v0.1.0: Electron 桌面端骨架 + pi SDK 聊天链路
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# pi SDK 集成笔记
|
||||
|
||||
> 来源:pi.dev 官方文档 + 仓库调研(2026-09-05)。
|
||||
> ⚠️ 本文是二手摘要,**写代码前必须对照已安装包的 `.d.ts` 类型定义核对 API 签名**。
|
||||
|
||||
## 1. 包与运行时
|
||||
|
||||
- 包名:`@earendil-works/pi-coding-agent`(主包自带 SDK,无需单独安装)
|
||||
- Node ≥ 22.19(Electron 37.6+ 主进程满足;系统 Node 仅跑构建)
|
||||
- MIT 协议;monorepo 结构:`pi-agent-core`(agent 运行时)/ `pi-ai`(多 Provider LLM 统一接口)/ `pi-tui` / `chord` / `telemetry`
|
||||
|
||||
## 2. SDK 三段式(嵌入 Node 应用的标准路径)
|
||||
|
||||
```ts
|
||||
const { session } = await createAgentSession({ /* options */ });
|
||||
session.subscribe((event) => { /* 处理 text_delta 等 */ });
|
||||
await session.prompt("...");
|
||||
```
|
||||
|
||||
- `prompt()` 返回 Promise,完成后 resolve;流式期间可用 `steer()` / `followUp()` 排队插话。
|
||||
- 事件流:`agent_start/end`、`message_update`(含 `text_delta` / `thinking_delta`)、`tool_execution_start/update/end`、`turn_end`、`queue_update`、压缩与自动重试事件。
|
||||
|
||||
## 3. 会话管理
|
||||
|
||||
- `SessionManager.inMemory()`(无持久化)/ `.create()` / `.continueRecent()` / `.open()`
|
||||
- 会话是树结构,支持分支(`fork()`);多会话动态替换用 `AgentSessionRuntime`(`newSession()` / `switchSession()` / `fork()` / `importFromJsonl()`,替换后需重新订阅)
|
||||
- 持久化后端可插拔:官方 `session-backends/sqlite-node`(与我们本地 sqlite 方案契合)
|
||||
- 本地文件布局(与 pi CLI / pi-web 共享):`~/.pi/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`
|
||||
|
||||
## 4. 模型与凭据
|
||||
|
||||
- 认证解析优先级:运行时 API key → `auth.json`(API key 或 OAuth)→ 环境变量 → 自定义 provider fallback resolver
|
||||
- `setRuntimeApiKey()`(不落盘)、`InMemoryCredentialStore`、自定义 auth/models 路径、`PI_OFFLINE` 离线模式
|
||||
- 内置 Provider:OpenAI、Anthropic、Google 等;自定义模型用 `models.json`,自定义 provider 支持实现自有 API 与 OAuth(为将来"服务器 LLM 代理端点"预留)
|
||||
- 本机现状:`~/.pi/agent/` 已有 `auth.json` 与 `models-store.json`,应用零配置可直接复用
|
||||
|
||||
## 5. 定制点(SDK options)
|
||||
|
||||
| 维度 | 方式 |
|
||||
|---|---|
|
||||
| 系统提示 | `DefaultResourceLoader({ systemPromptOverride: () => "..." })` |
|
||||
| 工具 | `tools` 白名单内置工具;`excludeTools` 排除;`noTools: "all"` 全关;`defineTool()` 经 `customTools` 注入 |
|
||||
| 扩展 | `extensionFactories` 内联扩展(`pi.registerTool()` / `pi.on()` / 命令),支持命名与共享 eventBus |
|
||||
| 模型 | `getModel()` 取内置模型;`models.json` 自定义;`thinkingLevel`、`scopedModels` |
|
||||
| Skills/上下文/提示模板 | ResourceLoader 的 `skillsOverride`、`agentsFilesOverride`、`promptsOverride` |
|
||||
| 设置 | `SettingsManager.inMemory()` / `.create()`,可覆盖压缩、重试等 |
|
||||
|
||||
## 6. 安全要点
|
||||
|
||||
- pi **无内置权限系统**,工具以进程用户权限执行。业务 agent 必须 `noTools` 或白名单收窄,能力全部走 `defineTool()` 自定义工具;本地文件类操作按需开启并配 `tool_call` 拦截。
|
||||
|
||||
## 7. 扩展(Extension)API 摘要
|
||||
|
||||
- 加载:`~/.pi/agent/extensions/*.ts`(全局)、`.pi/extensions/*.ts`(项目级,需 trust)、`pi -e ./x.ts`(临时);jiti 加载 TS 免编译,`/reload` 热重载(SDK 路径用 `extensionFactories` 内联)
|
||||
- 能力:`pi.on(event, handler)`(拦截 `tool_call`、改写 `input`、`before_agent_start` 注入上下文/改提示词)、`pi.registerTool()`(typebox 参数、流式进度 `onUpdate`)、`pi.registerCommand()`、`ctx.ui` 自定义交互、`pi.appendEntry()` 会话持久化、`pi.sendMessage()`
|
||||
- 注意:自定义工具需手动截断输出(默认 50KB/2000 行)、`withFileMutationQueue()` 防并行写冲突
|
||||
|
||||
## 8. 备选集成模式
|
||||
|
||||
| 模式 | 用途 | 取舍 |
|
||||
|---|---|---|
|
||||
| SDK 同进程(主选) | 嵌入 Electron 主进程 | 类型安全、直接访问 agent state |
|
||||
| RPC 模式(`pi --mode rpc`) | 子进程隔离 | 崩溃隔离好,但失去类型安全,自管 JSONL 协议 |
|
||||
| JSON event stream | 结构化事件打印 | 观测/调试用 |
|
||||
|
||||
## 9. pi-web 可借鉴的实现细节
|
||||
|
||||
- WebSocket 事件以快照推送、60ms 节流(我们的 IPC 转发同样适用)
|
||||
- 会话列表 UI 数据:运行状态、上下文用量、成本、压缩详情
|
||||
- 双分支设计:New session(从历史消息建独立会话)/ Edit from here(当前会话内分支)
|
||||
Reference in New Issue
Block a user