TypeScript SDK
必填配置
本页所有 TypeScript 示例都使用应用启动时已校验的 API Key:
前提条件
第 1 步:安装
源码:joytoken-sdk-ts/client-sdk-ts
该包直接从 GitHub 分发,不发布到 npm Registry。生产构建应固定到 Release Tag 或 Commit。
第 2 步:选择协议接口
OpenAI
Anthropic
非流式
流式
编排响应
model: "auto" 请求可能由编排网关处理:它会先规划并执行多个子任务(检索、推理,以及最终作答)再返回结果。SDK 已为你完成聚合——不会把原始 JSON 字符串丢回来让你自行解析。
非流式
create() 与普通补全一样,把最终答案的纯文本放在 choices[0].message.content 中。完整拆解单独挂在 response.orchestration 上:
- 只有当该轮为编排时才会出现
orchestration;普通补全不含该字段。 orchestration.plan是网关宣布的子任务列表(若有下发)。orchestration.stages按到达顺序记录每个子任务,各自带有聚合后的content。
流式
在网络层面,网关会先发出一个 planning 事件(一个 orchestration.phase 为 planning 的 chunk,携带有序的 plan),其后紧跟 __planner__ 的 metadata 事件;随后把每个子任务的完整正文作为一个 chunk 发送,该 chunk 携带 orchestration 字段(task_id、task_seq、task_status、title),每个任务之后再跟一个独立的 metadata 事件(值为单个对象,而非数组)。与其自己解码这种原始结构,不如使用下方的 runStream(),它会把上述信号归一化为 onOrchestrationEvent 回调,并将 onTextDelta 过滤为仅最终答案。如果你直接消费原始的 stream() 迭代器,请通过聚合结果中的哨兵值 ORCHESTRATION_FINAL_TASK_ID 来分离面向用户的最终答案。
带进度回调的流式
runStream() 会为你过滤文本——onTextDelta 只接收最终答案文本;而 onOrchestrationEvent 报告计划宣布与每个子任务的生命周期:
若编排执行失败,网关会返回错误信封({ "error": { ... }, "choices": [] })。SDK 会在流式与非流式的 Chat 路径上都检测该信封,并抛出 JoyTokenAPIError,而不是返回空回复。
选择原语还是工具执行器
当请求工具和 Client 注册工具都不存在时,create() 可以自动执行 SDK 的本地默认工具。这是原语方法唯一允许的自动执行路径。
工具归属
工具归属是互斥的,判断依据是 request.tools 是否为 undefined。
用户工具与默认工具同名时,用户声明和用户 handler 优先;SDK 不会回退到同名默认实现。
注册并显式执行 handler
如果只需要返回 tool_calls 并在别处执行,请使用 create(),不要使用 run()。
保留厂商工具元数据
ToolCall.extra_content 是不透明的厂商扩展数据。SDK 管理的 run() / executeTools() 循环及其流式版本,会在 Chat Completions、Responses 和 Anthropic Messages 续轮中原样保留该字段。例如,Gemini 函数调用可能包含 extra_content.google.thought_signature;SDK 不解释、不修改、也不伪造这个值。
SDK 同样会捕获直接位于 tool call 顶层的 thought_signature,暴露为 ToolCall.thought_signature,与嵌套在 extra_content 中的形式相区分。Gemini 经由网关的 Chat Completions 端点会把它返回在 tool_call 顶层;SDK 会在 Chat、Responses、Messages、流式以及 Agent 工具循环中原样保留它,并且必须在续跑轮次原样回传,否则 provider 会拒绝该请求(此前表现为 503)。
如果应用自行维护工具循环,必须回放 SDK 返回的完整 assistant ToolCall、Responses function_call 或 Messages tool_use item。只用 id 和 function 重建对象会丢失厂商续轮所需的元数据。
本地默认工具
仅当请求工具和 Client 注册工具都不存在时,SDK 才使用默认集合。
不要把 workspace 指向宽泛或敏感目录。权限回调只授权单次副作用,不能替代进程级文件系统与操作系统隔离。
Responses 托管工具
Hosted tools 与本地 function tools 不同,默认关闭。
Hosted file search 必须显式提供 vector store:
{ type: "function", name: "file_search", ... } 是本地函数声明;{ type: "file_search", vector_store_ids: [...] } 是 Responses hosted tool。SDK 不会自动构造 vector store ID。
第 3 步:模型列表
需要英文描述时使用 { locale: "en" }。不传 locale 时接口默认返回英文描述。目录项位于 models.data.models。
