agent-relay 3.0.2 → 3.1.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.
Files changed (266) hide show
  1. package/README.md +8 -0
  2. package/bin/agent-relay-broker-linux-x64 +0 -0
  3. package/dist/index.cjs +273 -56
  4. package/dist/src/cli/commands/core.d.ts +2 -0
  5. package/dist/src/cli/commands/core.d.ts.map +1 -1
  6. package/dist/src/cli/commands/core.js +9 -2
  7. package/dist/src/cli/commands/core.js.map +1 -1
  8. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  9. package/dist/src/cli/lib/broker-lifecycle.js +87 -28
  10. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  11. package/package.json +9 -9
  12. package/packages/acp-bridge/README.md +50 -67
  13. package/packages/acp-bridge/package.json +2 -2
  14. package/packages/config/package.json +1 -1
  15. package/packages/hooks/package.json +4 -4
  16. package/packages/memory/package.json +2 -2
  17. package/packages/openclaw/README.md +78 -0
  18. package/packages/openclaw/bin/relay-openclaw.mjs +2 -0
  19. package/packages/openclaw/bridge/bridge.mjs +305 -0
  20. package/packages/openclaw/dist/__tests__/gateway-threads.test.d.ts +2 -0
  21. package/packages/openclaw/dist/__tests__/gateway-threads.test.d.ts.map +1 -0
  22. package/packages/openclaw/dist/__tests__/gateway-threads.test.js +320 -0
  23. package/packages/openclaw/dist/__tests__/gateway-threads.test.js.map +1 -0
  24. package/packages/openclaw/dist/__tests__/naming.test.d.ts +2 -0
  25. package/packages/openclaw/dist/__tests__/naming.test.d.ts.map +1 -0
  26. package/packages/openclaw/dist/__tests__/naming.test.js +21 -0
  27. package/packages/openclaw/dist/__tests__/naming.test.js.map +1 -0
  28. package/packages/openclaw/dist/__tests__/spawn-manager.test.d.ts +2 -0
  29. package/packages/openclaw/dist/__tests__/spawn-manager.test.d.ts.map +1 -0
  30. package/packages/openclaw/dist/__tests__/spawn-manager.test.js +126 -0
  31. package/packages/openclaw/dist/__tests__/spawn-manager.test.js.map +1 -0
  32. package/packages/openclaw/dist/auth/converter.d.ts +28 -0
  33. package/packages/openclaw/dist/auth/converter.d.ts.map +1 -0
  34. package/packages/openclaw/dist/auth/converter.js +64 -0
  35. package/packages/openclaw/dist/auth/converter.js.map +1 -0
  36. package/packages/openclaw/dist/cli.d.ts +2 -0
  37. package/packages/openclaw/dist/cli.d.ts.map +1 -0
  38. package/packages/openclaw/dist/cli.js +230 -0
  39. package/packages/openclaw/dist/cli.js.map +1 -0
  40. package/packages/openclaw/dist/config.d.ts +27 -0
  41. package/packages/openclaw/dist/config.d.ts.map +1 -0
  42. package/packages/openclaw/dist/config.js +97 -0
  43. package/packages/openclaw/dist/config.js.map +1 -0
  44. package/packages/openclaw/dist/control.d.ts +22 -0
  45. package/packages/openclaw/dist/control.d.ts.map +1 -0
  46. package/packages/openclaw/dist/control.js +58 -0
  47. package/packages/openclaw/dist/control.js.map +1 -0
  48. package/packages/openclaw/dist/gateway.d.ts +71 -0
  49. package/packages/openclaw/dist/gateway.d.ts.map +1 -0
  50. package/packages/openclaw/dist/gateway.js +785 -0
  51. package/packages/openclaw/dist/gateway.js.map +1 -0
  52. package/packages/openclaw/dist/identity/contract.d.ts +11 -0
  53. package/packages/openclaw/dist/identity/contract.d.ts.map +1 -0
  54. package/packages/openclaw/dist/identity/contract.js +40 -0
  55. package/packages/openclaw/dist/identity/contract.js.map +1 -0
  56. package/packages/openclaw/dist/identity/files.d.ts +33 -0
  57. package/packages/openclaw/dist/identity/files.d.ts.map +1 -0
  58. package/packages/openclaw/dist/identity/files.js +145 -0
  59. package/packages/openclaw/dist/identity/files.js.map +1 -0
  60. package/packages/openclaw/dist/identity/model.d.ts +11 -0
  61. package/packages/openclaw/dist/identity/model.d.ts.map +1 -0
  62. package/packages/openclaw/dist/identity/model.js +28 -0
  63. package/packages/openclaw/dist/identity/model.js.map +1 -0
  64. package/packages/openclaw/dist/identity/naming.d.ts +5 -0
  65. package/packages/openclaw/dist/identity/naming.d.ts.map +1 -0
  66. package/packages/openclaw/dist/identity/naming.js +7 -0
  67. package/packages/openclaw/dist/identity/naming.js.map +1 -0
  68. package/packages/openclaw/dist/index.d.ts +20 -0
  69. package/packages/openclaw/dist/index.d.ts.map +1 -0
  70. package/packages/openclaw/dist/index.js +27 -0
  71. package/packages/openclaw/dist/index.js.map +1 -0
  72. package/packages/openclaw/dist/inject.d.ts +14 -0
  73. package/packages/openclaw/dist/inject.d.ts.map +1 -0
  74. package/packages/openclaw/dist/inject.js +66 -0
  75. package/packages/openclaw/dist/inject.js.map +1 -0
  76. package/packages/openclaw/dist/mcp/server.d.ts +8 -0
  77. package/packages/openclaw/dist/mcp/server.d.ts.map +1 -0
  78. package/packages/openclaw/dist/mcp/server.js +105 -0
  79. package/packages/openclaw/dist/mcp/server.js.map +1 -0
  80. package/packages/openclaw/dist/mcp/tools.d.ts +17 -0
  81. package/packages/openclaw/dist/mcp/tools.d.ts.map +1 -0
  82. package/packages/openclaw/dist/mcp/tools.js +145 -0
  83. package/packages/openclaw/dist/mcp/tools.js.map +1 -0
  84. package/packages/openclaw/dist/runtime/openclaw-config.d.ts +20 -0
  85. package/packages/openclaw/dist/runtime/openclaw-config.d.ts.map +1 -0
  86. package/packages/openclaw/dist/runtime/openclaw-config.js +50 -0
  87. package/packages/openclaw/dist/runtime/openclaw-config.js.map +1 -0
  88. package/packages/openclaw/dist/runtime/patch.d.ts +24 -0
  89. package/packages/openclaw/dist/runtime/patch.d.ts.map +1 -0
  90. package/packages/openclaw/dist/runtime/patch.js +92 -0
  91. package/packages/openclaw/dist/runtime/patch.js.map +1 -0
  92. package/packages/openclaw/dist/runtime/setup.d.ts +26 -0
  93. package/packages/openclaw/dist/runtime/setup.d.ts.map +1 -0
  94. package/packages/openclaw/dist/runtime/setup.js +58 -0
  95. package/packages/openclaw/dist/runtime/setup.js.map +1 -0
  96. package/packages/openclaw/dist/setup.d.ts +29 -0
  97. package/packages/openclaw/dist/setup.d.ts.map +1 -0
  98. package/packages/openclaw/dist/setup.js +300 -0
  99. package/packages/openclaw/dist/setup.js.map +1 -0
  100. package/packages/openclaw/dist/spawn/docker.d.ts +58 -0
  101. package/packages/openclaw/dist/spawn/docker.d.ts.map +1 -0
  102. package/packages/openclaw/dist/spawn/docker.js +222 -0
  103. package/packages/openclaw/dist/spawn/docker.js.map +1 -0
  104. package/packages/openclaw/dist/spawn/manager.d.ts +45 -0
  105. package/packages/openclaw/dist/spawn/manager.d.ts.map +1 -0
  106. package/packages/openclaw/dist/spawn/manager.js +140 -0
  107. package/packages/openclaw/dist/spawn/manager.js.map +1 -0
  108. package/packages/openclaw/dist/spawn/process.d.ts +16 -0
  109. package/packages/openclaw/dist/spawn/process.d.ts.map +1 -0
  110. package/packages/openclaw/dist/spawn/process.js +241 -0
  111. package/packages/openclaw/dist/spawn/process.js.map +1 -0
  112. package/packages/openclaw/dist/spawn/types.d.ts +42 -0
  113. package/packages/openclaw/dist/spawn/types.d.ts.map +1 -0
  114. package/packages/openclaw/dist/spawn/types.js +2 -0
  115. package/packages/openclaw/dist/spawn/types.js.map +1 -0
  116. package/packages/openclaw/dist/types.d.ts +37 -0
  117. package/packages/openclaw/dist/types.d.ts.map +1 -0
  118. package/packages/openclaw/dist/types.js +2 -0
  119. package/packages/openclaw/dist/types.js.map +1 -0
  120. package/packages/openclaw/package.json +63 -0
  121. package/packages/openclaw/skill/SKILL.md +194 -0
  122. package/packages/openclaw/src/__tests__/gateway-threads.test.ts +384 -0
  123. package/packages/openclaw/src/__tests__/naming.test.ts +24 -0
  124. package/packages/openclaw/src/__tests__/spawn-manager.test.ts +152 -0
  125. package/packages/openclaw/src/auth/converter.ts +90 -0
  126. package/packages/openclaw/src/cli.ts +269 -0
  127. package/packages/openclaw/src/config.ts +124 -0
  128. package/packages/openclaw/src/control.ts +100 -0
  129. package/packages/openclaw/src/gateway.ts +941 -0
  130. package/packages/openclaw/src/identity/contract.ts +44 -0
  131. package/packages/openclaw/src/identity/files.ts +198 -0
  132. package/packages/openclaw/src/identity/model.ts +27 -0
  133. package/packages/openclaw/src/identity/naming.ts +6 -0
  134. package/packages/openclaw/src/index.ts +59 -0
  135. package/packages/openclaw/src/inject.ts +77 -0
  136. package/packages/openclaw/src/mcp/server.ts +121 -0
  137. package/packages/openclaw/src/mcp/tools.ts +174 -0
  138. package/packages/openclaw/src/runtime/openclaw-config.ts +64 -0
  139. package/packages/openclaw/src/runtime/patch.ts +103 -0
  140. package/packages/openclaw/src/runtime/setup.ts +89 -0
  141. package/packages/openclaw/src/setup.ts +336 -0
  142. package/packages/openclaw/src/spawn/docker.ts +261 -0
  143. package/packages/openclaw/src/spawn/manager.ts +181 -0
  144. package/packages/openclaw/src/spawn/process.ts +272 -0
  145. package/packages/openclaw/src/spawn/types.ts +43 -0
  146. package/packages/openclaw/src/types.ts +38 -0
  147. package/packages/openclaw/templates/SOUL.md.template +34 -0
  148. package/packages/openclaw/tsconfig.json +12 -0
  149. package/packages/policy/package.json +2 -2
  150. package/packages/sdk/README.md +169 -64
  151. package/packages/sdk/dist/__tests__/contract-fixtures.test.js +76 -9
  152. package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -1
  153. package/packages/sdk/dist/__tests__/integration.test.js +5 -4
  154. package/packages/sdk/dist/__tests__/integration.test.js.map +1 -1
  155. package/packages/sdk/dist/client.d.ts +34 -3
  156. package/packages/sdk/dist/client.d.ts.map +1 -1
  157. package/packages/sdk/dist/client.js +120 -10
  158. package/packages/sdk/dist/client.js.map +1 -1
  159. package/packages/sdk/dist/protocol.d.ts +7 -1
  160. package/packages/sdk/dist/protocol.d.ts.map +1 -1
  161. package/packages/sdk/dist/relay.d.ts +47 -11
  162. package/packages/sdk/dist/relay.d.ts.map +1 -1
  163. package/packages/sdk/dist/relay.js +114 -23
  164. package/packages/sdk/dist/relay.js.map +1 -1
  165. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  166. package/packages/sdk/dist/workflows/runner.js +71 -36
  167. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  168. package/packages/sdk/dist/workflows/types.d.ts +1 -1
  169. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  170. package/packages/sdk/package.json +2 -2
  171. package/packages/sdk/src/__tests__/contract-fixtures.test.ts +88 -9
  172. package/packages/sdk/src/__tests__/error-scenarios.test.ts +1 -1
  173. package/packages/sdk/src/__tests__/idle-nudge.test.ts +205 -257
  174. package/packages/sdk/src/__tests__/integration.test.ts +5 -4
  175. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +277 -13
  176. package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +1 -0
  177. package/packages/sdk/src/__tests__/workflow-runner.test.ts +67 -7
  178. package/packages/sdk/src/__tests__/workflow-trajectory.test.ts +4 -5
  179. package/packages/sdk/src/client.ts +171 -14
  180. package/packages/sdk/src/examples/workflows/runner-idle-refactor.yaml +306 -0
  181. package/packages/sdk/src/protocol.ts +7 -2
  182. package/packages/sdk/src/relay.ts +196 -34
  183. package/packages/sdk/src/workflows/runner.ts +73 -42
  184. package/packages/sdk/src/workflows/schema.json +1 -1
  185. package/packages/sdk/src/workflows/types.ts +1 -1
  186. package/packages/sdk/vitest.config.ts +1 -0
  187. package/packages/sdk-py/README.md +89 -102
  188. package/packages/sdk-py/agent_relay/__init__.py +16 -19
  189. package/packages/sdk-py/pyproject.toml +5 -1
  190. package/packages/sdk-py/src/agent_relay/__init__.py +35 -1
  191. package/packages/sdk-py/src/agent_relay/client.py +776 -0
  192. package/packages/sdk-py/src/agent_relay/models.py +27 -0
  193. package/packages/sdk-py/src/agent_relay/protocol.py +114 -0
  194. package/packages/sdk-py/src/agent_relay/relay.py +860 -0
  195. package/packages/sdk-py/tests/test_relay_lifecycle_hooks.py +250 -0
  196. package/packages/telemetry/package.json +1 -1
  197. package/packages/trajectory/package.json +2 -2
  198. package/packages/user-directory/package.json +2 -2
  199. package/packages/utils/package.json +2 -2
  200. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  201. package/bin/agent-relay-broker-darwin-x64 +0 -0
  202. package/bin/agent-relay-broker-linux-arm64 +0 -0
  203. package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +0 -50
  204. package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +0 -50
  205. package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +0 -50
  206. package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +0 -50
  207. package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +0 -80
  208. package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +0 -80
  209. package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +0 -80
  210. package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +0 -80
  211. package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +0 -80
  212. package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +0 -80
  213. package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +0 -80
  214. package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +0 -80
  215. package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +0 -80
  216. package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +0 -80
  217. package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +0 -80
  218. package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +0 -91
  219. package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +0 -91
  220. package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +0 -91
  221. package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +0 -91
  222. package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +0 -80
  223. package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +0 -80
  224. package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +0 -80
  225. package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +0 -80
  226. package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +0 -80
  227. package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +0 -80
  228. package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +0 -80
  229. package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +0 -80
  230. package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +0 -80
  231. package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +0 -80
  232. package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +0 -80
  233. package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +0 -91
  234. package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +0 -91
  235. package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +0 -91
  236. package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +0 -91
  237. package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +0 -80
  238. package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +0 -80
  239. package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +0 -80
  240. package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +0 -80
  241. package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +0 -80
  242. package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +0 -80
  243. package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +0 -80
  244. package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +0 -80
  245. package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +0 -80
  246. package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +0 -80
  247. package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +0 -80
  248. package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +0 -91
  249. package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +0 -91
  250. package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +0 -91
  251. package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +0 -91
  252. package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +0 -80
  253. package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +0 -80
  254. package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +0 -80
  255. package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +0 -80
  256. package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +0 -80
  257. package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +0 -80
  258. package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +0 -80
  259. package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +0 -80
  260. package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +0 -80
  261. package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +0 -80
  262. package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +0 -80
  263. package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +0 -91
  264. package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +0 -91
  265. package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +0 -91
  266. package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +0 -91
@@ -1,141 +1,128 @@
1
1
  # Agent Relay Python SDK
2
2
 
3
- Python SDK for defining and running Agent Relay workflows with the same schema and
4
- builder capabilities as the TypeScript workflow SDK.
3
+ Python SDK for real-time agent-to-agent communication. Spawn AI agents, send messages, and coordinate multi-agent workflows with a simple async API.
5
4
 
6
- The SDK builds workflow config and executes it through:
5
+ ## Installation
7
6
 
8
7
  ```bash
9
- agent-relay run <workflow.yaml>
8
+ pip install agent-relay-sdk
10
9
  ```
11
10
 
12
- ## Install
11
+ The SDK automatically downloads the broker binary on first use.
13
12
 
14
- ```bash
15
- pip install agent-relay
16
- ```
13
+ ## Requirements
17
14
 
18
- ## Builder API
15
+ - Python 3.10+
16
+
17
+ ## Quick Start
19
18
 
20
19
  ```python
21
- from agent_relay import workflow, VerificationCheck
22
-
23
- result = (
24
- workflow("ship-feature")
25
- .description("Plan, build, and verify a feature")
26
- .pattern("dag")
27
- .max_concurrency(3)
28
- .timeout(60 * 60 * 1000)
29
- .channel("feature-channel")
30
- .idle_nudge(nudge_after_ms=120_000, escalate_after_ms=120_000, max_nudges=1)
31
- .trajectories(enabled=True, reflect_on_converge=True)
32
- .agent("planner", cli="claude", role="Planning lead")
33
- .agent(
34
- "builder",
35
- cli="codex",
36
- role="Implementation engineer",
37
- interactive=False,
38
- idle_threshold_secs=45,
39
- retries=1,
20
+ import asyncio
21
+ from agent_relay import AgentRelay, Models
22
+
23
+ async def main():
24
+ relay = AgentRelay(channels=["dev"])
25
+
26
+ # Event hooks
27
+ relay.on_message_received = lambda msg: print(f"[{msg.from_name}]: {msg.text}")
28
+ relay.on_agent_ready = lambda agent: print(f" {agent.name} ready")
29
+ relay.on_agent_exited = lambda agent: print(f" {agent.name} exited")
30
+
31
+ # Spawn agents
32
+ await relay.claude.spawn(
33
+ name="Reviewer",
34
+ model=Models.Claude.OPUS,
35
+ channels=["dev"],
36
+ task="Review the PR and suggest improvements",
40
37
  )
41
- .step("plan", agent="planner", task="Create a detailed plan")
42
- .step(
43
- "build",
44
- agent="builder",
45
- task="Implement the approved plan",
46
- depends_on=["plan"],
47
- verification=VerificationCheck(type="output_contains", value="DONE"),
38
+
39
+ await relay.codex.spawn(
40
+ name="Builder",
41
+ model=Models.Codex.GPT_5_3_CODEX,
42
+ channels=["dev"],
43
+ task="Implement the suggested improvements",
48
44
  )
49
- .run()
50
- )
51
- ```
52
45
 
53
- ## Workflow Templates
46
+ # Wait for both agents to be ready
47
+ await asyncio.gather(
48
+ relay.wait_for_agent_ready("Reviewer"),
49
+ relay.wait_for_agent_ready("Builder"),
50
+ )
54
51
 
55
- Built-in template helpers are provided for common patterns:
52
+ # Let agents collaborate, then shut down
53
+ await asyncio.sleep(600)
54
+ await relay.shutdown()
56
55
 
57
- - `fan_out(...)`
58
- - `pipeline(...)`
59
- - `dag(...)`
56
+ asyncio.run(main())
57
+ ```
60
58
 
61
- ```python
62
- from agent_relay import fan_out
63
-
64
- builder = fan_out(
65
- "parallel-analysis",
66
- tasks=[
67
- "Analyze backend modules and summarize risks",
68
- "Analyze frontend modules and summarize risks",
69
- ],
70
- synthesis_task="Synthesize both analyses into one prioritized action plan",
71
- )
59
+ ## API
72
60
 
73
- config = builder.to_config()
74
- ```
61
+ ### AgentRelay
62
+
63
+ The main entry point. Pass `channels` to subscribe to message channels.
75
64
 
76
65
  ```python
77
- from agent_relay import pipeline, PipelineStage
78
-
79
- builder = pipeline(
80
- "release-pipeline",
81
- stages=[
82
- PipelineStage(name="plan", task="Create release plan"),
83
- PipelineStage(name="implement", task="Implement planned changes"),
84
- PipelineStage(name="verify", task="Validate and produce release notes"),
85
- ],
86
- )
66
+ relay = AgentRelay(channels=["dev", "planning"])
87
67
  ```
88
68
 
89
- ## Event Callbacks
69
+ ### Spawning Agents
90
70
 
91
- Execution callbacks receive typed workflow events parsed from CLI workflow logs.
71
+ Use runtime-specific spawners:
92
72
 
93
73
  ```python
94
- from agent_relay import run_yaml, RunOptions
95
-
96
- def on_event(event):
97
- print(event.type, event)
74
+ await relay.claude.spawn(name="Agent1", model=Models.Claude.SONNET, channels=["dev"], task="...")
75
+ await relay.codex.spawn(name="Agent2", model=Models.Codex.GPT_5_3_CODEX, channels=["dev"], task="...")
76
+ await relay.gemini.spawn(name="Agent3", model=Models.Gemini.GEMINI_2_5_PRO, channels=["dev"], task="...")
77
+
78
+ worker = await relay.claude.spawn(
79
+ name="HookedWorker",
80
+ channels=["dev"],
81
+ # Lifecycle hooks can be sync or async callables.
82
+ on_start=lambda ctx: print(f"spawning {ctx['name']}"),
83
+ on_success=lambda ctx: print(f"spawned {ctx['name']} ({ctx['runtime']})"),
84
+ on_error=lambda ctx: print(f"failed to spawn {ctx['name']}: {ctx['error']}"),
85
+ )
98
86
 
99
- result = run_yaml(
100
- "workflows/release.yaml",
101
- RunOptions(workflow="release", on_event=on_event),
87
+ await worker.release(
88
+ "done",
89
+ on_start=lambda ctx: print(f"releasing {ctx['name']}"),
90
+ on_success=lambda ctx: print(f"released {ctx['name']}"),
102
91
  )
103
92
  ```
104
93
 
105
- Supported event types:
94
+ ### Sending Messages
106
95
 
107
- - `run:started`
108
- - `run:completed`
109
- - `run:failed`
110
- - `run:cancelled`
111
- - `step:started`
112
- - `step:completed`
113
- - `step:failed`
114
- - `step:skipped`
115
- - `step:retrying`
116
- - `step:nudged`
117
- - `step:force-released`
96
+ ```python
97
+ human = relay.system()
98
+ await human.send_message(to="Agent1", text="Please start the analysis")
99
+ ```
118
100
 
119
- ## YAML Workflow Execution
101
+ ### Event Hooks
120
102
 
121
103
  ```python
122
- from agent_relay import run_yaml, RunOptions
123
-
124
- result = run_yaml(
125
- "workflows/daytona-migration.yaml",
126
- RunOptions(
127
- workflow="main",
128
- trajectories=False, # override YAML trajectory config at runtime
129
- vars={"target": "staging"},
130
- ),
131
- )
104
+ relay.on_message_received = lambda msg: ... # New message
105
+ relay.on_agent_ready = lambda agent: ... # Agent connected
106
+ relay.on_agent_exited = lambda agent: ... # Agent exited
107
+ relay.on_agent_spawned = lambda agent: ... # Agent spawned
108
+ relay.on_worker_output = lambda data: ... # Agent output
109
+ relay.on_agent_idle = lambda agent: ... # Agent idle
132
110
  ```
133
111
 
134
- ## Requirements
112
+ ### Models
135
113
 
136
- - Python 3.10+
137
- - `agent-relay` CLI installed (`npm install -g agent-relay`)
114
+ ```python
115
+ Models.Claude.OPUS
116
+ Models.Claude.SONNET
117
+ Models.Claude.HAIKU
118
+
119
+ Models.Codex.GPT_5_2_CODEX
120
+ Models.Codex.GPT_5_3_CODEX
121
+
122
+ Models.Gemini.GEMINI_2_5_PRO
123
+ Models.Gemini.GEMINI_2_5_FLASH
124
+ ```
138
125
 
139
126
  ## License
140
127
 
141
- Apache-2.0 -- Copyright 2025-2026 Agent Workforce Incorporated
128
+ Apache-2.0
@@ -1,21 +1,18 @@
1
- """Agent Relay Python SDK."""
1
+ """Agent Relay Python SDK — re-exports from src/agent_relay/.
2
2
 
3
- from .models import (
4
- CLIs,
5
- CLIVersions,
6
- CLI_REGISTRY,
7
- DEFAULT_MODELS,
8
- Models,
9
- ModelOptions,
10
- SwarmPatterns,
11
- )
3
+ This directory exists for backward compatibility with codegen scripts.
4
+ The real package source lives in src/agent_relay/.
5
+ """
12
6
 
13
- __all__ = [
14
- "CLIs",
15
- "CLIVersions",
16
- "CLI_REGISTRY",
17
- "DEFAULT_MODELS",
18
- "Models",
19
- "ModelOptions",
20
- "SwarmPatterns",
21
- ]
7
+ import importlib.util as _util
8
+ import sys as _sys
9
+ from pathlib import Path as _Path
10
+
11
+ # Load the real package from src/agent_relay/ and replace this module
12
+ _src_init = _Path(__file__).resolve().parent.parent / "src" / "agent_relay" / "__init__.py"
13
+ _spec = _util.spec_from_file_location("agent_relay", str(_src_init),
14
+ submodule_search_locations=[str(_src_init.parent)])
15
+ assert _spec is not None and _spec.loader is not None, f"Could not load {_src_init}"
16
+ _real = _util.module_from_spec(_spec)
17
+ _sys.modules[__name__] = _real
18
+ _spec.loader.exec_module(_real)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agent-relay-sdk"
7
- version = "3.0.2"
7
+ version = "3.1.1"
8
8
  description = "Python SDK for Agent Relay workflows"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -21,3 +21,7 @@ dev = [
21
21
 
22
22
  [tool.hatch.build.targets.wheel]
23
23
  packages = ["src/agent_relay"]
24
+
25
+ [tool.pytest.ini_options]
26
+ pythonpath = ["src"]
27
+ asyncio_mode = "auto"
@@ -1,4 +1,20 @@
1
- """Agent Relay Python SDK — workflow builder and runner."""
1
+ """Agent Relay Python SDK — direct spawn/message API and workflow builder."""
2
+
3
+ # ── Primary API: Direct spawn/message (matches TypeScript SDK) ────────────────
4
+
5
+ from .relay import AgentRelay, Agent, AgentSpawner, HumanHandle, Message, SpawnOptions
6
+ from .models import Models
7
+ from .client import AgentRelayClient, AgentRelayProtocolError, AgentRelayProcessError
8
+ from .protocol import (
9
+ PROTOCOL_VERSION,
10
+ AgentRuntime,
11
+ AgentSpec,
12
+ BrokerEvent,
13
+ ProtocolEnvelope,
14
+ RestartPolicy as ProtocolRestartPolicy,
15
+ )
16
+
17
+ # ── Secondary API: Workflow builder (backward compatibility) ──────────────────
2
18
 
3
19
  from .builder import workflow, WorkflowBuilder, run_yaml
4
20
  from .templates import (
@@ -52,6 +68,24 @@ from .types import (
52
68
  )
53
69
 
54
70
  __all__ = [
71
+ # Primary API
72
+ "AgentRelay",
73
+ "Agent",
74
+ "AgentSpawner",
75
+ "HumanHandle",
76
+ "Message",
77
+ "SpawnOptions",
78
+ "Models",
79
+ "AgentRelayClient",
80
+ "AgentRelayProtocolError",
81
+ "AgentRelayProcessError",
82
+ "PROTOCOL_VERSION",
83
+ "AgentRuntime",
84
+ "AgentSpec",
85
+ "BrokerEvent",
86
+ "ProtocolEnvelope",
87
+ "ProtocolRestartPolicy",
88
+ # Workflow builder (backward compat)
55
89
  "workflow",
56
90
  "WorkflowBuilder",
57
91
  "run_yaml",