Skip to content

Cell - Ta Client ​

ta serve 的客户端:只依赖平台自带的 WebSocket,可用于浏览器、Electron、移动端和 Node.js >= 22.4。

ts
import { SessionStore, TaConnection } from '@celljs/ta-client';

const connection = new TaConnection({ url, token });   // 取自 ~/.ta/agent/serve.json
await connection.connect();
const { sessionId } = await connection.server.openSession({ cwd: '/repo' });

const store = new SessionStore(connection, sessionId);
store.subscribe(state => render(state));   // 每批事件通知一次
await store.attach();
await store.prompt('修复失败的测试');
  • TaConnection:断线后自动重连(指数退避);onReconnecting(delayMs, attempt) 在每次等待前通知,reconnect() 跳过等待立即重试。connection.server(会话)、workspace、terminals、settings、packages、auth(登录模型服务,事件用 onAuthEvent 订阅)、relay(配对设备)是 ta serve 各服务的带类型代理,共用这一条连接。createSocket 选项可以换成别的传输,例如经 Relay 的 RelaySocket(@celljs/ta-relay)。断线期间的调用直接失败(TaRemoteError,code 为 CELL_TA_CONNECTION_LOST),不排队,是否重发由调用方决定(重发请复用 clientMessageId)。
  • SessionStore:一个会话在客户端的状态(消息、工具执行、待回答的对话框、扩展状态栏)。重连后按 seq 补发错过的事件;补不上时(gap)自动用 getMessages 重新同步。
  • 客户端工具:模型可以调用由客户端执行的工具(例如读剪贴板、让用户在界面里选择)。打开会话时声明,SessionStore 负责执行并回传结果:
ts
const pickColor: ClientTool = {
    definition: { name: 'pick_color', description: '请用户选一个颜色', parameters: { type: 'object', properties: {} } },
    run: async () => await showColorPicker(),   // 返回给模型的文本;抛错即工具失败
};
const { sessionId } = await connection.server.openSession({ cwd, clientTools: [pickColor.definition] });
const store = new SessionStore(connection, sessionId, { clientTools: [pickColor] });

调用请求广播给所有已连接的客户端,第一个结果生效(与对话框相同);同一调用在一个客户端只执行一次,断线后重发已算好的结果而不是再执行一次。run 被中止或会话关闭时调用以失败结束。codemode 脚本里同样可以 tools.pick_color()。

  • openSession 的 appendSystemPrompt 给会话追加一段 system prompt(同 pi 的 --append-system-prompt),客户端可以借此给 Agent 一个角色。
  • SessionReducer:纯函数 (state, event) => state,不改动旧状态,UI 可按引用比较。