@agentunion/fastaun-browser 0.4.3 → 0.4.5

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 (71) hide show
  1. package/CHANGELOG.md +203 -178
  2. package/_packed_docs/CHANGELOG.md +203 -178
  3. package/_packed_docs/INDEX.md +17 -17
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +11 -11
  5. package/_packed_docs/agent.md/SCHEMA.md +49 -49
  6. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +22 -22
  7. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +327 -327
  8. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +686 -686
  9. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -542
  10. package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +124 -124
  11. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +665 -665
  12. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +2 -2
  13. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -170
  14. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -419
  15. package/_packed_docs/protocol/README.md +1 -1
  16. package/_packed_docs/protocol/aun-docs-guide.md +1 -1
  17. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +15 -15
  18. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +4 -4
  19. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +98 -98
  20. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +46 -46
  21. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +257 -257
  22. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +1 -1
  23. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
  24. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1 -0
  25. package/_packed_docs/sdk/09-payload-reference.md +13 -13
  26. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +171 -171
  27. package/dist/aid-store.d.ts +1 -0
  28. package/dist/aid-store.d.ts.map +1 -1
  29. package/dist/aid-store.js +26 -9
  30. package/dist/aid-store.js.map +1 -1
  31. package/dist/aid.d.ts +2 -1
  32. package/dist/aid.d.ts.map +1 -1
  33. package/dist/aid.js +7 -6
  34. package/dist/aid.js.map +1 -1
  35. package/dist/auth.d.ts +8 -13
  36. package/dist/auth.d.ts.map +1 -1
  37. package/dist/auth.js +38 -127
  38. package/dist/auth.js.map +1 -1
  39. package/dist/bundle.js +872 -350
  40. package/dist/client.d.ts +12 -5
  41. package/dist/client.d.ts.map +1 -1
  42. package/dist/client.js +296 -213
  43. package/dist/client.js.map +1 -1
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/keystore/index.d.ts +45 -22
  49. package/dist/keystore/index.d.ts.map +1 -1
  50. package/dist/keystore/index.js +6 -1
  51. package/dist/keystore/index.js.map +1 -1
  52. package/dist/keystore/indexeddb.d.ts +11 -1
  53. package/dist/keystore/indexeddb.d.ts.map +1 -1
  54. package/dist/keystore/indexeddb.js +167 -18
  55. package/dist/keystore/indexeddb.js.map +1 -1
  56. package/dist/register-flow.d.ts +34 -0
  57. package/dist/register-flow.d.ts.map +1 -0
  58. package/dist/register-flow.js +355 -0
  59. package/dist/register-flow.js.map +1 -0
  60. package/dist/v2/session/keystore.d.ts +5 -0
  61. package/dist/v2/session/keystore.d.ts.map +1 -1
  62. package/dist/v2/session/keystore.js +29 -0
  63. package/dist/v2/session/keystore.js.map +1 -1
  64. package/dist/version.d.ts +1 -1
  65. package/dist/version.js +1 -1
  66. package/package.json +1 -1
  67. package/_packed_docs/0.4.0_/345/267/256/345/274/202/346/240/270/345/256/236/345/206/263/347/255/226/350/256/260/345/275/225.md +0 -302
  68. package/_packed_docs/AUN_SDK_0.4.0_/350/256/276/350/256/241/345/257/271/346/257/224/345/210/206/346/236/220.md +0 -194
  69. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/345/256/236/346/226/275/350/256/241/345/210/222.md +0 -596
  70. package/_packed_docs/AUN_SDK_/351/207/215/346/236/204/350/256/276/350/256/241/346/226/271/346/241/210_v3.md +0 -1697
  71. package/_packed_docs/python-sdk-v2-only-changelog.md +0 -189
@@ -1,257 +1,257 @@
1
- # 附录 N — 分布式 Trace 协议
2
-
3
- ## 设计目标
4
-
5
- 为 AUN RPC 调用链路(SDK → Gateway → Service → Gateway → SDK)提供轻量级的分布式追踪能力,
6
- 支持两种使用场景:
7
-
8
- 1. **日志关联(log 模式)** — 全链路日志通过 `trace_id` 串联,零开销,可在生产环境常开
9
- 2. **诊断回传(diag 模式)** — 各环节追加 span,response 携带完整链路返回调用者,
10
- 仅用于疑难问题诊断,需通过开关启用
11
-
12
- 不依赖 OpenTelemetry / Jaeger 等外部体系,自定义 `_trace` 字段即可,跨语言实现成本极低。
13
-
14
- ---
15
-
16
- ## 一、协议层
17
-
18
- ### 1.1 字段位置
19
-
20
- `_trace` 字段位于 JSON-RPC `params` 内,沿用 AUN 现有框架字段约定(与 `_caller_id`、`_auth` 同级):
21
-
22
- ```json
23
- {
24
- "jsonrpc": "2.0",
25
- "id": 1,
26
- "method": "message.send",
27
- "params": {
28
- "to": "bob.aid.com",
29
- "body": "hello",
30
- "_trace": {
31
- "trace_id": "a1b2c3d4e5f6...",
32
- "mode": "log"
33
- }
34
- }
35
- }
36
- ```
37
-
38
- ### 1.2 字段定义
39
-
40
- | 字段 | 类型 | 必填 | 说明 |
41
- |------|------|------|------|
42
- | `trace_id` | string | 是 | 32 hex chars(16 bytes 随机),由 SDK 生成,全链路唯一 |
43
- | `mode` | string | 是 | `"log"` 或 `"diag"`,缺失视为 `"log"` |
44
- | `spans` | array | 否 | 仅 `diag` 模式存在,各环节追加 |
45
-
46
- **说明**:`mode: "off"` 不需要显式表示——不带 `_trace` 字段即为 off 状态。
47
-
48
- ### 1.3 Span 结构
49
-
50
- ```json
51
- {
52
- "node": "gateway",
53
- "ts": 1716300000156,
54
- "action": "relay_in",
55
- "ms": 0,
56
- "detail": "route→message"
57
- }
58
- ```
59
-
60
- | 字段 | 类型 | 说明 |
61
- |------|------|------|
62
- | `node` | string | 环节标识:`sdk-{aid}`、`gateway`、`{service_name}` |
63
- | `ts` | number | Unix 毫秒时间戳(入站时刻) |
64
- | `action` | string | 动作:`send` / `relay_in` / `process` / `relay_out` / `deliver` |
65
- | `ms` | number | 本环节处理耗时(出站时填写,入站初始为 0) |
66
- | `detail` | string | 可选,关键上下文(路由目标、错误码等),最多 256 字符 |
67
-
68
- ---
69
-
70
- ## 二、链路传播流程
71
-
72
- ```
73
- SDK-A Gateway Service Gateway SDK-B
74
- │ │ │ │ │
75
- │─── params._trace ─▶│ │ │ │
76
- │ {trace_id, mode, │ │ │ │
77
- │ spans:[sdk-send]}│ │ │ │
78
- │ │── 追加 gateway ───▶│ │ │
79
- │ │ 转发到 service │ │ │
80
- │ │ │── 追加 svc span ──▶│ │
81
- │ │ │ 返回 response │ │
82
- │ │◀── response ───────│ │ │
83
- │ │ 追加 gateway-out │ │ │
84
- │◀── response._trace─│ │ │ │
85
- │ │ │ │ │
86
- │ │─── event._trace ──────────────────────▶│── deliver ────────▶│
87
- ```
88
-
89
- ### 2.1 各环节职责
90
-
91
- | 环节 | 入站行为 | 出站行为 |
92
- |------|----------|----------|
93
- | SDK 发起 | 生成 trace_id;mode≠off 时构造 `_trace` 注入 params | — |
94
- | Gateway 入站 | 读取 _trace,应用降级;diag 模式追加 `relay_in` span | — |
95
- | Service 处理 | 读取 _trace 写入日志(log)或追加 span(diag) | response 透传 _trace |
96
- | Gateway 出站 | diag 模式追加 `relay_out` span | log 模式剥离 _trace;diag 模式注入 response 顶层 |
97
- | SDK 接收 | 提取 response._trace 回调 trace observer | — |
98
-
99
- ---
100
-
101
- ## 三、Response 回传(仅 diag 模式)
102
-
103
- Gateway 在 `deliver_response_to_client` 中将 `_trace` 注入 response 顶层(与 `_meta` 平级):
104
-
105
- ```json
106
- {
107
- "jsonrpc": "2.0",
108
- "id": 1,
109
- "result": {"status": "ok", "message_id": "..."},
110
- "_meta": {"agent_md_etag": "..."},
111
- "_trace": {
112
- "trace_id": "a1b2c3...",
113
- "mode": "diag",
114
- "spans": [
115
- {"node": "sdk-alice.aid.com", "ts": 1716300000100, "action": "send"},
116
- {"node": "gateway", "ts": 1716300000123, "action": "relay_in", "ms": 2, "detail": "→message"},
117
- {"node": "message", "ts": 1716300000125, "action": "process", "ms": 15},
118
- {"node": "gateway", "ts": 1716300000142, "action": "relay_out", "ms": 1}
119
- ]
120
- }
121
- }
122
- ```
123
-
124
- **注意**:log 模式下 response 不带 `_trace`(保持 envelope 干净,零开销)。
125
-
126
- ---
127
-
128
- ## 四、开关层级
129
-
130
- ### 4.1 三态定义
131
-
132
- | 值 | 行为 |
133
- |---|---|
134
- | `off` | 不生成 `_trace`,零开销(默认) |
135
- | `log` | 生成 trace_id + 各环节写本地日志,response 不回传 |
136
- | `diag` | 同 log + spans 追加 + response 回传完整链路 |
137
-
138
- ### 4.2 控制点
139
-
140
- | 层级 | 配置位置 | 默认值 | 作用 |
141
- |------|----------|--------|------|
142
- | 服务端上限 | Gateway 环境变量 `AUN_TRACE_MAX_MODE` | `"log"` | 超过此级别自动降级 |
143
- | SDK 会话级 | `client.set_trace_mode("log")` | `"off"` | 连接内所有请求默认 mode |
144
- | SDK 调用级 | `client.rpc("method", params, trace="diag")` | 继承会话级 | 单次覆盖,优先级最高 |
145
-
146
- ### 4.3 优先级规则
147
-
148
- ```
149
- 最终 mode = min(SDK 调用级 || SDK 会话级, 服务端上限)
150
- 其中 off < log < diag
151
- ```
152
-
153
- ### 4.4 服务端降级逻辑(Gateway 入站时)
154
-
155
- ```python
156
- client_mode = trace.get("mode", "off")
157
- server_max = config.trace_max_mode # "off" | "log" | "diag"
158
- effective = min(client_mode, server_max)
159
- if effective != client_mode:
160
- trace["mode"] = effective
161
- if effective != "diag":
162
- trace.pop("spans", None) # 降级到 log/off 时丢弃已有 spans
163
- ```
164
-
165
- **生产环境推荐配置**:`AUN_TRACE_MAX_MODE=log`,diag 需运维手动开启。
166
-
167
- ---
168
-
169
- ## 五、各组件改动点
170
-
171
- ### 5.1 SDK 侧
172
-
173
- **`transport.py`**:
174
- - `call()` 方法:会话/调用级 mode 非 off 时,构造 `_trace` 注入 params
175
- - response 处理:提取 `_trace` 回调 trace observer(与现有 `_meta_observer` 模式一致)
176
-
177
- **`client.py`**:
178
- - 新增 `set_trace_mode(mode: str)`:设置会话级默认 mode
179
- - `rpc()` 方法新增 `trace` 参数:单次覆盖 mode
180
- - 暴露 `set_trace_observer(callback)`:接收 diag 模式回传的 spans
181
-
182
- ### 5.2 Gateway 侧
183
-
184
- **`ws_server.py`**:
185
- - `_resolve_ws_message_trace()` 改造:读取 mode,应用服务端降级
186
- - 入站时追加 `relay_in` span(diag 模式)
187
- - `_strip_internal_route()` 保持现状:log 模式仍剥离 `_trace`,diag 模式由 response 路径专门处理
188
-
189
- **`relay.py`**:
190
- - `deliver_response_to_client()`:diag 模式追加 `relay_out` span,将 `_trace` 注入 response 顶层
191
-
192
- ### 5.3 Service 侧
193
-
194
- 通用 pattern(适用于 message / group / storage / stream / mail 等所有服务):
195
- 1. RPC 入口提取 `params._trace`
196
- 2. 处理过程中通过 trace_id 写入日志
197
- 3. diag 模式追加自身 span
198
- 4. response 透传 `_trace` 字段
199
-
200
- ---
201
-
202
- ## 六、日志格式(log 模式)
203
-
204
- 各环节按现有日志规范输出,前缀加 trace_id:
205
-
206
- ```
207
- [2026-05-21 10:00:00.123][INFO][gateway] [trace=a1b2c3d4] relay_in method=message.send conn=42
208
- [2026-05-21 10:00:00.125][INFO][message] [trace=a1b2c3d4] process persist=true target=bob.aid.com
209
- [2026-05-21 10:00:00.140][INFO][gateway] [trace=a1b2c3d4] relay_out duration_ms=17
210
- ```
211
-
212
- 排查时 `grep trace=a1b2c3d4` 即可串联全链路。
213
-
214
- ---
215
-
216
- ## 七、安全约束
217
-
218
- | 约束 | 限制 |
219
- |------|------|
220
- | spans 数组最大长度 | 32 条,超出由 Gateway 截断尾部 |
221
- | 单个 detail 最大长度 | 256 字符 |
222
- | trace_id 长度 | 严格 32 hex chars,不合规由 Gateway 重新生成 |
223
- | 敏感信息 | spans 禁止包含消息体、密钥、Token 等,只记录路由/耗时/错误码等元数据 |
224
- | 生产环境默认 | `AUN_TRACE_MAX_MODE=log`,diag 需运维手动开启 |
225
- | 跨域传播 | 跨 federation 边界时保留 trace_id,spans 在边界节点视为新链路起点 |
226
-
227
- ---
228
-
229
- ## 八、跨语言实现要点
230
-
231
- 所有 SDK(Python / Go / TypeScript / JavaScript / C++)需保持一致:
232
-
233
- 1. **trace_id 生成**:16 字节加密随机数,hex 编码
234
- 2. **时间戳**:Unix 毫秒(不使用秒/纳秒),统一单位
235
- 3. **字段顺序**:JSON 字段顺序不影响语义,但建议按 `trace_id, mode, spans` 顺序输出便于阅读
236
- 4. **observer 接口**:各 SDK 提供 `set_trace_observer(callback)` 接口,签名一致
237
- 5. **会话/调用级 API 命名**:
238
- - 设置:`set_trace_mode(mode)` / `setTraceMode(mode)`
239
- - 单次覆盖:`rpc(method, params, trace=mode)` / `rpc(method, params, {trace: mode})`
240
-
241
- ---
242
-
243
- ## 九、未实现 / 后续扩展
244
-
245
- 以下能力本附录暂不覆盖,留作后续扩展:
246
-
247
- - **采样率控制**:当前 SDK 完全控制 mode,未引入概率采样(如 1% diag)
248
- - **OpenTelemetry 适配**:未来如需对接 Jaeger / Zipkin,可在 Gateway 端增加导出适配层,
249
- 将 spans 转为 OTLP 格式
250
- - **跨域链路连续性**:当前跨 federation 边界视为新链路,未实现端到端 trace_id 透传
251
- - **span 父子关系**:当前 spans 数组仅按时间排序,未引入 parent_span_id(保持极简)
252
-
253
- ---
254
-
255
- ## 文档版本
256
-
257
- - v1.0 — 2026-05-21 初稿,定义协议字段、链路传播、开关层级、安全约束
1
+ # 附录 N — 分布式 Trace 协议
2
+
3
+ ## 设计目标
4
+
5
+ 为 AUN RPC 调用链路(SDK → Gateway → Service → Gateway → SDK)提供轻量级的分布式追踪能力,
6
+ 支持两种使用场景:
7
+
8
+ 1. **日志关联(log 模式)** — 全链路日志通过 `trace_id` 串联,零开销,可在生产环境常开
9
+ 2. **诊断回传(diag 模式)** — 各环节追加 span,response 携带完整链路返回调用者,
10
+ 仅用于疑难问题诊断,需通过开关启用
11
+
12
+ 不依赖 OpenTelemetry / Jaeger 等外部体系,自定义 `_trace` 字段即可,跨语言实现成本极低。
13
+
14
+ ---
15
+
16
+ ## 一、协议层
17
+
18
+ ### 1.1 字段位置
19
+
20
+ `_trace` 字段位于 JSON-RPC `params` 内,沿用 AUN 现有框架字段约定(与 `_caller_id`、`_auth` 同级):
21
+
22
+ ```json
23
+ {
24
+ "jsonrpc": "2.0",
25
+ "id": 1,
26
+ "method": "message.send",
27
+ "params": {
28
+ "to": "bob.aid.com",
29
+ "body": "hello",
30
+ "_trace": {
31
+ "trace_id": "a1b2c3d4e5f6...",
32
+ "mode": "log"
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ ### 1.2 字段定义
39
+
40
+ | 字段 | 类型 | 必填 | 说明 |
41
+ |------|------|------|------|
42
+ | `trace_id` | string | 是 | 32 hex chars(16 bytes 随机),由 SDK 生成,全链路唯一 |
43
+ | `mode` | string | 是 | `"log"` 或 `"diag"`,缺失视为 `"log"` |
44
+ | `spans` | array | 否 | 仅 `diag` 模式存在,各环节追加 |
45
+
46
+ **说明**:`mode: "off"` 不需要显式表示——不带 `_trace` 字段即为 off 状态。
47
+
48
+ ### 1.3 Span 结构
49
+
50
+ ```json
51
+ {
52
+ "node": "gateway",
53
+ "ts": 1716300000156,
54
+ "action": "relay_in",
55
+ "ms": 0,
56
+ "detail": "route→message"
57
+ }
58
+ ```
59
+
60
+ | 字段 | 类型 | 说明 |
61
+ |------|------|------|
62
+ | `node` | string | 环节标识:`sdk-{aid}`、`gateway`、`{service_name}` |
63
+ | `ts` | number | Unix 毫秒时间戳(入站时刻) |
64
+ | `action` | string | 动作:`send` / `relay_in` / `process` / `relay_out` / `deliver` |
65
+ | `ms` | number | 本环节处理耗时(出站时填写,入站初始为 0) |
66
+ | `detail` | string | 可选,关键上下文(路由目标、错误码等),最多 256 字符 |
67
+
68
+ ---
69
+
70
+ ## 二、链路传播流程
71
+
72
+ ```
73
+ SDK-A Gateway Service Gateway SDK-B
74
+ │ │ │ │ │
75
+ │─── params._trace ─▶│ │ │ │
76
+ │ {trace_id, mode, │ │ │ │
77
+ │ spans:[sdk-send]}│ │ │ │
78
+ │ │── 追加 gateway ───▶│ │ │
79
+ │ │ 转发到 service │ │ │
80
+ │ │ │── 追加 svc span ──▶│ │
81
+ │ │ │ 返回 response │ │
82
+ │ │◀── response ───────│ │ │
83
+ │ │ 追加 gateway-out │ │ │
84
+ │◀── response._trace─│ │ │ │
85
+ │ │ │ │ │
86
+ │ │─── event._trace ──────────────────────▶│── deliver ────────▶│
87
+ ```
88
+
89
+ ### 2.1 各环节职责
90
+
91
+ | 环节 | 入站行为 | 出站行为 |
92
+ |------|----------|----------|
93
+ | SDK 发起 | 生成 trace_id;mode≠off 时构造 `_trace` 注入 params | — |
94
+ | Gateway 入站 | 读取 _trace,应用降级;diag 模式追加 `relay_in` span | — |
95
+ | Service 处理 | 读取 _trace 写入日志(log)或追加 span(diag) | response 透传 _trace |
96
+ | Gateway 出站 | diag 模式追加 `relay_out` span | log 模式剥离 _trace;diag 模式注入 response 顶层 |
97
+ | SDK 接收 | 提取 response._trace 回调 trace observer | — |
98
+
99
+ ---
100
+
101
+ ## 三、Response 回传(仅 diag 模式)
102
+
103
+ Gateway 在 `deliver_response_to_client` 中将 `_trace` 注入 response 顶层(与 `_meta` 平级):
104
+
105
+ ```json
106
+ {
107
+ "jsonrpc": "2.0",
108
+ "id": 1,
109
+ "result": {"status": "ok", "message_id": "..."},
110
+ "_meta": {"agent_md_etag": "..."},
111
+ "_trace": {
112
+ "trace_id": "a1b2c3...",
113
+ "mode": "diag",
114
+ "spans": [
115
+ {"node": "sdk-alice.aid.com", "ts": 1716300000100, "action": "send"},
116
+ {"node": "gateway", "ts": 1716300000123, "action": "relay_in", "ms": 2, "detail": "→message"},
117
+ {"node": "message", "ts": 1716300000125, "action": "process", "ms": 15},
118
+ {"node": "gateway", "ts": 1716300000142, "action": "relay_out", "ms": 1}
119
+ ]
120
+ }
121
+ }
122
+ ```
123
+
124
+ **注意**:log 模式下 response 不带 `_trace`(保持 envelope 干净,零开销)。
125
+
126
+ ---
127
+
128
+ ## 四、开关层级
129
+
130
+ ### 4.1 三态定义
131
+
132
+ | 值 | 行为 |
133
+ |---|---|
134
+ | `off` | 不生成 `_trace`,零开销(默认) |
135
+ | `log` | 生成 trace_id + 各环节写本地日志,response 不回传 |
136
+ | `diag` | 同 log + spans 追加 + response 回传完整链路 |
137
+
138
+ ### 4.2 控制点
139
+
140
+ | 层级 | 配置位置 | 默认值 | 作用 |
141
+ |------|----------|--------|------|
142
+ | 服务端上限 | Gateway 环境变量 `AUN_TRACE_MAX_MODE` | `"log"` | 超过此级别自动降级 |
143
+ | SDK 会话级 | `client.set_trace_mode("log")` | `"off"` | 连接内所有请求默认 mode |
144
+ | SDK 调用级 | `client.rpc("method", params, trace="diag")` | 继承会话级 | 单次覆盖,优先级最高 |
145
+
146
+ ### 4.3 优先级规则
147
+
148
+ ```
149
+ 最终 mode = min(SDK 调用级 || SDK 会话级, 服务端上限)
150
+ 其中 off < log < diag
151
+ ```
152
+
153
+ ### 4.4 服务端降级逻辑(Gateway 入站时)
154
+
155
+ ```python
156
+ client_mode = trace.get("mode", "off")
157
+ server_max = config.trace_max_mode # "off" | "log" | "diag"
158
+ effective = min(client_mode, server_max)
159
+ if effective != client_mode:
160
+ trace["mode"] = effective
161
+ if effective != "diag":
162
+ trace.pop("spans", None) # 降级到 log/off 时丢弃已有 spans
163
+ ```
164
+
165
+ **生产环境推荐配置**:`AUN_TRACE_MAX_MODE=log`,diag 需运维手动开启。
166
+
167
+ ---
168
+
169
+ ## 五、各组件改动点
170
+
171
+ ### 5.1 SDK 侧
172
+
173
+ **`transport.py`**:
174
+ - `call()` 方法:会话/调用级 mode 非 off 时,构造 `_trace` 注入 params
175
+ - response 处理:提取 `_trace` 回调 trace observer(与现有 `_meta_observer` 模式一致)
176
+
177
+ **`client.py`**:
178
+ - 新增 `set_trace_mode(mode: str)`:设置会话级默认 mode
179
+ - `rpc()` 方法新增 `trace` 参数:单次覆盖 mode
180
+ - 暴露 `set_trace_observer(callback)`:接收 diag 模式回传的 spans
181
+
182
+ ### 5.2 Gateway 侧
183
+
184
+ **`ws_server.py`**:
185
+ - `_resolve_ws_message_trace()` 改造:读取 mode,应用服务端降级
186
+ - 入站时追加 `relay_in` span(diag 模式)
187
+ - `_strip_internal_route()` 保持现状:log 模式仍剥离 `_trace`,diag 模式由 response 路径专门处理
188
+
189
+ **`relay.py`**:
190
+ - `deliver_response_to_client()`:diag 模式追加 `relay_out` span,将 `_trace` 注入 response 顶层
191
+
192
+ ### 5.3 Service 侧
193
+
194
+ 通用 pattern(适用于 message / group / storage / stream / mail 等所有服务):
195
+ 1. RPC 入口提取 `params._trace`
196
+ 2. 处理过程中通过 trace_id 写入日志
197
+ 3. diag 模式追加自身 span
198
+ 4. response 透传 `_trace` 字段
199
+
200
+ ---
201
+
202
+ ## 六、日志格式(log 模式)
203
+
204
+ 各环节按现有日志规范输出,前缀加 trace_id:
205
+
206
+ ```
207
+ [2026-05-21 10:00:00.123][INFO][gateway] [trace=a1b2c3d4] relay_in method=message.send conn=42
208
+ [2026-05-21 10:00:00.125][INFO][message] [trace=a1b2c3d4] process persist=true target=bob.aid.com
209
+ [2026-05-21 10:00:00.140][INFO][gateway] [trace=a1b2c3d4] relay_out duration_ms=17
210
+ ```
211
+
212
+ 排查时 `grep trace=a1b2c3d4` 即可串联全链路。
213
+
214
+ ---
215
+
216
+ ## 七、安全约束
217
+
218
+ | 约束 | 限制 |
219
+ |------|------|
220
+ | spans 数组最大长度 | 32 条,超出由 Gateway 截断尾部 |
221
+ | 单个 detail 最大长度 | 256 字符 |
222
+ | trace_id 长度 | 严格 32 hex chars,不合规由 Gateway 重新生成 |
223
+ | 敏感信息 | spans 禁止包含消息体、密钥、Token 等,只记录路由/耗时/错误码等元数据 |
224
+ | 生产环境默认 | `AUN_TRACE_MAX_MODE=log`,diag 需运维手动开启 |
225
+ | 跨域传播 | 跨 federation 边界时保留 trace_id,spans 在边界节点视为新链路起点 |
226
+
227
+ ---
228
+
229
+ ## 八、跨语言实现要点
230
+
231
+ 所有 SDK(Python / Go / TypeScript / JavaScript / C++)需保持一致:
232
+
233
+ 1. **trace_id 生成**:16 字节加密随机数,hex 编码
234
+ 2. **时间戳**:Unix 毫秒(不使用秒/纳秒),统一单位
235
+ 3. **字段顺序**:JSON 字段顺序不影响语义,但建议按 `trace_id, mode, spans` 顺序输出便于阅读
236
+ 4. **observer 接口**:各 SDK 提供 `set_trace_observer(callback)` 接口,签名一致
237
+ 5. **会话/调用级 API 命名**:
238
+ - 设置:`set_trace_mode(mode)` / `setTraceMode(mode)`
239
+ - 单次覆盖:`rpc(method, params, trace=mode)` / `rpc(method, params, {trace: mode})`
240
+
241
+ ---
242
+
243
+ ## 九、未实现 / 后续扩展
244
+
245
+ 以下能力本附录暂不覆盖,留作后续扩展:
246
+
247
+ - **采样率控制**:当前 SDK 完全控制 mode,未引入概率采样(如 1% diag)
248
+ - **OpenTelemetry 适配**:未来如需对接 Jaeger / Zipkin,可在 Gateway 端增加导出适配层,
249
+ 将 spans 转为 OTLP 格式
250
+ - **跨域链路连续性**:当前跨 federation 边界视为新链路,未实现端到端 trace_id 透传
251
+ - **span 父子关系**:当前 spans 数组仅按时间排序,未引入 parent_span_id(保持极简)
252
+
253
+ ---
254
+
255
+ ## 文档版本
256
+
257
+ - v1.0 — 2026-05-21 初稿,定义协议字段、链路传播、开关层级、安全约束
@@ -1,6 +1,6 @@
1
1
  # AUN SDK - 快速开始
2
2
 
3
- **版本**: 0.4.0+ | **Python**: >= 3.11
3
+ **版本**: 0.4.5+ | **Python**: >= 3.11
4
4
 
5
5
  ---
6
6
 
@@ -74,7 +74,7 @@ headers = (
74
74
  ProtectedHeaders()
75
75
  .set("device_id", "dev-123")
76
76
  .set("slot_id", "desktop")
77
- .set("sdk_version", "0.4.0")
77
+ .set("sdk_version", "0.4.5")
78
78
  .set("app_name", "my-agent")
79
79
  )
80
80
 
@@ -118,6 +118,7 @@ AID 由 `AIDStore.load()` 返回,应用层不直接构造。
118
118
  | `verify_ssl` | `verifySsl` | `VerifySSL` | 是否校验 TLS 证书 |
119
119
  | `root_ca_path` | `rootCaPath` | `RootCaPath` | 自定义根证书路径 |
120
120
  | `debug` | `debug` | `Debug` | 是否开启调试日志 |
121
+ | `private_key_pem` | `privateKeyPem` | `PrivateKeyPem` | 明文私钥 PEM(由 `AIDStore.load()` 注入,空字符串表示无私钥)|
121
122
 
122
123
  ### 方法
123
124
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  `message.send.params.payload`、`message.thought.put.params.payload`、`group.send.params.payload` 和 `group.thought.put.params.payload` 使用同一套业务负载约定。`payload` 是应用层 JSON 对象,服务端只做大小、JSON 可序列化、信封/封装类型和加密相关的必要检查;业务字段由发送端和接收端协商,服务端不按本文字段做强制校验。
4
4
 
5
- 示例展示的是 `payload` 片段:P2P 完整请求仍需要在同级传入 `to`;群消息完整请求仍需要在同级传入 `group_id`;思考内容需要在顶层通过 `context.type + context.id` 指定 selector。文本、图片、文件、思考内容等业务消息类型只能放在 `payload.type`;`message.send.params.type` / `message.thought.put.params.type` / `group.send.params.type` / `group.thought.put.params.type` 是信封或封装类型,例如 SDK 加密发送时自动填充的 `e2ee.encrypted` / `e2ee.group_encrypted`。
5
+ 示例展示的是 `payload` 片段:P2P 完整请求仍需要在同级传入 `to`;群消息完整请求仍需要在同级传入 `group_id`;思考内容需要在顶层通过 `context.type + context.id` 指定 selector。文本、图片、文件、思考内容等业务消息类型只能放在 `payload.type`;`message.send.params.type` / `message.thought.put.params.type` / `group.send.params.type` / `group.thought.put.params.type` 是信封或封装类型,例如 SDK 加密发送时自动填充的 `e2ee.encrypted` / `e2ee.group_encrypted`。
6
6
 
7
7
  ## 类型总览
8
8
 
@@ -10,7 +10,7 @@
10
10
  |----------|------|----------|
11
11
  | `text` | 纯文本或 Markdown 文本 | 普通对话、任务说明、通知正文 |
12
12
  | `quote` | 带引用摘要的回复 | 回复某条消息、保留上下文 |
13
- | `thought` | 思考过程片段 | Agent 针对某个 P2P 或群上下文的非广播思考内容 |
13
+ | `thought` | 思考过程片段 | Agent 针对某个 P2P 或群上下文的非广播思考内容 |
14
14
  | `voice` | 语音文件引用及转写信息 | 语音消息、语音备忘 |
15
15
  | `image` | 图片对象引用及展示信息 | 截图、流程图、图片分享 |
16
16
  | `video` | 视频对象引用及封面信息 | 录屏、演示视频 |
@@ -38,19 +38,19 @@
38
38
  | 字段 | 所在位置 | 说明 |
39
39
  |------|----------|------|
40
40
  | `to` | `message.send.params` | P2P 接收方 AID |
41
- | `group_id` | `group.send.params` 和群消息信封 | 群组 ID |
42
- | `context.type + context.id` | `message.thought.put/get.params` 和 `group.thought.put/get.params` | 思考内容 selector;必填,不要只放在 payload 内 |
43
- | `protected_headers` / `headers` | `message.send` / `message.thought.put` / `group.send` / `group.thought.put` 参数 | E2EE 信封元数据,类似 HTTP headers;SDK 验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
44
- | `from` / `sender_aid` | 服务端生成的消息信封 | 发送方身份 |
41
+ | `group_id` | `group.send.params` 和群消息信封 | 群组 ID |
42
+ | `context.type + context.id` | `message.thought.put/get.params` 和 `group.thought.put/get.params` | 思考内容 selector;必填,不要只放在 payload 内 |
43
+ | `protected_headers` / `headers` | `message.send` / `message.thought.put` / `group.send` / `group.thought.put` 参数 | E2EE 信封元数据,类似 HTTP headers;SDK 验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
44
+ | `from` / `sender_aid` | 服务端生成的消息信封 | 发送方身份 |
45
45
  | `message_id` / `seq` / `timestamp` / `created_at` | 服务端生成或发送参数 | 当前消息 ID、序号和服务端时间 |
46
46
  | `encrypted` / `delivery_mode` | 发送参数或连接上下文 | 加密和 P2P 投递语义 |
47
47
  | `dispatch_mode` | 群消息信封和 SDK 注入的群消息 payload | 群消息应用层分发模式标签:`broadcast` / `mention`;由群设置决定,不作为 `group.send` 单次入参 |
48
48
  | `type` / `message_type` | 发送参数或消息信封 | 信封/封装类型,如 `e2ee.encrypted` / `e2ee.group_encrypted` |
49
- | `dispatch` / `duty_state` / `message_dispatch` | `group.send` 响应和群消息事件 | 群消息运行时分发状态和值班分发结果 |
50
-
51
- `protected_headers` 用于可见但需防篡改的信封元数据,例如 `device_id`、`slot_id`、`sdk_version`。它不属于业务 payload,也不提供机密性;需要端到端保密的上下文仍应放在 `payload.client_context` 或其他 payload 字段内。
52
-
53
- ## 公共辅助字段
49
+ | `dispatch` / `duty_state` / `message_dispatch` | `group.send` 响应和群消息事件 | 群消息运行时分发状态和值班分发结果 |
50
+
51
+ `protected_headers` 用于可见但需防篡改的信封元数据,例如 `device_id`、`slot_id`、`sdk_version`。它不属于业务 payload,也不提供机密性;需要端到端保密的上下文仍应放在 `payload.client_context` 或其他 payload 字段内。
52
+
53
+ ## 公共辅助字段
54
54
 
55
55
  以下字段可出现在多数 payload 中;如无需要,不必携带。
56
56
 
@@ -128,7 +128,7 @@
128
128
 
129
129
  ### `thought`:思考内容
130
130
 
131
- `thought` 用于 Agent 暴露针对某个 P2P 或群上下文的思考过程片段。它只应通过 `message.thought.put` 或 `group.thought.put` 发送,不作为普通 `message.send` / `group.send` 消息广播;有兴趣的客户端通过对应的 `*.thought.get` 主动读取。
131
+ `thought` 用于 Agent 暴露针对某个 P2P 或群上下文的思考过程片段。它只应通过 `message.thought.put` 或 `group.thought.put` 发送,不作为普通 `message.send` / `group.send` 消息广播;有兴趣的客户端通过对应的 `*.thought.get` 主动读取。
132
132
 
133
133
  | 字段 | 类型 | 必填 | 说明 |
134
134
  |------|------|:----:|------|
@@ -146,7 +146,7 @@
146
146
  }
147
147
  ```
148
148
 
149
- `message.thought.put` / `group.thought.put` 的顶层 selector 用于定位 thought head,只使用 `context.type + context.id`。`payload` 内如需展示引用摘要,可另行携带 `quote` 或 `client_context`,但不能替代顶层 selector。
149
+ `message.thought.put` / `group.thought.put` 的顶层 selector 用于定位 thought head,只使用 `context.type + context.id`。`payload` 内如需展示引用摘要,可另行携带 `quote` 或 `client_context`,但不能替代顶层 selector。
150
150
 
151
151
  ### `voice`:语音消息
152
152