@migor/agentia 0.4.2 → 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 +145 -10
- 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/core/trace.d.ts +21 -0
- package/dist/core/trace.js +9 -1
- package/dist/core/trace.js.map +1 -1
- 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 +46 -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 +18 -8
- package/dist/engine/usage.d.ts +2 -2
- package/dist/engine/usage.js.map +1 -1
- package/dist/eval/defineEval.d.ts +1 -1
- package/dist/eval/defineEval.js +12 -0
- package/dist/eval/defineEval.js.map +1 -1
- package/dist/eval/harvest.d.ts +37 -0
- package/dist/eval/harvest.js +132 -0
- package/dist/eval/harvest.js.map +1 -0
- package/dist/eval/scripted.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +4 -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/metrics.d.ts +13 -0
- package/dist/integrations/metrics.js +65 -0
- package/dist/integrations/metrics.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/integrations/otlp.d.ts +10 -0
- package/dist/integrations/otlp.js +59 -0
- package/dist/integrations/otlp.js.map +1 -1
- package/dist/runtime/run.js +2 -0
- 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 +8 -2
- package/dist/toolkit/module.js +56 -8
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.d.ts +20 -0
- package/dist/toolkit/prompt.js +18 -4
- package/dist/toolkit/prompt.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/errors.js
CHANGED
|
@@ -1,25 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Agentia —— 异常分类(engine 对厂商 SDK 零运行时 import)。
|
|
3
|
+
*
|
|
4
|
+
* 分类是**鸭子类型**:默认 client(`integrations/anthropic.ts`)自研化后抛的是
|
|
5
|
+
* 带数值 `status` 的 `AnthropicApiError` 与 fetch 的原生网络错误(TypeError 带 cause),
|
|
6
|
+
* 不再是 SDK 错误类。同套判法对第三方 SDK 错误同样适用(它们的错误类也带 `status`)。
|
|
7
|
+
*
|
|
8
|
+
* 历史教训(2026-09-13 实测,当时因此保留 instanceof):厂商 SDK 的错误类
|
|
9
|
+
* `name` 恒为 `'Error'`、`type` 为 null,鸭子类型只能靠 `constructor.name` ——
|
|
10
|
+
* **压缩即失效**。所以这里只认**数据属性**(`status` 数值 / `cause` / errno `code` /
|
|
11
|
+
* 内建 DOMException 的 `name`),一概不碰构造函数名。
|
|
12
|
+
*/
|
|
2
13
|
/** 是否中断异常(DOMException / 普通 Error 都可能是,靠 name 判定) */
|
|
3
14
|
export function isAbortError(e) {
|
|
4
15
|
return typeof e === 'object' && e !== null && e.name === 'AbortError';
|
|
5
16
|
}
|
|
17
|
+
/** 取错误的可读 message(Error 取 .message,其余 String 兜底) */
|
|
18
|
+
function messageOf(e) {
|
|
19
|
+
return e instanceof Error ? e.message : String(e);
|
|
20
|
+
}
|
|
21
|
+
/** errno 形态的连接错误码(Node 网络层稳定产出,不靠 message 文案) */
|
|
22
|
+
const CONNECTION_CODES = /^(ECONNRESET|ECONNREFUSED|ETIMEDOUT|EAI_AGAIN|ENOTFOUND|EPIPE|ENETUNREACH|EHOSTUNREACH|ECONNABORTED)$/;
|
|
23
|
+
/**
|
|
24
|
+
* 无 status 的网络型错误 → connection。
|
|
25
|
+
* 稳的判法(不过拟合 message 字符串):
|
|
26
|
+
* - fetch 的网络失败是 `TypeError` 且带 `cause`(undici 保证,cause 里常有 errno);
|
|
27
|
+
* - 带 errno `code` 属性的 Error(Node 网络层直接抛的形态);
|
|
28
|
+
* - `name === 'TimeoutError'` 的 DOMException(`AbortSignal.timeout` / 默认 client 的
|
|
29
|
+
* timeout 合成信号)—— 内建 name 是规范值,不受压缩影响。
|
|
30
|
+
*/
|
|
31
|
+
function isConnectionError(e) {
|
|
32
|
+
if (e instanceof TypeError && e.cause != null)
|
|
33
|
+
return true;
|
|
34
|
+
const code = e.code;
|
|
35
|
+
if (typeof code === 'string' && CONNECTION_CODES.test(code))
|
|
36
|
+
return true;
|
|
37
|
+
return e.name === 'TimeoutError';
|
|
38
|
+
}
|
|
6
39
|
/** 把任意异常分类成 trace 可用的 SpanError(可重试 vs 不可重试)。 */
|
|
7
40
|
export function classifyError(e) {
|
|
8
41
|
if (isAbortError(e)) {
|
|
9
42
|
return { type: 'aborted', message: 'run 已被取消', retryable: false };
|
|
10
43
|
}
|
|
11
|
-
if (e
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
44
|
+
if (typeof e === 'object' && e !== null) {
|
|
45
|
+
const status = e.status;
|
|
46
|
+
if (typeof status === 'number' && Number.isFinite(status)) {
|
|
47
|
+
if (status === 429)
|
|
48
|
+
return { type: 'rate_limit', message: messageOf(e), retryable: true };
|
|
49
|
+
if (status >= 500)
|
|
50
|
+
return { type: 'server', message: messageOf(e), retryable: true };
|
|
51
|
+
return { type: 'api', message: messageOf(e), retryable: false };
|
|
52
|
+
}
|
|
53
|
+
if (isConnectionError(e)) {
|
|
54
|
+
return { type: 'connection', message: messageOf(e), retryable: true };
|
|
55
|
+
}
|
|
23
56
|
}
|
|
24
57
|
if (e instanceof Error) {
|
|
25
58
|
return { type: 'unknown', message: e.message, retryable: false };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/engine/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/engine/errors.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAwB,CAAC,IAAI,KAAK,YAAY,CAAC;AAChG,CAAC;AAED,oDAAoD;AACpD,SAAS,SAAS,CAAC,CAAU;IAC3B,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,iDAAiD;AACjD,MAAM,gBAAgB,GACpB,uGAAuG,CAAC;AAE1G;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,CAAS;IAClC,IAAI,CAAC,YAAY,SAAS,IAAK,CAAyB,CAAC,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACpF,MAAM,IAAI,GAAI,CAAwB,CAAC,IAAI,CAAC;IAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,OAAQ,CAAwB,CAAC,IAAI,KAAK,cAAc,CAAC;AAC3D,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,MAAM,MAAM,GAAI,CAA0B,CAAC,MAAM,CAAC;QAClD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC1F,IAAI,MAAM,IAAI,GAAG;gBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACrF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAClE,CAAC;QACD,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC"}
|
package/dist/engine/loop.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type { MessageParam } from '../core/message.js';
|
|
2
2
|
import type { AgentTool, JsonSchema, ModelClient, ModelPricing, RecorderBackend, SchemaType } from '../core/tool.js';
|
|
3
3
|
import type { SpanError, SpanId } from '../core/trace.js';
|
|
4
4
|
import type { RetryOptions } from './retry.js';
|
|
@@ -9,6 +9,21 @@ import type { AgentRunResult, AgentStopReason, ContextPolicy, RunAgentOptions, S
|
|
|
9
9
|
* export AGENTIA_MODEL=deepseek-… 即可全局覆盖,无需逐处传 model。
|
|
10
10
|
*/
|
|
11
11
|
export declare function resolveDefaultModel(over?: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Agentia —— 主循环(manual loop,流式)—— spec §5。
|
|
14
|
+
*
|
|
15
|
+
* 结构:核心是 `agentLoop` —— 不自开 run 根,所有 llm.turn 挂在给定的
|
|
16
|
+
* parentSpanId 下。同一套循环既能当主 agent(run 根为其父,由 runAgent 开),
|
|
17
|
+
* 也能当子 agent(capability span 为其父,见 toolkit/subagent.ts),llm.turn 与 usage
|
|
18
|
+
* 递归进同一条 trace(spec §9:子 agent = 一个 capability span,内部能力递归成它的子孙)。
|
|
19
|
+
*
|
|
20
|
+
* 工具执行经 ctx: ToolRunContext 把 {client, recorder, parentSpanId: 当前 turn}
|
|
21
|
+
* 交给 tool.run —— 普通工具忽略;子 agent 用它在正确位置开 capability span。
|
|
22
|
+
*
|
|
23
|
+
* 文件分工:本文件只留入口(runAgent / runAgentScoped)与 agentLoop 编排骨架 +
|
|
24
|
+
* 缺省旋钮;「一回合执行步骤」的实现机(回合上下文、请求/重试、记账、stop_reason
|
|
25
|
+
* 分流、工具执行)拆在同层 turn.ts,依赖方向单向 loop.ts → turn.ts。
|
|
26
|
+
*/
|
|
12
27
|
export interface AgentLoopResult<T = unknown> {
|
|
13
28
|
stopReason: AgentStopReason;
|
|
14
29
|
finalText: string;
|
|
@@ -28,7 +43,7 @@ export declare function runAgent<S extends JsonSchema = JsonSchema>(options: Run
|
|
|
28
43
|
export declare function runAgentScoped<S extends JsonSchema = JsonSchema>(opts: {
|
|
29
44
|
client?: ModelClient;
|
|
30
45
|
system?: SystemParam;
|
|
31
|
-
messages:
|
|
46
|
+
messages: MessageParam[];
|
|
32
47
|
tools?: AgentTool[];
|
|
33
48
|
model?: string;
|
|
34
49
|
maxTokens?: number;
|
|
@@ -66,12 +81,3 @@ export declare function runAgentScoped<S extends JsonSchema = JsonSchema>(opts:
|
|
|
66
81
|
/** 成本硬管控(C1):累计成本(美元)上限;同 maxTotalTokens */
|
|
67
82
|
maxCostUsd?: number;
|
|
68
83
|
}): Promise<AgentLoopResult<SchemaType<S>>>;
|
|
69
|
-
/**
|
|
70
|
-
* 用 `next` 原地替换 `target` 的全部内容(保持数组引用不变 —— 循环各处持同一数组)。
|
|
71
|
-
*
|
|
72
|
-
* **不要**写回 `target.splice(0, target.length, ...next)`:展开传参受 V8 实参个数上限
|
|
73
|
-
* 约束,`next` 超过约 12 万项即抛 `RangeError: Maximum call stack size exceeded`
|
|
74
|
-
* (实测 12 万 ok、30 万抛)。`next` 来自调用方注入的 `contextPolicy`,长度不受框架
|
|
75
|
-
* 控制,所以用循环逐项写,彻底没有这个上限。
|
|
76
|
-
*/
|
|
77
|
-
export declare function replaceMessages(target: Anthropic.MessageParam[], next: readonly Anthropic.MessageParam[]): void;
|