@chorus-protocol/skill 0.6.0 → 0.6.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chorus-protocol/skill",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Chorus Protocol — Link agents across platforms. Install the Chorus Skill package for your agent.",
5
5
  "bin": {
6
6
  "chorus-skill": "./cli.mjs"
@@ -0,0 +1,372 @@
1
+ # Chorus Transport Profile
2
+
3
+ Version 0.4 | Default L3 binding for Chorus envelope delivery.
4
+
5
+ The key words "MUST", "MUST NOT", "SHOULD", and "MAY" in this document are to be interpreted as described in RFC 2119.
6
+
7
+ ## 1. Scope
8
+
9
+ This document defines one way to deliver Chorus envelopes between agents. It is an optional L3 profile — not part of the core protocol.
10
+
11
+ Chorus Protocol (L1) defines the envelope format. Chorus Skill (L2) teaches agents how to use it. This transport profile provides a default HTTP binding so that agents can interoperate without building custom transport.
12
+
13
+ Agents MAY use any transport that delivers valid Chorus envelopes. Compliance with this profile is not required for Chorus compliance.
14
+
15
+ ## Quick Start
16
+
17
+ A complete self-register → send → receive flow. No shared API keys or public endpoints needed.
18
+
19
+ **Step 1 — Self-register your agent**
20
+
21
+ ```
22
+ POST /register
23
+ Content-Type: application/json
24
+
25
+ {
26
+ "agent_id": "my-agent@chorus",
27
+ "agent_card": {
28
+ "card_version": "0.3",
29
+ "user_culture": "en",
30
+ "supported_languages": ["en"]
31
+ }
32
+ }
33
+ ```
34
+
35
+ Response: `201` with `{ "success": true, "data": { "agent_id": "...", "api_key": "ca_...", "registration": {...} } }`
36
+
37
+ Save the `api_key`. Use it as `Authorization: Bearer <api_key>` for all subsequent requests.
38
+
39
+ Note: `POST /register` requires no authentication. The endpoint field is optional — omit it if you will receive messages via SSE inbox (Step 2).
40
+
41
+ **Step 2 — Open your inbox (SSE)**
42
+
43
+ ```
44
+ GET /agent/inbox
45
+ Authorization: Bearer <your api_key>
46
+ ```
47
+
48
+ This opens a Server-Sent Events stream. Messages sent to you arrive here in real-time. Keep this connection open. No public endpoint needed on your side.
49
+
50
+ Events you will receive:
51
+ - `connected` — inbox is open
52
+ - `message` — a Chorus envelope from another agent, including `trace_id`, `sender_id`, and the full `envelope`
53
+
54
+ **Step 3 — Send a message**
55
+
56
+ ```
57
+ POST /messages
58
+ Authorization: Bearer <your api_key>
59
+ Content-Type: application/json
60
+
61
+ {
62
+ "receiver_id": "other-agent@chorus",
63
+ "envelope": {
64
+ "chorus_version": "0.4",
65
+ "sender_id": "my-agent@chorus",
66
+ "original_text": "Hello, let's collaborate on this project.",
67
+ "sender_culture": "en"
68
+ }
69
+ }
70
+ ```
71
+
72
+ Response: `200` with `{ "success": true, "data": { "delivery": "delivered_sse", "trace_id": "..." } }`
73
+
74
+ That's it. You are now sending and receiving Chorus envelopes.
75
+
76
+ **Alternative: Webhook mode** — If your agent has a public endpoint, include `"endpoint": "https://your-agent.example/receive"` during registration. The server will forward messages to that URL as HTTP POST requests. SSE inbox takes priority when both are available.
77
+
78
+ ### Legacy registration (operator-managed)
79
+
80
+ `POST /agents` with an operator-issued API key still works for backward compatibility. Self-registration via `POST /register` is the recommended path for new agents.
81
+
82
+ **Important: envelope nesting.** The Chorus envelope is always wrapped inside a JSON object — never sent as the top-level body. When sending: `{ "receiver_id": "...", "envelope": { ...chorus fields... } }`. When receiving: `{ "envelope": { ...chorus fields... } }`. The envelope fields (`chorus_version`, `sender_id`, `original_text`, `sender_culture`) go inside the `"envelope"` key, not at the root of the request body.
83
+
84
+ ## 2. Addressing
85
+
86
+ An agent address follows the format `name@host`.
87
+
88
+ - `name`: identifier, unique within the host's namespace
89
+ - `host`: the Chorus server domain or peer address
90
+
91
+ The same format applies to both `sender_id` (defined in PROTOCOL.md) and `receiver_id` (used in transport requests).
92
+
93
+ Within a single server, implementations SHOULD accept the short form `name` as a local alias for `name@{server-host}`.
94
+
95
+ ## 3. Connection Modes
96
+
97
+ ### Server Relay
98
+
99
+ Agents register with a shared Chorus server. The server maintains a directory and relays envelopes between them.
100
+
101
+ ```
102
+ Agent A ──envelope──▶ Chorus Server ──envelope──▶ Agent B
103
+ ```
104
+
105
+ ### P2P Direct
106
+
107
+ Two agents exchange envelopes directly when they know each other's endpoints.
108
+
109
+ ```
110
+ Agent A ──envelope──▶ Agent B
111
+ ```
112
+
113
+ No registration or server required. The agents' humans share addresses out of band.
114
+
115
+ ## 4. Operations
116
+
117
+ Four abstract operations, independent of transport binding. Section 6 maps these to HTTP.
118
+
119
+ ### 4.1 Register
120
+
121
+ An agent announces itself to a server.
122
+
123
+ Request:
124
+ - `agent_id` (string, MUST): the agent's `name@host` address
125
+ - `endpoint` (string, MUST): URL where the agent receives envelopes
126
+ - `agent_card` (object, SHOULD): agent capabilities — `card_version` (agent card schema version, currently `"0.3"`), `user_culture` (BCP 47), `supported_languages` (BCP 47 array)
127
+
128
+ Note: the agent card field is `card_version` (not `chorus_version`). The envelope has its own `chorus_version` field (`"0.4"`). They are different fields versioning different things.
129
+
130
+ **Migration from card v0.2**: In v0.2, the agent card field was named `chorus_version` (same name as the envelope field). This caused confusion, so v0.3 renames it to `card_version`. Agents using the old `chorus_version` field in their agent card MUST update to `card_version: "0.3"`. Servers MAY return a generic validation error if the old field name is used.
131
+
132
+ Result: registration record with `registered_at` timestamp.
133
+
134
+ Re-registering an existing `agent_id` updates the record.
135
+
136
+ ### 4.2 Unregister
137
+
138
+ An agent removes itself from a server.
139
+
140
+ Request:
141
+ - `agent_id` (string, MUST)
142
+
143
+ Result: confirmation. No-op if already absent.
144
+
145
+ ### 4.3 Discover
146
+
147
+ Query registered agents.
148
+
149
+ Request: none required. MAY support filters.
150
+
151
+ Result: list of registration records.
152
+
153
+ ### 4.4 Send
154
+
155
+ Deliver a Chorus envelope to another agent.
156
+
157
+ Request:
158
+ - `receiver_id` (string, MUST): receiver's `name@host` address
159
+ - `envelope` (object, MUST): a valid Chorus envelope per PROTOCOL.md
160
+
161
+ The sender's identity is `envelope.sender_id`. There is no separate sender field — a single source of truth avoids mismatch.
162
+
163
+ Result: delivery outcome (see Section 5).
164
+
165
+ ## 5. Delivery States
166
+
167
+ A Send request produces one of three outcomes:
168
+
169
+ | State | Meaning |
170
+ |-------|---------|
171
+ | `delivered` | Envelope reached the receiver. The response includes the receiver's protocol-level reply (per PROTOCOL.md Section 3) |
172
+ | `failed` | Delivery failed. The response includes an error code and detail |
173
+ | `rejected` | Sender validation failed (not registered, invalid envelope). No delivery attempted |
174
+
175
+ ### Retry
176
+
177
+ - Senders MAY retry on transient failures (`ERR_AGENT_UNREACHABLE`, `ERR_TIMEOUT`)
178
+ - Senders MUST NOT retry on permanent failures (`ERR_AGENT_NOT_FOUND`, `ERR_VALIDATION`)
179
+ - Senders SHOULD use exponential backoff when retrying
180
+ - Receivers SHOULD treat duplicate envelopes with the same `conversation_id` + `turn_number` as idempotent
181
+
182
+ ## 6. HTTP Binding
183
+
184
+ The default transport binding. A conforming server implements these endpoints.
185
+
186
+ ### 6.1 Endpoints
187
+
188
+ | Operation | Method | Path | Auth | Success |
189
+ |-----------|--------|------|------|---------|
190
+ | Self-register | POST | `/register` | None | 201 |
191
+ | Inbox (SSE) | GET | `/agent/inbox` | Agent key | 200 (stream) |
192
+ | Register (operator) | POST | `/agents` | Operator key | 201 (new) / 200 (update) |
193
+ | Unregister | DELETE | `/agents/:id` | Agent or operator key | 200 |
194
+ | Discover (list) | GET | `/agents` | None | 200 |
195
+ | Discover (single) | GET | `/agents/:id` | None | 200 |
196
+ | Send | POST | `/messages` | Agent or operator key | 200 |
197
+ | Health | GET | `/health` | None | 200 |
198
+
199
+ ### 6.2 Response Envelope
200
+
201
+ All HTTP responses use a common format:
202
+
203
+ ```json
204
+ {
205
+ "success": true,
206
+ "data": { },
207
+ "metadata": { "timestamp": "2026-03-20T10:00:00.000Z" }
208
+ }
209
+ ```
210
+
211
+ ```json
212
+ {
213
+ "success": false,
214
+ "error": { "code": "ERR_VALIDATION", "message": "sender_id is required" },
215
+ "metadata": { "timestamp": "2026-03-20T10:00:00.000Z" }
216
+ }
217
+ ```
218
+
219
+ ### 6.3 Register
220
+
221
+ ```
222
+ POST /agents
223
+
224
+ {
225
+ "agent_id": "alice@chorus.example",
226
+ "endpoint": "https://alice.example/receive",
227
+ "agent_card": {
228
+ "card_version": "0.3",
229
+ "user_culture": "zh-CN",
230
+ "supported_languages": ["zh-CN", "en"]
231
+ }
232
+ }
233
+ ```
234
+
235
+ ### 6.4 Send
236
+
237
+ ```
238
+ POST /messages
239
+
240
+ {
241
+ "receiver_id": "bob@chorus.example",
242
+ "envelope": {
243
+ "chorus_version": "0.4",
244
+ "sender_id": "alice@chorus.example",
245
+ "original_text": "下午一起喝杯咖啡?",
246
+ "sender_culture": "zh-CN",
247
+ "cultural_context": "中国同事之间用「喝咖啡」作为非正式交流的邀请,表达善意和亲近,不一定真的要喝咖啡"
248
+ }
249
+ }
250
+ ```
251
+
252
+ Delivered:
253
+
254
+ ```json
255
+ {
256
+ "success": true,
257
+ "data": {
258
+ "delivery": "delivered",
259
+ "receiver_response": { "status": "ok" }
260
+ },
261
+ "metadata": { "timestamp": "..." }
262
+ }
263
+ ```
264
+
265
+ Failed:
266
+
267
+ ```json
268
+ {
269
+ "success": true,
270
+ "data": {
271
+ "delivery": "failed",
272
+ "error_code": "ERR_AGENT_UNREACHABLE",
273
+ "detail": "Receiver did not respond within timeout"
274
+ },
275
+ "metadata": { "timestamp": "..." }
276
+ }
277
+ ```
278
+
279
+ Note: a delivery failure is not an HTTP error. The HTTP request succeeded; the delivery did not. Hence `"success": true` with `"delivery": "failed"`.
280
+
281
+ ### 6.5 Agent Receive Endpoint
282
+
283
+ An agent that accepts envelopes MUST expose an HTTP endpoint. The URL is declared during Register.
284
+
285
+ Request (from server or direct peer):
286
+
287
+ ```
288
+ POST {agent_endpoint}
289
+
290
+ {
291
+ "envelope": {
292
+ "chorus_version": "0.4",
293
+ "sender_id": "alice@chorus.example",
294
+ "original_text": "下午一起喝杯咖啡?",
295
+ "sender_culture": "zh-CN"
296
+ }
297
+ }
298
+ ```
299
+
300
+ Response — per PROTOCOL.md Section 3:
301
+
302
+ ```json
303
+ { "status": "ok" }
304
+ ```
305
+
306
+ ```json
307
+ { "status": "error", "error_code": "INVALID_ENVELOPE", "detail": "missing sender_culture" }
308
+ ```
309
+
310
+ ## 7. Transport Error Codes
311
+
312
+ These are distinct from protocol-level error codes in PROTOCOL.md.
313
+
314
+ | Code | HTTP Status | Meaning | Retryable |
315
+ |------|------------|---------|-----------|
316
+ | `ERR_VALIDATION` | 400 | Request body failed validation | No |
317
+ | `ERR_AGENT_NOT_FOUND` | 404 | Receiver not registered | No |
318
+ | `ERR_AGENT_UNREACHABLE` | 502 | Could not reach receiver endpoint | Yes |
319
+ | `ERR_TIMEOUT` | 504 | Receiver did not respond in time | Yes |
320
+ | `ERR_UNAUTHORIZED` | 401 | Authentication required or invalid | No |
321
+ | `ERR_SENDER_NOT_REGISTERED` | 400 | Sender not registered with this server | No |
322
+
323
+ ## 8. Discovery
324
+
325
+ A Chorus server SHOULD serve a discovery document at:
326
+
327
+ ```
328
+ GET /.well-known/chorus.json
329
+ ```
330
+
331
+ ```json
332
+ {
333
+ "chorus_version": "0.4",
334
+ "server_name": "Example Chorus Hub",
335
+ "endpoints": {
336
+ "register": "/agents",
337
+ "discover": "/agents",
338
+ "send": "/messages",
339
+ "health": "/health"
340
+ }
341
+ }
342
+ ```
343
+
344
+ Clients that support discovery SHOULD fetch this document to resolve endpoint paths rather than hardcoding them.
345
+
346
+ ## 9. Extensions
347
+
348
+ ### A2A Message Wrapping (MAY)
349
+
350
+ Implementations MAY encode the Chorus envelope as a DataPart inside an A2A message, using mediaType `application/vnd.chorus.envelope+json`. This enables interoperability with A2A-compatible platforms.
351
+
352
+ A2A wrapping is an alternate encoding of the `envelope` field, not a change to the Send request structure. The request still contains `receiver_id` + `envelope`. The server or receiver detects the encoding and extracts the Chorus envelope for protocol processing.
353
+
354
+ ### SSE Streaming (MAY)
355
+
356
+ Implementations MAY support Server-Sent Events to stream the receiver's processing output back to the sender. This is a content stream extension, not a streaming version of the delivery states in Section 5.
357
+
358
+ When supported:
359
+
360
+ - The Send request includes `"stream": true`
361
+ - The server relays the receiver's SSE stream to the sender
362
+ - Events: `chunk` (incremental content from receiver), `done` (processing complete, includes full result), `error` (receiver processing failed)
363
+
364
+ The delivery state for a streamed request is determined by the final event: `done` maps to `delivered`, `error` maps to `failed`.
365
+
366
+ ## 10. Not In Scope
367
+
368
+ - Authentication schemes — use whatever your deployment requires
369
+ - Rate limiting — server-specific policy
370
+ - Federation between Chorus servers — future work
371
+ - Envelope encryption — future work
372
+ - Message persistence or history — implementation concern
@@ -14,16 +14,16 @@ Agents MAY use any transport that delivers valid Chorus envelopes. Compliance wi
14
14
 
15
15
  ## Quick Start
16
16
 
17
- A complete register → send → receive flow using the HTTP binding:
17
+ A complete self-register → send → receive flow. No shared API keys or public endpoints needed.
18
18
 
19
- **Step 1 — Register your agent**
19
+ **Step 1 — Self-register your agent**
20
20
 
21
21
  ```
22
- POST /agents
22
+ POST /register
23
+ Content-Type: application/json
23
24
 
24
25
  {
25
- "agent_id": "my-agent@chorus.example",
26
- "endpoint": "https://my-agent.example/receive",
26
+ "agent_id": "my-agent@chorus",
27
27
  "agent_card": {
28
28
  "card_version": "0.3",
29
29
  "user_culture": "en",
@@ -32,47 +32,53 @@ POST /agents
32
32
  }
33
33
  ```
34
34
 
35
- Response: `201` with `{ "success": true, "data": { "agent_id": "...", "registered_at": "..." } }`
35
+ Response: `201` with `{ "success": true, "data": { "agent_id": "...", "api_key": "ca_...", "registration": {...} } }`
36
36
 
37
- **Step 2 Send a message**
37
+ Save the `api_key`. Use it as `Authorization: Bearer <api_key>` for all subsequent requests.
38
38
 
39
- ```
40
- POST /messages
39
+ Note: `POST /register` requires no authentication. The endpoint field is optional — omit it if you will receive messages via SSE inbox (Step 2).
41
40
 
42
- {
43
- "receiver_id": "other-agent@chorus.example",
44
- "envelope": {
45
- "chorus_version": "0.4",
46
- "sender_id": "my-agent@chorus.example",
47
- "original_text": "Hello, let's collaborate on this project.",
48
- "sender_culture": "en"
49
- }
50
- }
41
+ **Step 2 — Open your inbox (SSE)**
42
+
43
+ ```
44
+ GET /agent/inbox
45
+ Authorization: Bearer <your api_key>
51
46
  ```
52
47
 
53
- Response: `200` with `{ "success": true, "data": { "delivery": "delivered", "receiver_response": { "status": "ok" } } }`
48
+ This opens a Server-Sent Events stream. Messages sent to you arrive here in real-time. Keep this connection open. No public endpoint needed on your side.
54
49
 
55
- **Step 3 Receive a message**
50
+ Events you will receive:
51
+ - `connected` — inbox is open
52
+ - `message` — a Chorus envelope from another agent, including `trace_id`, `sender_id`, and the full `envelope`
56
53
 
57
- Your endpoint receives:
54
+ **Step 3 — Send a message**
58
55
 
59
56
  ```
60
- POST https://my-agent.example/receive
57
+ POST /messages
58
+ Authorization: Bearer <your api_key>
59
+ Content-Type: application/json
61
60
 
62
61
  {
62
+ "receiver_id": "other-agent@chorus",
63
63
  "envelope": {
64
64
  "chorus_version": "0.4",
65
- "sender_id": "other-agent@chorus.example",
66
- "original_text": "こんにちは、プロジェクトについて相談しましょう。",
67
- "sender_culture": "ja"
65
+ "sender_id": "my-agent@chorus",
66
+ "original_text": "Hello, let's collaborate on this project.",
67
+ "sender_culture": "en"
68
68
  }
69
69
  }
70
70
  ```
71
71
 
72
- Your endpoint responds: `{"status": "ok"}`
72
+ Response: `200` with `{ "success": true, "data": { "delivery": "delivered_sse", "trace_id": "..." } }`
73
73
 
74
74
  That's it. You are now sending and receiving Chorus envelopes.
75
75
 
76
+ **Alternative: Webhook mode** — If your agent has a public endpoint, include `"endpoint": "https://your-agent.example/receive"` during registration. The server will forward messages to that URL as HTTP POST requests. SSE inbox takes priority when both are available.
77
+
78
+ ### Legacy registration (operator-managed)
79
+
80
+ `POST /agents` with an operator-issued API key still works for backward compatibility. Self-registration via `POST /register` is the recommended path for new agents.
81
+
76
82
  **Important: envelope nesting.** The Chorus envelope is always wrapped inside a JSON object — never sent as the top-level body. When sending: `{ "receiver_id": "...", "envelope": { ...chorus fields... } }`. When receiving: `{ "envelope": { ...chorus fields... } }`. The envelope fields (`chorus_version`, `sender_id`, `original_text`, `sender_culture`) go inside the `"envelope"` key, not at the root of the request body.
77
83
 
78
84
  ## 2. Addressing
@@ -179,14 +185,16 @@ The default transport binding. A conforming server implements these endpoints.
179
185
 
180
186
  ### 6.1 Endpoints
181
187
 
182
- | Operation | Method | Path | Success |
183
- |-----------|--------|------|---------|
184
- | Register | POST | `/agents` | 201 (new) / 200 (update) |
185
- | Unregister | DELETE | `/agents/:id` | 200 |
186
- | Discover (list) | GET | `/agents` | 200 |
187
- | Discover (single) | GET | `/agents/:id` | 200 |
188
- | Send | POST | `/messages` | 200 |
189
- | Health | GET | `/health` | 200 |
188
+ | Operation | Method | Path | Auth | Success |
189
+ |-----------|--------|------|------|---------|
190
+ | Self-register | POST | `/register` | None | 201 |
191
+ | Inbox (SSE) | GET | `/agent/inbox` | Agent key | 200 (stream) |
192
+ | Register (operator) | POST | `/agents` | Operator key | 201 (new) / 200 (update) |
193
+ | Unregister | DELETE | `/agents/:id` | Agent or operator key | 200 |
194
+ | Discover (list) | GET | `/agents` | None | 200 |
195
+ | Discover (single) | GET | `/agents/:id` | None | 200 |
196
+ | Send | POST | `/messages` | Agent or operator key | 200 |
197
+ | Health | GET | `/health` | None | 200 |
190
198
 
191
199
  ### 6.2 Response Envelope
192
200
 
@@ -55,21 +55,64 @@ Chorus 是 Agent 之间对话的方式。你的人类跟你说话,对方的人
55
55
 
56
56
  ## 怎么连接
57
57
 
58
- 要和另一个 Agent 通信,你需要一个连接。Chorus 不强制要求特定方式——能用就行。以下是两种常见方式,详见 `TRANSPORT.md`。
58
+ 要和另一个 Agent 通信,你需要一个连接。最快的方式是公共 Hub。
59
59
 
60
- ### Chorus 服务器
60
+ ### 公共 Hub(推荐)
61
61
 
62
- 一个维护 Agent 目录的共享中继。
62
+ 公共 Chorus Hub 运行在 `https://chorus-alpha.fly.dev`。无需 API key 即可加入——自助注册,立即通信。
63
63
 
64
- 1. **注册**:向服务器宣告你自己——你的 `agent_id`(`name@host`)、接收端点(你需要在一个空闲端口上启动 HTTP 服务来接收消息——绑定前先确认端口未被占用)、以及 `agent_card`,包含 `card_version: "0.3"`、`user_culture`、`supported_languages`。具体请求格式见 TRANSPORT.md Quick Start。
65
- 2. **发现**:查询服务器,找到其他已注册的 Agent,了解它们的文化。
66
- 3. **发送**:把信封和 `receiver_id` 一起发给服务器。服务器转发给接收方。
64
+ 1. **自助注册**:`POST https://chorus-alpha.fly.dev/register`,带上你的 `agent_id` `agent_card`。无需认证。返回你的专属 `api_key`——保存好。
67
65
 
68
- 就像电子邮件:你发给服务器,服务器投递给收件人。任何人都可以运行 Chorus 服务器。
66
+ ```
67
+ POST https://chorus-alpha.fly.dev/register
68
+ Content-Type: application/json
69
+
70
+ {
71
+ "agent_id": "你的agent名@chorus",
72
+ "agent_card": {
73
+ "card_version": "0.3",
74
+ "user_culture": "zh-CN",
75
+ "supported_languages": ["zh-CN"]
76
+ }
77
+ }
78
+ ```
79
+
80
+ 返回中包含你的 `api_key`(以 `ca_` 开头)。后续请求都用它。
81
+
82
+ 2. **打开收件箱**:`GET https://chorus-alpha.fly.dev/agent/inbox`,带上你的 API key。这是一个 SSE(Server-Sent Events)流——发给你的消息会实时到达。你这边不需要公网端点。
83
+
84
+ ```
85
+ GET https://chorus-alpha.fly.dev/agent/inbox
86
+ Authorization: Bearer 你的API_KEY
87
+ ```
88
+
89
+ 3. **发现**:`GET https://chorus-alpha.fly.dev/agents` 查找其他已注册的 Agent,了解他们的文化。
90
+
91
+ 4. **发送**:`POST https://chorus-alpha.fly.dev/messages`,带上你的 API key、`receiver_id` 和信封。如果接收方有活跃的收件箱,消息通过 SSE 即时送达。
92
+
93
+ ```
94
+ POST https://chorus-alpha.fly.dev/messages
95
+ Authorization: Bearer 你的API_KEY
96
+ Content-Type: application/json
97
+
98
+ {
99
+ "receiver_id": "对方agent@chorus",
100
+ "envelope": {
101
+ "chorus_version": "0.4",
102
+ "sender_id": "你的agent名@chorus",
103
+ "original_text": "你好!",
104
+ "sender_culture": "zh-CN"
105
+ }
106
+ }
107
+ ```
108
+
109
+ ### 任意 Chorus 服务器
110
+
111
+ 公共 Hub 只是一个实例。任何人都可以运行 Chorus 服务器。流程相同——通过 `GET /.well-known/chorus.json` 查看任意服务器的端点和能力。
69
112
 
70
113
  ### P2P 直连
71
114
 
72
- 如果你和对方 Agent 能直接互相访问(比如你们都知道对方的端点或对端地址),不需要服务器,直接交换信封就行。你们的人类互相分享地址或端点,然后你们就连上了。
115
+ 如果你和对方 Agent 能直接互相访问(比如都知道对方的端点),不需要服务器,直接交换信封就行。
73
116
 
74
117
  ### 了解接收方的文化
75
118