@migor/agentia 0.5.0 → 0.6.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.
- package/README.md +1 -1
- package/dist/AGENTS.md +73 -7
- package/dist/core/message.d.ts +148 -0
- package/dist/core/message.js +25 -0
- package/dist/core/message.js.map +1 -0
- package/dist/core/tool.d.ts +10 -9
- package/dist/engine/errors.d.ts +12 -0
- package/dist/engine/errors.js +46 -13
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/loop.d.ts +17 -11
- package/dist/engine/loop.js +34 -433
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/replay.d.ts +18 -3
- package/dist/engine/replay.js +49 -8
- package/dist/engine/replay.js.map +1 -1
- package/dist/engine/retry.d.ts +5 -4
- package/dist/engine/retry.js.map +1 -1
- package/dist/engine/spec.d.ts +5 -5
- package/dist/engine/spec.js.map +1 -1
- package/dist/engine/trace-diff.d.ts +57 -0
- package/dist/engine/trace-diff.js +188 -0
- package/dist/engine/trace-diff.js.map +1 -0
- package/dist/engine/trimming.d.ts +7 -7
- package/dist/engine/trimming.js +6 -5
- package/dist/engine/trimming.js.map +1 -1
- package/dist/engine/turn.d.ts +157 -0
- package/dist/engine/turn.js +500 -0
- package/dist/engine/turn.js.map +1 -0
- package/dist/engine/types.d.ts +6 -8
- package/dist/engine/usage.d.ts +2 -2
- package/dist/engine/usage.js.map +1 -1
- package/dist/eval/defineEval.js.map +1 -1
- package/dist/eval/harvest.d.ts +2 -2
- package/dist/eval/harvest.js.map +1 -1
- package/dist/eval/scripted.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +41 -37
- package/dist/integrations/anthropic.js +408 -17
- package/dist/integrations/anthropic.js.map +1 -1
- package/dist/integrations/openai.d.ts +1 -1
- package/dist/integrations/openai.js +3 -3
- package/dist/integrations/openai.js.map +1 -1
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/session.d.ts +5 -5
- package/dist/runtime/session.js.map +1 -1
- package/dist/toolkit/module.d.ts +2 -2
- package/dist/toolkit/module.js +36 -4
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/skill.d.ts +3 -3
- package/dist/toolkit/subagent.d.ts +2 -2
- package/dist/toolkit/subagent.js +1 -1
- package/dist/transport/async.d.ts +2 -2
- package/package.json +2 -4
package/dist/engine/replay.js
CHANGED
|
@@ -4,9 +4,47 @@ export function traceToMessages(trace, opts = {}) {
|
|
|
4
4
|
const includeToolIO = opts.includeToolIO ?? true;
|
|
5
5
|
const maxChars = opts.maxEventChars ?? DEFAULT_MAX_EVENT_CHARS;
|
|
6
6
|
const byId = new Map(trace.spans.map((s) => [s.spanId, s]));
|
|
7
|
-
const turns = trace
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const turns = sortTurns(trace);
|
|
8
|
+
return normalizeForApi(expandTurns(turns, byId, includeToolIO, maxChars), REPLAY_HEAD, REPLAY_TAIL);
|
|
9
|
+
}
|
|
10
|
+
export function forkMessages(trace, opts) {
|
|
11
|
+
const includeToolIO = opts.includeToolIO ?? true;
|
|
12
|
+
const maxChars = opts.maxEventChars ?? DEFAULT_MAX_EVENT_CHARS;
|
|
13
|
+
const byId = new Map(trace.spans.map((s) => [s.spanId, s]));
|
|
14
|
+
const turns = sortTurns(trace);
|
|
15
|
+
// 主循环回合 = 直属 run 根的 llm.turn;记录它们在全量时序里的位置
|
|
16
|
+
const mainPositions = [];
|
|
17
|
+
turns.forEach((t, i) => {
|
|
18
|
+
if (t.parentSpanId === trace.rootSpanId)
|
|
19
|
+
mainPositions.push(i);
|
|
20
|
+
});
|
|
21
|
+
const total = mainPositions.length;
|
|
22
|
+
const { atTurn } = opts;
|
|
23
|
+
if (!Number.isInteger(atTurn) || atTurn < 0 || atTurn >= total) {
|
|
24
|
+
throw new Error(total === 0
|
|
25
|
+
? `forkMessages: atTurn=${atTurn} 越界 —— 该 trace 主循环共 0 回合,无可分叉点`
|
|
26
|
+
: `forkMessages: atTurn=${atTurn} 越界 —— 该 trace 主循环共 ${total} 回合` +
|
|
27
|
+
`(合法范围 0..${total - 1})`);
|
|
28
|
+
}
|
|
29
|
+
// 截断点 = 第 atTurn 个主循环回合在时序中的位置:该位置起(含)的回合不展开;
|
|
30
|
+
// 位置之前的子 agent 嵌套回合保留(它们是分叉点前历史的一部分)
|
|
31
|
+
const kept = turns.slice(0, mainPositions[atTurn]);
|
|
32
|
+
const head = `[fork] 以下来自已完成 run ${trace.traceId} 的前 ${atTurn}/${total} 回合 trace 重放` +
|
|
33
|
+
`(assistant 文本为标注占位,非逐字原文),请从分叉点继续。`;
|
|
34
|
+
const messages = [
|
|
35
|
+
// fork 头无条件在最前(溯源信息必须存在,不能像 replay 头那样「首条已是 user 就省」)
|
|
36
|
+
{ role: 'user', content: head },
|
|
37
|
+
...expandTurns(kept, byId, includeToolIO, maxChars),
|
|
38
|
+
...(opts.append ?? []),
|
|
39
|
+
];
|
|
40
|
+
return normalizeForApi(messages, head, FORK_TAIL);
|
|
41
|
+
}
|
|
42
|
+
/** 全部 llm.turn 按 startedAt 时序排列(稳定排序:同刻保 spans 数组插入序) */
|
|
43
|
+
function sortTurns(trace) {
|
|
44
|
+
return trace.spans.filter((s) => s.kind === 'llm.turn').sort((a, b) => a.startedAt - b.startedAt);
|
|
45
|
+
}
|
|
46
|
+
/** 回合 → 消息展开(traceToMessages / forkMessages 共用;不含 normalize 与头尾合成) */
|
|
47
|
+
function expandTurns(turns, byId, includeToolIO, maxChars) {
|
|
10
48
|
const messages = [];
|
|
11
49
|
let seq = 0;
|
|
12
50
|
turns.forEach((turn, i) => {
|
|
@@ -58,22 +96,25 @@ export function traceToMessages(trace, opts = {}) {
|
|
|
58
96
|
});
|
|
59
97
|
}
|
|
60
98
|
});
|
|
61
|
-
return
|
|
99
|
+
return messages;
|
|
62
100
|
}
|
|
63
101
|
/** 前置 user 说明(API 要求首条为 user;trace 不含 run 的原始输入) */
|
|
64
102
|
const REPLAY_HEAD = '[replay] 以下是一次已完成 run 的 trace 重放(assistant 文本为标注占位,非逐字原文)。';
|
|
65
103
|
/** 收尾 user 请求:末条为 assistant 会被 API 当作 prefill */
|
|
66
104
|
const REPLAY_TAIL = '[replay] 以上是全部回合,请分析这次 run 的过程与结果。';
|
|
105
|
+
/** fork 收尾:仅在末条非 user 时补一条简短的「请继续」user */
|
|
106
|
+
const FORK_TAIL = '[fork] 以上是分叉点前的全部回合,请继续。';
|
|
67
107
|
/**
|
|
68
108
|
* 规整为可直接喂回 Messages API 的形态:
|
|
69
109
|
* - 连续同 role 消息合并(无 tool 对的连续 assistant 会合流,交替保持合法;
|
|
70
110
|
* 带 tool_use 的 assistant 之后必有其 tool_result user,配对不受影响);
|
|
71
|
-
* - 首条确保为 user(API 硬要求)——trace 不含 run 的原始输入,前置一条说明性 user
|
|
111
|
+
* - 首条确保为 user(API 硬要求)——trace 不含 run 的原始输入,前置一条说明性 user(head);
|
|
72
112
|
* - **末条也确保为 user**:多数 run 以 `end_turn` 的 assistant 回合收尾,直接喂回就是
|
|
73
113
|
* assistant prefill —— 缺省模型(claude-opus-5 / claude-sonnet-5)上会 400。
|
|
74
114
|
* 空 trace(无 llm.turn)返回的也是这条前置 user,而非 `[]`(空 messages 同样非法)。
|
|
115
|
+
* head/tail 文案由调用方给(replay 与 fork 语义不同),规整逻辑两者一致。
|
|
75
116
|
*/
|
|
76
|
-
function normalizeForApi(messages) {
|
|
117
|
+
function normalizeForApi(messages, head, tail) {
|
|
77
118
|
const merged = [];
|
|
78
119
|
for (const m of messages) {
|
|
79
120
|
const last = merged[merged.length - 1];
|
|
@@ -85,9 +126,9 @@ function normalizeForApi(messages) {
|
|
|
85
126
|
}
|
|
86
127
|
}
|
|
87
128
|
if (merged[0]?.role !== 'user')
|
|
88
|
-
merged.unshift({ role: 'user', content:
|
|
129
|
+
merged.unshift({ role: 'user', content: head });
|
|
89
130
|
if (merged[merged.length - 1].role !== 'user') {
|
|
90
|
-
merged.push({ role: 'user', content:
|
|
131
|
+
merged.push({ role: 'user', content: tail });
|
|
91
132
|
}
|
|
92
133
|
return merged;
|
|
93
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/engine/replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/engine/replay.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/retry.d.ts
CHANGED
|
@@ -8,10 +8,11 @@ import type { SpanError } from '../core/trace.js';
|
|
|
8
8
|
* **只重试尚未产出任何文本的尝试** —— 已流出一半的文本无法撤回,重试会造成
|
|
9
9
|
* 重复输出。这条约束由 engine/loop.ts 保证(它才知道有没有吐过文本)。
|
|
10
10
|
*
|
|
11
|
-
* ⚠️
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* `
|
|
11
|
+
* ⚠️ 与默认 client 内置重试叠加:默认 client(integrations/anthropic.ts)自己会对
|
|
12
|
+
* 429/5xx/连接错误重试(缺省 2 次,与 SDK 缺省语义对齐)。框架层是更外层的兜底
|
|
13
|
+
* (覆盖 client 层放弃后、以及 OpenAI 兼容客户端)。两层同时开最多会打
|
|
14
|
+
* `(1+clientRetries) × maxAttempts` 次请求 —— 建议二选一调(把这里设
|
|
15
|
+
* `maxAttempts: 1`,或把 client 的 `maxRetries` 设小)。
|
|
15
16
|
*/
|
|
16
17
|
export interface RetryOptions {
|
|
17
18
|
/** 最大尝试次数(含首次);1 = 关闭。缺省 3 */
|
package/dist/engine/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/engine/retry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/engine/retry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgC5C,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,GAAG;CACH,CAAC;AAIX,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAAC,CAAmC;IAC9D,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAClD,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,uBAAuB;IACpE,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,CAAC,GAAS,EAAE,GAAE,CAAC,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,CAAgB;IAC5D,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,GAAU,EAAE,CAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC/D,0CAA0C;QAC1C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,SAAS,OAAO;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/engine/spec.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type { MessageParam } from '../core/message.js';
|
|
2
2
|
import type { ModelClient, ModelPricing } from '../core/tool.js';
|
|
3
3
|
import type { AgentTool } from '../core/tool.js';
|
|
4
4
|
import type { BlackboardSeed } from '../core/blackboard.js';
|
|
@@ -56,16 +56,16 @@ export interface RunInvocationOptions {
|
|
|
56
56
|
}
|
|
57
57
|
/** 一次任务的规范化入参:messages(已由 normalizeMessages 规整) */
|
|
58
58
|
export interface RunSpec {
|
|
59
|
-
messages:
|
|
59
|
+
messages: MessageParam[];
|
|
60
60
|
options?: RunInvocationOptions;
|
|
61
61
|
/** 触发来源标记(sync / async / schedule:<id>),供 run 记录审计 */
|
|
62
62
|
source?: string;
|
|
63
63
|
}
|
|
64
64
|
/** transport 层接受的原始入参形态 */
|
|
65
|
-
export type RunInput = string |
|
|
65
|
+
export type RunInput = string | MessageParam[] | {
|
|
66
66
|
prompt?: string;
|
|
67
67
|
text?: string;
|
|
68
|
-
messages?:
|
|
68
|
+
messages?: MessageParam[];
|
|
69
69
|
};
|
|
70
70
|
/** 把任意任务入参规范成 messages(首条缺省包成 user)。 */
|
|
71
|
-
export declare function normalizeMessages(input: RunInput | unknown):
|
|
71
|
+
export declare function normalizeMessages(input: RunInput | unknown): MessageParam[];
|
package/dist/engine/spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/engine/spec.ts"],"names":[],"mappings":"AAyEA,wCAAwC;AACxC,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,mDAAmD;QACnD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/engine/spec.ts"],"names":[],"mappings":"AAyEA,wCAAwC;AACxC,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,mDAAmD;QACnD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC5D,OAAO,KAAuB,CAAC;IACjC,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,KAAiE,CAAC;QAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACjE,OAAO,CAAC,CAAC,QAA0B,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Span, Trace } from '../core/trace.js';
|
|
2
|
+
/**
|
|
3
|
+
* Agentia —— trace diff(A/B 比对)。
|
|
4
|
+
*
|
|
5
|
+
* 比对两条 trace(典型场景:同一输入换模型 / 换 prompt 重跑),产出结构化差异:
|
|
6
|
+
* run 级 summary(status / totalUsage / 根 span attributes —— A/B 模型第一眼就看
|
|
7
|
+
* attributes.model)+ 逐 span 的字段级差异。纯函数:不发起请求、不改 trace。
|
|
8
|
+
*
|
|
9
|
+
* 配对算法(结构性配对,字段差异不影响配对):
|
|
10
|
+
* - 根与根无条件配对(run 名不同记为 name 字段差);
|
|
11
|
+
* - 子 span 递归配对:父已配对的两侧孩子按「配对键」分组 —— **llm.turn 的配对键
|
|
12
|
+
* 只有 kind(忽略 name)**,因为 name 是模型 id,而「换个模型重跑」正是 A/B 主用例,
|
|
13
|
+
* 按 name 配对会把两侧所有 turn 都报成缺失;模型差异降格为配对 turn 的 name 字段差。
|
|
14
|
+
* capability span 配对键 = `kind:name`(skill:foo vs skill:bar 是不同能力,不该配上);
|
|
15
|
+
* - 同键孩子按 startedAt 稳定排序后按下标一一配对;多出的侧记缺侧 SpanDiff
|
|
16
|
+
* (fields 为空,path 照给),缺侧的整棵子树不再下钻 —— 一条缺侧记录即代表整支。
|
|
17
|
+
*
|
|
18
|
+
* path 段规则:根段 `run:<name>`;llm.turn 段 `llm.turn#<同键内下标>`;capability 段
|
|
19
|
+
* `capability:<name>`(同键重复时加 `#<下标>`);用 `/` 连接。
|
|
20
|
+
*
|
|
21
|
+
* traceId 是身份不是行为,永不比。墙钟字段(span startedAt/endedAt、event time)
|
|
22
|
+
* 缺省忽略 —— A/B 比对不关心时序;`ignoreTiming: false` 时改比 span 时长
|
|
23
|
+
* (endedAt-startedAt),绝对时间戳永不比。
|
|
24
|
+
*/
|
|
25
|
+
export interface TraceDiffOptions {
|
|
26
|
+
/** 忽略墙钟字段(span startedAt/endedAt、event time),缺省 true —— A/B 比对不关心时序;
|
|
27
|
+
* false 时改比 span 时长(endedAt-startedAt,未结束为 undefined),绝对时间戳永不比 */
|
|
28
|
+
ignoreTiming?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface DiffEntry {
|
|
31
|
+
/** 字段路径:'status' / 'name' / 'usage.inputTokens' / 'attributes.<key>' /
|
|
32
|
+
* 'events[2].name' / 'events[2].body' / 'events'(计数不等或截断说明) / 'duration' */
|
|
33
|
+
field: string;
|
|
34
|
+
/** 该侧无此值用 undefined */
|
|
35
|
+
a: unknown;
|
|
36
|
+
b: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface SpanDiff {
|
|
39
|
+
/** 从根到该 span 的配对路径(人读 + 稳定锚),规则见文件头 */
|
|
40
|
+
path: string;
|
|
41
|
+
/** 缺侧 = 该侧调用树无此位置 */
|
|
42
|
+
a?: Span;
|
|
43
|
+
b?: Span;
|
|
44
|
+
/** 两侧都在时的字段级差异;缺侧时为空数组 */
|
|
45
|
+
fields: DiffEntry[];
|
|
46
|
+
}
|
|
47
|
+
export interface TraceDiff {
|
|
48
|
+
/** 应用 DiffOptions 后是否无差异(summary 与 spans 全空差异) */
|
|
49
|
+
equal: boolean;
|
|
50
|
+
/** run 级差异:status、totalUsage.* 各字段、根 span attributes.<key>
|
|
51
|
+
* (model/system.version/prompts.versions/session.id 都在这里 —— A/B 模型第一眼就看它)。
|
|
52
|
+
* traceId 是身份不是行为,永不比 */
|
|
53
|
+
summary: DiffEntry[];
|
|
54
|
+
/** 逐 span 差异(只收有字段差或缺侧的 span;配平且全同的 span 不出现) */
|
|
55
|
+
spans: SpanDiff[];
|
|
56
|
+
}
|
|
57
|
+
export declare function diffTraces(a: Trace, b: Trace, opts?: TraceDiffOptions): TraceDiff;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { stringifySafe, truncateWithMark } from '../core/json.js';
|
|
2
|
+
const USAGE_FIELDS = [
|
|
3
|
+
'inputTokens',
|
|
4
|
+
'outputTokens',
|
|
5
|
+
'cacheReadTokens',
|
|
6
|
+
'cacheCreationTokens',
|
|
7
|
+
'costEstimate',
|
|
8
|
+
];
|
|
9
|
+
/** 每个 span 的事件差异最多报 20 条,超出记一条 `events` 截断说明 */
|
|
10
|
+
const EVENT_DIFF_LIMIT = 20;
|
|
11
|
+
/** 事件 body 差异值截断上限(body 可能很大,防爆) */
|
|
12
|
+
const DIFF_VALUE_CHARS = 200;
|
|
13
|
+
export function diffTraces(a, b, opts = {}) {
|
|
14
|
+
const ignoreTiming = opts.ignoreTiming ?? true;
|
|
15
|
+
const summary = [];
|
|
16
|
+
if (a.status !== b.status)
|
|
17
|
+
summary.push({ field: 'status', a: a.status, b: b.status });
|
|
18
|
+
pushUsageDiffs(summary, 'totalUsage', a.totalUsage, b.totalUsage);
|
|
19
|
+
const aRoot = a.spans.find((s) => s.spanId === a.rootSpanId);
|
|
20
|
+
const bRoot = b.spans.find((s) => s.spanId === b.rootSpanId);
|
|
21
|
+
if (aRoot && bRoot)
|
|
22
|
+
pushAttrDiffs(summary, aRoot.attributes, bRoot.attributes);
|
|
23
|
+
const spans = [];
|
|
24
|
+
const ctx = {
|
|
25
|
+
aChildren: childrenMap(a),
|
|
26
|
+
bChildren: childrenMap(b),
|
|
27
|
+
ignoreTiming,
|
|
28
|
+
out: spans,
|
|
29
|
+
};
|
|
30
|
+
// 根与根无条件配对(一侧连根都没有时记缺侧)
|
|
31
|
+
if (aRoot || bRoot) {
|
|
32
|
+
walk(aRoot, bRoot, `run:${(aRoot ?? bRoot).name}`, ctx);
|
|
33
|
+
}
|
|
34
|
+
return { equal: summary.length === 0 && spans.length === 0, summary, spans };
|
|
35
|
+
}
|
|
36
|
+
/** parentSpanId → 直接子 span(保 spans 数组插入序,供稳定排序前的同刻次序) */
|
|
37
|
+
function childrenMap(trace) {
|
|
38
|
+
const map = new Map();
|
|
39
|
+
for (const s of trace.spans) {
|
|
40
|
+
if (s.parentSpanId === null)
|
|
41
|
+
continue;
|
|
42
|
+
const kids = map.get(s.parentSpanId);
|
|
43
|
+
if (kids)
|
|
44
|
+
kids.push(s);
|
|
45
|
+
else
|
|
46
|
+
map.set(s.parentSpanId, [s]);
|
|
47
|
+
}
|
|
48
|
+
return map;
|
|
49
|
+
}
|
|
50
|
+
function walk(aSpan, bSpan, path, ctx) {
|
|
51
|
+
const fields = aSpan && bSpan ? diffSpanFields(aSpan, bSpan, ctx.ignoreTiming) : [];
|
|
52
|
+
// 只收有差异的节点:字段差,或缺侧(整棵子树缺失,一条记录代表整支,不再下钻)
|
|
53
|
+
if (fields.length > 0 || !aSpan || !bSpan) {
|
|
54
|
+
ctx.out.push({ path, a: aSpan, b: bSpan, fields });
|
|
55
|
+
}
|
|
56
|
+
if (!aSpan || !bSpan)
|
|
57
|
+
return;
|
|
58
|
+
const aKids = ctx.aChildren.get(aSpan.spanId) ?? [];
|
|
59
|
+
const bKids = ctx.bChildren.get(bSpan.spanId) ?? [];
|
|
60
|
+
for (const pair of pairChildren(aKids, bKids)) {
|
|
61
|
+
walk(pair.a, pair.b, `${path}/${pair.seg}`, ctx);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 配对键:llm.turn 只有 kind(忽略 name —— name 是模型 id,「换模型重跑」是 A/B 主用例,
|
|
66
|
+
* 按 name 配对会把两侧 turn 全报成缺失;模型差异降格为配对 turn 的 name 字段差);
|
|
67
|
+
* 其余 span 按 `kind:name`(skill:foo vs skill:bar 是不同能力,不该配上)。
|
|
68
|
+
*/
|
|
69
|
+
function pairKey(s) {
|
|
70
|
+
return s.kind === 'llm.turn' ? 'llm.turn' : `${s.kind}:${s.name}`;
|
|
71
|
+
}
|
|
72
|
+
function pairChildren(aKids, bKids) {
|
|
73
|
+
const keys = [];
|
|
74
|
+
const seen = new Set();
|
|
75
|
+
for (const s of [...aKids, ...bKids]) {
|
|
76
|
+
const k = pairKey(s);
|
|
77
|
+
if (!seen.has(k)) {
|
|
78
|
+
seen.add(k);
|
|
79
|
+
keys.push(k);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const pairs = [];
|
|
83
|
+
for (const key of keys) {
|
|
84
|
+
// 同键孩子按 startedAt 稳定排序(同刻保插入序)后按下标一一配对
|
|
85
|
+
const as = aKids.filter((s) => pairKey(s) === key).sort((x, y) => x.startedAt - y.startedAt);
|
|
86
|
+
const bs = bKids.filter((s) => pairKey(s) === key).sort((x, y) => x.startedAt - y.startedAt);
|
|
87
|
+
const n = Math.max(as.length, bs.length);
|
|
88
|
+
for (let i = 0; i < n; i++) {
|
|
89
|
+
const sample = as[i] ?? bs[i];
|
|
90
|
+
let seg;
|
|
91
|
+
if (sample.kind === 'llm.turn') {
|
|
92
|
+
seg = `llm.turn#${i}`;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
seg = `${sample.kind}:${sample.name}`;
|
|
96
|
+
if (n > 1)
|
|
97
|
+
seg += `#${i}`; // 同键重复时加下标区分
|
|
98
|
+
}
|
|
99
|
+
pairs.push({ a: as[i], b: bs[i], seg });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return pairs;
|
|
103
|
+
}
|
|
104
|
+
/** 两侧都在时的字段级差异(顺序:status / name / error / usage.* / attributes.* / duration / events) */
|
|
105
|
+
function diffSpanFields(a, b, ignoreTiming) {
|
|
106
|
+
const fields = [];
|
|
107
|
+
if (a.status !== b.status)
|
|
108
|
+
fields.push({ field: 'status', a: a.status, b: b.status });
|
|
109
|
+
if (a.name !== b.name)
|
|
110
|
+
fields.push({ field: 'name', a: a.name, b: b.name });
|
|
111
|
+
if (!errorEqual(a.error, b.error))
|
|
112
|
+
fields.push({ field: 'error', a: a.error, b: b.error });
|
|
113
|
+
pushUsageDiffs(fields, 'usage', a.usage, b.usage);
|
|
114
|
+
pushAttrDiffs(fields, a.attributes, b.attributes);
|
|
115
|
+
if (!ignoreTiming) {
|
|
116
|
+
// 比时长而非绝对时间戳(未结束为 undefined,与已结束也是差异)
|
|
117
|
+
const da = a.endedAt === undefined ? undefined : a.endedAt - a.startedAt;
|
|
118
|
+
const db = b.endedAt === undefined ? undefined : b.endedAt - b.startedAt;
|
|
119
|
+
if (da !== db)
|
|
120
|
+
fields.push({ field: 'duration', a: da, b: db });
|
|
121
|
+
}
|
|
122
|
+
pushEventDiffs(fields, a.events, b.events);
|
|
123
|
+
return fields;
|
|
124
|
+
}
|
|
125
|
+
/** error 比 type + message + retryable 三元组 */
|
|
126
|
+
function errorEqual(x, y) {
|
|
127
|
+
if (!x || !y)
|
|
128
|
+
return x === y;
|
|
129
|
+
return x.type === y.type && x.message === y.message && x.retryable === y.retryable;
|
|
130
|
+
}
|
|
131
|
+
/** usage 逐字段比;缺省(undefined)与 0 是不同语义 —— 一侧有一侧无也是差异 */
|
|
132
|
+
function pushUsageDiffs(out, prefix, x, y) {
|
|
133
|
+
for (const f of USAGE_FIELDS) {
|
|
134
|
+
const xv = x?.[f];
|
|
135
|
+
const yv = y?.[f];
|
|
136
|
+
if (xv !== yv)
|
|
137
|
+
out.push({ field: `${prefix}.${f}`, a: xv, b: yv });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** attributes 并集逐键比(键序排序,输出确定) */
|
|
141
|
+
function pushAttrDiffs(out, x, y) {
|
|
142
|
+
const keys = [...new Set([...Object.keys(x), ...Object.keys(y)])].sort();
|
|
143
|
+
for (const k of keys) {
|
|
144
|
+
if (x[k] !== y[k])
|
|
145
|
+
out.push({ field: `attributes.${k}`, a: x[k], b: y[k] });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* events 序列比:长度不等记一条 `events` 计数差;逐下标比 name 与 body
|
|
150
|
+
* (body 用 stringifySafe 序列化后比字符串,差异值截断到 200 字符防爆)。
|
|
151
|
+
* 每个 span 最多报 EVENT_DIFF_LIMIT 条,超出记一条 `events` 截断说明。
|
|
152
|
+
* event.time 是墙钟字段,永不比。
|
|
153
|
+
*/
|
|
154
|
+
function pushEventDiffs(out, x, y) {
|
|
155
|
+
let budget = EVENT_DIFF_LIMIT;
|
|
156
|
+
let omitted = 0;
|
|
157
|
+
const push = (entry) => {
|
|
158
|
+
if (budget > 0) {
|
|
159
|
+
out.push(entry);
|
|
160
|
+
budget--;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
omitted++;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
if (x.length !== y.length)
|
|
167
|
+
push({ field: 'events', a: x.length, b: y.length });
|
|
168
|
+
const n = Math.min(x.length, y.length);
|
|
169
|
+
for (let i = 0; i < n; i++) {
|
|
170
|
+
if (x[i].name !== y[i].name) {
|
|
171
|
+
push({ field: `events[${i}].name`, a: x[i].name, b: y[i].name });
|
|
172
|
+
}
|
|
173
|
+
const bx = stringifySafe(x[i].body);
|
|
174
|
+
const by = stringifySafe(y[i].body);
|
|
175
|
+
if (bx !== by) {
|
|
176
|
+
push({
|
|
177
|
+
field: `events[${i}].body`,
|
|
178
|
+
a: truncateWithMark(bx, DIFF_VALUE_CHARS),
|
|
179
|
+
b: truncateWithMark(by, DIFF_VALUE_CHARS),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (omitted > 0) {
|
|
184
|
+
const note = `(事件差异超过 ${EVENT_DIFF_LIMIT} 条,另有 ${omitted} 条未列出)`;
|
|
185
|
+
out.push({ field: 'events', a: note, b: note });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=trace-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-diff.js","sourceRoot":"","sources":["../../src/engine/trace-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type { MessageParam } from '../core/message.js';
|
|
2
2
|
export declare function defaultEstimateTokens(text: string): number;
|
|
3
|
-
export declare function isToolResultMessage(msg:
|
|
3
|
+
export declare function isToolResultMessage(msg: MessageParam): boolean;
|
|
4
4
|
/** 整组消息的估算 token(含每条 role 开销)。 */
|
|
5
|
-
export declare function estimateMessages(messages:
|
|
5
|
+
export declare function estimateMessages(messages: MessageParam[], estimate?: (text: string) => number): number;
|
|
6
6
|
/**
|
|
7
7
|
* 增量 token 计数器(预算策略专用;**不属公共导出面**,故不进 index.ts)。
|
|
8
8
|
*
|
|
@@ -20,9 +20,9 @@ export declare function estimateMessages(messages: Anthropic.MessageParam[], est
|
|
|
20
20
|
* 首元素或边界,trimToolPairs/compactMessages 都返回新数组),只有自定义
|
|
21
21
|
* contextPolicy 原地改写中间消息时才会踩到;那种写法请自行换数组引用。
|
|
22
22
|
*/
|
|
23
|
-
export declare function createTokenCounter(estimate?: (text: string) => number): (messages:
|
|
23
|
+
export declare function createTokenCounter(estimate?: (text: string) => number): (messages: MessageParam[]) => number;
|
|
24
24
|
/** 把消息渲染成可喂给摘要器的纯文本(role: content)。 */
|
|
25
|
-
export declare function renderMessages(messages:
|
|
25
|
+
export declare function renderMessages(messages: MessageParam[]): string;
|
|
26
26
|
export interface TrimOptions {
|
|
27
27
|
/** 保留最近几对 tool exchange(tool_use→tool_result **对数**);缺省 1 */
|
|
28
28
|
keepToolPairs?: number;
|
|
@@ -35,7 +35,7 @@ export interface TrimOptions {
|
|
|
35
35
|
* 前置:历史必须是工具块严格成对的(toolBlocksPaired)。畸形历史直接返回原数组
|
|
36
36
|
* —— 宁可少裁剪,也不能切出孤立 tool_use/tool_result 让后续请求 400。
|
|
37
37
|
*/
|
|
38
|
-
export declare function trimToolPairs(messages:
|
|
38
|
+
export declare function trimToolPairs(messages: MessageParam[], opts?: TrimOptions): MessageParam[];
|
|
39
39
|
export interface CompactOptions {
|
|
40
40
|
/** 保留的最近消息条数;缺省 20 */
|
|
41
41
|
keepRecent?: number;
|
|
@@ -48,4 +48,4 @@ export interface CompactOptions {
|
|
|
48
48
|
* - 不拆散 (assistant tool_use → user tool_result) 对 —— cut 落到对中间时整体后移;
|
|
49
49
|
* - 角色交替合法 —— 尾段首条是普通 user 时摘要并入之;否则摘要以 user 角色放最前。
|
|
50
50
|
*/
|
|
51
|
-
export declare function compactMessages(messages:
|
|
51
|
+
export declare function compactMessages(messages: MessageParam[], opts: CompactOptions): Promise<MessageParam[]>;
|
package/dist/engine/trimming.js
CHANGED
|
@@ -60,11 +60,14 @@ function contentToText(content) {
|
|
|
60
60
|
return content;
|
|
61
61
|
return content
|
|
62
62
|
.map((b) => {
|
|
63
|
+
// 联合含兜底成员(type: string),按字面量收窄后仍需断言到具体块型
|
|
63
64
|
switch (b.type) {
|
|
64
65
|
case 'text':
|
|
65
66
|
return b.text;
|
|
66
|
-
case 'tool_use':
|
|
67
|
-
|
|
67
|
+
case 'tool_use': {
|
|
68
|
+
const tu = b;
|
|
69
|
+
return `${tu.name}(${JSON.stringify(tu.input)})`;
|
|
70
|
+
}
|
|
68
71
|
case 'tool_result':
|
|
69
72
|
return JSON.stringify(b.content);
|
|
70
73
|
default:
|
|
@@ -148,9 +151,7 @@ export function renderMessages(messages) {
|
|
|
148
151
|
function toolUseIds(msg) {
|
|
149
152
|
if (msg.role !== 'assistant' || typeof msg.content === 'string')
|
|
150
153
|
return [];
|
|
151
|
-
return msg.content
|
|
152
|
-
.filter((b) => b.type === 'tool_use')
|
|
153
|
-
.map((b) => b.id);
|
|
154
|
+
return msg.content.filter((b) => b.type === 'tool_use').map((b) => b.id);
|
|
154
155
|
}
|
|
155
156
|
/** user 消息里的 tool_result 对应 id 列表(无则空) */
|
|
156
157
|
function toolResultIds(msg) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trimming.js","sourceRoot":"","sources":["../../src/engine/trimming.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trimming.js","sourceRoot":"","sources":["../../src/engine/trimming.ts"],"names":[],"mappings":"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"}
|