@ruixutong.manee/agent-framework 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,223 @@
1
+ import type { Model } from '../llm/base';
2
+ /** Agent 的生命周期状态。 */
3
+ export type AgentStatus = 'idle' | 'running' | 'ended' | 'failed';
4
+ /** 触发工具调用错误事件的处理阶段。 */
5
+ export type ToolCallErrorTrigger = 'before' | 'calling' | 'after';
6
+ /** 事件注册方法返回的取消监听函数。 */
7
+ export type Unsubscribe = () => void;
8
+ /** 工具参数转换后使用的 JSON 对象结构。 */
9
+ export type JsonObject = Record<string, unknown>;
10
+ /** 框架工具所需的最小 schema 契约,Zod object schema 可直接满足该契约。 */
11
+ export interface ToolParametersSchema {
12
+ safeParse(data: unknown): {
13
+ success: true;
14
+ data: unknown;
15
+ } | {
16
+ success: false;
17
+ error: unknown;
18
+ };
19
+ }
20
+ /**
21
+ * 一个模型协议需要关联的消息、工具和原始返回类型。
22
+ *
23
+ * Agent 仅通过这些关联类型保存和拼装上下文;具体 wire structure 由 `Model`
24
+ * 的 builder/parser 处理。
25
+ */
26
+ export interface AgentProtocol {
27
+ /** Agent 持久保存并传回 Model 的协议上下文项。 */
28
+ context: unknown;
29
+ /** Model API 接收的工具声明结构。 */
30
+ tool: unknown;
31
+ /** 应用可交给 `buildUserMessage()` 的协议用户消息结构。 */
32
+ userMessage: unknown;
33
+ /** 应用可交给 `buildSystemMessage()` 的协议系统消息结构。 */
34
+ systemMessage: unknown;
35
+ /** `parseAssistantMessages()` 返回的协议 assistant 抽象结构。 */
36
+ assistantMessage: unknown;
37
+ /** 应用可交给 `buildToolCallOutputMessage()` 的协议工具结果结构。 */
38
+ toolCallOutputMessage: unknown;
39
+ /** 单个原始工具调用项,用于保真保存 `sourceCall`。 */
40
+ rawToolCall: unknown;
41
+ /** Model SDK 返回的完整原始响应对象。 */
42
+ rawResponse: unknown;
43
+ }
44
+ /** 从协议规格中取出上下文项类型。 */
45
+ export type ContextOf<P extends AgentProtocol> = P['context'];
46
+ /** 从协议规格中取出工具声明类型。 */
47
+ export type ToolOf<P extends AgentProtocol> = P['tool'];
48
+ /** 从协议规格中取出用户消息 builder 输入类型。 */
49
+ export type UserMessageOf<P extends AgentProtocol> = P['userMessage'];
50
+ /** 从协议规格中取出系统消息 builder 输入类型。 */
51
+ export type SystemMessageOf<P extends AgentProtocol> = P['systemMessage'];
52
+ /** 从协议规格中取出 assistant parser 输出类型。 */
53
+ export type AssistantMessageOf<P extends AgentProtocol> = P['assistantMessage'];
54
+ /** 从协议规格中取出工具结果 builder 输入类型。 */
55
+ export type ToolCallOutputMessageOf<P extends AgentProtocol> = P['toolCallOutputMessage'];
56
+ /** 从协议规格中取出单个原始工具调用类型。 */
57
+ export type RawToolCallOf<P extends AgentProtocol> = P['rawToolCall'];
58
+ /** Agent 生成文本输入时使用的协议无关内容块。 */
59
+ export interface AgentTextPart {
60
+ /** 固定为文本内容块。 */
61
+ type: 'text';
62
+ /** 文本内容。 */
63
+ text: string;
64
+ }
65
+ /** Agent 启动文本任务时必须能由 Model 构建的用户消息基础结构。 */
66
+ export interface AgentBaseUserMessage {
67
+ /** Agent 基础用户输入只要求支持文本内容块。 */
68
+ content: readonly AgentTextPart[];
69
+ }
70
+ /** 框架内部提示词交给 Model 构建时使用的系统消息基础结构。 */
71
+ export interface AgentBaseSystemMessage {
72
+ /** system prompt 文本。 */
73
+ content: string;
74
+ }
75
+ /** Model 反解析普通 assistant 文本输出时使用的基础结构。 */
76
+ export interface AgentBaseAssistantMessage {
77
+ /** assistant 文本内容块;provider refusal 可由具体协议额外表示。 */
78
+ content: readonly AgentTextPart[];
79
+ }
80
+ /** 工具执行结果交给 Model 构建时使用的基础结构。 */
81
+ export interface AgentBaseToolCallOutputMessage {
82
+ /** 模型工具调用 id;Chat 对应 `tool_call_id`,Responses 对应 `call_id`。 */
83
+ callId: string;
84
+ /** 本地工具执行结果的字符串表示。 */
85
+ output: string;
86
+ }
87
+ /** Agent 交给 Model 构建为协议工具定义的基础结构。 */
88
+ export interface AgentToolDefinitionInput {
89
+ /** 工具名,必须在同一个 Agent 实例中唯一。 */
90
+ name: string;
91
+ /** 提供给模型的工具说明;动态说明会在 Agent 构建工具时先计算为字符串。 */
92
+ description: string;
93
+ /** 工具参数 schema;省略时由 Agent 使用空对象 schema。 */
94
+ parameters?: ToolParametersSchema;
95
+ /** 设置后原值传给协议 Model;省略时请求工具中也不包含 `strict`。 */
96
+ strict?: boolean;
97
+ }
98
+ /** 反解析后的基础消息及其原始协议消息载体。 */
99
+ export interface AgentParsedMessage<TMessage, TContext> {
100
+ /** parser 反解析出的协议抽象消息。 */
101
+ message: TMessage;
102
+ /** 承载该解析结果的原始上下文项。 */
103
+ sourceMessage: TContext;
104
+ }
105
+ /**
106
+ * Model 从一个协议消息中提取出的单个工具调用。
107
+ *
108
+ * Chat 中一条 assistant message 可能展开为多个调用;`sourceCall` 精确指向
109
+ * 其中对应的原始项,而 `sourceMessage` 保留承载它的完整消息。
110
+ */
111
+ export interface AgentToolCall<P extends AgentProtocol> {
112
+ /** 工具调用 id,用于把执行结果关联回模型请求。 */
113
+ id: string;
114
+ /** 本地工具名。 */
115
+ name: string;
116
+ /** 模型输出的原始 JSON 参数字符串。 */
117
+ arguments: string;
118
+ /** 承载该调用的完整协议上下文项。 */
119
+ sourceMessage: ContextOf<P>;
120
+ /** 单个原始调用项;Chat 中是一条 `tool_calls[]` 元素,Responses 中是 `function_call` item。 */
121
+ sourceCall: RawToolCallOf<P>;
122
+ }
123
+ /** 技能手册中的一条具体操作流程。 */
124
+ export interface AgentSkillSop {
125
+ description: string;
126
+ content: string;
127
+ }
128
+ /**
129
+ * 技能手册元数据。
130
+ *
131
+ * 框架通过内部 system prompt 暴露技能索引;模型应先调用内置 `get-skill`
132
+ * 获取完整手册,再按照匹配到的流程执行。
133
+ */
134
+ export interface AgentSkill {
135
+ name: string;
136
+ description: string;
137
+ systemContent?: string;
138
+ sops?: AgentSkillSop[];
139
+ }
140
+ /**
141
+ * 调用动态工具描述函数时传入的协议无关上下文。
142
+ *
143
+ * 装饰器定义属于类级 metadata,本期不将其绑定到具体 Model 协议。
144
+ */
145
+ export interface ToolDescriptionContext {
146
+ skills: readonly AgentSkill[];
147
+ subAgents: readonly AgentConstructor<AgentProtocol>[];
148
+ context: readonly unknown[];
149
+ history: readonly unknown[];
150
+ systemPrompts: readonly string[];
151
+ tool: {
152
+ name: string;
153
+ parameters?: ToolParametersSchema;
154
+ strict?: boolean;
155
+ };
156
+ }
157
+ /** 静态工具描述,或在每次构建模型请求时动态生成的工具描述。 */
158
+ export type ToolDescription = string | ((ctx: ToolDescriptionContext) => string);
159
+ /** `@Tool` 装饰器和运行时工具共用的公开工具定义。 */
160
+ export interface ToolDefinition {
161
+ name: string;
162
+ description: ToolDescription;
163
+ parameters?: ToolParametersSchema;
164
+ /** 可选的协议严格参数标记;框架不设置默认值,也不修改 schema。 */
165
+ strict?: boolean;
166
+ }
167
+ /** 参数解析和校验成功后执行的运行时工具函数。 */
168
+ export type ToolHandler = (parameters: unknown) => unknown | Promise<unknown>;
169
+ /** 绑定了实例 handler、可由 Agent 执行的运行时工具定义。 */
170
+ export interface ToolRuntimeDefinition extends ToolDefinition {
171
+ handler: ToolHandler;
172
+ }
173
+ /** 子代理实例必须满足的最小契约。 */
174
+ export interface AgentInstance<P extends AgentProtocol> {
175
+ init(): this;
176
+ agent(input: string | UserMessageOf<P>, stream?: boolean): Promise<ContextOf<P>[]>;
177
+ }
178
+ /** `AgentOptions.subAgents` 接收的同协议子代理构造器契约。 */
179
+ export interface AgentConstructor<P extends AgentProtocol> {
180
+ new (options: AgentOptions<P>): AgentInstance<P>;
181
+ readonly name: string;
182
+ readonly description?: string;
183
+ readonly toolsDefinition: readonly ToolDefinition[];
184
+ }
185
+ /** 创建 Agent 或 Agent 子类实例时使用的选项。 */
186
+ export interface AgentOptions<P extends AgentProtocol> {
187
+ /** 提供消息构建、反解析和生成能力的协议 Model。 */
188
+ llm: Model<P>;
189
+ /** 通过内部 system prompt 向模型展示索引的技能手册。 */
190
+ skills?: readonly AgentSkill[];
191
+ /** 可由内置 `agent` 工具调度的同协议子代理类。 */
192
+ subAgents?: readonly AgentConstructor<P>[];
193
+ /** 用户 system prompt;框架内部提示词会排列在这些提示词之前。 */
194
+ systemPrompts?: readonly string[];
195
+ /** 初始有效上下文;省略时回退到 `initRawContext`。 */
196
+ initContext?: readonly ContextOf<P>[];
197
+ /** 初始原始历史记录;省略时回退到 `initContext`。 */
198
+ initRawContext?: readonly ContextOf<P>[];
199
+ /** 可选的 Agent 循环硬上限;省略表示不显式限制迭代轮数。 */
200
+ maxIterations?: number;
201
+ }
202
+ /** before/after 工具调用监听器的行为控制选项。 */
203
+ export interface ToolEventOptions {
204
+ /** 是否等待该监听器完成后再继续工具执行流程。 */
205
+ await?: boolean;
206
+ /**
207
+ * 仅对 before 监听器生效:监听器报错时取消真实工具调用。
208
+ * 异步监听器 rejection 只有在 `await` 同时为 `true` 时才能触发取消。
209
+ */
210
+ errorCancel?: boolean;
211
+ }
212
+ /** 模型请求的指定函数在真正执行前触发的监听器。 */
213
+ export type BeforeToolCallCallback<P extends AgentProtocol> = (parameters: unknown, call: AgentToolCall<P>) => void | Promise<void>;
214
+ /** 指定工具 handler 返回后触发的监听器。 */
215
+ export type AfterToolCallCallback<P extends AgentProtocol> = (parameters: unknown, call: AgentToolCall<P>, result: unknown) => void | Promise<void>;
216
+ /** 每次模型响应触发一次;触发时整批原始协议消息尚未写入上下文。 */
217
+ export type ModelResponseCallback<P extends AgentProtocol> = (messages: readonly ContextOf<P>[]) => void | Promise<void>;
218
+ /** before/calling/after 任一工具处理阶段发生错误时触发的监听器。 */
219
+ export type ToolCallErrorCallback<P extends AgentProtocol> = (name: string, triggerType: ToolCallErrorTrigger, error: unknown, parameters: unknown, call: AgentToolCall<P>, result?: unknown) => void | Promise<void>;
220
+ /** Agent 进入已注册状态后触发的监听器。 */
221
+ export type AgentStatusChangedCallback<P extends AgentProtocol> = (rawContext: readonly ContextOf<P>[], context: readonly ContextOf<P>[]) => void | Promise<void>;
222
+ /** `agent()` 抛出错误时触发的监听器。 */
223
+ export type AgentErrorCallback = (error: Error) => void | Promise<void>;
package/dist/index.cjs ADDED
@@ -0,0 +1,18 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`zod`),l=require(`openai`);l=s(l,1);let u=require(`zod-to-json-schema`),d=require(`node:fs`);var f=Symbol.for(`@manee/agent-framework/toolDefinitions`);function p(e){return function(t,n){if(n.kind!==`method`||typeof t!=`function`)throw Error(`@Tool can only decorate methods.`);let r=t;h(n.metadata,{...e}),n.addInitializer(function(){if(typeof this!=`object`||this===null)return;let t=this;t.tools??=[],t.tools.push({...e,handler:r.bind(t)})})}}function m(e){let t=e[g()]?.[f];return Array.isArray(t)?t.map(e=>({...e})):[]}function h(e,t){let n=Object.prototype.hasOwnProperty.call(e,f),r=e[f],i=n&&Array.isArray(r)?r:Array.isArray(r)?[...r]:[];i.push(t),e[f]=i}function g(){return Symbol.metadata??Symbol.for(`Symbol.metadata`)}var _=c.z.object({});function v(){return _}var y,b,x,S;function C(e,t,n,r,i,a){var o,s,c,l,u,d,f,p=Symbol.metadata||Symbol.for(`Symbol.metadata`),m=Object.defineProperty,h=Object.create,g=[h(null),h(null)],_=t.length;function v(t,n,r){return function(i,a){n&&(a=i,i=e);for(var o=0;o<t.length;o++)a=t[o].apply(i,r?[a]:[]);return r?a:i}}function y(e,t,n,r){if(typeof e!=`function`&&(r||e!==void 0))throw TypeError(t+` must `+(n||`be`)+` a function`+(r?``:` or undefined`));return e}function b(e,t,n,r,i,a,c,l,u,d,f){function p(e){if(!f(e))throw TypeError(`Attempted to access private element on non-instance`)}var h=[].concat(t[0]),_=t[3],b=!c,x=i===1,S=i===3,C=i===4,w=i===2;function T(t,n,r){return function(i,a){return n&&(a=i,i=e),r&&r(i),D[t].call(i,a)}}if(!b){var D={},O=[],k=S?`get`:C||x?`set`:`value`;if(u?(d||x?D={get:E(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:D[k]=_,d||E(D[k],r,w?``:k)):d||(D=Object.getOwnPropertyDescriptor(e,r)),!d&&!u){if((s=g[+l][r])&&(s^i)!==7)throw Error(`Decorating two elements with the same name (`+D[k].name+`) is not supported yet`);g[+l][r]=i<3?1:i}}for(var A=e,j=h.length-1;j>=0;j-=n?2:1){var M=y(h[j],`A decorator`,`be`,!0),N=n?h[j-1]:void 0,P={},F={kind:[`field`,`accessor`,`method`,`getter`,`setter`,`class`][i],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw TypeError(`attempted to call addInitializer after decoration was finished`);y(t,`An initializer`,`be`,!0),a.push(t)}.bind(null,P)};if(b)s=M.call(N,A,F),P.v=1,y(s,`class decorators`,`return`)&&(A=s);else if(F.static=l,F.private=u,s=F.access={has:u?f.bind():function(e){return r in e}},C||(s.get=u?w?function(e){return p(e),D.value}:T(`get`,0,p):function(e){return e[r]}),w||S||(s.set=u?T(`set`,0,p):function(e,t){e[r]=t}),A=M.call(N,x?{get:D.get,set:D.set}:D[k],F),P.v=1,x){if(typeof A==`object`&&A)(s=y(A.get,`accessor.get`))&&(D.get=s),(s=y(A.set,`accessor.set`))&&(D.set=s),(s=y(A.init,`accessor.init`))&&O.unshift(s);else if(A!==void 0)throw TypeError(`accessor decorators must return an object with get, set, or init properties or undefined`)}else y(A,(d?`field`:`method`)+` decorators`,`return`)&&(d?O.unshift(A):D[k]=A)}return i<2&&c.push(v(O,l,1),v(a,l,0)),d||b||(u?x?c.splice(-1,0,T(`get`,l),T(`set`,l)):c.push(w?D[k]:y.call.bind(D[k])):m(e,r,D)),A}function x(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return a!==void 0&&(o=a[p]),o=h(o??null),u=[],d=function(e){e&&u.push(v(e))},f=function(t,r){for(var a=0;a<n.length;a++){var o=n[a],s=o[1],d=7&s;if((8&s)==t&&!d==r){var f=o[2],p=!!o[3],m=16&s;b(t?e:e.prototype,o,m,p?`#`+f:w(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return D(t)===e}:i)}}},f(8,0),f(0,0),f(8,1),f(0,1),d(c),d(l),s=u,_||x(e),{e:s,get c(){var n=[];return _&&[x(e=b(e,[t],r,e.name,5,n)),v(n,1)]}}}function w(e){var t=T(e,`string`);return typeof t==`symbol`?t:t+``}function T(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function E(e,t,n){typeof t==`symbol`&&(t=(t=t.description)?`[`+t+`]`:``);try{Object.defineProperty(e,`name`,{configurable:!0,value:n?n+` `+t:t})}catch{}return e}function D(e){if(Object(e)!==e)throw TypeError(`right-hand side of 'in' should be an object, got `+(e===null?`null`:typeof e));return e}var O=`函数调用的前置工作出现异常,异常为:`,k=`框架约束:当任务完成时,必须单独调用 end-agent 工具结束任务;不能仅用自然语言回答表示结束,也不能把 end-agent 与其他工具放在同一轮调用。`,A=Symbol(`agent.tools`),j=class{static{[b,x,S,y]=C(this,[],[[p({name:`agent`,description:({subAgents:e})=>[`这是一个子代理调度工具,当你需要调用一个子代理来完成某个任务时,请使用这个工具。调用时请在参数中说明需要调用的子代理名称和输入子代理的内容。`,`每次调度同一子代理都是全新的代理,并且可以同时调度多个相同子代理。`,`调度子代理时,需要指定任务的描述,以及需要子代理最后汇报你的东西的描述。比如如果是一个任务,那需要汇报你任务的报告;如果是需要一个问题的答案,则是问题的回答。`,`以下是当前可用的子代理列表:`,e.length===0?`当前没有可调度的子代理。`:e.map(z).join(`
2
+
3
+ `)].join(`
4
+
5
+ `),parameters:c.z.object({agentName:c.z.string().describe(`要调用的子代理名称`),input:c.z.string().describe(`输入子代理的内容`),outputDescription:c.z.string().describe(`需要让子代理最后交付你的东西的描述,比如任务的报告、问题的回答`)})}),2,`toolSubAgent`,async function(e){let t,n,{agentName:r,input:i,outputDescription:a}=e,o=this.subAgents.find(e=>e.name===r);if(!o)return`没有找到名称为 ${r} 的子代理。`;let s,l=o;class u extends l{static{[n,t]=C(this,[],[[p({name:`agent-result`,description:`这是一个结果汇报工具,你需要在完成任务后调用这个工具把结果汇报回来`,parameters:c.z.object({result:c.z.string().describe(a)})}),2,`reportResult`,function(e){let{result:t}=e;return s=t,t}]],0,e=>#j in e,l).e}constructor(...e){super(...e),t(this)}#j=n}let d=new u({llm:this.#o,systemPrompts:[`你现在是被主代理调度的子代理:${r}。`,`主代理输入给你的任务:\n${i}`,[`完成任务后,调用 end-agent 前必须先调用 agent-result 工具把结果汇报回来。`,`agent-result.result 必须满足如下交付描述:\n${a}`].join(`
6
+ `)]});return d.init(),await d.agent(i),s??`子代理已结束但未通过 agent-result 汇报结果。`}],[p({name:`get-skill`,description:`获取指定下标的技能手册完整内容。`,parameters:c.z.object({index:c.z.number().int().nonnegative()})}),2,`getSkill`,function(e){let{index:t}=e,n=this.#n[t];return n?[`手册标题:${n.name}`,`手册描述:${n.description}`,n.systemContent?`全局适用内容:${n.systemContent}`:``,...(n.sops??[]).map((e,t)=>[`工作流${t+1}:${e.description}`,`执行流程:\n${e.content}`].join(`
7
+ `))].filter(e=>e.length>0).join(`
8
+
9
+ `):`没有找到下标为 ${t} 的技能手册。`}],[p({name:`end-agent`,description:`当你认为你已经彻底完成了用户交代的任务,并且不需要更多信息时,请调用这个工具。该工具必须在任务确定结束时单独调用,不能跟其他工具一起调用。`}),2,`endAgent`,function(){return this.#A(`ended`),`Agent 已结束。`}]],0,e=>#p in e).e}get tools(){return L(this)}set tools(e){R(this,e)}#e=(y(this),[]);#t=[];#n=[];#r=[];#i=`idle`;#a;#o;#s=!1;#c=[];#l=[];#u=[];#d=[];#f=[];#p=[];static description;subAgents=[];static get toolsDefinition(){return m(this)}constructor(e){if(this.#o=e.llm,this.#a=e.maxIterations,this.#t=[...e.initContext??e.initRawContext??[]],this.#e=[...e.initRawContext??e.initContext??[]],this.tools??=[],this.subAgents=[...e.subAgents??[]],this.#a!==void 0&&(this.#a<1||!Number.isInteger(this.#a)))throw Error(`maxIterations must be a positive integer.`);this.addSkill(...e.skills??[]),this.addSystemPrompts(...e.systemPrompts??[])}getHistory(){return[...this.#e]}getContext(){return[...this.#t]}init(){return this.#s=!1,this.#m(),this.#h(),this.#s=!0,this}addSystemPrompts(...e){for(let t of e)t.trim().length>0&&this.#r.push(t);return this}addSkill(...e){return this.#n.push(...e),this}appendContext(e){return this.#D(e),this}onModelResponse(e){return M(this.#f,e)}onBeforeToolCall(e,t,n){return M(this.#c,{toolName:e,callback:t,options:N(n)})}onAfterToolCall(e,t,n){return M(this.#l,{toolName:e,callback:t,options:N(n)})}onToolCallError(e){return M(this.#u,e)}onAgentStatusChanged(e,t){return M(this.#d,{status:e,callback:t})}onAgentError(e){return M(this.#p,e)}async toolCall(e){this.#g();let t=this.tools.find(t=>t.name===e.name),n={};if(!t){let t=Error(`Unknown tool: ${e.name}`);return await this.#T(e.name,`calling`,t,n,e),this.#O(this.#k(e.id,F(t)))}let r=await this.#x(t,e);if(!r.ok)return this.#O(this.#k(e.id,r.message));let i=r.parameters,a=await this.#S(t.name,i,e);if(a.canceled)return this.#O(this.#k(e.id,`${O}${F(a.error)}`));let o;try{o=await t.handler(i)}catch(n){return await this.#T(t.name,`calling`,n,i,e),this.#O(this.#k(e.id,F(n)))}let s=this.#O(this.#k(e.id,P(o)));return await this.#C(t.name,i,e,o),s}async agent(e,t=!1){let n=!0;try{if(this.#g(),this.#i===`running`)throw n=!1,Error(`Agent is already running.`);if(t)throw Error(`Agent streaming is not supported in this version.`);this.#D(this.#o.buildUserMessage(typeof e==`string`?{content:[{type:`text`,text:e}]}:e)),this.#A(`running`);for(let e=0;this.#a===void 0||e<this.#a;e+=1){let e=await this.#b();await this.#w(e.messages);for(let t of e.messages)this.#D(t);for(let t of this.#o.parseToolCalls(e.messages))await this.toolCall(t);if(this.#i===`ended`)return[...this.#t]}throw Error(`Agent exceeded maxIterations: ${this.#a}.`)}catch(e){let t=I(e);throw n&&this.#i!==`ended`&&this.#A(`failed`),this.#E(t),e instanceof Error?e:t}}#m(){this.tools??=[];let e=new Set;for(let t of this.tools){if(e.has(t.name))throw Error(`Duplicate tool name: ${t.name}`);e.add(t.name)}}#h(){let e=new Set;for(let t of this.subAgents){if(e.has(t.name))throw Error(`Duplicate sub-agent name: ${t.name}`);e.add(t.name)}}#g(){if(!this.#s)throw Error(`Agent has not been initialized. Call init() before agent().`)}#_(){return[...[k,this.#v(),...this.#r].map(e=>this.#o.buildSystemMessage({content:e})),...this.#t]}#v(){return[`框架技能约束:当正在执行的任务匹配到如下技能手册描述时,必须先调用 get-skill 工具获取对应下标的完整手册内容,然后检查手册内是否有具体工作流;如果匹配到具体工作流,必须按照该工作流执行。`,this.#n.length===0?`当前没有可查询的技能手册,不要调用 get-skill。`:this.#n.map((e,t)=>`技能手册${t}:\n名称:${e.name}\n描述:${e.description}`).join(`
10
+
11
+ `)].join(`
12
+
13
+ `)}#y(){return this.tools.map(e=>{let t={name:e.name};e.parameters&&(t.parameters=e.parameters),e.strict!==void 0&&(t.strict=e.strict);let n=typeof e.description==`function`?e.description({skills:[...this.#n],subAgents:[...this.subAgents],context:[...this.#t],history:[...this.#e],systemPrompts:[...this.#r],tool:t}):e.description;return this.#o.buildToolMessage({name:e.name,description:n,parameters:e.parameters??v(),...e.strict===void 0?{}:{strict:e.strict}})})}async#b(){let e=`Model returned no messages.`;for(let t=0;t<=3;t+=1){let n=await this.#o.generate({context:this.#_(),tools:this.#y()});if(n.messages.length>0)return n;e=`Model returned no messages after ${t+1} attempt(s).`}throw Error(e)}async#x(e,t){let n;try{n=t.arguments.trim().length>0?JSON.parse(t.arguments):{}}catch(n){return await this.#T(e.name,`calling`,n,{},t),{ok:!1,message:F(n)}}let r=(e.parameters??v()).safeParse(n);return r.success?{ok:!0,parameters:r.data}:(await this.#T(e.name,`calling`,r.error,n,t),{ok:!1,message:F(r.error)})}async#S(e,t,n){for(let r of this.#c.filter(t=>t.toolName===e))try{let i=r.callback(t,n);r.options.await?await i:Promise.resolve(i).catch(r=>{this.#T(e,`before`,r,t,n)})}catch(i){if(await this.#T(e,`before`,i,t,n),r.options.errorCancel)return{canceled:!0,error:i}}return{canceled:!1}}async#C(e,t,n,r){for(let i of this.#l.filter(t=>t.toolName===e))try{let a=i.callback(t,n,r);i.options.await?await a:Promise.resolve(a).catch(i=>{this.#T(e,`after`,i,t,n,r)})}catch(i){await this.#T(e,`after`,i,t,n,r)}}async#w(e){for(let t of this.#f)try{await t(e)}catch{}}async#T(e,t,n,r,i,a){for(let o of this.#u)try{await o(e,t,n,r,i,a)}catch{}}#E(e){for(let t of this.#p)try{let n=t(e);Promise.resolve(n).catch(e=>{})}catch{}}#D(e){this.#e.push(e),this.#t.push(e)}#O(e){return this.#D(e),e}#k(e,t){return this.#o.buildToolCallOutputMessage({callId:e,output:t})}#A(e){if(this.#i!==e){this.#i=e;for(let t of this.#d.filter(t=>t.status===e))Promise.resolve(t.callback([...this.#e],[...this.#t])).catch(()=>{})}}};function M(e,t){return e.push(t),()=>{let n=e.indexOf(t);n>=0&&e.splice(n,1)}}function N(e){return{await:e?.await??!1,errorCancel:e?.errorCancel??!1}}function P(e){if(typeof e==`string`)return e;if(e===void 0)return``;try{return JSON.stringify(e)}catch{return String(e)}}function F(e){return e instanceof Error?e.message:P(e)}function I(e){return e instanceof Error?e:Error(String(e))}function L(e){let t=e;return t[A]??=[],t[A]}function R(e,t){let n=e;n[A]=t}function z(e,t){let n=e.toolsDefinition.length===0?` 当前子代理没有声明工具能力。`:e.toolsDefinition.map(B).join(`
14
+ `);return[`子代理${t+1}:`,` 名称:${e.name||`未命名代理`}`,` 描述:${e.description??`未提供描述。`}`,` 工具能力:`,n].join(`
15
+ `)}function B(e,t){return[` - 工具${t+1}:${e.name}`,` 描述:${typeof e.description==`function`?`动态描述,运行时生成。`:e.description}`].join(`
16
+ `)}var V=class{};function H(e){let t=G(U(e));if(t)return t;let n=G(W(e));if(n)return n;throw Error(`Tool parameters must resolve to a JSON object schema.`)}function U(e){try{return(0,u.zodToJsonSchema)(e,{target:`openAi`})}catch{return null}}function W(e){try{return c.z.toJSONSchema(e)}catch{return null}}function G(e){if(!Y(e))return null;let t=J(K(J(e)));return t.type===`object`?t:null}function K(e){let t=e.$ref;if(typeof t!=`string`||!t.startsWith(`#/`))return e;let n=q(e,t);if(!n)return e;let r={...n};return Y(e.definitions)&&!(`definitions`in r)&&(r.definitions=e.definitions),Y(e.$defs)&&!(`$defs`in r)&&(r.$defs=e.$defs),r}function q(e,t){let n=t.slice(2).split(`/`).map(e=>e.replace(/~1/g,`/`).replace(/~0/g,`~`)),r=e;for(let e of n){if(!Y(r))return null;r=r[e]}return Y(r)?r:null}function J(e){let t={...e};return delete t.$schema,t}function Y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var X=class extends V{#e;#t;#n;constructor(e){super();let{client:t,model:n,defaultParams:r,...i}=e;this.#t=n,this.#n=r,this.#e=t??new l.default(i)}async generate(e){let t={...this.#n,model:this.#t,messages:e.context};e.tools.length>0&&(t.tools=e.tools);let n=await this.#e.chat.completions.create(t),r=n.choices[0]?.message;return{messages:r?[r]:[],raw:n}}buildUserMessage(e){return{role:`user`,content:e.content.map(e=>e.type===`text`?{type:`text`,text:e.text}:e),...`name`in e&&e.name?{name:e.name}:{}}}buildSystemMessage(e){return{role:`system`,content:e.content,...`name`in e&&e.name?{name:e.name}:{}}}buildToolCallOutputMessage(e){return{role:`tool`,tool_call_id:e.callId,content:e.output}}buildToolMessage(e){return{type:`function`,function:{name:e.name,description:e.description,parameters:H(e.parameters??v()),...e.strict===void 0?{}:{strict:e.strict}}}}parseUserMessages(e){return e.flatMap(e=>e.role===`user`?[{message:{content:Z(e.content),...e.name?{name:e.name}:{}},sourceMessage:e}]:[])}parseSystemMessages(e){return e.flatMap(e=>e.role===`system`?[{message:{content:Q(e.content),...e.name?{name:e.name}:{}},sourceMessage:e}]:[])}parseAssistantMessages(e){return e.flatMap(e=>{if(e.role!==`assistant`)return[];let t=ee(e.content);return[{message:{content:t.content,...t.refusals.length>0?{refusals:t.refusals}:{},...e.refusal===void 0?{}:{refusal:e.refusal}},sourceMessage:e}]})}parseToolCalls(e){return e.flatMap(e=>e.role===`assistant`?(e.tool_calls??[]).flatMap(t=>t.type===`function`?[{id:t.id,name:t.function.name,arguments:t.function.arguments,sourceMessage:e,sourceCall:t}]:[]):[])}parseToolCallOutputMessages(e){return e.flatMap(e=>e.role===`tool`?[{message:{callId:e.tool_call_id,output:Q(e.content)},sourceMessage:e}]:[])}};function Z(e){return typeof e==`string`?[{type:`text`,text:e}]:e.map(e=>e.type===`text`?{type:`text`,text:e.text}:e)}function Q(e){return typeof e==`string`?e:e.map(e=>e.text).join(``)}function ee(e){return typeof e==`string`?{content:[{type:`text`,text:e}],refusals:[]}:e?{content:e.flatMap(e=>e.type===`text`?[{type:`text`,text:e.text}]:[]),refusals:e.flatMap(e=>e.type===`refusal`?[e.refusal]:[])}:{content:[],refusals:[]}}var te=class extends V{#e;#t;#n;constructor(e){super();let{client:t,model:n,defaultParams:r,...i}=e;this.#t=n,this.#n=r,this.#e=t??new l.default(i)}async generate(e){let t={...this.#n,model:this.#t,input:e.context};e.tools.length>0&&(t.tools=e.tools);let n=await this.#e.responses.create(t);return{messages:n.output,raw:n}}buildUserMessage(e){return{role:`user`,content:e.content.map(e=>e.type===`text`?{type:`input_text`,text:e.text}:e)}}buildSystemMessage(e){return{role:`system`,content:[{type:`input_text`,text:e.content}]}}buildToolCallOutputMessage(e){return{type:`function_call_output`,call_id:e.callId,output:e.output}}buildToolMessage(e){return{type:`function`,name:e.name,description:e.description,parameters:H(e.parameters??v()),...e.strict===void 0?{}:{strict:e.strict}}}parseUserMessages(e){return e.flatMap(e=>$(e,`user`)?[{message:{content:ne(e.content)},sourceMessage:e}]:[])}parseSystemMessages(e){return e.flatMap(e=>$(e,`system`)?[{message:{content:re(e.content)},sourceMessage:e}]:[])}parseAssistantMessages(e){return e.flatMap(e=>e.type!==`message`||e.role!==`assistant`||!(`id`in e)?[]:[{message:{content:e.content.flatMap(e=>e.type===`output_text`?[{type:`text`,text:e.text}]:[]),refusals:e.content.flatMap(e=>e.type===`refusal`?[e.refusal]:[])},sourceMessage:e}])}parseToolCalls(e){return e.flatMap(e=>e.type===`function_call`?[{id:e.call_id,name:e.name,arguments:e.arguments,sourceMessage:e,sourceCall:e}]:[])}parseToolCallOutputMessages(e){return e.flatMap(e=>e.type===`function_call_output`?[{message:{callId:e.call_id,output:e.output},sourceMessage:e}]:[])}async uploadFile(e,t={}){return this.#e.files.create({file:(0,d.createReadStream)(e),purpose:t.purpose??`user_data`})}};function ne(e){return typeof e==`string`?[{type:`text`,text:e}]:e.map(e=>e.type===`input_text`?{type:`text`,text:e.text}:e)}function re(e){return typeof e==`string`?e:e.flatMap(e=>e.type===`input_text`?[e.text]:[]).join(`
17
+ `)}function $(e,t){return`role`in e&&e.role===t&&!(`id`in e)}exports.Agent=j,exports.Model=V,exports.OpenAIChatModel=X,exports.OpenAIResponsesModel=te,exports.Tool=p;
18
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/agent/decorators/index.ts","../src/agent/schema.ts","../src/agent/index.ts","../src/llm/base/index.ts","../src/llm/openai-schema.ts","../src/llm/chat/index.ts","../src/llm/responses/index.ts"],"sourcesContent":["import type { ToolDefinition, ToolRuntimeDefinition } from '../types';\n\nconst toolDefinitionsMetadataKey = Symbol.for('@manee/agent-framework/toolDefinitions');\n\ninterface ToolInitializerReceiver {\n tools?: ToolRuntimeDefinition[];\n}\n\n/**\n * 将 Agent 方法声明为可被模型调用的工具。\n *\n * 装饰器在类级 metadata 中记录 `toolsDefinition` 静态定义,并为每个实例\n * 注册绑定后的运行时 handler。\n */\nexport function Tool(definition: ToolDefinition) {\n return function (value: unknown, context: ClassMethodDecoratorContext) {\n if (context.kind !== 'method' || typeof value !== 'function') {\n throw new Error('@Tool can only decorate methods.');\n }\n\n const method = value as (this: object, parameters: unknown) => unknown | Promise<unknown>;\n\n // 2023-11 decorator metadata 位于类级别;写入前复制继承数组,避免子类工具\n // 污染父类的 `toolsDefinition`。\n registerToolDefinition(context.metadata as Record<PropertyKey, unknown>, {\n ...definition,\n });\n\n // initializer 绑定当前实例,使 private method 也能安全作为运行时工具执行。\n context.addInitializer(function (this: unknown) {\n if (typeof this !== 'object' || this === null) {\n return;\n }\n\n const receiver = this as ToolInitializerReceiver;\n\n receiver.tools ??= [];\n receiver.tools.push({\n ...definition,\n handler: method.bind(receiver),\n });\n });\n };\n}\n\n/** 获取类构造器的静态工具定义浅拷贝,避免外部修改内部定义数组。 */\nexport function getToolDefinitions(target: object): ToolDefinition[] {\n const metadata = (target as Record<PropertyKey, unknown>)[getMetadataSymbol()] as\n | Record<PropertyKey, unknown>\n | undefined;\n const definitions = metadata?.[toolDefinitionsMetadataKey];\n\n return Array.isArray(definitions)\n ? definitions.map((definition) => ({\n ...definition,\n }))\n : [];\n}\n\nfunction registerToolDefinition(\n metadata: Record<PropertyKey, unknown>,\n definition: ToolDefinition,\n): void {\n // 子类第一次写入 metadata 时需要复制父类数组,否则会把子类工具挂到父类上。\n const hasOwnDefinitions = Object.prototype.hasOwnProperty.call(\n metadata,\n toolDefinitionsMetadataKey,\n );\n const currentDefinitions = metadata[toolDefinitionsMetadataKey];\n const definitions =\n hasOwnDefinitions && Array.isArray(currentDefinitions)\n ? currentDefinitions\n : Array.isArray(currentDefinitions)\n ? [...currentDefinitions]\n : [];\n\n definitions.push(definition);\n metadata[toolDefinitionsMetadataKey] = definitions;\n}\n\nfunction getMetadataSymbol(): symbol {\n // 兼容不同运行时对 2023-11 decorator metadata symbol 的实现命名。\n return (\n (Symbol as typeof Symbol & { metadata?: symbol }).metadata ?? Symbol.for('Symbol.metadata')\n );\n}\n","import { z } from 'zod';\n\nimport type { ToolParametersSchema } from './types';\n\nconst emptyParametersSchema = z.object({});\n\n/** 为没有声明参数的工具提供默认空对象 schema,供本地参数校验使用。 */\nexport function getDefaultToolParametersSchema(): ToolParametersSchema {\n return emptyParametersSchema;\n}\n","import { z } from 'zod';\n\nimport { getToolDefinitions, Tool } from './decorators';\nimport { getDefaultToolParametersSchema } from './schema';\nimport type {\n AfterToolCallCallback,\n AgentConstructor,\n AgentErrorCallback,\n AgentOptions,\n AgentProtocol,\n AgentSkill,\n AgentStatus,\n AgentStatusChangedCallback,\n AgentToolCall,\n BeforeToolCallCallback,\n ContextOf,\n ModelResponseCallback,\n ToolOf,\n ToolCallErrorCallback,\n ToolDefinition,\n ToolEventOptions,\n ToolRuntimeDefinition,\n Unsubscribe,\n UserMessageOf,\n} from './types';\n\ninterface ToolEventListener<TCallback> {\n toolName: string;\n callback: TCallback;\n options: Required<ToolEventOptions>;\n}\n\ninterface AgentStatusListener<P extends AgentProtocol> {\n status: AgentStatus;\n callback: AgentStatusChangedCallback<P>;\n}\n\nconst beforeToolErrorPrefix = '函数调用的前置工作出现异常,异常为:';\nconst internalEndAgentPrompt =\n '框架约束:当任务完成时,必须单独调用 end-agent 工具结束任务;不能仅用自然语言回答表示结束,也不能把 end-agent 与其他工具放在同一轮调用。';\n// 装饰器 initializer 早于类字段 initializer 执行,因此借助 symbol-backed\n// 存储和公开访问器保留实例工具,避免工具数组被字段初始化覆盖。\nconst toolsStorageKey: unique symbol = Symbol('agent.tools');\n\ninterface ToolsStorageCarrier {\n [toolsStorageKey]?: ToolRuntimeDefinition[];\n}\n\n/**\n * 运行于 Node.js 的 Agent 主执行器。\n *\n * Agent 管理由模型协议泛型指定的上下文、工具、技能、子代理与生命周期事件。\n * 协议消息的生成和工具调用解析由 `Model<P>` 提供;配置完运行时工具或子代理后,\n * 必须先调用 `init()`,再调用 `agent()` 或 `toolCall()`。\n */\nexport class Agent<P extends AgentProtocol> {\n /**\n * 当前 Agent 实例可调用的运行时工具集合。\n *\n * 装饰器工具会在实例构造阶段自动注册;也可以在 `init()` 前追加仅在本实例\n * 生效的工具。\n */\n get tools(): ToolRuntimeDefinition[] {\n return getToolsStorage(this);\n }\n\n /** 替换当前实例工具集合;替换后需要重新调用 `init()` 进行重复名校验。 */\n set tools(tools: ToolRuntimeDefinition[]) {\n setToolsStorage(this, tools);\n }\n\n #rawContext: ContextOf<P>[] = [];\n #context: ContextOf<P>[] = [];\n #skills: AgentSkill[] = [];\n #systemPrompts: string[] = [];\n #status: AgentStatus = 'idle';\n #maxIterations: number | undefined;\n #llm: AgentOptions<P>['llm'];\n #initialized = false;\n\n #beforeToolListeners: ToolEventListener<BeforeToolCallCallback<P>>[] = [];\n #afterToolListeners: ToolEventListener<AfterToolCallCallback<P>>[] = [];\n #toolCallErrorListeners: ToolCallErrorCallback<P>[] = [];\n #statusListeners: AgentStatusListener<P>[] = [];\n #modelResponseListeners: ModelResponseCallback<P>[] = [];\n\n #agentErrorListeners: AgentErrorCallback[] = [];\n\n /** 该类作为子代理暴露时使用的人类可读说明。 */\n static description?: string;\n\n /** 可由内置 `agent` 工具调度的子代理类集合。 */\n subAgents: AgentConstructor<P>[] = [];\n\n /** 当前类及其父类通过装饰器声明的静态工具定义。 */\n static get toolsDefinition(): readonly ToolDefinition[] {\n return getToolDefinitions(this);\n }\n\n @Tool({\n name: 'agent',\n description: ({ subAgents }) => {\n const agentList =\n subAgents.length === 0\n ? '当前没有可调度的子代理。'\n : subAgents.map(formatSubAgentDescription).join('\\n\\n');\n\n return [\n '这是一个子代理调度工具,当你需要调用一个子代理来完成某个任务时,请使用这个工具。调用时请在参数中说明需要调用的子代理名称和输入子代理的内容。',\n '每次调度同一子代理都是全新的代理,并且可以同时调度多个相同子代理。',\n '调度子代理时,需要指定任务的描述,以及需要子代理最后汇报你的东西的描述。比如如果是一个任务,那需要汇报你任务的报告;如果是需要一个问题的答案,则是问题的回答。',\n '以下是当前可用的子代理列表:',\n agentList,\n ].join('\\n\\n');\n },\n parameters: z.object({\n agentName: z.string().describe('要调用的子代理名称'),\n input: z.string().describe('输入子代理的内容'),\n outputDescription: z\n .string()\n .describe('需要让子代理最后交付你的东西的描述,比如任务的报告、问题的回答'),\n }),\n })\n async #toolSubAgent(parameters: unknown): Promise<string> {\n // `agent` 工具的 handler 只接收一个参数对象,便于所有协议共用同一套调用约定。\n const { agentName, input, outputDescription } = parameters as {\n agentName: string;\n input: string;\n outputDescription: string;\n };\n const TargetAgent = this.subAgents.find((agent) => agent.name === agentName);\n\n if (!TargetAgent) {\n return `没有找到名称为 ${agentName} 的子代理。`;\n }\n\n let agentResult: string | undefined;\n const BaseSubAgent = TargetAgent as unknown as new (options: AgentOptions<P>) => Agent<P>;\n\n // 为本次调度创建临时子类,仅向这一轮子代理执行暴露 `agent-result`。\n class RuntimeSubAgent extends BaseSubAgent {\n @Tool({\n name: 'agent-result',\n description: `这是一个结果汇报工具,你需要在完成任务后调用这个工具把结果汇报回来`,\n parameters: z.object({\n result: z.string().describe(outputDescription),\n }),\n })\n #reportResult(parameters: unknown): string {\n const { result } = parameters as { result: string };\n\n agentResult = result;\n return result;\n }\n }\n\n // 子代理复用模型适配器,但拥有独立上下文,并在启动前走同样的配置校验。\n const subAgent = new RuntimeSubAgent({\n llm: this.#llm,\n systemPrompts: [\n `你现在是被主代理调度的子代理:${agentName}。`,\n `主代理输入给你的任务:\\n${input}`,\n [\n '完成任务后,调用 end-agent 前必须先调用 agent-result 工具把结果汇报回来。',\n `agent-result.result 必须满足如下交付描述:\\n${outputDescription}`,\n ].join('\\n'),\n ],\n });\n\n subAgent.init();\n await subAgent.agent(input);\n\n return agentResult ?? '子代理已结束但未通过 agent-result 汇报结果。';\n }\n\n /** 使用模型适配器及可选运行配置创建 Agent 实例。 */\n constructor(options: AgentOptions<P>) {\n this.#llm = options.llm;\n this.#maxIterations = options.maxIterations;\n this.#context = [...(options.initContext ?? options.initRawContext ?? [])];\n this.#rawContext = [...(options.initRawContext ?? options.initContext ?? [])];\n this.tools ??= [];\n this.subAgents = [...(options.subAgents ?? [])];\n\n if (\n this.#maxIterations !== undefined &&\n (this.#maxIterations < 1 || !Number.isInteger(this.#maxIterations))\n ) {\n throw new Error('maxIterations must be a positive integer.');\n }\n\n this.addSkill(...(options.skills ?? []));\n this.addSystemPrompts(...(options.systemPrompts ?? []));\n }\n\n /** 获取完整历史记录;返回的数组为浅拷贝。 */\n getHistory(): readonly ContextOf<P>[] {\n return [...this.#rawContext];\n }\n\n /** 获取模型请求使用的活动上下文,不包含临时注入的内部系统提示词。 */\n getContext(): readonly ContextOf<P>[] {\n return [...this.#context];\n }\n\n /**\n * 校验运行时配置并将 Agent 标记为已初始化。\n *\n * 修改 `tools` 或 `subAgents` 后应重新调用本方法;重复调用只重新校验配置,\n * 不会清空历史或事件监听。\n */\n init(): this {\n this.#initialized = false;\n this.#assertUniqueToolNames();\n this.#assertUniqueSubAgentNames();\n this.#initialized = true;\n\n return this;\n }\n\n /** 追加非空系统提示词;请求模型时它们排在框架内部提示词之后。 */\n addSystemPrompts(...prompts: string[]): this {\n for (const prompt of prompts) {\n if (prompt.trim().length > 0) {\n this.#systemPrompts.push(prompt);\n }\n }\n\n return this;\n }\n\n /** 追加技能手册;新增技能会从下一次模型请求开始对模型可见。 */\n addSkill(...skills: AgentSkill[]): this {\n this.#skills.push(...skills);\n return this;\n }\n\n /** 向完整历史和活动上下文同时追加文本或多模态消息。 */\n appendContext(message: ContextOf<P>): this {\n this.#appendMessage(message);\n return this;\n }\n\n /** 在任一模型返回消息写入上下文前,监听该轮完整消息数组。 */\n onModelResponse(callback: ModelResponseCallback<P>): Unsubscribe {\n return addListener(this.#modelResponseListeners, callback);\n }\n\n /** 监听指定工具的调用前阶段;可通过 options 等待回调或在异常时取消调用。 */\n onBeforeToolCall(\n toolName: string,\n callback: BeforeToolCallCallback<P>,\n options?: ToolEventOptions,\n ): Unsubscribe {\n return addListener(this.#beforeToolListeners, {\n toolName,\n callback,\n options: normalizeToolEventOptions(options),\n });\n }\n\n /** 监听指定工具处理器返回后的阶段;回调异常会上报,但不会中断主流程。 */\n onAfterToolCall(\n toolName: string,\n callback: AfterToolCallCallback<P>,\n options?: ToolEventOptions,\n ): Unsubscribe {\n return addListener(this.#afterToolListeners, {\n toolName,\n callback,\n options: normalizeToolEventOptions(options),\n });\n }\n\n /** 监听工具在 `before`、`calling` 或 `after` 阶段发生的异常。 */\n onToolCallError(callback: ToolCallErrorCallback<P>): Unsubscribe {\n return addListener(this.#toolCallErrorListeners, callback);\n }\n\n /** 监听 Agent 进入指定状态的事件。 */\n onAgentStatusChanged(status: AgentStatus, callback: AgentStatusChangedCallback<P>): Unsubscribe {\n return addListener(this.#statusListeners, {\n status,\n callback,\n });\n }\n\n /** 监听 `agent()` 抛出的错误;listener 自身异常不会影响 Agent 状态。 */\n onAgentError(callback: AgentErrorCallback): Unsubscribe {\n return addListener(this.#agentErrorListeners, callback);\n }\n\n @Tool({\n name: 'get-skill',\n description: '获取指定下标的技能手册完整内容。',\n parameters: z.object({\n index: z.number().int().nonnegative(),\n }),\n })\n #getSkill(parameters: unknown): string {\n // 技能列表通过 system prompt 暴露索引,工具只负责按索引返回完整手册。\n const { index } = parameters as { index: number };\n const skill = this.#skills[index];\n\n if (!skill) {\n return `没有找到下标为 ${index} 的技能手册。`;\n }\n\n const parts = [\n `手册标题:${skill.name}`,\n `手册描述:${skill.description}`,\n skill.systemContent ? `全局适用内容:${skill.systemContent}` : '',\n ...(skill.sops ?? []).map((sop, sopIndex) =>\n [`工作流${sopIndex + 1}:${sop.description}`, `执行流程:\\n${sop.content}`].join('\\n'),\n ),\n ].filter((part) => part.length > 0);\n\n return parts.join('\\n\\n');\n }\n\n @Tool({\n name: 'end-agent',\n description:\n '当你认为你已经彻底完成了用户交代的任务,并且不需要更多信息时,请调用这个工具。该工具必须在任务确定结束时单独调用,不能跟其他工具一起调用。',\n })\n #endAgent(): string {\n // Agent 的结束条件集中在该内置工具中,避免自然语言回答误判为完成。\n this.#changeStatus('ended');\n return 'Agent 已结束。';\n }\n\n /**\n * 执行一个已解析的模型函数调用,并返回本地结果 item。\n *\n * 成功结果会先由 Model 构建并写入上下文,再触发 after listener,使 listener\n * 追加的消息排在对应工具结果之后。\n */\n async toolCall(callInfo: AgentToolCall<P>): Promise<ContextOf<P>> {\n this.#assertInitialized();\n\n const tool = this.tools.find((candidate) => candidate.name === callInfo.name);\n const fallbackParameters: unknown = {};\n\n if (!tool) {\n const error = new Error(`Unknown tool: ${callInfo.name}`);\n await this.#emitToolCallError(callInfo.name, 'calling', error, fallbackParameters, callInfo);\n return this.#appendToolMessage(\n this.#createToolMessage(callInfo.id, normalizeErrorMessage(error)),\n );\n }\n\n const parsedArguments = await this.#parseToolArguments(tool, callInfo);\n\n if (!parsedArguments.ok) {\n return this.#appendToolMessage(this.#createToolMessage(callInfo.id, parsedArguments.message));\n }\n\n const parameters = parsedArguments.parameters;\n const beforeResult = await this.#runBeforeToolListeners(tool.name, parameters, callInfo);\n\n if (beforeResult.canceled) {\n return this.#appendToolMessage(\n this.#createToolMessage(\n callInfo.id,\n `${beforeToolErrorPrefix}${normalizeErrorMessage(beforeResult.error)}`,\n ),\n );\n }\n\n let result: unknown;\n\n try {\n result = await tool.handler(parameters);\n } catch (error) {\n await this.#emitToolCallError(tool.name, 'calling', error, parameters, callInfo);\n return this.#appendToolMessage(\n this.#createToolMessage(callInfo.id, normalizeErrorMessage(error)),\n );\n }\n\n const resultMessage = this.#appendToolMessage(\n this.#createToolMessage(callInfo.id, serializeToolResult(result)),\n );\n\n await this.#runAfterToolListeners(tool.name, parameters, callInfo, result);\n\n return resultMessage;\n }\n\n /**\n * 启动 Agent 任务循环。\n *\n * 每轮先原样保存模型返回的协议消息,再执行 Model 反解析出的工具调用。\n * 只有内置 `end-agent` 工具把状态改为 `ended` 后任务才结束;当前版本\n * 尚不支持流式调用。\n */\n async agent(input: string | UserMessageOf<P>, stream = false): Promise<ContextOf<P>[]> {\n let shouldFailOnError = true;\n\n try {\n this.#assertInitialized();\n\n if (this.#status === 'running') {\n shouldFailOnError = false;\n throw new Error('Agent is already running.');\n }\n\n if (stream) {\n throw new Error('Agent streaming is not supported in this version.');\n }\n\n this.#appendMessage(\n this.#llm.buildUserMessage(\n typeof input === 'string'\n ? {\n content: [{ type: 'text', text: input }],\n }\n : input,\n ),\n );\n\n this.#changeStatus('running');\n\n for (\n let iteration = 0;\n this.#maxIterations === undefined || iteration < this.#maxIterations;\n iteration += 1\n ) {\n const response = await this.#generateWithEmptyMessagesRetry();\n\n await this.#emitModelResponse(response.messages);\n\n // 模型消息可能带有提供方元数据,必须整批原样保存后再执行本地工具。\n for (const message of response.messages) {\n this.#appendMessage(message);\n }\n\n for (const call of this.#llm.parseToolCalls(response.messages)) {\n await this.toolCall(call);\n }\n\n if (this.#status === 'ended') {\n return [...this.#context];\n }\n }\n\n throw new Error(`Agent exceeded maxIterations: ${this.#maxIterations}.`);\n } catch (error) {\n const agentError = toError(error);\n\n if (shouldFailOnError && this.#status !== 'ended') {\n this.#changeStatus('failed');\n }\n\n this.#emitAgentError(agentError);\n\n throw error instanceof Error ? error : agentError;\n }\n }\n\n #assertUniqueToolNames(): void {\n // 显式 init 阶段统一做配置校验,运行时不在每轮请求重复扫描。\n this.tools ??= [];\n const seen = new Set<string>();\n\n for (const tool of this.tools) {\n if (seen.has(tool.name)) {\n throw new Error(`Duplicate tool name: ${tool.name}`);\n }\n\n seen.add(tool.name);\n }\n }\n\n #assertUniqueSubAgentNames(): void {\n // 子代理通过 static name 被模型选择,因此同一父代理内必须唯一。\n const seen = new Set<string>();\n\n for (const agent of this.subAgents) {\n if (seen.has(agent.name)) {\n throw new Error(`Duplicate sub-agent name: ${agent.name}`);\n }\n\n seen.add(agent.name);\n }\n }\n\n #assertInitialized(): void {\n // 直接调用 toolCall() 也需要初始化,因为运行时工具可能由外部数组追加。\n if (!this.#initialized) {\n throw new Error('Agent has not been initialized. Call init() before agent().');\n }\n }\n\n #buildContextForModel(): ContextOf<P>[] {\n // 框架协议提示词仅在请求模型时临时前置,不写入 context/history。\n const systemMessages = [\n internalEndAgentPrompt,\n this.#buildSkillPrompt(),\n ...this.#systemPrompts,\n ].map((content) => this.#llm.buildSystemMessage({ content }));\n\n return [...systemMessages, ...this.#context];\n }\n\n #buildSkillPrompt(): string {\n // 技能选择指引放在 system prompt 中,让 `get-skill` 的工具描述保持精简。\n const skillList =\n this.#skills.length === 0\n ? '当前没有可查询的技能手册,不要调用 get-skill。'\n : this.#skills\n .map(\n (skill, index) =>\n `技能手册${index}:\\n名称:${skill.name}\\n描述:${skill.description}`,\n )\n .join('\\n\\n');\n\n return [\n '框架技能约束:当正在执行的任务匹配到如下技能手册描述时,必须先调用 get-skill 工具获取对应下标的完整手册内容,然后检查手册内是否有具体工作流;如果匹配到具体工作流,必须按照该工作流执行。',\n skillList,\n ].join('\\n\\n');\n }\n\n #buildToolsForModel(): ToolOf<P>[] {\n return this.tools.map((tool) => {\n // 动态 description 只能看到协议无关上下文,避免装饰器 API 绑定具体 Model。\n const toolContext: {\n name: string;\n parameters?: NonNullable<ToolRuntimeDefinition['parameters']>;\n strict?: boolean;\n } = {\n name: tool.name,\n };\n\n if (tool.parameters) {\n toolContext.parameters = tool.parameters;\n }\n\n if (tool.strict !== undefined) {\n toolContext.strict = tool.strict;\n }\n\n const description =\n typeof tool.description === 'function'\n ? tool.description({\n skills: [...this.#skills],\n subAgents: [\n ...this.subAgents,\n ] as unknown as readonly AgentConstructor<AgentProtocol>[],\n context: [...this.#context],\n history: [...this.#rawContext],\n systemPrompts: [...this.#systemPrompts],\n tool: toolContext,\n })\n : tool.description;\n\n return this.#llm.buildToolMessage({\n name: tool.name,\n description,\n parameters: tool.parameters ?? getDefaultToolParametersSchema(),\n ...(tool.strict === undefined ? {} : { strict: tool.strict }),\n });\n });\n }\n\n async #generateWithEmptyMessagesRetry() {\n // 只重试“成功响应但没有消息”的情况;网络/API 异常由外层 catch 统一处理。\n let lastResponseText = 'Model returned no messages.';\n\n for (let attempt = 0; attempt <= 3; attempt += 1) {\n const response = await this.#llm.generate({\n context: this.#buildContextForModel(),\n tools: this.#buildToolsForModel(),\n });\n\n if (response.messages.length > 0) {\n return response;\n }\n\n lastResponseText = `Model returned no messages after ${attempt + 1} attempt(s).`;\n }\n\n throw new Error(lastResponseText);\n }\n\n async #parseToolArguments(\n tool: ToolRuntimeDefinition,\n callInfo: AgentToolCall<P>,\n ): Promise<\n | {\n ok: true;\n parameters: unknown;\n }\n | {\n ok: false;\n message: string;\n }\n > {\n let rawParameters: unknown;\n\n // 模型输出必须是 JSON 字符串;解析失败时把错误作为工具结果交回模型处理。\n try {\n rawParameters = callInfo.arguments.trim().length > 0 ? JSON.parse(callInfo.arguments) : {};\n } catch (error) {\n await this.#emitToolCallError(tool.name, 'calling', error, {}, callInfo);\n return {\n ok: false,\n message: normalizeErrorMessage(error),\n };\n }\n\n const schema = tool.parameters ?? getDefaultToolParametersSchema();\n const parsed = schema.safeParse(rawParameters);\n\n // Zod 校验失败同样不终止 Agent,而是写入工具结果让模型自行修正参数。\n if (!parsed.success) {\n await this.#emitToolCallError(tool.name, 'calling', parsed.error, rawParameters, callInfo);\n return {\n ok: false,\n message: normalizeErrorMessage(parsed.error),\n };\n }\n\n return {\n ok: true,\n parameters: parsed.data,\n };\n }\n\n async #runBeforeToolListeners(\n toolName: string,\n parameters: unknown,\n message: AgentToolCall<P>,\n ): Promise<\n | {\n canceled: true;\n error: unknown;\n }\n | {\n canceled: false;\n }\n > {\n for (const listener of this.#beforeToolListeners.filter((item) => item.toolName === toolName)) {\n try {\n const result = listener.callback(parameters, message);\n\n if (listener.options.await) {\n await result;\n } else {\n void Promise.resolve(result).catch((error: unknown) => {\n void this.#emitToolCallError(toolName, 'before', error, parameters, message);\n });\n }\n } catch (error) {\n await this.#emitToolCallError(toolName, 'before', error, parameters, message);\n\n // 只有 before listener 可以通过异常取消真实工具调用。\n if (listener.options.errorCancel) {\n return {\n canceled: true,\n error,\n };\n }\n }\n }\n\n return {\n canceled: false,\n };\n }\n\n async #runAfterToolListeners(\n toolName: string,\n parameters: unknown,\n message: AgentToolCall<P>,\n result: unknown,\n ): Promise<void> {\n for (const listener of this.#afterToolListeners.filter((item) => item.toolName === toolName)) {\n try {\n const callbackResult = listener.callback(parameters, message, result);\n\n if (listener.options.await) {\n await callbackResult;\n } else {\n void Promise.resolve(callbackResult).catch((error: unknown) => {\n void this.#emitToolCallError(toolName, 'after', error, parameters, message, result);\n });\n }\n } catch (error) {\n // after listener 的失败可以被观察,但不能中断 Agent 主循环。\n await this.#emitToolCallError(toolName, 'after', error, parameters, message, result);\n }\n }\n }\n\n async #emitModelResponse(messages: readonly ContextOf<P>[]): Promise<void> {\n for (const listener of this.#modelResponseListeners) {\n try {\n await listener(messages);\n } catch {\n // 模型响应 listener 仅用于观察,不应打断 Agent 主循环。\n }\n }\n }\n\n async #emitToolCallError(\n name: string,\n triggerType: 'before' | 'calling' | 'after',\n error: unknown,\n parameters: unknown,\n message: AgentToolCall<P>,\n result?: unknown,\n ): Promise<void> {\n for (const listener of this.#toolCallErrorListeners) {\n try {\n await listener(name, triggerType, error, parameters, message, result);\n } catch {\n // 工具错误 listener 仅用于观察,不应产生新的工具错误。\n }\n }\n }\n\n #emitAgentError(error: Error): void {\n for (const listener of this.#agentErrorListeners) {\n try {\n const result = listener(error);\n\n void Promise.resolve(result).catch((listenerError: unknown) => {\n void listenerError;\n // 错误 listener 属于非阻塞观察者;暂不向控制台重复输出其异常。\n });\n } catch (listenerError) {\n void listenerError;\n // Agent 错误 listener 仅用于观察,不应制造新的 Agent 错误。\n }\n }\n }\n\n #appendMessage(message: ContextOf<P>): void {\n this.#rawContext.push(message);\n this.#context.push(message);\n }\n\n #appendToolMessage(message: ContextOf<P>): ContextOf<P> {\n this.#appendMessage(message);\n return message;\n }\n\n #createToolMessage(callId: string, output: string): ContextOf<P> {\n return this.#llm.buildToolCallOutputMessage({\n callId,\n output,\n });\n }\n\n #changeStatus(status: AgentStatus): void {\n if (this.#status === status) {\n return;\n }\n\n this.#status = status;\n\n for (const listener of this.#statusListeners.filter((item) => item.status === status)) {\n void Promise.resolve(listener.callback([...this.#rawContext], [...this.#context])).catch(\n () => {\n // 状态 listener 仅用于观察,不应打断状态迁移。\n },\n );\n }\n }\n}\n\nfunction addListener<TListener>(listeners: TListener[], listener: TListener): Unsubscribe {\n // 所有事件注册都返回轻量 unsubscribe,避免调用方持有内部数组引用。\n listeners.push(listener);\n\n return () => {\n const index = listeners.indexOf(listener);\n\n if (index >= 0) {\n listeners.splice(index, 1);\n }\n };\n}\n\nfunction normalizeToolEventOptions(options?: ToolEventOptions): Required<ToolEventOptions> {\n // 默认 observer 不阻塞主流程,也不会因 before 异常取消真实工具调用。\n return {\n await: options?.await ?? false,\n errorCancel: options?.errorCancel ?? false,\n };\n}\n\nfunction serializeToolResult(result: unknown): string {\n // 工具 handler 可以返回对象;Agent 统一序列化为协议工具结果可传输的字符串。\n if (typeof result === 'string') {\n return result;\n }\n\n if (result === undefined) {\n return '';\n }\n\n try {\n return JSON.stringify(result);\n } catch {\n return String(result);\n }\n}\n\nfunction normalizeErrorMessage(error: unknown): string {\n // 写入模型上下文的错误需要保持短文本,避免暴露多余堆栈。\n if (error instanceof Error) {\n return error.message;\n }\n\n return serializeToolResult(error);\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getToolsStorage(agent: object): ToolRuntimeDefinition[] {\n // 若装饰器 initializer 尚未写入 symbol slot,则按需创建实例工具数组。\n const carrier = agent as ToolsStorageCarrier;\n\n carrier[toolsStorageKey] ??= [];\n\n return carrier[toolsStorageKey];\n}\n\nfunction setToolsStorage(agent: object, tools: ToolRuntimeDefinition[]): void {\n // 使用 symbol slot 避免用户声明同名 public 字段时覆盖装饰器注册结果。\n const carrier = agent as ToolsStorageCarrier;\n\n carrier[toolsStorageKey] = tools;\n}\n\nfunction formatSubAgentDescription(agent: AgentConstructor<AgentProtocol>, index: number): string {\n // 子代理描述只使用 static metadata,不需要实例化子代理读取工具定义。\n const toolList =\n agent.toolsDefinition.length === 0\n ? ' 当前子代理没有声明工具能力。'\n : agent.toolsDefinition.map(formatStaticToolDescription).join('\\n');\n\n return [\n `子代理${index + 1}:`,\n ` 名称:${agent.name || '未命名代理'}`,\n ` 描述:${agent.description ?? '未提供描述。'}`,\n ' 工具能力:',\n toolList,\n ].join('\\n');\n}\n\nfunction formatStaticToolDescription(tool: ToolDefinition, index: number): string {\n // 动态工具描述依赖运行时上下文,静态 toolsDefinition 中只能提示其为运行时生成。\n return [\n ` - 工具${index + 1}:${tool.name}`,\n ` 描述:${typeof tool.description === 'function' ? '动态描述,运行时生成。' : tool.description}`,\n ].join('\\n');\n}\n\nexport { Tool };\nexport type * from './types';\n","import type {\n AgentBaseSystemMessage,\n AgentBaseToolCallOutputMessage,\n AgentBaseUserMessage,\n AgentParsedMessage,\n AgentProtocol,\n AgentToolCall,\n AgentToolDefinitionInput,\n AssistantMessageOf,\n ContextOf,\n SystemMessageOf,\n ToolCallOutputMessageOf,\n ToolOf,\n UserMessageOf,\n} from '../../agent/types';\nimport type { ModelGenerateRequest, ModelGenerateResult } from './types';\n\nexport type { ModelGenerateRequest, ModelGenerateResult } from './types';\n\n/**\n * Agent 使用的协议适配器抽象基类。\n *\n * builder 将 Agent 基础结构转换为协议消息,parser 从混合上下文中筛选并反解析目标消息,\n * `generate()` 负责实际模型请求。\n */\nexport abstract class Model<P extends AgentProtocol> {\n /**\n * 执行一轮非流式模型调用。\n *\n * `context` 和 `tools` 已经由 Agent 通过本 Model 的 builder 转成目标协议结构;\n * 返回的 `messages` 会被 Agent 原样写入上下文,并继续交给 parser 提取工具调用。\n */\n abstract generate(request: ModelGenerateRequest<P>): Promise<ModelGenerateResult<P>>;\n\n /**\n * 将 Agent 的基础用户消息或协议专属用户消息构建为可持久保存的上下文项。\n *\n * 字符串任务会先被 Agent 包装为 `{ type: \"text\" }` 内容块,再进入本方法。\n */\n abstract buildUserMessage(input: AgentBaseUserMessage | UserMessageOf<P>): ContextOf<P>;\n\n /**\n * 将框架内部提示词或调用方 system prompt 构建为协议 system 上下文项。\n *\n * Agent 每轮请求都会临时构建这些消息,但不会把它们写入持久 context/history。\n */\n abstract buildSystemMessage(input: AgentBaseSystemMessage | SystemMessageOf<P>): ContextOf<P>;\n\n /**\n * 将本地工具执行结果构建为协议工具结果消息。\n *\n * Agent 只提供通用的 `callId + output` 语义;具体 wire 字段由协议适配器决定。\n */\n abstract buildToolCallOutputMessage(\n input: AgentBaseToolCallOutputMessage | ToolCallOutputMessageOf<P>,\n ): ContextOf<P>;\n\n /**\n * 将框架工具定义构建为模型 API 接收的工具声明。\n *\n * `strict` 仅在工具显式设置时出现;schema 的 OpenAI-compatible 转换也应在 Model 层完成。\n */\n abstract buildToolMessage(input: AgentToolDefinitionInput): ToolOf<P>;\n\n /**\n * 从混合上下文中筛选用户消息并反解析为协议用户消息结构。\n *\n * 不匹配的上下文项必须被跳过,解析结果需要保留原始 `sourceMessage`。\n */\n abstract parseUserMessages(\n context: readonly ContextOf<P>[],\n ): readonly AgentParsedMessage<UserMessageOf<P>, ContextOf<P>>[];\n\n /**\n * 从混合上下文中筛选 system 消息并反解析。\n *\n * 主要供应用调试、恢复历史和自定义模型适配器测试使用。\n */\n abstract parseSystemMessages(\n context: readonly ContextOf<P>[],\n ): readonly AgentParsedMessage<SystemMessageOf<P>, ContextOf<P>>[];\n\n /**\n * 从混合上下文中筛选 assistant 文本/拒绝等普通输出。\n *\n * provider 专属推理项可以保留在原始 context 中,不必强行映射到 assistant 消息。\n */\n abstract parseAssistantMessages(\n context: readonly ContextOf<P>[],\n ): readonly AgentParsedMessage<AssistantMessageOf<P>, ContextOf<P>>[];\n\n /**\n * 从一批模型返回消息中按协议顺序提取本地可执行的工具调用。\n *\n * Chat 协议中一条 assistant message 可能展开多个调用;Responses 通常一条 item\n * 对应一个调用。返回项需要携带原始 `sourceCall`。\n */\n abstract parseToolCalls(context: readonly ContextOf<P>[]): readonly AgentToolCall<P>[];\n\n /**\n * 从混合上下文中筛选工具结果消息并反解析。\n *\n * 该方法不参与 Agent 主循环,但用于外部审计、测试和恢复上下文。\n */\n abstract parseToolCallOutputMessages(\n context: readonly ContextOf<P>[],\n ): readonly AgentParsedMessage<ToolCallOutputMessageOf<P>, ContextOf<P>>[];\n}\n","import { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\n\nimport type { JsonObject, ToolParametersSchema } from '../agent/types';\n\n/** 将框架工具 schema 转换为 OpenAI-compatible function tool 参数定义。 */\nexport function toOpenAIToolParameters(schema: ToolParametersSchema): JsonObject {\n const converted = normalizeRootSchema(convertWithZodToJsonSchema(schema));\n\n if (converted) {\n return converted;\n }\n\n const native = normalizeRootSchema(convertWithNativeZod(schema));\n\n if (native) {\n return native;\n }\n\n throw new Error('Tool parameters must resolve to a JSON object schema.');\n}\n\nfunction convertWithZodToJsonSchema(schema: ToolParametersSchema): unknown {\n // zod-to-json-schema 对 Zod v3/v4 兼容路径更成熟,优先尝试 OpenAI target。\n try {\n return zodToJsonSchema(schema as never, {\n target: 'openAi',\n });\n } catch {\n return null;\n }\n}\n\nfunction convertWithNativeZod(schema: ToolParametersSchema): unknown {\n // 若 zod-to-json-schema 无法处理当前 schema,再回退到 Zod 自带 JSON Schema 输出。\n try {\n return z.toJSONSchema(schema as never);\n } catch {\n return null;\n }\n}\n\nfunction normalizeRootSchema(schema: unknown): JsonObject | null {\n // OpenAI tool parameters 必须是 object;所有 ref/$schema 清理都限制在 wire 层。\n if (!isJsonObject(schema)) {\n return null;\n }\n\n const root = stripSchemaKeyword(schema);\n const resolved = resolveLocalRootRef(root);\n const normalized = stripSchemaKeyword(resolved);\n\n // OpenAI function tool 的参数必须以 object 为根;此处隔离 wire 层限制。\n if (normalized.type !== 'object') {\n return null;\n }\n\n return normalized;\n}\n\nfunction resolveLocalRootRef(schema: JsonObject): JsonObject {\n // zod-to-json-schema 可能把根对象写成本地 $ref,这里只解析根级本地引用。\n const ref = schema.$ref;\n\n if (typeof ref !== 'string' || !ref.startsWith('#/')) {\n return schema;\n }\n\n const resolved = findLocalRef(schema, ref);\n\n if (!resolved) {\n return schema;\n }\n\n const next: JsonObject = {\n ...resolved,\n };\n\n if (isJsonObject(schema.definitions) && !('definitions' in next)) {\n next.definitions = schema.definitions;\n }\n\n if (isJsonObject(schema.$defs) && !('$defs' in next)) {\n next.$defs = schema.$defs;\n }\n\n return next;\n}\n\nfunction findLocalRef(schema: JsonObject, ref: string): JsonObject | null {\n // JSON Pointer 中的 ~1 和 ~0 需要按规范反转义。\n const path = ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'));\n\n let current: unknown = schema;\n\n for (const part of path) {\n if (!isJsonObject(current)) {\n return null;\n }\n\n current = current[part];\n }\n\n return isJsonObject(current) ? current : null;\n}\n\nfunction stripSchemaKeyword(schema: JsonObject): JsonObject {\n // OpenAI tool schema 不需要顶层 $schema,保留会增加 provider 兼容风险。\n const next: JsonObject = {\n ...schema,\n };\n\n delete next.$schema;\n\n return next;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import OpenAI from 'openai';\nimport type {\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources/chat/completions/completions';\n\nimport { getDefaultToolParametersSchema } from '../../agent/schema';\nimport type {\n AgentBaseSystemMessage,\n AgentBaseToolCallOutputMessage,\n AgentBaseUserMessage,\n AgentParsedMessage,\n AgentTextPart,\n AgentToolCall,\n AgentToolDefinitionInput,\n} from '../../agent/types';\nimport { Model, type ModelGenerateRequest, type ModelGenerateResult } from '../base';\nimport { toOpenAIToolParameters } from '../openai-schema';\nimport type {\n OpenAIChatAssistantContextMessage,\n OpenAIChatAssistantMessage,\n OpenAIChatContext,\n OpenAIChatModelOptions,\n OpenAIChatProtocol,\n OpenAIChatSystemMessage,\n OpenAIChatTextPart,\n OpenAIChatTool,\n OpenAIChatToolCallOutputMessage,\n OpenAIChatUserContentPart,\n OpenAIChatUserContextMessage,\n OpenAIChatUserMessage,\n} from './types';\n\nexport type * from './types';\n\n/**\n * OpenAI-compatible Chat Completions 模型适配器。\n *\n * 该类把 Agent 的协议无关消息转换为 Chat `messages` / `tools`,并从\n * assistant `tool_calls[]` 中反解析本地工具调用。它只支持新版 tool calling\n * 闭环,不再暴露 deprecated `function_call` / `function` role。\n */\nexport class OpenAIChatModel extends Model<OpenAIChatProtocol> {\n #openai: OpenAI;\n #model: string;\n #defaultParams: OpenAIChatModelOptions['defaultParams'];\n\n /**\n * 创建 Chat Completions 适配器。\n *\n * 可以直接传入 OpenAI SDK `ClientOptions`,也可以通过 `client` 注入已配置好的\n * SDK 实例;`defaultParams` 会透传到每次非流式 Chat 请求。\n */\n constructor(options: OpenAIChatModelOptions) {\n super();\n\n const { client, model, defaultParams, ...clientOptions } = options;\n\n this.#model = model;\n this.#defaultParams = defaultParams;\n this.#openai = client ?? new OpenAI(clientOptions);\n }\n\n /**\n * 调用 Chat Completions,并将首个 choice 的 assistant message 原样返回给 Agent。\n *\n * 如果服务端成功响应但没有 choice,返回空数组,由 Agent 负责空响应重试。\n */\n async generate(\n request: ModelGenerateRequest<OpenAIChatProtocol>,\n ): Promise<ModelGenerateResult<OpenAIChatProtocol>> {\n const params: ChatCompletionCreateParamsNonStreaming = {\n ...this.#defaultParams,\n model: this.#model,\n messages: request.context as unknown as ChatCompletionMessageParam[],\n };\n\n if (request.tools.length > 0) {\n params.tools = request.tools as unknown as ChatCompletionTool[];\n }\n\n const response = await this.#openai.chat.completions.create(params);\n const message = response.choices[0]?.message;\n\n return {\n messages: message ? [message as unknown as OpenAIChatContext] : [],\n raw: response,\n };\n }\n\n /**\n * 构建 Chat user message。\n *\n * Agent 基础文本 part 会转换为 Chat `text` part;协议专属的 `image_url`、\n * `input_audio`、`file` part 会被原样保留。\n */\n buildUserMessage(input: AgentBaseUserMessage | OpenAIChatUserMessage): OpenAIChatContext {\n return {\n role: 'user',\n content: input.content.map((part) =>\n part.type === 'text'\n ? {\n type: 'text',\n text: part.text,\n }\n : part,\n ),\n ...('name' in input && input.name ? { name: input.name } : {}),\n };\n }\n\n /** 构建 Chat system message,保留可选 `name` 字段。 */\n buildSystemMessage(input: AgentBaseSystemMessage | OpenAIChatSystemMessage): OpenAIChatContext {\n return {\n role: 'system',\n content: input.content,\n ...('name' in input && input.name ? { name: input.name } : {}),\n };\n }\n\n /** 构建 Chat `tool` role 消息,用于把本地工具结果回传给对应 `tool_call_id`。 */\n buildToolCallOutputMessage(\n input: AgentBaseToolCallOutputMessage | OpenAIChatToolCallOutputMessage,\n ): OpenAIChatContext {\n return {\n role: 'tool',\n tool_call_id: input.callId,\n content: input.output,\n };\n }\n\n /**\n * 构建 Chat function tool 声明。\n *\n * 参数 schema 在此处转换为 OpenAI-compatible JSON Schema;`strict` 只在调用方\n * 显式设置时透传。\n */\n buildToolMessage(input: AgentToolDefinitionInput): OpenAIChatTool {\n return {\n type: 'function',\n function: {\n name: input.name,\n description: input.description,\n parameters: toOpenAIToolParameters(input.parameters ?? getDefaultToolParametersSchema()),\n ...(input.strict === undefined ? {} : { strict: input.strict }),\n },\n };\n }\n\n /** 从混合 Chat context 中筛选 user 消息,并把字符串内容归一为 `text` part。 */\n parseUserMessages(\n context: readonly OpenAIChatContext[],\n ): readonly AgentParsedMessage<OpenAIChatUserMessage, OpenAIChatContext>[] {\n return context.flatMap((message) =>\n message.role === 'user'\n ? [\n {\n message: {\n content: parseUserContent(message.content),\n ...(message.name ? { name: message.name } : {}),\n },\n sourceMessage: message,\n },\n ]\n : [],\n );\n }\n\n /** 从混合 Chat context 中筛选 system 消息,并读取其中的文本内容。 */\n parseSystemMessages(\n context: readonly OpenAIChatContext[],\n ): readonly AgentParsedMessage<OpenAIChatSystemMessage, OpenAIChatContext>[] {\n return context.flatMap((message) =>\n message.role === 'system'\n ? [\n {\n message: {\n content: readTextContent(message.content),\n ...(message.name ? { name: message.name } : {}),\n },\n sourceMessage: message,\n },\n ]\n : [],\n );\n }\n\n /**\n * 从 Chat assistant 消息中解析文本输出和 refusal 内容。\n *\n * 该方法不解析工具调用;工具调用由 `parseToolCalls()` 单独按顺序展开。\n */\n parseAssistantMessages(\n context: readonly OpenAIChatContext[],\n ): readonly AgentParsedMessage<OpenAIChatAssistantMessage, OpenAIChatContext>[] {\n return context.flatMap((message) => {\n if (message.role !== 'assistant') {\n return [];\n }\n\n const parsed = parseAssistantContent(message.content);\n\n return [\n {\n message: {\n content: parsed.content,\n ...(parsed.refusals.length > 0 ? { refusals: parsed.refusals } : {}),\n ...(message.refusal !== undefined ? { refusal: message.refusal } : {}),\n },\n sourceMessage: message,\n },\n ];\n });\n }\n\n /**\n * 从 assistant `tool_calls[]` 中提取本地 function tool 调用。\n *\n * Chat custom tool call 会被保留在原始消息里,但不会映射为本地 `@Tool` 调用。\n */\n parseToolCalls(\n context: readonly OpenAIChatContext[],\n ): readonly AgentToolCall<OpenAIChatProtocol>[] {\n return context.flatMap((message) =>\n message.role === 'assistant'\n ? (message.tool_calls ?? []).flatMap((call) =>\n call.type === 'function'\n ? [\n {\n id: call.id,\n name: call.function.name,\n arguments: call.function.arguments,\n sourceMessage: message,\n sourceCall: call,\n },\n ]\n : [],\n )\n : [],\n );\n }\n\n /** 从 Chat `tool` role message 中解析工具结果。 */\n parseToolCallOutputMessages(\n context: readonly OpenAIChatContext[],\n ): readonly AgentParsedMessage<OpenAIChatToolCallOutputMessage, OpenAIChatContext>[] {\n return context.flatMap((message) =>\n message.role === 'tool'\n ? [\n {\n message: {\n callId: message.tool_call_id,\n output: readTextContent(message.content),\n },\n sourceMessage: message,\n },\n ]\n : [],\n );\n }\n}\n\nfunction parseUserContent(\n content: OpenAIChatUserContextMessage['content'],\n): OpenAIChatUserContentPart[] {\n // SDK 允许 user content 是字符串;框架解析结果统一暴露为内容块数组。\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n\n return content.map((part) => (part.type === 'text' ? { type: 'text', text: part.text } : part));\n}\n\nfunction readTextContent(content: string | readonly OpenAIChatTextPart[]): string {\n return typeof content === 'string' ? content : content.map((part) => part.text).join('');\n}\n\nfunction parseAssistantContent(content: OpenAIChatAssistantContextMessage['content']): {\n content: AgentTextPart[];\n refusals: string[];\n} {\n // assistant content 可能为空,尤其是仅返回 tool_calls 的场景。\n if (typeof content === 'string') {\n return { content: [{ type: 'text', text: content }], refusals: [] };\n }\n\n if (!content) {\n return { content: [], refusals: [] };\n }\n\n return {\n content: content.flatMap((part) =>\n part.type === 'text' ? [{ type: 'text' as const, text: part.text }] : [],\n ),\n refusals: content.flatMap((part) => (part.type === 'refusal' ? [part.refusal] : [])),\n };\n}\n","import { createReadStream } from 'node:fs';\n\nimport OpenAI from 'openai';\nimport type { FileCreateParams } from 'openai/resources/files';\nimport type {\n ResponseCreateParamsNonStreaming,\n ResponseInput,\n Tool as ResponseTool,\n} from 'openai/resources/responses/responses';\n\nimport { getDefaultToolParametersSchema } from '../../agent/schema';\nimport type {\n AgentBaseSystemMessage,\n AgentBaseToolCallOutputMessage,\n AgentBaseUserMessage,\n AgentParsedMessage,\n AgentTextPart,\n AgentToolCall,\n AgentToolDefinitionInput,\n} from '../../agent/types';\nimport { Model, type ModelGenerateRequest, type ModelGenerateResult } from '../base';\nimport { toOpenAIToolParameters } from '../openai-schema';\nimport type {\n OpenAIFileObject,\n OpenAIFileUploadOptions,\n OpenAIResponsesAssistantMessage,\n OpenAIResponsesContext,\n OpenAIResponsesFunctionCallOutput,\n OpenAIResponsesInputMessage,\n OpenAIResponsesModelOptions,\n OpenAIResponsesProtocol,\n OpenAIResponsesSystemMessage,\n OpenAIResponsesTool,\n OpenAIResponsesToolCallOutputMessage,\n OpenAIResponsesUserExtensionPart,\n OpenAIResponsesUserMessage,\n} from './types';\n\nexport type * from './types';\n\n/**\n * OpenAI-compatible Responses 模型适配器,提供标准 Files 上传能力。\n *\n * 该适配器把 Agent 基础消息构建为 Responses `input` 项,并把服务端返回的\n * `output` item 原样交给 Agent 保存和回传;只有 `function_call` 会被解析为\n * 本地工具调用。\n */\nexport class OpenAIResponsesModel extends Model<OpenAIResponsesProtocol> {\n #openai: OpenAI;\n #model: string;\n #defaultParams: OpenAIResponsesModelOptions['defaultParams'];\n\n /**\n * 创建 Responses 适配器。\n *\n * `baseURL`、`apiKey` 等 OpenAI SDK 配置可直接透传;方舟 `api/v3` 兼容\n * endpoint 也通过这里配置。`defaultParams` 会合入每次非流式 Responses 请求。\n */\n constructor(options: OpenAIResponsesModelOptions) {\n super();\n\n const { client, model, defaultParams, ...clientOptions } = options;\n\n this.#model = model;\n this.#defaultParams = defaultParams;\n this.#openai = client ?? new OpenAI(clientOptions);\n }\n\n /**\n * 调用 Responses API,并将完整 `response.output` 作为协议 context 返回。\n *\n * Agent 不会裁剪这些 output item;如服务端返回空 output,则由 Agent 处理重试。\n */\n async generate(\n request: ModelGenerateRequest<OpenAIResponsesProtocol>,\n ): Promise<ModelGenerateResult<OpenAIResponsesProtocol>> {\n const params: ResponseCreateParamsNonStreaming = {\n ...this.#defaultParams,\n model: this.#model,\n input: request.context as unknown as ResponseInput,\n };\n\n if (request.tools.length > 0) {\n params.tools = request.tools as unknown as ResponseTool[];\n }\n\n const response = await this.#openai.responses.create(params);\n\n return {\n messages: response.output as unknown as readonly OpenAIResponsesContext[],\n raw: response,\n };\n }\n\n /**\n * 构建 Responses user input message。\n *\n * 基础 `{ type: \"text\" }` 会转换为 `input_text`;已声明的图片、文件、视频、\n * 音频扩展 part 会按 Responses/方舟兼容字段原样保留。\n */\n buildUserMessage(\n input: AgentBaseUserMessage | OpenAIResponsesUserMessage,\n ): OpenAIResponsesInputMessage {\n return {\n role: 'user',\n content: input.content.map((part) =>\n part.type === 'text'\n ? {\n type: 'input_text',\n text: part.text,\n }\n : part,\n ),\n };\n }\n\n /** 构建 Responses system input message,用于框架内部提示词和调用方 system prompt。 */\n buildSystemMessage(\n input: AgentBaseSystemMessage | OpenAIResponsesSystemMessage,\n ): OpenAIResponsesInputMessage {\n return {\n role: 'system',\n content: [{ type: 'input_text', text: input.content }],\n };\n }\n\n /** 构建 Responses `function_call_output` item,用于把本地工具结果回传给模型。 */\n buildToolCallOutputMessage(\n input: AgentBaseToolCallOutputMessage | OpenAIResponsesToolCallOutputMessage,\n ): OpenAIResponsesFunctionCallOutput {\n return {\n type: 'function_call_output',\n call_id: input.callId,\n output: input.output,\n };\n }\n\n /**\n * 构建 Responses function tool 声明。\n *\n * 参数 schema 在此处转换为 OpenAI-compatible JSON Schema;`strict` 只在工具\n * 显式声明时出现在请求中。\n */\n buildToolMessage(input: AgentToolDefinitionInput): OpenAIResponsesTool {\n return {\n type: 'function',\n name: input.name,\n description: input.description,\n parameters: toOpenAIToolParameters(input.parameters ?? getDefaultToolParametersSchema()),\n ...(input.strict === undefined ? {} : { strict: input.strict }),\n };\n }\n\n /** 从混合 Responses context 中筛选 user input message,并反解析多模态内容块。 */\n parseUserMessages(\n context: readonly OpenAIResponsesContext[],\n ): readonly AgentParsedMessage<OpenAIResponsesUserMessage, OpenAIResponsesContext>[] {\n return context.flatMap((message) =>\n isInputMessage(message, 'user')\n ? [\n {\n message: { content: parseInputParts(message.content) },\n sourceMessage: message,\n },\n ]\n : [],\n );\n }\n\n /** 从混合 Responses context 中筛选 system input message,并读取文本提示词。 */\n parseSystemMessages(\n context: readonly OpenAIResponsesContext[],\n ): readonly AgentParsedMessage<OpenAIResponsesSystemMessage, OpenAIResponsesContext>[] {\n return context.flatMap((message) =>\n isInputMessage(message, 'system')\n ? [\n {\n message: { content: readInputText(message.content) },\n sourceMessage: message,\n },\n ]\n : [],\n );\n }\n\n /**\n * 从 Responses assistant output message 中解析文本和 refusal。\n *\n * `reasoning` 等 provider 专属 item 保留在原始 context 中,不映射为 assistant 文本。\n */\n parseAssistantMessages(\n context: readonly OpenAIResponsesContext[],\n ): readonly AgentParsedMessage<OpenAIResponsesAssistantMessage, OpenAIResponsesContext>[] {\n return context.flatMap((message) => {\n if (message.type !== 'message' || message.role !== 'assistant' || !('id' in message)) {\n return [];\n }\n\n return [\n {\n message: {\n content: message.content.flatMap((part) =>\n part.type === 'output_text' ? [{ type: 'text' as const, text: part.text }] : [],\n ),\n refusals: message.content.flatMap((part) =>\n part.type === 'refusal' ? [part.refusal] : [],\n ),\n },\n sourceMessage: message,\n },\n ];\n });\n }\n\n /** 从 Responses `function_call` item 中提取本地工具调用。 */\n parseToolCalls(\n context: readonly OpenAIResponsesContext[],\n ): readonly AgentToolCall<OpenAIResponsesProtocol>[] {\n return context.flatMap((message) =>\n message.type === 'function_call'\n ? [\n {\n id: message.call_id,\n name: message.name,\n arguments: message.arguments,\n sourceMessage: message,\n sourceCall: message,\n },\n ]\n : [],\n );\n }\n\n /** 从 Responses `function_call_output` item 中解析工具结果,保留字符串或内容数组 output。 */\n parseToolCallOutputMessages(\n context: readonly OpenAIResponsesContext[],\n ): readonly AgentParsedMessage<OpenAIResponsesToolCallOutputMessage, OpenAIResponsesContext>[] {\n return context.flatMap((message) =>\n message.type === 'function_call_output'\n ? [\n {\n message: {\n callId: message.call_id,\n output: message.output,\n },\n sourceMessage: message,\n },\n ]\n : [],\n );\n }\n\n /**\n * 上传本地文件,供后续 Responses 输入内容块通过 `file_id` 引用。\n *\n * 默认 `purpose` 为 `user_data`,适合截图、文档等用户输入材料;返回值为\n * OpenAI SDK 的标准 FileObject。\n */\n async uploadFile(\n filePath: string,\n options: OpenAIFileUploadOptions = {},\n ): Promise<OpenAIFileObject> {\n return this.#openai.files.create({\n file: createReadStream(filePath),\n purpose: options.purpose ?? 'user_data',\n } as FileCreateParams);\n }\n}\n\nfunction parseInputParts(\n content: OpenAIResponsesInputMessage['content'],\n): Array<AgentTextPart | OpenAIResponsesUserExtensionPart> {\n // 兼容历史或外部手写 context 中仍以字符串保存的 input 内容。\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n\n return content.map((part) =>\n part.type === 'input_text' ? { type: 'text', text: part.text } : part,\n );\n}\n\nfunction readInputText(content: OpenAIResponsesInputMessage['content']): string {\n // system/developer/user input 中可能混有多模态 part;system parser 只提取文本。\n if (typeof content === 'string') {\n return content;\n }\n\n return content.flatMap((part) => (part.type === 'input_text' ? [part.text] : [])).join('\\n');\n}\n\nfunction isInputMessage(\n message: OpenAIResponsesContext,\n role: 'system' | 'user',\n): message is OpenAIResponsesInputMessage {\n // 模型 output message 也可能有 role 字段;带 id 的项视为响应,不作为 input 解析。\n return 'role' in message && message.role === role && !('id' in message);\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** npm 包公开入口:导出 Agent 运行时、模型适配器与配套类型。 */
2
+ export { Agent, Tool } from './agent';
3
+ export { Model, OpenAIChatModel, OpenAIResponsesModel } from './llm';
4
+ export type * from './agent';
5
+ export type * from './llm';