SDK 与编程接口
Pi 不是「一个 CLI 加一个 RPC」——它是一个能在 CLI、Node.js 嵌入、子进程 RPC、JSONL 流四种场景下等价使用的 agent runtime。
createAgentSession()是统一入口,本章拆这四种使用姿势的 API 与取舍。
核心 API:createAgentSession()
SDK 的主工厂函数返回 AgentSession 实例。使用 ResourceLoader 加载 extensions、skills、prompt templates、themes 和 context files。
最小调用:
import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
const { session } = await createAgentSession({
sessionManager: SessionManager.inMemory(),
});
返回值结构:
interface CreateAgentSessionResult {
session: AgentSession;
extensionsResult: LoadExtensionsResult;
modelFallbackMessage?: string;
}
interface LoadExtensionsResult {
extensions: Extension[];
errors: Array<{ path: string; error: string }>;
runtime: ExtensionRuntime;
}
extensionsResult.errors 让你能检测「哪些扩展加载失败」——这对生产环境部署很关键,避免一个坏扩展默默拖累整个 session。
AgentSession 接口
AgentSession 是 SDK 的核心对象。它的方法分三类:
Prompt 与消息排队
// 阻塞式发送 prompt,等完成后返回
await session.prompt(text, options?);
// streaming 期间排队消息(不阻塞)
session.steer(text); // 当前助手回合工具调用完成后投递
session.followUp(text); // agent 全部工作完成后投递
PromptOptions:
interface PromptOptions {
expandPromptTemplates?: boolean;
images?: ImageContent[];
streamingBehavior?: "steer" | "followUp";
source?: InputSource;
preflightResult?: (success: boolean) => void;
}
preflightResult 在每次 prompt() 调用时触发一次(在 resolve 之前),true 表示接受/排队/立即处理;false 表示 preflight 拒绝。
关键行为规则:
- Extension commands(如
/mycommand):streaming 期间也立即执行,通过pi.sendMessage()管理自身 LLM 交互 - 基于文件的 prompt templates:在发送/排队前展开
- Streaming 期间无
streamingBehavior:抛错,需用steer()/followUp()或指定选项 steer()和followUp()展开基于文件的 prompt templates,但对 extension commands 报错
事件订阅
const unsubscribe = session.subscribe((event) => {
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
process.stdout.write(event.assistantMessageEvent.delta);
}
});
// 之后取消订阅
unsubscribe();
事件是强类型的——message_update 下的 assistantMessageEvent 是 TypeScript discriminated union,写起代码来很自然。
模型与推理等级
session.setModel(model);
session.setThinkingLevel(level); // off | minimal | low | medium | high | xhigh
session.cycleModel(); // 切到 scopedModels 里的下一个
session.cycleThinkingLevel(); // 切到下一个推理等级
状态访问
session.agent // 内部 agent 对象(高级用法)
session.model // 当前 model
session.thinkingLevel // 当前推理等级
session.messages // 当前消息历史
session.isStreaming // 是否正在流式输出
session.sessionFile // 文件路径或 undefined
session.sessionId // session id