@migor/agentia 0.2.1 → 0.2.2

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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +144 -0
  3. package/README.md +202 -76
  4. package/dist/AGENTS.md +811 -0
  5. package/dist/container/container.d.ts +10 -2
  6. package/dist/container/container.js +27 -3
  7. package/dist/container/container.js.map +1 -1
  8. package/dist/core/abort.d.ts +10 -0
  9. package/dist/core/abort.js +28 -0
  10. package/dist/core/abort.js.map +1 -0
  11. package/dist/core/blackboard.d.ts +37 -0
  12. package/dist/core/blackboard.js +2 -0
  13. package/dist/core/blackboard.js.map +1 -0
  14. package/dist/core/json.d.ts +2 -0
  15. package/dist/core/json.js +4 -0
  16. package/dist/core/json.js.map +1 -1
  17. package/dist/core/run.d.ts +18 -0
  18. package/dist/core/run.js +2 -0
  19. package/dist/core/run.js.map +1 -0
  20. package/dist/core/schema.js +2 -2
  21. package/dist/core/schema.js.map +1 -1
  22. package/dist/core/tool.d.ts +62 -7
  23. package/dist/core/trace.d.ts +20 -4
  24. package/dist/engine/budget.d.ts +49 -0
  25. package/dist/engine/budget.js +30 -0
  26. package/dist/engine/budget.js.map +1 -0
  27. package/dist/engine/concurrency.d.ts +43 -0
  28. package/dist/engine/concurrency.js +95 -0
  29. package/dist/engine/concurrency.js.map +1 -0
  30. package/dist/engine/errors.d.ts +2 -0
  31. package/dist/engine/errors.js +7 -0
  32. package/dist/engine/errors.js.map +1 -1
  33. package/dist/engine/loop.d.ts +35 -10
  34. package/dist/engine/loop.js +336 -66
  35. package/dist/engine/loop.js.map +1 -1
  36. package/dist/engine/policy.d.ts +9 -1
  37. package/dist/engine/policy.js +8 -5
  38. package/dist/engine/policy.js.map +1 -1
  39. package/dist/engine/replay.d.ts +8 -5
  40. package/dist/engine/replay.js +30 -29
  41. package/dist/engine/replay.js.map +1 -1
  42. package/dist/engine/retry.d.ts +47 -0
  43. package/dist/engine/retry.js +51 -0
  44. package/dist/engine/retry.js.map +1 -0
  45. package/dist/engine/spec.d.ts +61 -0
  46. package/dist/{run → engine}/spec.js +4 -1
  47. package/dist/engine/spec.js.map +1 -0
  48. package/dist/engine/tracer.d.ts +9 -0
  49. package/dist/engine/tracer.js +57 -1
  50. package/dist/engine/tracer.js.map +1 -1
  51. package/dist/engine/{context.d.ts → trimming.d.ts} +19 -20
  52. package/dist/engine/trimming.js +238 -0
  53. package/dist/engine/trimming.js.map +1 -0
  54. package/dist/engine/types.d.ts +109 -13
  55. package/dist/engine/types.js +9 -1
  56. package/dist/engine/types.js.map +1 -1
  57. package/dist/engine/usage.d.ts +28 -2
  58. package/dist/engine/usage.js +39 -6
  59. package/dist/engine/usage.js.map +1 -1
  60. package/dist/eval/defineEval.d.ts +73 -0
  61. package/dist/eval/defineEval.js +44 -0
  62. package/dist/eval/defineEval.js.map +1 -0
  63. package/dist/eval/scripted.d.ts +26 -0
  64. package/dist/eval/scripted.js +43 -0
  65. package/dist/eval/scripted.js.map +1 -0
  66. package/dist/index.d.ts +60 -35
  67. package/dist/index.js +38 -20
  68. package/dist/index.js.map +1 -1
  69. package/dist/integrations/anthropic.d.ts +53 -0
  70. package/dist/integrations/anthropic.js +24 -0
  71. package/dist/integrations/anthropic.js.map +1 -0
  72. package/dist/integrations/mcp.d.ts +79 -0
  73. package/dist/integrations/mcp.js +108 -0
  74. package/dist/integrations/mcp.js.map +1 -0
  75. package/dist/integrations/metrics.d.ts +131 -0
  76. package/dist/integrations/metrics.js +488 -0
  77. package/dist/integrations/metrics.js.map +1 -0
  78. package/dist/{run → integrations}/openai.d.ts +12 -5
  79. package/dist/integrations/openai.js +386 -0
  80. package/dist/integrations/openai.js.map +1 -0
  81. package/dist/integrations/otlp.js.map +1 -0
  82. package/dist/integrations/report.d.ts +78 -0
  83. package/dist/integrations/report.js +257 -0
  84. package/dist/integrations/report.js.map +1 -0
  85. package/dist/runtime/context.d.ts +25 -0
  86. package/dist/{run → runtime}/context.js +8 -1
  87. package/dist/runtime/context.js.map +1 -0
  88. package/dist/{run → runtime}/memory.d.ts +1 -1
  89. package/dist/{run → runtime}/memory.js +3 -1
  90. package/dist/runtime/memory.js.map +1 -0
  91. package/dist/{run → runtime}/run.d.ts +22 -5
  92. package/dist/runtime/run.js +218 -0
  93. package/dist/runtime/run.js.map +1 -0
  94. package/dist/runtime/session.d.ts +27 -0
  95. package/dist/runtime/session.js +16 -0
  96. package/dist/runtime/session.js.map +1 -0
  97. package/dist/{run → runtime}/spec.d.ts +16 -2
  98. package/dist/runtime/spec.js +28 -0
  99. package/dist/runtime/spec.js.map +1 -0
  100. package/dist/{run → runtime}/systemPrompt.d.ts +12 -0
  101. package/dist/{run → runtime}/systemPrompt.js +16 -3
  102. package/dist/runtime/systemPrompt.js.map +1 -0
  103. package/dist/{run → runtime}/types.js.map +1 -1
  104. package/dist/{run → store}/fsStore.d.ts +15 -0
  105. package/dist/{run → store}/fsStore.js +43 -1
  106. package/dist/store/fsStore.js.map +1 -0
  107. package/dist/{run → store}/redisStore.d.ts +19 -1
  108. package/dist/{run → store}/redisStore.js +33 -6
  109. package/dist/store/redisStore.js.map +1 -0
  110. package/dist/{run → store}/sqliteStore.js +22 -1
  111. package/dist/store/sqliteStore.js.map +1 -0
  112. package/dist/{run → store}/store.d.ts +25 -3
  113. package/dist/store/store.js +63 -0
  114. package/dist/store/store.js.map +1 -0
  115. package/dist/toolkit/asset.d.ts +7 -6
  116. package/dist/toolkit/asset.js +7 -6
  117. package/dist/toolkit/asset.js.map +1 -1
  118. package/dist/toolkit/collect.d.ts +20 -7
  119. package/dist/toolkit/collect.js +21 -7
  120. package/dist/toolkit/collect.js.map +1 -1
  121. package/dist/toolkit/discover.d.ts +21 -1
  122. package/dist/toolkit/discover.js +59 -12
  123. package/dist/toolkit/discover.js.map +1 -1
  124. package/dist/toolkit/middleware.d.ts +10 -10
  125. package/dist/toolkit/middleware.js +17 -4
  126. package/dist/toolkit/middleware.js.map +1 -1
  127. package/dist/toolkit/module.d.ts +100 -34
  128. package/dist/toolkit/module.js +112 -36
  129. package/dist/toolkit/module.js.map +1 -1
  130. package/dist/toolkit/prompt.d.ts +4 -6
  131. package/dist/toolkit/prompt.js +11 -10
  132. package/dist/toolkit/prompt.js.map +1 -1
  133. package/dist/toolkit/skill.d.ts +14 -16
  134. package/dist/toolkit/skill.js +32 -25
  135. package/dist/toolkit/skill.js.map +1 -1
  136. package/dist/toolkit/subagent.d.ts +10 -12
  137. package/dist/toolkit/subagent.js +23 -21
  138. package/dist/toolkit/subagent.js.map +1 -1
  139. package/dist/toolkit/tool.d.ts +19 -11
  140. package/dist/toolkit/tool.js +11 -8
  141. package/dist/toolkit/tool.js.map +1 -1
  142. package/dist/toolkit/zod.d.ts +4 -3
  143. package/dist/toolkit/zod.js +2 -1
  144. package/dist/toolkit/zod.js.map +1 -1
  145. package/dist/transport/async.d.ts +133 -0
  146. package/dist/transport/async.js +415 -0
  147. package/dist/transport/async.js.map +1 -0
  148. package/dist/transport/http.d.ts +146 -0
  149. package/dist/transport/http.js +387 -0
  150. package/dist/transport/http.js.map +1 -0
  151. package/dist/{run → transport}/scheduler.d.ts +9 -1
  152. package/dist/transport/scheduler.js +133 -0
  153. package/dist/transport/scheduler.js.map +1 -0
  154. package/dist/transport/sse.d.ts +43 -0
  155. package/dist/transport/sse.js +51 -0
  156. package/dist/transport/sse.js.map +1 -0
  157. package/dist/{run → transport}/transport.d.ts +1 -1
  158. package/dist/{run → transport}/transport.js +1 -1
  159. package/dist/transport/transport.js.map +1 -0
  160. package/package.json +24 -9
  161. package/dist/engine/context.js +0 -146
  162. package/dist/engine/context.js.map +0 -1
  163. package/dist/run/async.d.ts +0 -59
  164. package/dist/run/async.js +0 -201
  165. package/dist/run/async.js.map +0 -1
  166. package/dist/run/context.d.ts +0 -16
  167. package/dist/run/context.js.map +0 -1
  168. package/dist/run/fsStore.js.map +0 -1
  169. package/dist/run/http.d.ts +0 -47
  170. package/dist/run/http.js +0 -119
  171. package/dist/run/http.js.map +0 -1
  172. package/dist/run/memory.js.map +0 -1
  173. package/dist/run/openai.js +0 -181
  174. package/dist/run/openai.js.map +0 -1
  175. package/dist/run/otlp.js.map +0 -1
  176. package/dist/run/redisStore.js.map +0 -1
  177. package/dist/run/run.js +0 -129
  178. package/dist/run/run.js.map +0 -1
  179. package/dist/run/scheduler.js +0 -85
  180. package/dist/run/scheduler.js.map +0 -1
  181. package/dist/run/spec.js.map +0 -1
  182. package/dist/run/sqliteStore.js.map +0 -1
  183. package/dist/run/store.js +0 -28
  184. package/dist/run/store.js.map +0 -1
  185. package/dist/run/systemPrompt.js.map +0 -1
  186. package/dist/run/transport.js.map +0 -1
  187. /package/dist/{run → integrations}/otlp.d.ts +0 -0
  188. /package/dist/{run → integrations}/otlp.js +0 -0
  189. /package/dist/{run → runtime}/types.d.ts +0 -0
  190. /package/dist/{run → runtime}/types.js +0 -0
  191. /package/dist/{run → store}/sqliteStore.d.ts +0 -0
@@ -6,18 +6,25 @@ import type { ModelClient } from '../core/tool.js';
6
6
  * 响应再翻译回 Anthropic.Message —— 产出的 ModelClient 可直接喂给
7
7
  * executeRun / runAgent 的 client 选项。兼容端点(DeepSeek 等)换 baseURL 即可。
8
8
  *
9
- * 边界(近似映射,头部声明):
10
- * - 非流式模拟:底层一次性 POST(stream:false),on('text') 回调在
11
- * finalMessage() 完成后收到一次完整文本,而非逐 token 增量;
12
- * - cache token 恒 0:OpenAI 形态无 prompt cache 计量字段;
13
- * - refusal 为近似:finish_reason=content_filter 映射为 'refusal',
9
+ * 剩余边界(**协议层面无法对齐**,不是没做):
10
+ * - cache token 恒 0:OpenAI 形态没有 prompt cache 计量字段;
11
+ * - refusal 为近似:finish_reason=content_filter 近似映射为 'refusal',
14
12
  * 语义上接近但不等同 Anthropic 的流式分类器干预。
13
+ *
14
+ * 流式(C3):默认 `stream: true`,逐 token 触发 `on('text')`;`tool_calls` 的
15
+ * 分片按 `index` 累积后再汇成完整 `tool_use`。带 `stream_options.include_usage`
16
+ * 取 token 计量 —— 个别端点不认这个字段,可设 `stream: false` 退回一次性响应。
15
17
  */
16
18
  export interface OpenAIClientOptions {
17
19
  /** 缺省读 env OPENAI_API_KEY */
18
20
  apiKey?: string;
19
21
  /** 缺省 https://api.openai.com;兼容端点直接替换(如 https://api.deepseek.com) */
20
22
  baseURL?: string;
23
+ /**
24
+ * 是否用流式(缺省 true,逐 token 回调)。设 false 退回一次性响应:
25
+ * 兼容端点若不支持 `stream_options` 而报 400,用它兜底。
26
+ */
27
+ stream?: boolean;
21
28
  /** 测试注入用 */
22
29
  fetchImpl?: typeof fetch;
23
30
  }
@@ -0,0 +1,386 @@
1
+ export function createOpenAIClient(opts = {}) {
2
+ const baseURL = (opts.baseURL ?? 'https://api.openai.com').replace(/\/+$/, '');
3
+ const fetchImpl = opts.fetchImpl ?? fetch;
4
+ const apiKey = opts.apiKey ?? process.env.OPENAI_API_KEY;
5
+ const useStream = opts.stream ?? true;
6
+ return {
7
+ messages: {
8
+ stream(params) {
9
+ const textCallbacks = [];
10
+ return {
11
+ on(event, cb) {
12
+ if (event === 'text')
13
+ textCallbacks.push(cb);
14
+ },
15
+ async finalMessage() {
16
+ const req = toOpenAIRequest(params);
17
+ const res = await fetchImpl(`${baseURL}/v1/chat/completions`, {
18
+ method: 'POST',
19
+ headers: {
20
+ 'content-type': 'application/json',
21
+ ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
22
+ },
23
+ // signal 必须转发:否则调用方(含 A1 的取消 / 超时)无法中止在飞请求
24
+ ...(params.signal ? { signal: params.signal } : {}),
25
+ body: useStream
26
+ ? JSON.stringify({ ...req, stream: true, stream_options: { include_usage: true } })
27
+ : JSON.stringify(req),
28
+ });
29
+ if (!res.ok) {
30
+ const body = await res.text();
31
+ throw new Error(`OpenAI 请求失败 ${res.status}: ${body.slice(0, 200)}`);
32
+ }
33
+ // 内容协商:**按响应实际形态**决定怎么解析,而不是按我们请求了什么 ——
34
+ // 部分兼容端点会忽略 `stream: true` 直接回一整份 JSON(此时退回 JSON 路径,
35
+ // 行为与旧版本一致,只是没有逐 token 的「打字机」效果)。
36
+ const ctype = res.headers.get('content-type') ?? '';
37
+ const isSse = ctype.includes('event-stream');
38
+ if (!useStream || !isSse) {
39
+ const data = (await res.json());
40
+ const message = toAnthropicMessage(data, params.model);
41
+ // 非流式:完整文本一次性交给回调(与流式的最终结果一致)
42
+ const full = textOf(message);
43
+ if (full)
44
+ for (const cb of textCallbacks)
45
+ cb(full);
46
+ return message;
47
+ }
48
+ if (!res.body) {
49
+ throw new Error('OpenAI 流式响应没有 body(端点声明了 event-stream 却没给流)');
50
+ }
51
+ return await readStream(res.body, params.model, textCallbacks);
52
+ },
53
+ };
54
+ },
55
+ },
56
+ };
57
+ }
58
+ /** Anthropic 请求形态 → OpenAI chat.completions 请求 */
59
+ function toOpenAIRequest(params) {
60
+ const messages = [];
61
+ if (params.system) {
62
+ messages.push({
63
+ role: 'system',
64
+ content: typeof params.system === 'string'
65
+ ? params.system
66
+ : params.system.map((b) => b.text).join('\n'),
67
+ });
68
+ }
69
+ for (const m of params.messages) {
70
+ if (typeof m.content === 'string') {
71
+ messages.push({ role: m.role, content: m.content });
72
+ continue;
73
+ }
74
+ if (m.role === 'user') {
75
+ // tool_result blocks:每个 block 一条 role=tool 消息;其余合成一条 user
76
+ const blocks = m.content;
77
+ const toolResults = blocks.filter((b) => b.type === 'tool_result');
78
+ const rest = blocks.filter((b) => b.type !== 'tool_result');
79
+ for (const tr of toolResults) {
80
+ messages.push({
81
+ role: 'tool',
82
+ tool_call_id: tr.tool_use_id,
83
+ content: tr.content === undefined
84
+ ? ''
85
+ : typeof tr.content === 'string'
86
+ ? tr.content
87
+ : JSON.stringify(tr.content),
88
+ });
89
+ }
90
+ if (rest.length > 0)
91
+ messages.push({ role: 'user', content: renderUserContent(rest) });
92
+ }
93
+ else {
94
+ // assistant:文本部分进 content(无则 null),tool_use → tool_calls
95
+ const blocks = m.content;
96
+ const text = blocks
97
+ .filter((b) => b.type === 'text')
98
+ .map((b) => b.text)
99
+ .join('\n');
100
+ const toolUses = blocks.filter((b) => b.type === 'tool_use');
101
+ messages.push({
102
+ role: 'assistant',
103
+ content: text || null,
104
+ ...(toolUses.length > 0
105
+ ? {
106
+ tool_calls: toolUses.map((tu) => ({
107
+ id: tu.id,
108
+ type: 'function',
109
+ function: { name: tu.name, arguments: JSON.stringify(tu.input) },
110
+ })),
111
+ }
112
+ : {}),
113
+ });
114
+ }
115
+ }
116
+ return {
117
+ model: params.model,
118
+ max_tokens: params.max_tokens,
119
+ messages,
120
+ ...(params.tools && params.tools.length > 0
121
+ ? {
122
+ tools: params.tools.map((t) => ({
123
+ type: 'function',
124
+ function: {
125
+ name: t.name,
126
+ ...(t.description ? { description: t.description } : {}),
127
+ parameters: t.input_schema,
128
+ },
129
+ })),
130
+ }
131
+ : {}),
132
+ };
133
+ }
134
+ /**
135
+ * user 消息的非 tool_result 块 → OpenAI content(C3 多模态)。
136
+ *
137
+ * - 文本块 → `{type:'text'}`;
138
+ * - 图片块 → `{type:'image_url'}`,base64 源编成 data URL,url 源直接透传;
139
+ * - **没有图片时回落成纯字符串** —— 部分兼容端点只接受 string content,
140
+ * 无脑上数组会把原本能跑的通路弄坏(旧行为就是纯字符串)。
141
+ */
142
+ function renderUserContent(blocks) {
143
+ const parts = [];
144
+ let hasImage = false;
145
+ for (const b of blocks) {
146
+ if (b.type === 'text') {
147
+ parts.push({ type: 'text', text: b.text });
148
+ continue;
149
+ }
150
+ if (b.type === 'image') {
151
+ const url = imageUrlOf(b);
152
+ if (url) {
153
+ parts.push({ type: 'image_url', image_url: { url } });
154
+ hasImage = true;
155
+ continue;
156
+ }
157
+ }
158
+ // 其余块类型 JSON 兜底:宁可把原文交给模型,也不静默丢内容
159
+ parts.push({ type: 'text', text: JSON.stringify(b) });
160
+ }
161
+ if (!hasImage) {
162
+ return parts.map((p) => (p.type === 'text' ? p.text : '')).join('\n');
163
+ }
164
+ return parts;
165
+ }
166
+ /** Anthropic image block → OpenAI 能吃的 URL(base64 编 data URL;url 源透传) */
167
+ function imageUrlOf(b) {
168
+ const src = b.source;
169
+ if (src.type === 'base64' && src.data) {
170
+ return `data:${src.media_type ?? 'image/png'};base64,${src.data}`;
171
+ }
172
+ if (src.type === 'url' && src.url)
173
+ return src.url;
174
+ return null;
175
+ }
176
+ /**
177
+ * 消费 `text/event-stream` 并组装成 Anthropic.Message。
178
+ *
179
+ * 关键点(每条都有对应单测):
180
+ * - **`id` / `name` 取首次出现的值**(OpenAI 在第一个分片给全),
181
+ * **`arguments` 按分片拼接** —— 一次调用的 JSON 参数会被拆成多片;
182
+ * - 多个工具并行调用时**必须按 `index` 归并**,不能按到达顺序新建;
183
+ * - `usage` 在**最后一个 chunk**(choices 为空的那条)才出现;
184
+ * - `[DONE]` 是结束哨兵,之后不再有数据。
185
+ */
186
+ async function readStream(body, fallbackModel, textCallbacks) {
187
+ const acc = { text: '', toolCalls: new Map() };
188
+ for await (const line of sseLines(body)) {
189
+ if (!line.startsWith('data:'))
190
+ continue; // 忽略 event: / id: / 注释 / 空行
191
+ const payload = line.slice('data:'.length).trim();
192
+ if (!payload)
193
+ continue;
194
+ if (payload === '[DONE]')
195
+ break;
196
+ let chunk;
197
+ try {
198
+ chunk = JSON.parse(payload);
199
+ }
200
+ catch {
201
+ continue; // 半截/畸形分片不该毁掉整个流(后面还有正常数据)
202
+ }
203
+ applyChunk(acc, chunk, textCallbacks);
204
+ }
205
+ return accumulatorToMessage(acc, fallbackModel);
206
+ }
207
+ /** 把一条流式分片并进累积器 */
208
+ function applyChunk(acc, chunk, textCallbacks) {
209
+ if (chunk.id)
210
+ acc.id ??= chunk.id;
211
+ if (chunk.model)
212
+ acc.model ??= chunk.model;
213
+ if (chunk.usage)
214
+ acc.usage = chunk.usage;
215
+ const choice = chunk.choices?.[0];
216
+ if (!choice)
217
+ return; // 带 usage 的收尾 chunk 没有 choices
218
+ const delta = choice.delta;
219
+ if (delta?.content) {
220
+ acc.text += delta.content;
221
+ // 逐 token 下发 —— 这就是「打字机」效果的全部来源
222
+ for (const cb of textCallbacks)
223
+ cb(delta.content);
224
+ }
225
+ for (const tc of delta?.tool_calls ?? []) {
226
+ const index = tc.index ?? 0;
227
+ const entry = acc.toolCalls.get(index) ?? { id: '', name: '', args: '' };
228
+ // id / name 只在首次给全(`??=`);arguments 必须拼接
229
+ if (tc.id)
230
+ entry.id ||= tc.id;
231
+ if (tc.function?.name)
232
+ entry.name ||= tc.function.name;
233
+ if (tc.function?.arguments)
234
+ entry.args += tc.function.arguments;
235
+ acc.toolCalls.set(index, entry);
236
+ }
237
+ if (choice.finish_reason)
238
+ acc.finish = choice.finish_reason;
239
+ }
240
+ /** 累积器 → Anthropic.Message */
241
+ function accumulatorToMessage(acc, fallbackModel) {
242
+ const content = [];
243
+ if (acc.text)
244
+ content.push({ type: 'text', text: acc.text });
245
+ // 按 index 升序还原调用顺序(Map 保留插入序,但 index 可能乱序到达)
246
+ const calls = [...acc.toolCalls.entries()].sort((a, b) => a[0] - b[0]);
247
+ let n = 0;
248
+ for (const [, tc] of calls) {
249
+ n++;
250
+ content.push({
251
+ // 端点没给 id 时补一个:engine 会把它当 tool_use_id 回传,空 id 会让配对失败
252
+ id: tc.id || `call_${n}`,
253
+ type: 'tool_use',
254
+ name: tc.name,
255
+ input: parseToolArgs(tc.args),
256
+ });
257
+ }
258
+ const hasToolCalls = calls.length > 0;
259
+ return {
260
+ id: acc.id ?? 'chatcmpl-unknown',
261
+ type: 'message',
262
+ role: 'assistant',
263
+ model: acc.model ?? fallbackModel,
264
+ content,
265
+ stop_reason: mapStopReason(acc.finish, hasToolCalls),
266
+ stop_sequence: null,
267
+ usage: {
268
+ input_tokens: acc.usage?.prompt_tokens ?? 0,
269
+ output_tokens: acc.usage?.completion_tokens ?? 0,
270
+ // OpenAI 形态无 cache 计量:恒 0
271
+ cache_creation_input_tokens: 0,
272
+ cache_read_input_tokens: 0,
273
+ },
274
+ };
275
+ }
276
+ /** tool_call 的 arguments 是模型生成的 JSON 字符串;非法时原样交给下游 schema 校验 */
277
+ function parseToolArgs(raw) {
278
+ if (!raw)
279
+ return {};
280
+ try {
281
+ return JSON.parse(raw);
282
+ }
283
+ catch {
284
+ return raw;
285
+ }
286
+ }
287
+ /** 逐行读 SSE(OpenAI 每条事件都是一行 `data:`,不需要处理多行 payload) */
288
+ async function* sseLines(body) {
289
+ const reader = body.getReader();
290
+ const decoder = new TextDecoder();
291
+ let buf = '';
292
+ try {
293
+ for (;;) {
294
+ const { done, value } = await reader.read();
295
+ if (done)
296
+ break;
297
+ buf += decoder.decode(value, { stream: true });
298
+ let idx = buf.indexOf('\n');
299
+ while (idx >= 0) {
300
+ yield buf.slice(0, idx).replace(/\r$/, '');
301
+ buf = buf.slice(idx + 1);
302
+ idx = buf.indexOf('\n');
303
+ }
304
+ }
305
+ if (buf)
306
+ yield buf.replace(/\r$/, '');
307
+ }
308
+ finally {
309
+ // 提前 break([DONE])时释放读锁,否则流不会被回收
310
+ try {
311
+ await reader.cancel();
312
+ }
313
+ catch {
314
+ /* 已结束/已取消 */
315
+ }
316
+ }
317
+ }
318
+ /** OpenAI chat.completions 响应 → Anthropic.Message */
319
+ function toAnthropicMessage(data, model) {
320
+ const choice = data.choices?.[0];
321
+ if (!choice) {
322
+ // 200 但 choices 为空/缺失:上游故障(兼容端点 bug、被网关截断)。
323
+ // 不得静默映射成「成功」——空文本 + usage 全 0 + end_turn 会把一次上游故障
324
+ // 记成正常收尾,run 结论与真实情况相反。抛出交 engine 按 error 收尾。
325
+ throw new Error(`OpenAI 兼容端点返回空 choices(id=${data.id ?? 'unknown'});响应无可用补全,按上游故障处理`);
326
+ }
327
+ const msg = choice.message ?? {};
328
+ const content = [];
329
+ if (typeof msg.content === 'string' && msg.content) {
330
+ content.push({ type: 'text', text: msg.content });
331
+ }
332
+ for (const tc of msg.tool_calls ?? []) {
333
+ content.push({
334
+ type: 'tool_use',
335
+ id: tc.id,
336
+ name: tc.function.name,
337
+ input: parseToolArgs(tc.function.arguments),
338
+ });
339
+ }
340
+ return {
341
+ id: data.id ?? 'chatcmpl-unknown',
342
+ type: 'message',
343
+ role: 'assistant',
344
+ model: data.model ?? model,
345
+ content,
346
+ stop_reason: mapStopReason(choice?.finish_reason, (msg.tool_calls?.length ?? 0) > 0),
347
+ stop_sequence: null,
348
+ usage: {
349
+ input_tokens: data.usage?.prompt_tokens ?? 0,
350
+ output_tokens: data.usage?.completion_tokens ?? 0,
351
+ // OpenAI 形态无 cache 计量:恒 0
352
+ cache_creation_input_tokens: 0,
353
+ cache_read_input_tokens: 0,
354
+ },
355
+ };
356
+ }
357
+ /** 取消息里的全部文本块(非流式路径一次性回调用) */
358
+ function textOf(message) {
359
+ return message.content
360
+ .filter((b) => b.type === 'text')
361
+ .map((b) => b.text)
362
+ .join('');
363
+ }
364
+ /**
365
+ * finish_reason → Anthropic stop_reason(content_filter→refusal 为近似映射)。
366
+ *
367
+ * hasToolCalls:**只要响应带 tool_calls 就必须是 tool_use**,不看 finish_reason ——
368
+ * DeepSeek / vLLM / Ollama 等兼容端点在带工具调用时回的是 `stop`;若映射成 end_turn,
369
+ * engine 会在提取工具块之前就收尾(loop 的 end_turn 即终态),工具调用被静默丢弃。
370
+ */
371
+ function mapStopReason(finish, hasToolCalls) {
372
+ if (hasToolCalls)
373
+ return 'tool_use';
374
+ switch (finish) {
375
+ case 'tool_calls':
376
+ return 'tool_use';
377
+ case 'length':
378
+ return 'max_tokens';
379
+ case 'content_filter':
380
+ return 'refusal';
381
+ case 'stop':
382
+ default:
383
+ return 'end_turn';
384
+ }
385
+ }
386
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/integrations/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../src/integrations/otlp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { Trace, Usage } from '../core/trace.js';
2
+ /**
3
+ * Agentia —— 调优报告(G1)。
4
+ *
5
+ * 把一条(或多条)`Trace` 变成「**哪个能力慢 / 贵 / 爱失败**」的排行 —— 这是"可调优"
6
+ * 的依据:没有它,用户面对一堆旋钮(budgetTokens / keepToolPairs / maxCostUsd …)
7
+ * 不知道该拧哪一个。
8
+ *
9
+ * 数据全部从既有 trace 派生,**纯函数、无副作用、不联网**:
10
+ * - 能力级:`tool` 读 turn 上的 `tool.output` 事件(E1 补的 `durationMs`/`ok`),
11
+ * `skill`/`subagent` 读 `capability` span(tracer 已聚合其子孙 usage);
12
+ * - 模型级:读 `llm.turn` span(`name` 即模型 id)。
13
+ *
14
+ * ⚠️ **单条 run 的分位没有统计意义**(样本常 < 5):报告以 `total` / `max` 为主,
15
+ * `p50`/`p95` 仅作参考;要看分位请用 `mergeRunReports` 汇总多条。
16
+ *
17
+ * 只依赖 core(分层:integrations 只依赖 core)。
18
+ */
19
+ export interface DurationReport {
20
+ /** 样本总时长(毫秒) */
21
+ total: number;
22
+ /** 单次最长的那个(毫秒)—— 单 run 场景比 p95 更有诊断价值 */
23
+ max: number;
24
+ /** 窗口内精确分位(样本少时仅供参考) */
25
+ p50: number;
26
+ p95: number;
27
+ }
28
+ export interface CapabilityReport {
29
+ /** `${kind}:${name}`,如 `tool:search` / `subagent:researcher` */
30
+ capability: string;
31
+ calls: number;
32
+ errors: number;
33
+ durationMs: DurationReport;
34
+ /** 仅 skill/subagent:其子孙 llm.turn 的 token 合计;工具为 null */
35
+ tokens: Usage | null;
36
+ /** token 四类之和(便于排序/展示);无 token 时为 null */
37
+ tokensTotal: number | null;
38
+ /** 仅 skill/subagent:估算成本(美元);未定价或工具为 null */
39
+ costUsd: number | null;
40
+ /**
41
+ * 原始耗时样本(毫秒)—— `mergeRunReports` 靠它重算跨 run 分位。
42
+ * 报告是排障产物,保留样本比"丢掉再近似"更有用。
43
+ */
44
+ durations: number[];
45
+ }
46
+ export interface ModelReport {
47
+ model: string;
48
+ turns: number;
49
+ tokens: Usage;
50
+ tokensTotal: number;
51
+ /** 已定价部分的成本;全未定价时为 null */
52
+ costUsd: number | null;
53
+ /** 算不出成本的 turn 数(模型不在价格表内) */
54
+ unpricedTurns: number;
55
+ durationMs: DurationReport;
56
+ durations: number[];
57
+ }
58
+ export interface RunReport {
59
+ /** 单条 run = traceId;合并报告为 `merged(n runs)` */
60
+ traceId: string;
61
+ status: 'ok' | 'error';
62
+ /** 合并报告 = 各 run 时长之和 */
63
+ durationMs: number;
64
+ totalUsage: Usage;
65
+ models: ModelReport[];
66
+ /** 按 `durationMs.total` 降序(并列时按 calls 降序) */
67
+ capabilities: CapabilityReport[];
68
+ /** 价格表外、成本算不出来的模型(成本护栏失效的显式信号) */
69
+ unpricedModels: string[];
70
+ /** 参与合并的 run 数(单条报告为 1) */
71
+ runs: number;
72
+ }
73
+ /** 从一条 Trace 生成报告(纯函数) */
74
+ export declare function buildRunReport(trace: Trace): RunReport;
75
+ /** 汇总多条报告(跨 run 的能力排行才有统计意义)。空数组 → 空报告。 */
76
+ export declare function mergeRunReports(reports: readonly RunReport[]): RunReport;
77
+ /** 人类可读的纯文本报告(CLI `agentia report` 与日志用;零依赖手写) */
78
+ export declare function renderRunReport(report: RunReport): string;