@cicctencent/agent-core 0.1.122 → 0.1.124
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/dist/cjs/agent/engine.d.ts.map +1 -1
- package/dist/cjs/agent/engine.js +12 -1
- package/dist/cjs/agent/engine.js.map +1 -1
- package/dist/cjs/agent/llm-caller.d.ts +14 -0
- package/dist/cjs/agent/llm-caller.d.ts.map +1 -1
- package/dist/cjs/agent/llm-caller.js +78 -23
- package/dist/cjs/agent/llm-caller.js.map +1 -1
- package/dist/cjs/hooks/types.d.ts +11 -1
- package/dist/cjs/hooks/types.d.ts.map +1 -1
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +31 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/observability/alerting.d.ts +56 -0
- package/dist/cjs/observability/alerting.d.ts.map +1 -0
- package/dist/cjs/observability/alerting.js +141 -0
- package/dist/cjs/observability/alerting.js.map +1 -0
- package/dist/cjs/observability/metrics.d.ts +40 -0
- package/dist/cjs/observability/metrics.d.ts.map +1 -0
- package/dist/cjs/observability/metrics.js +194 -0
- package/dist/cjs/observability/metrics.js.map +1 -0
- package/dist/cjs/observability/middleware.d.ts.map +1 -1
- package/dist/cjs/observability/middleware.js +55 -7
- package/dist/cjs/observability/middleware.js.map +1 -1
- package/dist/cjs/observability/otel.d.ts +6 -0
- package/dist/cjs/observability/otel.d.ts.map +1 -0
- package/dist/cjs/observability/otel.js +91 -0
- package/dist/cjs/observability/otel.js.map +1 -0
- package/dist/cjs/observability/pricing.d.ts +37 -0
- package/dist/cjs/observability/pricing.d.ts.map +1 -0
- package/dist/cjs/observability/pricing.js +110 -0
- package/dist/cjs/observability/pricing.js.map +1 -0
- package/dist/cjs/observability/propagation.d.ts +37 -0
- package/dist/cjs/observability/propagation.d.ts.map +1 -0
- package/dist/cjs/observability/propagation.js +148 -0
- package/dist/cjs/observability/propagation.js.map +1 -0
- package/dist/cjs/observability/sink.d.ts +15 -1
- package/dist/cjs/observability/sink.d.ts.map +1 -1
- package/dist/cjs/observability/sink.js +57 -5
- package/dist/cjs/observability/sink.js.map +1 -1
- package/dist/cjs/observability/taxonomy.d.ts +9 -0
- package/dist/cjs/observability/taxonomy.d.ts.map +1 -0
- package/dist/cjs/observability/taxonomy.js +67 -0
- package/dist/cjs/observability/taxonomy.js.map +1 -0
- package/dist/cjs/observability/types.d.ts +146 -3
- package/dist/cjs/observability/types.d.ts.map +1 -1
- package/dist/esm/agent/engine.d.ts.map +1 -1
- package/dist/esm/agent/engine.js +12 -1
- package/dist/esm/agent/engine.js.map +1 -1
- package/dist/esm/agent/llm-caller.d.ts +14 -0
- package/dist/esm/agent/llm-caller.d.ts.map +1 -1
- package/dist/esm/agent/llm-caller.js +78 -23
- package/dist/esm/agent/llm-caller.js.map +1 -1
- package/dist/esm/hooks/types.d.ts +11 -1
- package/dist/esm/hooks/types.d.ts.map +1 -1
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/observability/alerting.d.ts +56 -0
- package/dist/esm/observability/alerting.d.ts.map +1 -0
- package/dist/esm/observability/alerting.js +136 -0
- package/dist/esm/observability/alerting.js.map +1 -0
- package/dist/esm/observability/metrics.d.ts +40 -0
- package/dist/esm/observability/metrics.d.ts.map +1 -0
- package/dist/esm/observability/metrics.js +190 -0
- package/dist/esm/observability/metrics.js.map +1 -0
- package/dist/esm/observability/middleware.d.ts.map +1 -1
- package/dist/esm/observability/middleware.js +55 -7
- package/dist/esm/observability/middleware.js.map +1 -1
- package/dist/esm/observability/otel.d.ts +6 -0
- package/dist/esm/observability/otel.d.ts.map +1 -0
- package/dist/esm/observability/otel.js +87 -0
- package/dist/esm/observability/otel.js.map +1 -0
- package/dist/esm/observability/pricing.d.ts +37 -0
- package/dist/esm/observability/pricing.d.ts.map +1 -0
- package/dist/esm/observability/pricing.js +106 -0
- package/dist/esm/observability/pricing.js.map +1 -0
- package/dist/esm/observability/propagation.d.ts +37 -0
- package/dist/esm/observability/propagation.d.ts.map +1 -0
- package/dist/esm/observability/propagation.js +137 -0
- package/dist/esm/observability/propagation.js.map +1 -0
- package/dist/esm/observability/sink.d.ts +15 -1
- package/dist/esm/observability/sink.d.ts.map +1 -1
- package/dist/esm/observability/sink.js +57 -5
- package/dist/esm/observability/sink.js.map +1 -1
- package/dist/esm/observability/taxonomy.d.ts +9 -0
- package/dist/esm/observability/taxonomy.d.ts.map +1 -0
- package/dist/esm/observability/taxonomy.js +63 -0
- package/dist/esm/observability/taxonomy.js.map +1 -0
- package/dist/esm/observability/types.d.ts +146 -3
- package/dist/esm/observability/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Observability — OpenTelemetry GenAI semantic-convention mapping
|
|
3
|
+
// ============================================================
|
|
4
|
+
//
|
|
5
|
+
// 将内部 Trace/Observation 记录映射为 OpenTelemetry GenAI 语义约定
|
|
6
|
+
// (https://opentelemetry.io/docs/specs/semconv/gen-ai/)的属性,
|
|
7
|
+
// 使导出到 Phoenix / Grafana / Helicone / Langfuse 等系统时语义对齐、可移植。
|
|
8
|
+
//
|
|
9
|
+
// 仅做属性映射,不依赖 @opentelemetry/* 运行时(避免引入重依赖);
|
|
10
|
+
// store-sink 的 OTLP 导出器可消费本模块产出的 attribute map。
|
|
11
|
+
/** 将 usage 映射为 gen_ai.token.* 属性 */
|
|
12
|
+
function usageAttributes(rec) {
|
|
13
|
+
const u = rec.usage;
|
|
14
|
+
if (!u)
|
|
15
|
+
return {};
|
|
16
|
+
const attrs = {};
|
|
17
|
+
if (u.promptTokens != null)
|
|
18
|
+
attrs['gen_ai.usage.input_tokens'] = u.promptTokens;
|
|
19
|
+
if (u.completionTokens != null)
|
|
20
|
+
attrs['gen_ai.usage.output_tokens'] = u.completionTokens;
|
|
21
|
+
if (u.totalTokens != null)
|
|
22
|
+
attrs['gen_ai.usage.total_tokens'] = u.totalTokens;
|
|
23
|
+
if (u.cacheReadTokens != null)
|
|
24
|
+
attrs['gen_ai.usage.cache_read_input_tokens'] = u.cacheReadTokens;
|
|
25
|
+
if (u.cacheWriteTokens != null)
|
|
26
|
+
attrs['gen_ai.usage.cache_creation_input_tokens'] = u.cacheWriteTokens;
|
|
27
|
+
return attrs;
|
|
28
|
+
}
|
|
29
|
+
/** Trace → OTel resource/span attributes */
|
|
30
|
+
export function traceToOtelAttributes(trace) {
|
|
31
|
+
const attrs = {
|
|
32
|
+
'gen_ai.operation.name': 'agent.run',
|
|
33
|
+
'trace.id': trace.traceId,
|
|
34
|
+
'session.id': trace.sessionId,
|
|
35
|
+
};
|
|
36
|
+
if (trace.applicationId != null)
|
|
37
|
+
attrs['gen_ai.application.id'] = String(trace.applicationId);
|
|
38
|
+
if (trace.agentProfileId != null)
|
|
39
|
+
attrs['gen_ai.agent.id'] = String(trace.agentProfileId);
|
|
40
|
+
if (trace.userId != null)
|
|
41
|
+
attrs['user.id'] = String(trace.userId);
|
|
42
|
+
if (trace.name)
|
|
43
|
+
attrs['gen_ai.agent.name'] = trace.name;
|
|
44
|
+
if (trace.environment)
|
|
45
|
+
attrs['deployment.environment'] = trace.environment;
|
|
46
|
+
if (trace.promptVersion)
|
|
47
|
+
attrs['gen_ai.prompt.version'] = trace.promptVersion;
|
|
48
|
+
if (Array.isArray(trace.tags) && trace.tags.length)
|
|
49
|
+
attrs['observability.tags'] = trace.tags;
|
|
50
|
+
if (trace.input != null)
|
|
51
|
+
attrs['gen_ai.input.messages'] = trace.input;
|
|
52
|
+
if (trace.output != null)
|
|
53
|
+
attrs['gen_ai.output.message'] = trace.output;
|
|
54
|
+
return attrs;
|
|
55
|
+
}
|
|
56
|
+
/** Observation → OTel span attributes(按 generation / span / event 区分) */
|
|
57
|
+
export function observationToOtelAttributes(obs) {
|
|
58
|
+
const attrs = {
|
|
59
|
+
'gen_ai.span.type': obs.type,
|
|
60
|
+
'observability.name': obs.name,
|
|
61
|
+
'span.parent_id': obs.parentObservationId,
|
|
62
|
+
};
|
|
63
|
+
if (obs.model)
|
|
64
|
+
attrs['gen_ai.response.model'] = obs.model;
|
|
65
|
+
if (obs.provider)
|
|
66
|
+
attrs['gen_ai.system'] = obs.provider;
|
|
67
|
+
if (obs.type === 'generation') {
|
|
68
|
+
attrs['gen_ai.operation.name'] = 'generate_content';
|
|
69
|
+
if (obs.timeToFirstToken != null)
|
|
70
|
+
attrs['gen_ai.time_to_first_token'] = obs.timeToFirstToken;
|
|
71
|
+
if (obs.tokensPerSecond != null)
|
|
72
|
+
attrs['gen_ai.tokens_per_second'] = obs.tokensPerSecond;
|
|
73
|
+
if (obs.retryCount != null)
|
|
74
|
+
attrs['gen_ai.retry.count'] = obs.retryCount;
|
|
75
|
+
if (obs.fallbackModel)
|
|
76
|
+
attrs['gen_ai.fallback_model'] = obs.fallbackModel;
|
|
77
|
+
}
|
|
78
|
+
if (obs.errorType)
|
|
79
|
+
attrs['error.type'] = obs.errorType;
|
|
80
|
+
if (obs.environment)
|
|
81
|
+
attrs['deployment.environment'] = obs.environment;
|
|
82
|
+
if (Array.isArray(obs.tags) && obs.tags.length)
|
|
83
|
+
attrs['observability.tags'] = obs.tags;
|
|
84
|
+
Object.assign(attrs, usageAttributes(obs));
|
|
85
|
+
return attrs;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=otel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../src/observability/otel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ObservabilityUsage } from './types.js';
|
|
2
|
+
export interface ModelPrice {
|
|
3
|
+
/** 输入 token 单价(每 1K tokens,USD) */
|
|
4
|
+
input: number;
|
|
5
|
+
/** 输出 token 单价(每 1K tokens,USD) */
|
|
6
|
+
output: number;
|
|
7
|
+
/** 命中缓存读取单价(每 1K tokens,USD),通常远低于 input */
|
|
8
|
+
cacheRead?: number;
|
|
9
|
+
/** 写入缓存单价(每 1K tokens,USD) */
|
|
10
|
+
cacheWrite?: number;
|
|
11
|
+
currency?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 模型定价表(USD / 1K tokens)。
|
|
15
|
+
* key 统一为小写 `provider::model`。provider 允许省略(仅 model 匹配)。
|
|
16
|
+
* 仅收录常用模型,缺失型号回退到同 provider 的兜底或 NaN(交由调用方决策)。
|
|
17
|
+
*/
|
|
18
|
+
export declare const MODEL_PRICING: Record<string, ModelPrice>;
|
|
19
|
+
export interface CostResult {
|
|
20
|
+
cost?: number;
|
|
21
|
+
currency?: string;
|
|
22
|
+
/** 是否为估算(定价表缺失时按兜底价估算,前端可标记为"估算") */
|
|
23
|
+
estimated: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 根据 usage 计算成本(USD)。
|
|
27
|
+
* 计费口径(与 Langfuse/OpenAI 一致):
|
|
28
|
+
* cost = promptTokens * input/1K
|
|
29
|
+
* + completionTokens * output/1K
|
|
30
|
+
* + cacheReadTokens * cacheRead/1K
|
|
31
|
+
* + cacheWriteTokens * cacheWrite/1K
|
|
32
|
+
* 若 usage 同时携带上游返回的 cost,则以 usage.cost 为准(更精确),本函数仅作兜底。
|
|
33
|
+
*
|
|
34
|
+
* @returns 无 token 数据时返回空(不虚构成本)
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeCost(usage: ObservabilityUsage | undefined, model?: string, provider?: string): CostResult;
|
|
37
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/observability/pricing.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA4BpD,CAAC;AA+BF,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAqBhH"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Observability — server-side model pricing
|
|
3
|
+
// ============================================================
|
|
4
|
+
//
|
|
5
|
+
// 服务端定价表:当上游 provider 未返回 cost(或返回不准)时,
|
|
6
|
+
// 根据 usage 的 token 数 + 模型/供应商 离线计算成本。
|
|
7
|
+
// 同时支持 prompt cache 命中/写入的差异化计费(OpenAI/Anthropic/DeepSeek 均支持)。
|
|
8
|
+
//
|
|
9
|
+
// 单位:每 1K tokens 的美元价格(USD)。汇率可后续扩展为多币种。
|
|
10
|
+
/**
|
|
11
|
+
* 模型定价表(USD / 1K tokens)。
|
|
12
|
+
* key 统一为小写 `provider::model`。provider 允许省略(仅 model 匹配)。
|
|
13
|
+
* 仅收录常用模型,缺失型号回退到同 provider 的兜底或 NaN(交由调用方决策)。
|
|
14
|
+
*/
|
|
15
|
+
export const MODEL_PRICING = {
|
|
16
|
+
// ---- OpenAI ----
|
|
17
|
+
'openai::gpt-4o': { input: 0.0025, output: 0.01, cacheRead: 0.00125, cacheWrite: 0.005, currency: 'USD' },
|
|
18
|
+
'openai::gpt-4o-mini': { input: 0.00015, output: 0.0006, cacheRead: 0.000075, cacheWrite: 0.0003, currency: 'USD' },
|
|
19
|
+
'openai::gpt-4-turbo': { input: 0.01, output: 0.03, currency: 'USD' },
|
|
20
|
+
'openai::gpt-3.5-turbo': { input: 0.0005, output: 0.0015, currency: 'USD' },
|
|
21
|
+
'openai::o1': { input: 0.015, output: 0.06, currency: 'USD' },
|
|
22
|
+
'openai::o3-mini': { input: 0.0011, output: 0.0044, currency: 'USD' },
|
|
23
|
+
// ---- Anthropic ----
|
|
24
|
+
'anthropic::claude-3-5-sonnet': { input: 0.003, output: 0.015, cacheRead: 0.0003, cacheWrite: 0.00375, currency: 'USD' },
|
|
25
|
+
'anthropic::claude-3-5-haiku': { input: 0.0008, output: 0.004, cacheRead: 0.00008, cacheWrite: 0.001, currency: 'USD' },
|
|
26
|
+
'anthropic::claude-3-opus': { input: 0.015, output: 0.075, cacheRead: 0.0015, cacheWrite: 0.01875, currency: 'USD' },
|
|
27
|
+
// ---- DeepSeek ----
|
|
28
|
+
'deepseek::deepseek-chat': { input: 0.00027, output: 0.0011, cacheRead: 0.00007, cacheWrite: 0.00055, currency: 'USD' },
|
|
29
|
+
'deepseek::deepseek-reasoner': { input: 0.00055, output: 0.00219, cacheRead: 0.00014, cacheWrite: 0.00055, currency: 'USD' },
|
|
30
|
+
'deepseek::deepseek-v3': { input: 0.00027, output: 0.0011, cacheRead: 0.00007, cacheWrite: 0.00055, currency: 'USD' },
|
|
31
|
+
'deepseek::deepseek-v4-flash': { input: 0.0001, output: 0.0004, cacheRead: 0.00003, cacheWrite: 0.0002, currency: 'USD' },
|
|
32
|
+
// ---- 通义千问 / 阿里 ----
|
|
33
|
+
'qwen::qwen-max': { input: 0.0004, output: 0.0012, currency: 'USD' },
|
|
34
|
+
'qwen::qwen-plus': { input: 0.0001, output: 0.0003, currency: 'USD' },
|
|
35
|
+
'qwen::qwen-turbo': { input: 0.00003, output: 0.00009, currency: 'USD' },
|
|
36
|
+
// ---- 智谱 GLM ----
|
|
37
|
+
'zhipu::glm-4-plus': { input: 0.0005, output: 0.0015, currency: 'USD' },
|
|
38
|
+
'zhipu::glm-4-flash': { input: 0.00001, output: 0.00001, currency: 'USD' },
|
|
39
|
+
};
|
|
40
|
+
/** 未知模型的兜底单价(USD / 1K tokens),用于避免 cost 完全缺失 */
|
|
41
|
+
const FALLBACK_PRICE = { input: 0.001, output: 0.002, cacheRead: 0.0005, cacheWrite: 0.001, currency: 'USD' };
|
|
42
|
+
function normalizeProvider(provider) {
|
|
43
|
+
if (!provider)
|
|
44
|
+
return '';
|
|
45
|
+
const p = provider.toLowerCase();
|
|
46
|
+
if (p.includes('openai') || p.includes('gpt'))
|
|
47
|
+
return 'openai';
|
|
48
|
+
if (p.includes('anthropic') || p.includes('claude'))
|
|
49
|
+
return 'anthropic';
|
|
50
|
+
if (p.includes('deepseek'))
|
|
51
|
+
return 'deepseek';
|
|
52
|
+
if (p.includes('qwen') || p.includes('dashscope'))
|
|
53
|
+
return 'qwen';
|
|
54
|
+
if (p.includes('zhipu') || p.includes('glm'))
|
|
55
|
+
return 'zhipu';
|
|
56
|
+
return p;
|
|
57
|
+
}
|
|
58
|
+
function resolvePrice(model, provider) {
|
|
59
|
+
const m = (model || '').toLowerCase();
|
|
60
|
+
const p = normalizeProvider(provider);
|
|
61
|
+
if (m && p) {
|
|
62
|
+
const exact = MODEL_PRICING[`${p}::${m}`];
|
|
63
|
+
if (exact)
|
|
64
|
+
return exact;
|
|
65
|
+
}
|
|
66
|
+
if (m) {
|
|
67
|
+
// 仅按 model 模糊匹配(取第一个包含 model 子串的条目)
|
|
68
|
+
const byModel = Object.entries(MODEL_PRICING).find(([k]) => k.includes(m));
|
|
69
|
+
if (byModel)
|
|
70
|
+
return byModel[1];
|
|
71
|
+
}
|
|
72
|
+
return FALLBACK_PRICE;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 根据 usage 计算成本(USD)。
|
|
76
|
+
* 计费口径(与 Langfuse/OpenAI 一致):
|
|
77
|
+
* cost = promptTokens * input/1K
|
|
78
|
+
* + completionTokens * output/1K
|
|
79
|
+
* + cacheReadTokens * cacheRead/1K
|
|
80
|
+
* + cacheWriteTokens * cacheWrite/1K
|
|
81
|
+
* 若 usage 同时携带上游返回的 cost,则以 usage.cost 为准(更精确),本函数仅作兜底。
|
|
82
|
+
*
|
|
83
|
+
* @returns 无 token 数据时返回空(不虚构成本)
|
|
84
|
+
*/
|
|
85
|
+
export function computeCost(usage, model, provider) {
|
|
86
|
+
if (!usage)
|
|
87
|
+
return { estimated: false };
|
|
88
|
+
// 上游已给精确 cost → 直接采用
|
|
89
|
+
if (typeof usage.cost === 'number' && usage.cost >= 0) {
|
|
90
|
+
return { cost: usage.cost, currency: usage.currency, estimated: false };
|
|
91
|
+
}
|
|
92
|
+
const prompt = usage.promptTokens ?? 0;
|
|
93
|
+
const completion = usage.completionTokens ?? 0;
|
|
94
|
+
const cacheRead = usage.cacheReadTokens ?? 0;
|
|
95
|
+
const cacheWrite = usage.cacheWriteTokens ?? 0;
|
|
96
|
+
if (prompt + completion + cacheRead + cacheWrite <= 0)
|
|
97
|
+
return { estimated: false };
|
|
98
|
+
const price = resolvePrice(model, provider);
|
|
99
|
+
const cost = (prompt * price.input +
|
|
100
|
+
completion * price.output +
|
|
101
|
+
cacheRead * (price.cacheRead ?? price.input * 0.5) +
|
|
102
|
+
cacheWrite * (price.cacheWrite ?? price.input)) /
|
|
103
|
+
1000;
|
|
104
|
+
return { cost: Math.round(cost * 1e6) / 1e6, currency: price.currency ?? 'USD', estimated: price === FALLBACK_PRICE };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../../src/observability/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PropagationContext } from './types.js';
|
|
2
|
+
/** W3C 传播头(OpenTelemetry 标准),用于与 Jaeger/Tempo/现有 OTel 链路互操作 */
|
|
3
|
+
export declare const W3C_TRACEPARENT_HEADER = "traceparent";
|
|
4
|
+
export declare const W3C_TRACESTATE_HEADER = "tracestate";
|
|
5
|
+
/** 将传播上下文编码为可传输字符串(base64 JSON) */
|
|
6
|
+
export declare function serializePropagationContext(ctx: PropagationContext): string;
|
|
7
|
+
/** 从传输字符串解码传播上下文(容错:非法返回 undefined) */
|
|
8
|
+
export declare function parsePropagationContext(encoded: string | undefined | null): PropagationContext | undefined;
|
|
9
|
+
/** HTTP 头名(用于服务间调用透传) */
|
|
10
|
+
export declare const OBSERVABILITY_TRACE_HEADER = "x-observability-trace";
|
|
11
|
+
/**
|
|
12
|
+
* 将传播上下文注入到调用参数对象中(用于 delegate_task / a2a 等工具参数)。
|
|
13
|
+
* 返回新的参数对象,不修改原对象。
|
|
14
|
+
*/
|
|
15
|
+
export declare function injectIntoParams(params: Record<string, unknown>, ctx: PropagationContext): Record<string, unknown>;
|
|
16
|
+
/** 从调用参数对象中提取传播上下文 */
|
|
17
|
+
export declare function extractFromParams(params: Record<string, unknown> | undefined): PropagationContext | undefined;
|
|
18
|
+
/** 从 HTTP headers 中提取传播上下文(优先 W3C,回退自定义头) */
|
|
19
|
+
export declare function extractFromHeaders(headers: Record<string, string | undefined> | undefined): PropagationContext | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* 将传播上下文编码为 W3C traceparent + tracestate。
|
|
22
|
+
* - traceparent:由真实 ID 派生的 32/16 位十六进制,供外部 OTel 工具(Jaeger/Tempo)展示链路;
|
|
23
|
+
* - tracestate:以 obs=<base64> 形式保存真实上下文(traceId/parentObservationId 等),
|
|
24
|
+
* 保证跨进程能无损还原我们自己的观测上下文(W3C 标准推荐的 vendor data 用法)。
|
|
25
|
+
*/
|
|
26
|
+
export declare function serializeToW3C(ctx: PropagationContext): {
|
|
27
|
+
traceparent: string;
|
|
28
|
+
tracestate: string;
|
|
29
|
+
};
|
|
30
|
+
/** 从 W3C traceparent/tracestate 解码传播上下文(优先取 tracestate 中的真实上下文) */
|
|
31
|
+
export declare function parseFromW3C(traceparent: string | undefined, tracestate: string | undefined): PropagationContext | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* 将传播上下文注入 HTTP headers(同时携带自定义头与 W3C 头,最大化互操作性)。
|
|
34
|
+
* 返回新 headers 对象,不修改原对象。
|
|
35
|
+
*/
|
|
36
|
+
export declare function injectIntoHeaders(ctx: PropagationContext): Record<string, string>;
|
|
37
|
+
//# sourceMappingURL=propagation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propagation.d.ts","sourceRoot":"","sources":["../../../src/observability/propagation.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKrD,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAWlD,mCAAmC;AACnC,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAa3E;AAED,uCAAuC;AACvC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,kBAAkB,GAAG,SAAS,CAgB1G;AAED,yBAAyB;AACzB,eAAO,MAAM,0BAA0B,0BAAc,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlH;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,kBAAkB,GAAG,SAAS,CAI7G;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,GAAG,kBAAkB,GAAG,SAAS,CAW1H;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,kBAAkB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAMnG;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,kBAAkB,GAAG,SAAS,CAchC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMjF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Observability — cross-process trace propagation
|
|
3
|
+
// ============================================================
|
|
4
|
+
//
|
|
5
|
+
// 将 trace 上下文序列化后注入到跨进程调用(delegate_task / A2A / HTTP),
|
|
6
|
+
// 接收方用 ObservabilityManager.continueTrace() 重建上下文,
|
|
7
|
+
// 使分布式多 agent 落在同一棵 trace 树下(AsyncLocalStorage 不出进程,
|
|
8
|
+
// 必须显式传递 traceId + parentObservationId)。
|
|
9
|
+
//
|
|
10
|
+
// 序列化格式:base64(JSON),避免直接拼接进参数导致的注入/转义问题。
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
const HEADER_NAME = 'x-observability-trace';
|
|
13
|
+
const PARAM_KEY = '__obsTrace';
|
|
14
|
+
/** W3C 传播头(OpenTelemetry 标准),用于与 Jaeger/Tempo/现有 OTel 链路互操作 */
|
|
15
|
+
export const W3C_TRACEPARENT_HEADER = 'traceparent';
|
|
16
|
+
export const W3C_TRACESTATE_HEADER = 'tracestate';
|
|
17
|
+
/** tracestate 中的 vendor key,承载真实观测上下文(traceId/parentObservationId 等) */
|
|
18
|
+
const W3C_VENDOR = 'obs';
|
|
19
|
+
function w3cTraceId(seed) {
|
|
20
|
+
return createHash('sha256').update(`tid:${seed}`).digest('hex').slice(0, 32);
|
|
21
|
+
}
|
|
22
|
+
function w3cSpanId(seed) {
|
|
23
|
+
return createHash('sha256').update(`sid:${seed}`).digest('hex').slice(0, 16);
|
|
24
|
+
}
|
|
25
|
+
/** 将传播上下文编码为可传输字符串(base64 JSON) */
|
|
26
|
+
export function serializePropagationContext(ctx) {
|
|
27
|
+
try {
|
|
28
|
+
const json = JSON.stringify({
|
|
29
|
+
t: ctx.traceId,
|
|
30
|
+
p: ctx.parentObservationId,
|
|
31
|
+
e: ctx.environment,
|
|
32
|
+
g: ctx.tags,
|
|
33
|
+
v: ctx.promptVersion,
|
|
34
|
+
});
|
|
35
|
+
return Buffer.from(json, 'utf-8').toString('base64');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** 从传输字符串解码传播上下文(容错:非法返回 undefined) */
|
|
42
|
+
export function parsePropagationContext(encoded) {
|
|
43
|
+
if (!encoded)
|
|
44
|
+
return undefined;
|
|
45
|
+
try {
|
|
46
|
+
const json = Buffer.from(encoded, 'base64').toString('utf-8');
|
|
47
|
+
const o = JSON.parse(json);
|
|
48
|
+
if (!o || typeof o.t !== 'string')
|
|
49
|
+
return undefined;
|
|
50
|
+
return {
|
|
51
|
+
traceId: o.t,
|
|
52
|
+
parentObservationId: o.p,
|
|
53
|
+
environment: o.e,
|
|
54
|
+
tags: Array.isArray(o.g) ? o.g : undefined,
|
|
55
|
+
promptVersion: o.v,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** HTTP 头名(用于服务间调用透传) */
|
|
63
|
+
export const OBSERVABILITY_TRACE_HEADER = HEADER_NAME;
|
|
64
|
+
/**
|
|
65
|
+
* 将传播上下文注入到调用参数对象中(用于 delegate_task / a2a 等工具参数)。
|
|
66
|
+
* 返回新的参数对象,不修改原对象。
|
|
67
|
+
*/
|
|
68
|
+
export function injectIntoParams(params, ctx) {
|
|
69
|
+
const encoded = serializePropagationContext(ctx);
|
|
70
|
+
if (!encoded)
|
|
71
|
+
return params;
|
|
72
|
+
return { ...params, [PARAM_KEY]: encoded };
|
|
73
|
+
}
|
|
74
|
+
/** 从调用参数对象中提取传播上下文 */
|
|
75
|
+
export function extractFromParams(params) {
|
|
76
|
+
if (!params)
|
|
77
|
+
return undefined;
|
|
78
|
+
const raw = params[PARAM_KEY];
|
|
79
|
+
return parsePropagationContext(typeof raw === 'string' ? raw : undefined);
|
|
80
|
+
}
|
|
81
|
+
/** 从 HTTP headers 中提取传播上下文(优先 W3C,回退自定义头) */
|
|
82
|
+
export function extractFromHeaders(headers) {
|
|
83
|
+
if (!headers)
|
|
84
|
+
return undefined;
|
|
85
|
+
// 优先解析 W3C traceparent/tracestate:tracestate.obs 携带真实上下文,可权威还原
|
|
86
|
+
const tp = headers[W3C_TRACEPARENT_HEADER] || headers[W3C_TRACEPARENT_HEADER.toUpperCase()];
|
|
87
|
+
const ts = headers[W3C_TRACESTATE_HEADER] || headers[W3C_TRACESTATE_HEADER.toUpperCase()];
|
|
88
|
+
if (tp || ts) {
|
|
89
|
+
const w3c = parseFromW3C(tp, ts);
|
|
90
|
+
if (w3c)
|
|
91
|
+
return w3c;
|
|
92
|
+
}
|
|
93
|
+
// 回退到自定义头(内部 delegate_task / A2A 兼容)
|
|
94
|
+
return parsePropagationContext(headers[HEADER_NAME] || headers[HEADER_NAME.toLowerCase()]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 将传播上下文编码为 W3C traceparent + tracestate。
|
|
98
|
+
* - traceparent:由真实 ID 派生的 32/16 位十六进制,供外部 OTel 工具(Jaeger/Tempo)展示链路;
|
|
99
|
+
* - tracestate:以 obs=<base64> 形式保存真实上下文(traceId/parentObservationId 等),
|
|
100
|
+
* 保证跨进程能无损还原我们自己的观测上下文(W3C 标准推荐的 vendor data 用法)。
|
|
101
|
+
*/
|
|
102
|
+
export function serializeToW3C(ctx) {
|
|
103
|
+
const traceId = w3cTraceId(ctx.traceId);
|
|
104
|
+
const parentId = ctx.parentObservationId ? w3cSpanId(ctx.parentObservationId) : w3cSpanId(`root:${ctx.traceId}`);
|
|
105
|
+
const traceparent = `00-${traceId}-${parentId}-01`;
|
|
106
|
+
const tracestate = `${W3C_VENDOR}=${serializePropagationContext(ctx)}`;
|
|
107
|
+
return { traceparent, tracestate };
|
|
108
|
+
}
|
|
109
|
+
/** 从 W3C traceparent/tracestate 解码传播上下文(优先取 tracestate 中的真实上下文) */
|
|
110
|
+
export function parseFromW3C(traceparent, tracestate) {
|
|
111
|
+
if (tracestate) {
|
|
112
|
+
const item = tracestate
|
|
113
|
+
.split(',')
|
|
114
|
+
.map(s => s.trim())
|
|
115
|
+
.find(s => s.startsWith(`${W3C_VENDOR}=`));
|
|
116
|
+
if (item) {
|
|
117
|
+
const payload = item.slice(`${W3C_VENDOR}=`.length);
|
|
118
|
+
const ctx = parsePropagationContext(payload);
|
|
119
|
+
if (ctx)
|
|
120
|
+
return ctx;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// 仅有 traceparent(无 tracestate)时无法还原真实业务 ID,交由上层回退自定义头
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 将传播上下文注入 HTTP headers(同时携带自定义头与 W3C 头,最大化互操作性)。
|
|
128
|
+
* 返回新 headers 对象,不修改原对象。
|
|
129
|
+
*/
|
|
130
|
+
export function injectIntoHeaders(ctx) {
|
|
131
|
+
const headers = { [HEADER_NAME]: serializePropagationContext(ctx) };
|
|
132
|
+
const { traceparent, tracestate } = serializeToW3C(ctx);
|
|
133
|
+
headers[W3C_TRACEPARENT_HEADER] = traceparent;
|
|
134
|
+
headers[W3C_TRACESTATE_HEADER] = tracestate;
|
|
135
|
+
return headers;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=propagation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propagation.js","sourceRoot":"","sources":["../../../src/observability/propagation.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,kDAAkD;AAClD,+DAA+D;AAC/D,EAAE;AACF,uDAAuD;AACvD,mDAAmD;AACnD,qDAAqD;AACrD,yCAAyC;AACzC,EAAE;AACF,0CAA0C;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAClD,wEAAwE;AACxE,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,SAAS,UAAU,CAAC,IAAY;IAC5B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AACD,SAAS,SAAS,CAAC,IAAY;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,2BAA2B,CAAC,GAAuB;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,CAAC,EAAE,GAAG,CAAC,OAAO;YACd,CAAC,EAAE,GAAG,CAAC,mBAAmB;YAC1B,CAAC,EAAE,GAAG,CAAC,WAAW;YAClB,CAAC,EAAE,GAAG,CAAC,IAAI;YACX,CAAC,EAAE,GAAG,CAAC,aAAa;SACrB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACxE,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,CAAC;YACZ,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACxB,WAAW,EAAE,CAAC,CAAC,CAAC;YAChB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1C,aAAa,EAAE,CAAC,CAAC,CAAC;SACnB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA+B,EAAE,GAAuB;IACvF,MAAM,OAAO,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAC5B,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,iBAAiB,CAAC,MAA2C;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9B,OAAO,uBAAuB,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC5E,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,kBAAkB,CAAC,OAAuD;IACxF,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,+DAA+D;IAC/D,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,qBAAqB,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1F,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,qCAAqC;IACrC,OAAO,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACjH,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,QAAQ,KAAK,CAAC;IACnD,MAAM,UAAU,GAAG,GAAG,UAAU,IAAI,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;IACvE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAC1B,WAA+B,EAC/B,UAA8B;IAE9B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,UAAU;aACpB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;IACH,CAAC;IACD,sDAAsD;IACtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,MAAM,OAAO,GAA2B,EAAE,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5F,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,sBAAsB,CAAC,GAAG,WAAW,CAAC;IAC9C,OAAO,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC;IAC5C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EventContext, ObservationEndData, ObservationHandle, ObservationStartContext, ObservabilityConfig, ObservabilitySink, ScoreRecord, TraceEndData, TraceHandle, TraceStartContext } from './types.js';
|
|
1
|
+
import type { EventContext, ObservationEndData, ObservationHandle, ObservationStartContext, ObservabilityConfig, ObservabilitySink, PropagationContext, ScoreRecord, TraceEndData, TraceHandle, TraceStartContext } from './types.js';
|
|
2
2
|
export interface ObservabilityContext {
|
|
3
3
|
traceId: string;
|
|
4
4
|
/** 根会话 ID(启动 trace 的 session)。子 Agent 的 on_complete 不会结束 trace */
|
|
@@ -11,6 +11,12 @@ export interface ObservabilityContext {
|
|
|
11
11
|
metadata?: Record<string, unknown>;
|
|
12
12
|
/** trace 是否已结束(由 on_complete/endTrace 置位),防止 runWithTrace 成功路径覆盖错误状态 */
|
|
13
13
|
ended?: boolean;
|
|
14
|
+
/** 运行环境(dev/prod/test),贯穿整个 trace 及其 observations */
|
|
15
|
+
environment?: string;
|
|
16
|
+
/** 全局标签,贯穿整个 trace 及其 observations */
|
|
17
|
+
tags?: string[];
|
|
18
|
+
/** 关联提示词/agent 配置版本 */
|
|
19
|
+
promptVersion?: string;
|
|
14
20
|
}
|
|
15
21
|
export declare class NoOpObservabilitySink implements ObservabilitySink {
|
|
16
22
|
startTrace(ctx: TraceStartContext): TraceHandle;
|
|
@@ -30,6 +36,14 @@ export declare class ObservabilityManager implements ObservabilitySink {
|
|
|
30
36
|
getTraceContext(): ObservabilityContext | undefined;
|
|
31
37
|
runWithContext<T>(context: ObservabilityContext, fn: () => T): T;
|
|
32
38
|
runWithTrace<T>(ctx: TraceStartContext, fn: () => T | Promise<T>): Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* 跨进程继续 trace:在子进程(delegate_task / A2A)中,用父进程传入的
|
|
41
|
+
* PropagationContext 重建观测上下文,使子进程的 observations 挂到同一棵 trace 树下。
|
|
42
|
+
* 不会结束 trace(trace 生命周期由父进程拥有),仅在本进程内传播上下文。
|
|
43
|
+
*/
|
|
44
|
+
continueTrace<T>(propCtx: PropagationContext, fn: () => T | Promise<T>): Promise<T>;
|
|
45
|
+
/** 导出当前上下文为可跨进程传播的 PropagationContext(供注入到子调用参数/HTTP 头) */
|
|
46
|
+
getPropagationContext(): PropagationContext | undefined;
|
|
33
47
|
startTrace(ctx: TraceStartContext): Promise<TraceHandle>;
|
|
34
48
|
endTrace(traceId: string, data?: TraceEndData): void;
|
|
35
49
|
startObservation(ctx: ObservationStartContext): Promise<ObservationHandle>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../../src/observability/sink.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../../src/observability/sink.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,10 +32,13 @@ export class ObservabilityManager {
|
|
|
32
32
|
this.config = {
|
|
33
33
|
enabled: config.enabled ?? true,
|
|
34
34
|
samplingRate: normalizeSamplingRate(config.samplingRate ?? 1),
|
|
35
|
+
sampleErrors: config.sampleErrors ?? false,
|
|
35
36
|
captureInput: config.captureInput ?? true,
|
|
36
37
|
captureOutput: config.captureOutput ?? true,
|
|
37
38
|
captureMessages: config.captureMessages ?? true,
|
|
38
39
|
redact: config.redact,
|
|
40
|
+
environment: config.environment,
|
|
41
|
+
tags: config.tags,
|
|
39
42
|
};
|
|
40
43
|
}
|
|
41
44
|
configure(config) {
|
|
@@ -62,6 +65,9 @@ export class ObservabilityManager {
|
|
|
62
65
|
sampled: handle.sampled,
|
|
63
66
|
startTime: handle.startTime,
|
|
64
67
|
metadata: ctx.metadata,
|
|
68
|
+
environment: ctx.environment ?? this.config.environment,
|
|
69
|
+
tags: ctx.tags ?? this.config.tags,
|
|
70
|
+
promptVersion: ctx.promptVersion,
|
|
65
71
|
};
|
|
66
72
|
return this.storage.run(context, async () => {
|
|
67
73
|
try {
|
|
@@ -74,15 +80,53 @@ export class ObservabilityManager {
|
|
|
74
80
|
return result;
|
|
75
81
|
}
|
|
76
82
|
catch (err) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
// 若 on_complete 已结束 trace(例如引擎内部捕获错误后触发了 on_complete(error)),
|
|
84
|
+
// 不再重复结束,避免重复告警 / 状态覆盖。
|
|
85
|
+
if (!context.ended) {
|
|
86
|
+
this.endTrace(handle.traceId, {
|
|
87
|
+
status: 'error',
|
|
88
|
+
error: err instanceof Error ? err.message : String(err),
|
|
89
|
+
startTime: handle.startTime,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
82
92
|
throw err;
|
|
83
93
|
}
|
|
84
94
|
});
|
|
85
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* 跨进程继续 trace:在子进程(delegate_task / A2A)中,用父进程传入的
|
|
98
|
+
* PropagationContext 重建观测上下文,使子进程的 observations 挂到同一棵 trace 树下。
|
|
99
|
+
* 不会结束 trace(trace 生命周期由父进程拥有),仅在本进程内传播上下文。
|
|
100
|
+
*/
|
|
101
|
+
async continueTrace(propCtx, fn) {
|
|
102
|
+
const context = {
|
|
103
|
+
traceId: propCtx.traceId,
|
|
104
|
+
// 子进程不是 root:其 on_complete 不应结束父 trace
|
|
105
|
+
rootSessionId: undefined,
|
|
106
|
+
currentObservationId: propCtx.parentObservationId,
|
|
107
|
+
observationStack: propCtx.parentObservationId ? [propCtx.parentObservationId] : [],
|
|
108
|
+
sampled: true,
|
|
109
|
+
startTime: Date.now(),
|
|
110
|
+
environment: propCtx.environment ?? this.config.environment,
|
|
111
|
+
tags: propCtx.tags ?? this.config.tags,
|
|
112
|
+
promptVersion: propCtx.promptVersion,
|
|
113
|
+
metadata: {},
|
|
114
|
+
};
|
|
115
|
+
return this.storage.run(context, async () => fn());
|
|
116
|
+
}
|
|
117
|
+
/** 导出当前上下文为可跨进程传播的 PropagationContext(供注入到子调用参数/HTTP 头) */
|
|
118
|
+
getPropagationContext() {
|
|
119
|
+
const current = this.storage.getStore();
|
|
120
|
+
if (!current?.traceId)
|
|
121
|
+
return undefined;
|
|
122
|
+
return {
|
|
123
|
+
traceId: current.traceId,
|
|
124
|
+
parentObservationId: current.currentObservationId,
|
|
125
|
+
environment: current.environment,
|
|
126
|
+
tags: current.tags,
|
|
127
|
+
promptVersion: current.promptVersion,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
86
130
|
async startTrace(ctx) {
|
|
87
131
|
const traceId = ctx.traceId || generateObservabilityId('trace');
|
|
88
132
|
const sampled = this.shouldSample();
|
|
@@ -128,6 +172,9 @@ export class ObservabilityManager {
|
|
|
128
172
|
...ctx,
|
|
129
173
|
traceId,
|
|
130
174
|
parentObservationId,
|
|
175
|
+
// 未显式指定的 environment/tags 从当前 trace 上下文继承,保证全链路一致
|
|
176
|
+
environment: ctx.environment ?? current?.environment,
|
|
177
|
+
tags: ctx.tags ?? current?.tags,
|
|
131
178
|
});
|
|
132
179
|
const sinkHandle = await this.sink.startObservation(safeCtx);
|
|
133
180
|
return { ...handle, ...sinkHandle, traceId };
|
|
@@ -166,6 +213,11 @@ export class ObservabilityManager {
|
|
|
166
213
|
shouldSample() {
|
|
167
214
|
if (!this.config.enabled)
|
|
168
215
|
return false;
|
|
216
|
+
// 错误优先可观测:开启 sampleErrors 时强制全量采样。
|
|
217
|
+
// head-based 采样在 startTrace 时无法预知最终结果是否错误,「强制保留」是唯一能保证错误 trace
|
|
218
|
+
// 不被随机丢弃的方式;真正的尾部采样(trace 结束后再决策保留)见后续规划。
|
|
219
|
+
if (this.config.sampleErrors)
|
|
220
|
+
return true;
|
|
169
221
|
if (this.config.samplingRate >= 1)
|
|
170
222
|
return true;
|
|
171
223
|
if (this.config.samplingRate <= 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sink.js","sourceRoot":"","sources":["../../../src/observability/sink.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,2DAA2D;AAC3D,+DAA+D;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sink.js","sourceRoot":"","sources":["../../../src/observability/sink.ts"],"names":[],"mappings":"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"}
|