# @f5-sales-demo/pi-agent-core 中文文档

规范地址：https://npmcn.com/package/%40f5-sales-demo/pi-agent-core/

版本：23\.10\.13
npm 元数据更新时间：2026-11-13T03:57:29.012Z
中文译文更新时间：2026-11-14T07:33:22.830Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40f5-sales-demo/pi-agent-core
原文对照：https://npmcn.com/package/%40f5-sales-demo/pi-agent-core/?lang=original
项目主页：https://github.com/f5-sales-demo/xcsh
源码仓库：https://github.com/f5-sales-demo/xcsh

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：132 kB，13 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：2 个
- 首次发布：2026-06-26T15:15:26.540Z
- 最新版本发布：2026-11-13T03:57:28.613Z
- 近 30 天下载量：8000（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：450（近 12 个月 450 个）

## 中文简介

具有运输抽象、状态管理和附件支持的通用剂

## 安装

```sh
npm install @f5-sales-demo/pi-agent-core
```

也可以使用：`pnpm add @f5-sales-demo/pi-agent-core`、`yarn add @f5-sales-demo/pi-agent-core`、`bun add @f5-sales-demo/pi-agent-core`

## README

# @f5-sales-demo/pi-agent (英语)

具有工具执行和事件流的状态代理 。 建造在 `@f5-sales-demo/pi-ai`。 。 。 .

## 安装

```bash
npm install @f5-sales-demo/pi-agent
```

## 快速启动

```typescript
import { Agent } from "@f5-sales-demo/pi-agent";
import { getModel } from "@f5-sales-demo/pi-ai";

const agent = new Agent({
 initialState: {
  systemPrompt: "You are a helpful assistant.",
  model: getModel("anthropic", "claude-sonnet-4-20250514"),
 },
});

agent.subscribe((event) => {
 if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
  // Stream just the new text chunk
  process.stdout.write(event.assistantMessageEvent.delta);
 }
});

await agent.prompt("Hello!");
```

## 核心概念

### 代理Message vs LLM 信件

代理与 `AgentMessage`,灵活类型,可以包括:

-   标准 LLM 消息 (`user`, (中文(简体) ), `assistant`, (中文(简体) ), `toolResult`(中文(简体) )
-   通过声明合并自定义应用特定消息类型

法学硕士只理解 `user`, (中文(简体) ), `assistant`,以及 `toolResult`编辑 `convertToLlm` 函数通过在每次LLM调用前过滤和转换消息来弥补这一空白.

### 信件流动

```
AgentMessage[] → transformContext() → AgentMessage[] → convertToLlm() → Message[] → LLM
                    (optional)                           (required)
```

1.  **转换语句**: Prune 旧消息, 注入外部上下文
2.  **转换为Llm**: 过滤出仅UI 信件, 将自定义类型转换为 LLM 格式

## 事件流程

代理为 UI 更新发布事件 。 了解事件序列有助于构建响应界面.

### 提示( ) 事件顺序

当你打电话 `prompt("Hello")`数字 :

```
prompt("Hello")
├─ agent_start
├─ turn_start
├─ message_start   { message: userMessage }      // Your prompt
├─ message_end     { message: userMessage }
├─ message_start   { message: assistantMessage } // LLM starts responding
├─ message_update  { message: partial... }       // Streaming chunks
├─ message_update  { message: partial... }
├─ message_end     { message: assistantMessage } // Complete response
├─ turn_end        { message, toolResults: [] }
└─ agent_end       { messages: [...] }
```

### 用工具调用

如果助手调用工具,循环继续:

```
prompt("Read config.json")
├─ agent_start
├─ turn_start
├─ message_start/end  { userMessage }
├─ message_start      { assistantMessage with toolCall }
├─ message_update...
├─ message_end        { assistantMessage }
├─ tool_execution_start  { toolCallId, toolName, args }
├─ tool_execution_update { partialResult }           // If tool streams
├─ tool_execution_end    { toolCallId, result }
├─ message_start/end  { toolResultMessage }
├─ turn_end           { message, toolResults: [toolResult] }
│
├─ turn_start                                        // Next turn
├─ message_start      { assistantMessage }           // LLM responds to tool result
├─ message_update...
├─ message_end
├─ turn_end
└─ agent_end
```

### 持续( ) 事件顺序

`continue()` 从现有上下文恢复,而不添加新信件。 错误发生后用它进行重试 .

```typescript
// After an error, retry from current state
await agent.continue();
```

上下文中的最后信息必须是 `user` 或者说 `toolResult` (无) `assistant`) (中文(简体) ).

### 事件类型

| 活动 | 说明 |
| --- | --- |
| `agent_start` | 代理开始处理 |
| `agent_end` | 代理完成所有新信件 |
| `turn_start` | 新回合开始( 一个 LLM 调用 + 工具执行) |
| `turn_end` | 以助理消息和工具结果转换完成 |
| `message_start` | 任何消息开始( 用户、 助手、 工具Result) |
| `message_update` | **仅限助理.** 包括 `assistantMessageEvent` 带三角洲 |
| `message_end` | 信件完成 |
| `tool_execution_start` | 工具开始 |
| `tool_execution_update` | 工具流进展 |
| `tool_execution_end` | 工具完成 |

## 代理选项

```typescript
const agent = new Agent({
  // Initial state
  initialState: {
    systemPrompt: string,
    model: Model,
    thinkingLevel: "off" | "minimal" | "low" | "medium" | "high" | "xhigh",
    tools: AgentTool<any>[],
    messages: AgentMessage[],
  },

  // Convert AgentMessage[] to LLM Message[] (required for custom message types)
  convertToLlm: (messages) => messages.filter(...),

  // Transform context before convertToLlm (for pruning, compaction)
  transformContext: async (messages, signal) => pruneOldMessages(messages),

  // How to handle queued messages: "one-at-a-time" (default) or "all"
  queueMode: "one-at-a-time",

  // Custom stream function (for proxy backends)
  streamFn: streamProxy,

  // Dynamic API key resolution (for expiring OAuth tokens)
  getApiKey: async (provider) => refreshToken(),

  // Tool execution context (late-bound UI/session access)
  getToolContext: () => ({ /* app-defined */ }),
});
```

## 代理国

```typescript
interface AgentState {
 systemPrompt: string;
 model: Model;
 thinkingLevel: ThinkingLevel;
 tools: AgentTool<any>[];
 messages: AgentMessage[];
 isStreaming: boolean;
 streamMessage: AgentMessage | null; // Current partial during streaming
 pendingToolCalls: Set<string>;
 error?: string;
}
```

通过 `agent.state`在流出时, `streamMessage` 包含部分助理消息.

## 方法

### 提示

```typescript
// Text prompt
await agent.prompt("Hello");

// With images
await agent.prompt("What's in this image?", [{ type: "image", data: base64Data, mimeType: "image/jpeg" }]);

// AgentMessage directly
await agent.prompt({ role: "user", content: "Hello", timestamp: Date.now() });

// Continue from current context (last message must be user or toolResult)
await agent.continue();
```

### 州管理层

```typescript
agent.setSystemPrompt("New prompt");
agent.setModel(getModel("openai", "gpt-4o"));
agent.setThinkingLevel("medium");
agent.setTools([myTool]);
agent.replaceMessages(newMessages);
agent.appendMessage(message);
agent.clearMessages();
agent.reset(); // Clear everything
```

### 控制权

```typescript
agent.abort(); // Cancel current operation
await agent.waitForIdle(); // Wait for completion
```

### 活动

```typescript
const unsubscribe = agent.subscribe((event) => {
 console.log(event.type);
});
unsubscribe();
```

## 指导与后续行动

在工具执行(stering)期间或代理商停止(后续)后要注入的队列信息 :

```typescript
agent.setSteeringMode("one-at-a-time");
agent.setInterruptMode("immediate");

// While agent is running tools
agent.steer({
 role: "user",
 content: "Stop! Do this instead.",
 timestamp: Date.now(),
});

// Queue a follow-up to run after the current turn completes
agent.followUp({
 role: "user",
 content: "After that, summarize the changes.",
 timestamp: Date.now(),
});
```

每次工具默认调用后都会检查引导消息 。 设定 `interruptMode` 改为 `"wait"` 推迟 引导直到当前转向完成 .

## 自定义信件类型

扩展 `AgentMessage` 通过声明合并:

```typescript
declare module "@f5-sales-demo/pi-agent" {
 interface CustomAgentMessages {
  notification: { role: "notification"; text: string; timestamp: number };
 }
}

// Now valid
const msg: AgentMessage = { role: "notification", text: "Info", timestamp: Date.now() };
```

处理自定义类型 `convertToLlm`数字 :

```typescript
const agent = new Agent({
 convertToLlm: (messages) =>
  messages.flatMap((m) => {
   if (m.role === "notification") return []; // Filter out
   return [m];
  }),
});
```

## 工具

使用 `AgentTool`数字 :

```typescript
import { Type } from "@sinclair/typebox";

const readFileTool: AgentTool = {
 name: "read_file",
 label: "Read File", // For UI display
 description: "Read a file's contents",
 parameters: Type.Object({
  path: Type.String({ description: "File path" }),
 }),
 execute: async (toolCallId, params, signal, onUpdate, context) => {
  const content = await fs.readFile(params.path, "utf-8");

  // Optional: stream progress
  onUpdate?.({ content: [{ type: "text", text: "Reading..." }], details: {} });

  return {
   content: [{ type: "text", text: content }],
   details: { path: params.path, size: content.length },
  };
 },
};

agent.setTools([readFileTool]);
```

### 处理错误

**丢出错误** 当工具失败时。 不返回错误消息为内容 .

```typescript
execute: async (toolCallId, params, signal, onUpdate) => {
 if (!fs.existsSync(params.path)) {
  throw new Error(`File not found: ${params.path}`);
 }
 // Return content only on success
 return { content: [{ type: "text", text: "..." }] };
};
```

丢出的错误被代理抓住,并作为工具错误报告到 LLM `isError: true`。 。 。 .

## 代理用户

对于通过后端代理的浏览器应用:

```typescript
import { Agent, streamProxy } from "@f5-sales-demo/pi-agent";

const agent = new Agent({
 streamFn: (model, context, options) =>
  streamProxy(model, context, {
   ...options,
   authToken: "...",
   proxyUrl: "https://your-server.com",
  }),
});
```

## 低级 API

对于没有代理类的直接控制:

```typescript
import { agentLoop, agentLoopContinue } from "@f5-sales-demo/pi-agent";

const context: AgentContext = {
 systemPrompt: "You are helpful.",
 messages: [],
 tools: [],
};

const config: AgentLoopConfig = {
 model: getModel("openai", "gpt-4o"),
 convertToLlm: (msgs) => msgs.filter((m) => ["user", "assistant", "toolResult"].includes(m.role)),
};

const userMessage = { role: "user", content: "Hello", timestamp: Date.now() };

for await (const event of agentLoop([userMessage], context, config)) {
 console.log(event.type);
}

// Continue from existing context
for await (const event of agentLoopContinue(context, config)) {
 console.log(event.type);
}
```

## 许可证

麻省理工学院

## 常见问题

### @f5-sales-demo/pi-agent-core 是什么？

具有运输抽象、状态管理和附件支持的通用剂

### 如何安装 @f5-sales-demo/pi-agent-core？

在项目目录运行 npm install @f5-sales-demo/pi-agent-core，或使用 pnpm add / yarn add / bun add。

### @f5-sales-demo/pi-agent-core 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @f5-sales-demo/pi-agent-core 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @f5-sales-demo/pi-agent-core 可以商用吗？

@f5-sales-demo/pi-agent-core 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @f5-sales-demo/pi-agent-core 的下载量有多少？

根据 npm 官方下载统计，@f5-sales-demo/pi-agent-core 在 2026/10/14 – 2026/11/12 这 30 天内被下载 8,000 次，日均约 267 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @f5-sales-demo/pi-agent-core 还在维护吗？

最新版本 23\.10\.13 发布于 2026/11/13（1 天前）；至今共发布 450 个版本，其中过去 12 个月发布了 450 个；首次发布于 2026/06/26。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

