coco-framework 0.1.0__py3-none-any.whl

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 (400) hide show
  1. coco/__init__.py +3 -0
  2. coco/agents/__init__.py +9 -0
  3. coco/agents/_subagent_transformer.py +307 -0
  4. coco/agents/factory.py +2164 -0
  5. coco/agents/middleware/__init__.py +100 -0
  6. coco/agents/middleware/_execution.py +385 -0
  7. coco/agents/middleware/_redaction.py +454 -0
  8. coco/agents/middleware/_retry.py +134 -0
  9. coco/agents/middleware/_trace_policy.py +61 -0
  10. coco/agents/middleware/context_editing.py +306 -0
  11. coco/agents/middleware/file_search.py +433 -0
  12. coco/agents/middleware/human_in_the_loop.py +680 -0
  13. coco/agents/middleware/internal_call_transformer.py +108 -0
  14. coco/agents/middleware/model_call_limit.py +267 -0
  15. coco/agents/middleware/model_fallback.py +417 -0
  16. coco/agents/middleware/model_retry.py +327 -0
  17. coco/agents/middleware/pii.py +878 -0
  18. coco/agents/middleware/provider_tool_search.py +307 -0
  19. coco/agents/middleware/shell_tool.py +949 -0
  20. coco/agents/middleware/summarization.py +910 -0
  21. coco/agents/middleware/todo.py +357 -0
  22. coco/agents/middleware/tool_call_limit.py +495 -0
  23. coco/agents/middleware/tool_emulator.py +251 -0
  24. coco/agents/middleware/tool_error.py +209 -0
  25. coco/agents/middleware/tool_retry.py +421 -0
  26. coco/agents/middleware/tool_selection.py +515 -0
  27. coco/agents/middleware/types.py +2201 -0
  28. coco/agents/structured_output.py +472 -0
  29. coco/chat_models/__init__.py +7 -0
  30. coco/chat_models/base.py +1082 -0
  31. coco/embeddings/__init__.py +18 -0
  32. coco/embeddings/base.py +279 -0
  33. coco/mcp/__init__.py +36 -0
  34. coco/mcp/adapter.py +245 -0
  35. coco/mcp/elicitation.py +394 -0
  36. coco/mcp/tools.py +307 -0
  37. coco/messages/__init__.py +73 -0
  38. coco/py.typed +0 -0
  39. coco/rate_limiters/__init__.py +13 -0
  40. coco/tools/__init__.py +22 -0
  41. coco/tools/tool_node.py +20 -0
  42. coco_anthropic/__init__.py +15 -0
  43. coco_anthropic/_client_utils.py +81 -0
  44. coco_anthropic/_compat.py +228 -0
  45. coco_anthropic/_sdk_compat.py +124 -0
  46. coco_anthropic/_version.py +3 -0
  47. coco_anthropic/chat_models.py +3349 -0
  48. coco_anthropic/data/__init__.py +1 -0
  49. coco_anthropic/data/_profiles.py +491 -0
  50. coco_anthropic/data/profile_augmentations.toml +69 -0
  51. coco_anthropic/experimental.py +140 -0
  52. coco_anthropic/llms.py +428 -0
  53. coco_anthropic/middleware/__init__.py +25 -0
  54. coco_anthropic/middleware/anthropic_tools.py +1197 -0
  55. coco_anthropic/middleware/bash.py +84 -0
  56. coco_anthropic/middleware/file_search.py +360 -0
  57. coco_anthropic/middleware/prompt_caching.py +276 -0
  58. coco_anthropic/output_parsers.py +93 -0
  59. coco_anthropic/py.typed +0 -0
  60. coco_core/__init__.py +20 -0
  61. coco_core/_api/__init__.py +87 -0
  62. coco_core/_api/beta_decorator.py +266 -0
  63. coco_core/_api/deprecation.py +637 -0
  64. coco_core/_api/internal.py +23 -0
  65. coco_core/_api/path.py +50 -0
  66. coco_core/_import_utils.py +41 -0
  67. coco_core/_protocol.py +625 -0
  68. coco_core/_security/__init__.py +36 -0
  69. coco_core/_security/_exceptions.py +9 -0
  70. coco_core/_security/_policy.py +313 -0
  71. coco_core/_security/_ssrf_protection.py +155 -0
  72. coco_core/_security/_transport.py +254 -0
  73. coco_core/agents.py +258 -0
  74. coco_core/caches.py +272 -0
  75. coco_core/callbacks/__init__.py +132 -0
  76. coco_core/callbacks/base.py +1229 -0
  77. coco_core/callbacks/file.py +266 -0
  78. coco_core/callbacks/manager.py +2826 -0
  79. coco_core/callbacks/stdout.py +123 -0
  80. coco_core/callbacks/streaming_stdout.py +154 -0
  81. coco_core/callbacks/usage.py +124 -0
  82. coco_core/chat_history.py +267 -0
  83. coco_core/chat_loaders.py +26 -0
  84. coco_core/chat_sessions.py +19 -0
  85. coco_core/cross_encoders.py +18 -0
  86. coco_core/document_loaders/__init__.py +36 -0
  87. coco_core/document_loaders/base.py +155 -0
  88. coco_core/document_loaders/blob_loaders.py +38 -0
  89. coco_core/documents/__init__.py +55 -0
  90. coco_core/documents/base.py +347 -0
  91. coco_core/documents/compressor.py +74 -0
  92. coco_core/documents/transformers.py +79 -0
  93. coco_core/embeddings/__init__.py +31 -0
  94. coco_core/embeddings/embeddings.py +78 -0
  95. coco_core/embeddings/fake.py +129 -0
  96. coco_core/env.py +22 -0
  97. coco_core/example_selectors/__init__.py +47 -0
  98. coco_core/example_selectors/base.py +60 -0
  99. coco_core/example_selectors/length_based.py +131 -0
  100. coco_core/example_selectors/semantic_similarity.py +366 -0
  101. coco_core/exceptions.py +166 -0
  102. coco_core/globals.py +72 -0
  103. coco_core/indexing/__init__.py +53 -0
  104. coco_core/indexing/api.py +954 -0
  105. coco_core/indexing/base.py +661 -0
  106. coco_core/indexing/in_memory.py +104 -0
  107. coco_core/language_models/__init__.py +116 -0
  108. coco_core/language_models/_compat_bridge.py +844 -0
  109. coco_core/language_models/_utils.py +343 -0
  110. coco_core/language_models/base.py +500 -0
  111. coco_core/language_models/chat_model_stream.py +1525 -0
  112. coco_core/language_models/chat_models.py +2748 -0
  113. coco_core/language_models/fake.py +137 -0
  114. coco_core/language_models/fake_chat_models.py +396 -0
  115. coco_core/language_models/llms.py +1569 -0
  116. coco_core/language_models/model_profile.py +183 -0
  117. coco_core/load/__init__.py +44 -0
  118. coco_core/load/_validation.py +191 -0
  119. coco_core/load/dump.py +120 -0
  120. coco_core/load/load.py +828 -0
  121. coco_core/load/mapping.py +1097 -0
  122. coco_core/load/serializable.py +406 -0
  123. coco_core/messages/__init__.py +198 -0
  124. coco_core/messages/ai.py +854 -0
  125. coco_core/messages/base.py +518 -0
  126. coco_core/messages/block_translators/__init__.py +112 -0
  127. coco_core/messages/block_translators/anthropic.py +534 -0
  128. coco_core/messages/block_translators/bedrock.py +108 -0
  129. coco_core/messages/block_translators/bedrock_converse.py +329 -0
  130. coco_core/messages/block_translators/coco_v0.py +303 -0
  131. coco_core/messages/block_translators/google_genai.py +610 -0
  132. coco_core/messages/block_translators/google_vertexai.py +21 -0
  133. coco_core/messages/block_translators/groq.py +157 -0
  134. coco_core/messages/block_translators/openai.py +1089 -0
  135. coco_core/messages/chat.py +64 -0
  136. coco_core/messages/content.py +1488 -0
  137. coco_core/messages/function.py +62 -0
  138. coco_core/messages/human.py +70 -0
  139. coco_core/messages/modifier.py +33 -0
  140. coco_core/messages/system.py +70 -0
  141. coco_core/messages/tool.py +418 -0
  142. coco_core/messages/utils.py +2442 -0
  143. coco_core/output_parsers/__init__.py +101 -0
  144. coco_core/output_parsers/base.py +361 -0
  145. coco_core/output_parsers/format_instructions.py +16 -0
  146. coco_core/output_parsers/json.py +139 -0
  147. coco_core/output_parsers/list.py +249 -0
  148. coco_core/output_parsers/openai_functions.py +324 -0
  149. coco_core/output_parsers/openai_tools.py +383 -0
  150. coco_core/output_parsers/pydantic.py +141 -0
  151. coco_core/output_parsers/string.py +63 -0
  152. coco_core/output_parsers/transform.py +175 -0
  153. coco_core/output_parsers/xml.py +301 -0
  154. coco_core/outputs/__init__.py +66 -0
  155. coco_core/outputs/chat_generation.py +147 -0
  156. coco_core/outputs/chat_result.py +39 -0
  157. coco_core/outputs/generation.py +80 -0
  158. coco_core/outputs/llm_result.py +112 -0
  159. coco_core/outputs/run_info.py +22 -0
  160. coco_core/prompt_values.py +161 -0
  161. coco_core/prompts/__init__.py +101 -0
  162. coco_core/prompts/base.py +508 -0
  163. coco_core/prompts/chat.py +1495 -0
  164. coco_core/prompts/dict.py +177 -0
  165. coco_core/prompts/few_shot.py +483 -0
  166. coco_core/prompts/few_shot_with_templates.py +239 -0
  167. coco_core/prompts/image.py +177 -0
  168. coco_core/prompts/loading.py +296 -0
  169. coco_core/prompts/message.py +97 -0
  170. coco_core/prompts/prompt.py +312 -0
  171. coco_core/prompts/string.py +399 -0
  172. coco_core/prompts/structured.py +214 -0
  173. coco_core/py.typed +0 -0
  174. coco_core/rate_limiters.py +254 -0
  175. coco_core/retrievers.py +328 -0
  176. coco_core/runnables/__init__.py +136 -0
  177. coco_core/runnables/base.py +6725 -0
  178. coco_core/runnables/branch.py +457 -0
  179. coco_core/runnables/config.py +712 -0
  180. coco_core/runnables/configurable.py +710 -0
  181. coco_core/runnables/fallbacks.py +663 -0
  182. coco_core/runnables/graph.py +741 -0
  183. coco_core/runnables/graph_ascii.py +366 -0
  184. coco_core/runnables/graph_mermaid.py +503 -0
  185. coco_core/runnables/graph_png.py +215 -0
  186. coco_core/runnables/history.py +631 -0
  187. coco_core/runnables/passthrough.py +849 -0
  188. coco_core/runnables/retry.py +379 -0
  189. coco_core/runnables/router.py +239 -0
  190. coco_core/runnables/schema.py +188 -0
  191. coco_core/runnables/utils.py +798 -0
  192. coco_core/stores.py +291 -0
  193. coco_core/structured_query.py +203 -0
  194. coco_core/sys_info.py +154 -0
  195. coco_core/tools/__init__.py +95 -0
  196. coco_core/tools/base.py +1948 -0
  197. coco_core/tools/convert.py +497 -0
  198. coco_core/tools/render.py +67 -0
  199. coco_core/tools/retriever.py +94 -0
  200. coco_core/tools/simple.py +208 -0
  201. coco_core/tools/structured.py +322 -0
  202. coco_core/tracers/__init__.py +47 -0
  203. coco_core/tracers/_compat.py +95 -0
  204. coco_core/tracers/_context.py +337 -0
  205. coco_core/tracers/_streaming.py +53 -0
  206. coco_core/tracers/base.py +955 -0
  207. coco_core/tracers/coco.py +279 -0
  208. coco_core/tracers/context.py +205 -0
  209. coco_core/tracers/core.py +766 -0
  210. coco_core/tracers/event_stream.py +1101 -0
  211. coco_core/tracers/log_stream.py +765 -0
  212. coco_core/tracers/memory_stream.py +200 -0
  213. coco_core/tracers/root_listeners.py +130 -0
  214. coco_core/tracers/run_collector.py +40 -0
  215. coco_core/tracers/schemas.py +14 -0
  216. coco_core/tracers/stdout.py +205 -0
  217. coco_core/utils/__init__.py +111 -0
  218. coco_core/utils/_gateway.py +274 -0
  219. coco_core/utils/_merge.py +218 -0
  220. coco_core/utils/aiter.py +357 -0
  221. coco_core/utils/env.py +86 -0
  222. coco_core/utils/formatting.py +80 -0
  223. coco_core/utils/function_calling.py +869 -0
  224. coco_core/utils/html.py +132 -0
  225. coco_core/utils/image.py +15 -0
  226. coco_core/utils/input.py +82 -0
  227. coco_core/utils/interactive_env.py +12 -0
  228. coco_core/utils/iter.py +229 -0
  229. coco_core/utils/json.py +230 -0
  230. coco_core/utils/json_schema.py +273 -0
  231. coco_core/utils/mustache.py +706 -0
  232. coco_core/utils/pydantic.py +631 -0
  233. coco_core/utils/strings.py +69 -0
  234. coco_core/utils/usage.py +61 -0
  235. coco_core/utils/utils.py +528 -0
  236. coco_core/utils/uuid.py +57 -0
  237. coco_core/vectorstores/__init__.py +53 -0
  238. coco_core/vectorstores/base.py +1111 -0
  239. coco_core/vectorstores/in_memory.py +546 -0
  240. coco_core/vectorstores/utils.py +163 -0
  241. coco_core/version.py +3 -0
  242. coco_framework-0.1.0.dist-info/METADATA +184 -0
  243. coco_framework-0.1.0.dist-info/RECORD +400 -0
  244. coco_framework-0.1.0.dist-info/WHEEL +4 -0
  245. coco_framework-0.1.0.dist-info/licenses/LICENSE +24 -0
  246. coco_framework-0.1.0.dist-info/licenses/NOTICE +15 -0
  247. coco_graph/_internal/__init__.py +4 -0
  248. coco_graph/_internal/_cache.py +31 -0
  249. coco_graph/_internal/_config.py +474 -0
  250. coco_graph/_internal/_constants.py +140 -0
  251. coco_graph/_internal/_fields.py +213 -0
  252. coco_graph/_internal/_future.py +220 -0
  253. coco_graph/_internal/_pydantic.py +275 -0
  254. coco_graph/_internal/_queue.py +124 -0
  255. coco_graph/_internal/_replay.py +90 -0
  256. coco_graph/_internal/_retry.py +29 -0
  257. coco_graph/_internal/_runnable.py +969 -0
  258. coco_graph/_internal/_scratchpad.py +19 -0
  259. coco_graph/_internal/_serde.py +253 -0
  260. coco_graph/_internal/_timeout.py +25 -0
  261. coco_graph/_internal/_typing.py +54 -0
  262. coco_graph/cache/base/__init__.py +48 -0
  263. coco_graph/cache/base/py.typed +0 -0
  264. coco_graph/cache/memory/__init__.py +73 -0
  265. coco_graph/cache/redis/__init__.py +144 -0
  266. coco_graph/cache/sqlite/__init__.py +120 -0
  267. coco_graph/callbacks.py +394 -0
  268. coco_graph/channels/__init__.py +29 -0
  269. coco_graph/channels/any_value.py +72 -0
  270. coco_graph/channels/base.py +121 -0
  271. coco_graph/channels/binop.py +155 -0
  272. coco_graph/channels/delta.py +202 -0
  273. coco_graph/channels/ephemeral_value.py +79 -0
  274. coco_graph/channels/last_value.py +151 -0
  275. coco_graph/channels/named_barrier_value.py +167 -0
  276. coco_graph/channels/topic.py +94 -0
  277. coco_graph/channels/untracked_value.py +73 -0
  278. coco_graph/checkpoint/base/__init__.py +861 -0
  279. coco_graph/checkpoint/base/id.py +109 -0
  280. coco_graph/checkpoint/base/py.typed +0 -0
  281. coco_graph/checkpoint/memory/__init__.py +698 -0
  282. coco_graph/checkpoint/memory/py.typed +0 -0
  283. coco_graph/checkpoint/postgres/__init__.py +602 -0
  284. coco_graph/checkpoint/postgres/_ainternal.py +23 -0
  285. coco_graph/checkpoint/postgres/_internal.py +21 -0
  286. coco_graph/checkpoint/postgres/aio.py +691 -0
  287. coco_graph/checkpoint/postgres/base.py +666 -0
  288. coco_graph/checkpoint/postgres/py.typed +0 -0
  289. coco_graph/checkpoint/postgres/shallow.py +967 -0
  290. coco_graph/checkpoint/serde/__init__.py +0 -0
  291. coco_graph/checkpoint/serde/_msgpack.py +97 -0
  292. coco_graph/checkpoint/serde/base.py +64 -0
  293. coco_graph/checkpoint/serde/encrypted.py +80 -0
  294. coco_graph/checkpoint/serde/event_hooks.py +52 -0
  295. coco_graph/checkpoint/serde/jsonplus.py +883 -0
  296. coco_graph/checkpoint/serde/py.typed +0 -0
  297. coco_graph/checkpoint/serde/types.py +68 -0
  298. coco_graph/checkpoint/sqlite/__init__.py +645 -0
  299. coco_graph/checkpoint/sqlite/_delta.py +172 -0
  300. coco_graph/checkpoint/sqlite/aio.py +738 -0
  301. coco_graph/checkpoint/sqlite/py.typed +0 -0
  302. coco_graph/checkpoint/sqlite/utils.py +116 -0
  303. coco_graph/config.py +196 -0
  304. coco_graph/constants.py +64 -0
  305. coco_graph/errors.py +241 -0
  306. coco_graph/func/__init__.py +620 -0
  307. coco_graph/graph/__init__.py +12 -0
  308. coco_graph/graph/_branch.py +225 -0
  309. coco_graph/graph/_node.py +103 -0
  310. coco_graph/graph/message.py +437 -0
  311. coco_graph/graph/state.py +1978 -0
  312. coco_graph/graph/ui.py +227 -0
  313. coco_graph/managed/__init__.py +3 -0
  314. coco_graph/managed/base.py +31 -0
  315. coco_graph/managed/is_last_step.py +24 -0
  316. coco_graph/prebuilt/__init__.py +23 -0
  317. coco_graph/prebuilt/_tool_call_stream.py +117 -0
  318. coco_graph/prebuilt/_tool_call_transformer.py +165 -0
  319. coco_graph/prebuilt/chat_agent_executor.py +1015 -0
  320. coco_graph/prebuilt/interrupt.py +105 -0
  321. coco_graph/prebuilt/py.typed +0 -0
  322. coco_graph/prebuilt/tool_node.py +2030 -0
  323. coco_graph/prebuilt/tool_validator.py +221 -0
  324. coco_graph/pregel/__init__.py +3 -0
  325. coco_graph/pregel/_algo.py +1460 -0
  326. coco_graph/pregel/_call.py +298 -0
  327. coco_graph/pregel/_checkpoint.py +331 -0
  328. coco_graph/pregel/_config.py +0 -0
  329. coco_graph/pregel/_draw.py +294 -0
  330. coco_graph/pregel/_executor.py +223 -0
  331. coco_graph/pregel/_io.py +174 -0
  332. coco_graph/pregel/_log.py +3 -0
  333. coco_graph/pregel/_loop.py +1988 -0
  334. coco_graph/pregel/_messages.py +461 -0
  335. coco_graph/pregel/_read.py +312 -0
  336. coco_graph/pregel/_retry.py +854 -0
  337. coco_graph/pregel/_runner.py +941 -0
  338. coco_graph/pregel/_tools.py +268 -0
  339. coco_graph/pregel/_utils.py +221 -0
  340. coco_graph/pregel/_validate.py +120 -0
  341. coco_graph/pregel/_write.py +192 -0
  342. coco_graph/pregel/debug.py +302 -0
  343. coco_graph/pregel/main.py +4364 -0
  344. coco_graph/pregel/protocol.py +288 -0
  345. coco_graph/pregel/types.py +38 -0
  346. coco_graph/py.typed +0 -0
  347. coco_graph/runtime.py +350 -0
  348. coco_graph/store/base/__init__.py +1322 -0
  349. coco_graph/store/base/batch.py +371 -0
  350. coco_graph/store/base/embed.py +436 -0
  351. coco_graph/store/base/py.typed +0 -0
  352. coco_graph/store/memory/__init__.py +592 -0
  353. coco_graph/store/memory/py.typed +0 -0
  354. coco_graph/store/postgres/__init__.py +4 -0
  355. coco_graph/store/postgres/aio.py +592 -0
  356. coco_graph/store/postgres/base.py +1480 -0
  357. coco_graph/store/postgres/py.typed +0 -0
  358. coco_graph/store/sqlite/__init__.py +4 -0
  359. coco_graph/store/sqlite/aio.py +632 -0
  360. coco_graph/store/sqlite/base.py +1514 -0
  361. coco_graph/stream/__init__.py +45 -0
  362. coco_graph/stream/_convert.py +32 -0
  363. coco_graph/stream/_mux.py +523 -0
  364. coco_graph/stream/_types.py +330 -0
  365. coco_graph/stream/run_stream.py +735 -0
  366. coco_graph/stream/stream_channel.py +341 -0
  367. coco_graph/stream/transformers.py +1039 -0
  368. coco_graph/types.py +1079 -0
  369. coco_graph/typing.py +48 -0
  370. coco_graph/utils/__init__.py +1 -0
  371. coco_graph/utils/config.py +4 -0
  372. coco_graph/utils/runnable.py +3 -0
  373. coco_graph/version.py +13 -0
  374. coco_graph/warnings.py +69 -0
  375. coco_openai/__init__.py +20 -0
  376. coco_openai/_compat.py +45 -0
  377. coco_openai/_version.py +3 -0
  378. coco_openai/chat_models/__init__.py +6 -0
  379. coco_openai/chat_models/_client_utils.py +684 -0
  380. coco_openai/chat_models/_compat.py +525 -0
  381. coco_openai/chat_models/azure.py +1227 -0
  382. coco_openai/chat_models/base.py +5654 -0
  383. coco_openai/chat_models/codex.py +557 -0
  384. coco_openai/chatgpt_oauth.py +1063 -0
  385. coco_openai/data/__init__.py +1 -0
  386. coco_openai/data/_profiles.py +1655 -0
  387. coco_openai/data/profile_augmentations.toml +127 -0
  388. coco_openai/embeddings/__init__.py +6 -0
  389. coco_openai/embeddings/azure.py +240 -0
  390. coco_openai/embeddings/base.py +820 -0
  391. coco_openai/llms/__init__.py +6 -0
  392. coco_openai/llms/azure.py +249 -0
  393. coco_openai/llms/base.py +919 -0
  394. coco_openai/middleware/__init__.py +11 -0
  395. coco_openai/middleware/openai_moderation.py +484 -0
  396. coco_openai/output_parsers/__init__.py +9 -0
  397. coco_openai/output_parsers/tools.py +9 -0
  398. coco_openai/py.typed +0 -0
  399. coco_openai/tools/__init__.py +5 -0
  400. coco_openai/tools/custom_tool.py +111 -0
coco_core/_api/path.py ADDED
@@ -0,0 +1,50 @@
1
+ import os
2
+ from pathlib import Path
3
+
4
+ HERE = Path(__file__).parent
5
+
6
+ # Get directory of coco package
7
+ PACKAGE_DIR = HERE.parent
8
+ SEPARATOR = os.sep
9
+
10
+
11
+ def get_relative_path(file: Path | str, *, relative_to: Path = PACKAGE_DIR) -> str:
12
+ """Get the path of the file as a relative path to the package directory.
13
+
14
+ Args:
15
+ file: The file path to convert.
16
+ relative_to: The base path to make the file path relative to.
17
+
18
+ Returns:
19
+ The relative path as a string.
20
+ """
21
+ if isinstance(file, str):
22
+ file = Path(file)
23
+ return str(file.relative_to(relative_to))
24
+
25
+
26
+ def as_import_path(
27
+ file: Path | str,
28
+ *,
29
+ suffix: str | None = None,
30
+ relative_to: Path = PACKAGE_DIR,
31
+ ) -> str:
32
+ """Path of the file as a Coco import exclude coco top namespace.
33
+
34
+ Args:
35
+ file: The file path to convert.
36
+ suffix: An optional suffix to append to the import path.
37
+ relative_to: The base path to make the file path relative to.
38
+
39
+ Returns:
40
+ The import path as a string.
41
+ """
42
+ if isinstance(file, str):
43
+ file = Path(file)
44
+ path = get_relative_path(file, relative_to=relative_to)
45
+ if file.is_file():
46
+ path = path[: -len(file.suffix)]
47
+ import_path = path.replace(SEPARATOR, ".")
48
+ if suffix:
49
+ import_path += "." + suffix
50
+ return import_path
@@ -0,0 +1,41 @@
1
+ from importlib import import_module
2
+
3
+
4
+ def import_attr(
5
+ attr_name: str,
6
+ module_name: str | None,
7
+ package: str | None,
8
+ ) -> object:
9
+ """Import an attribute from a module located in a package.
10
+
11
+ This utility function is used in custom `__getattr__` methods within `__init__.py`
12
+ files to dynamically import attributes.
13
+
14
+ Args:
15
+ attr_name: The name of the attribute to import.
16
+ module_name: The name of the module to import from.
17
+
18
+ If `None`, the attribute is imported from the package itself.
19
+ package: The name of the package where the module is located.
20
+
21
+ Raises:
22
+ ImportError: If the module cannot be found.
23
+ AttributeError: If the attribute does not exist in the module or package.
24
+
25
+ Returns:
26
+ The imported attribute.
27
+ """
28
+ if module_name == "__module__" or module_name is None:
29
+ try:
30
+ result = import_module(f".{attr_name}", package=package)
31
+ except ModuleNotFoundError:
32
+ msg = f"module '{package!r}' has no attribute {attr_name!r}"
33
+ raise AttributeError(msg) from None
34
+ else:
35
+ try:
36
+ module = import_module(f".{module_name}", package=package)
37
+ except ModuleNotFoundError as err:
38
+ msg = f"module '{package!r}.{module_name!r}' not found ({err})"
39
+ raise ImportError(msg) from None
40
+ result = getattr(module, attr_name)
41
+ return result
coco_core/_protocol.py ADDED
@@ -0,0 +1,625 @@
1
+ """Types for the agent streaming protocol: commands, events and payload shapes.
2
+
3
+ Vendored from langchain-protocol 0.0.19 (MIT, Copyright (c) 2026 LangChain, Inc.),
4
+ generated upstream from the protocol's CDDL with cddl2py. Kept here so the framework
5
+ does not depend on an upstream package. See NOTICE.
6
+ """
7
+
8
+ # compiled with https://www.npmjs.com/package/cddl2py v0.2.2
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import Annotated, Any, Literal, Union
13
+ from typing_extensions import NotRequired, TypedDict
14
+
15
+ JsInt = int
16
+
17
+ JsUint = int
18
+
19
+ Namespace = list[str]
20
+
21
+ Extensible = dict[str, Any]
22
+
23
+ Timestamp = int
24
+
25
+ MetadataScalar = Union[None, bool, int, float, str]
26
+
27
+ MessageRole = Union[Literal["ai"], Literal["human"], Literal["system"]]
28
+
29
+ class MessageMetadata(TypedDict, extra_items=MetadataScalar):
30
+ provider: NotRequired[str]
31
+ model: NotRequired[str]
32
+ model_type: NotRequired[str]
33
+ run_id: NotRequired[str]
34
+ thread_id: NotRequired[str]
35
+ system_fingerprint: NotRequired[str]
36
+ service_tier: NotRequired[str]
37
+
38
+ class TextContentBlock(TypedDict):
39
+ type: Literal["text"]
40
+ text: str
41
+ id: NotRequired[str]
42
+ index: NotRequired[BlockIndex]
43
+ annotations: NotRequired[list[Annotation]]
44
+
45
+ class InvalidToolCall(TypedDict):
46
+ type: Literal["invalid_tool_call"]
47
+ id: Union[str, None]
48
+ name: Union[str, None]
49
+ args: Union[str, None]
50
+ error: Union[str, None]
51
+ index: NotRequired[BlockIndex]
52
+
53
+ class ReasoningContentBlock(TypedDict):
54
+ type: Literal["reasoning"]
55
+ reasoning: NotRequired[str]
56
+ id: NotRequired[str]
57
+ index: NotRequired[BlockIndex]
58
+
59
+ class NonStandardContentBlock(TypedDict):
60
+ type: Literal["non_standard"]
61
+ value: dict[str, Any]
62
+ id: NotRequired[str]
63
+ index: NotRequired[BlockIndex]
64
+
65
+ class ImageContentBlock(TypedDict):
66
+ type: Literal["image"]
67
+ id: NotRequired[str]
68
+ file_id: NotRequired[str]
69
+ url: NotRequired[str]
70
+ base64: NotRequired[str] # Base64-encoded image data
71
+ mime_type: NotRequired[str]
72
+ index: NotRequired[BlockIndex]
73
+
74
+ class VideoContentBlock(TypedDict):
75
+ type: Literal["video"]
76
+ id: NotRequired[str]
77
+ file_id: NotRequired[str]
78
+ url: NotRequired[str]
79
+ base64: NotRequired[str] # Base64-encoded video data
80
+ mime_type: NotRequired[str]
81
+ index: NotRequired[BlockIndex]
82
+
83
+ class AudioContentBlock(TypedDict):
84
+ type: Literal["audio"]
85
+ id: NotRequired[str]
86
+ file_id: NotRequired[str]
87
+ url: NotRequired[str]
88
+ base64: NotRequired[str] # Base64-encoded audio data
89
+ mime_type: NotRequired[str]
90
+ index: NotRequired[BlockIndex]
91
+
92
+ class FileContentBlock(TypedDict):
93
+ type: Literal["file"]
94
+ id: NotRequired[str]
95
+ file_id: NotRequired[str]
96
+ url: NotRequired[str]
97
+ base64: NotRequired[str] # Base64-encoded file data
98
+ mime_type: NotRequired[str]
99
+ index: NotRequired[BlockIndex]
100
+
101
+ DataContentBlock = Union[ImageContentBlock, VideoContentBlock, AudioContentBlock, FileContentBlock]
102
+
103
+ class ToolCall(TypedDict):
104
+ type: Literal["tool_call"]
105
+ id: Union[str, None]
106
+ name: str
107
+ args: dict[str, Any]
108
+ index: NotRequired[BlockIndex]
109
+
110
+ class ToolCallChunk(TypedDict):
111
+ type: Literal["tool_call_chunk"]
112
+ id: Union[str, None]
113
+ name: Union[str, None]
114
+ args: Union[str, None] # Partial JSON string
115
+ index: NotRequired[BlockIndex]
116
+
117
+ class ServerToolCall(TypedDict):
118
+ type: Literal["server_tool_call"]
119
+ id: str
120
+ name: str
121
+ args: dict[str, Any]
122
+ index: NotRequired[BlockIndex]
123
+
124
+ class ServerToolCallChunk(TypedDict):
125
+ type: Literal["server_tool_call_chunk"]
126
+ id: NotRequired[str]
127
+ name: NotRequired[str]
128
+ args: NotRequired[str]
129
+ index: NotRequired[BlockIndex]
130
+
131
+ class ServerToolResult(TypedDict):
132
+ type: Literal["server_tool_result"]
133
+ tool_call_id: str
134
+ status: Union[Literal["success"], Literal["error"]]
135
+ id: NotRequired[str]
136
+ output: NotRequired[Any]
137
+ index: NotRequired[BlockIndex]
138
+
139
+ ToolContentBlock = Union[ToolCall, ToolCallChunk, ServerToolCall, ServerToolCallChunk, ServerToolResult]
140
+
141
+ ContentBlock = Union[TextContentBlock, InvalidToolCall, ReasoningContentBlock, NonStandardContentBlock, DataContentBlock, ToolContentBlock]
142
+
143
+ FinalizedContentBlock = Union[TextContentBlock, ReasoningContentBlock, ToolCall, InvalidToolCall, ServerToolCall, ServerToolResult, DataContentBlock, NonStandardContentBlock]
144
+
145
+ BlockIndex = Union[JsInt, str]
146
+
147
+ class Citation(TypedDict):
148
+ type: Literal["citation"]
149
+ id: NotRequired[str]
150
+ url: NotRequired[str]
151
+ title: NotRequired[str]
152
+ start_index: NotRequired[int]
153
+ end_index: NotRequired[int]
154
+ cited_text: NotRequired[str]
155
+
156
+ class NonStandardAnnotation(TypedDict):
157
+ type: Literal["non_standard_annotation"]
158
+ id: NotRequired[str]
159
+ value: dict[str, Any]
160
+
161
+ Annotation = Union[Citation, NonStandardAnnotation]
162
+
163
+ class TextDelta(TypedDict):
164
+ type: Literal["text-delta"]
165
+ text: str
166
+
167
+ class ReasoningDelta(TypedDict):
168
+ type: Literal["reasoning-delta"]
169
+ reasoning: str
170
+
171
+ class DataDelta(TypedDict):
172
+ type: Literal["data-delta"]
173
+ data: str # Encoded data chunk to append
174
+ encoding: NotRequired[Literal["base64"]] # Defaults to base64 when absent
175
+
176
+ class BlockDeltaFields(TypedDict, extra_items=Any):
177
+ type: str
178
+
179
+ class BlockDelta(TypedDict):
180
+ type: Literal["block-delta"]
181
+ fields: BlockDeltaFields
182
+
183
+ ContentBlockDelta = Union[TextDelta, ReasoningDelta, DataDelta, BlockDelta]
184
+
185
+ class RunStart(TypedDict):
186
+ method: Literal["run.start"]
187
+ params: RunStartParams
188
+
189
+ class SubscriptionSubscribe(TypedDict):
190
+ method: Literal["subscription.subscribe"]
191
+ params: SubscribeParams
192
+
193
+ class SubscriptionUnsubscribe(TypedDict):
194
+ method: Literal["subscription.unsubscribe"]
195
+ params: UnsubscribeParams
196
+
197
+ class SubscriptionReconnect(TypedDict):
198
+ method: Literal["subscription.reconnect"]
199
+ params: ReconnectParams
200
+
201
+ SubscriptionCommand = Union[SubscriptionSubscribe, SubscriptionUnsubscribe, SubscriptionReconnect]
202
+
203
+ class AgentGetTree(TypedDict):
204
+ method: Literal["agent.getTree"]
205
+ params: AgentGetTreeParams
206
+
207
+ class InputRespond(TypedDict):
208
+ method: Literal["input.respond"]
209
+ params: InputRespondParams
210
+
211
+ class InputInject(TypedDict):
212
+ method: Literal["input.inject"]
213
+ params: InputInjectParams
214
+
215
+ InputCommand = Union[InputRespond, InputInject]
216
+
217
+ class StateGet(TypedDict):
218
+ method: Literal["state.get"]
219
+ params: StateGetParams
220
+
221
+ class StateListCheckpoints(TypedDict):
222
+ method: Literal["state.listCheckpoints"]
223
+ params: ListCheckpointsParams
224
+
225
+ class StateFork(TypedDict):
226
+ method: Literal["state.fork"]
227
+ params: StateForkParams
228
+
229
+ StateCommand = Union[StateGet, StateListCheckpoints, StateFork]
230
+
231
+ class _CommandFields(TypedDict):
232
+ id: JsUint
233
+
234
+ class _CommandVariant1(_CommandFields, SubscriptionSubscribe):
235
+ pass
236
+
237
+ class _CommandVariant2(_CommandFields, SubscriptionUnsubscribe):
238
+ pass
239
+
240
+ class _CommandVariant3(_CommandFields, SubscriptionReconnect):
241
+ pass
242
+
243
+ class _CommandVariant5(_CommandFields, InputRespond):
244
+ pass
245
+
246
+ class _CommandVariant6(_CommandFields, InputInject):
247
+ pass
248
+
249
+ class _CommandVariant7(_CommandFields, StateGet):
250
+ pass
251
+
252
+ class _CommandVariant8(_CommandFields, StateListCheckpoints):
253
+ pass
254
+
255
+ class _CommandVariant9(_CommandFields, StateFork):
256
+ pass
257
+
258
+ class CommandResponse(TypedDict):
259
+ type: Literal["success"]
260
+ id: JsUint
261
+ result: ResultData
262
+ meta: NotRequired[ResponseMeta]
263
+
264
+ class ErrorResponse(TypedDict):
265
+ type: Literal["error"]
266
+ id: Union[JsUint, None]
267
+ error: ErrorCode
268
+ message: str
269
+ stacktrace: NotRequired[str]
270
+ meta: NotRequired[ResponseMeta]
271
+
272
+ class LifecycleEvent(TypedDict):
273
+ method: Literal["lifecycle"]
274
+ params: dict[str, Any]
275
+
276
+ class MessagesEvent(TypedDict):
277
+ method: Literal["messages"]
278
+ params: dict[str, Any]
279
+
280
+ class ToolsEvent(TypedDict):
281
+ method: Literal["tools"]
282
+ params: dict[str, Any]
283
+
284
+ class InputEvent(TypedDict):
285
+ method: Literal["input.requested"]
286
+ params: dict[str, Any]
287
+
288
+ class ValuesEvent(TypedDict):
289
+ method: Literal["values"]
290
+ params: dict[str, Any]
291
+
292
+ class UpdatesEvent(TypedDict):
293
+ method: Literal["updates"]
294
+ params: dict[str, Any]
295
+
296
+ class CheckpointsEvent(TypedDict):
297
+ method: Literal["checkpoints"]
298
+ params: dict[str, Any]
299
+
300
+ class CustomEvent(TypedDict):
301
+ method: Literal["custom"]
302
+ params: dict[str, Any]
303
+
304
+ class TasksEvent(TypedDict):
305
+ method: Literal["tasks"]
306
+ params: dict[str, Any]
307
+
308
+ EventData = Union[LifecycleEvent, MessagesEvent, ToolsEvent, InputEvent, ValuesEvent, UpdatesEvent, CheckpointsEvent, CustomEvent, TasksEvent]
309
+
310
+ class _EventFields(TypedDict):
311
+ type: Literal["event"]
312
+ event_id: NotRequired[str] # Unique ID for reconnection (maps to SSE id:)
313
+ seq: NotRequired[JsUint] # Monotonic sequence number for ordering
314
+
315
+ class _EventVariant0(_EventFields, LifecycleEvent):
316
+ pass
317
+
318
+ class _EventVariant1(_EventFields, MessagesEvent):
319
+ pass
320
+
321
+ class _EventVariant2(_EventFields, ToolsEvent):
322
+ pass
323
+
324
+ class _EventVariant3(_EventFields, InputEvent):
325
+ pass
326
+
327
+ class _EventVariant4(_EventFields, ValuesEvent):
328
+ pass
329
+
330
+ class _EventVariant5(_EventFields, UpdatesEvent):
331
+ pass
332
+
333
+ class _EventVariant6(_EventFields, CheckpointsEvent):
334
+ pass
335
+
336
+ class _EventVariant7(_EventFields, CustomEvent):
337
+ pass
338
+
339
+ class _EventVariant8(_EventFields, TasksEvent):
340
+ pass
341
+
342
+ Event = Union[_EventVariant0, _EventVariant1, _EventVariant2, _EventVariant3, _EventVariant4, _EventVariant5, _EventVariant6, _EventVariant7, _EventVariant8]
343
+
344
+ Message = Union[CommandResponse, ErrorResponse, Event]
345
+
346
+ class RunResult(TypedDict):
347
+ run_id: NotRequired[str] # ID of the started or resumed run
348
+
349
+ class SubscribeResult(TypedDict):
350
+ subscription_id: str
351
+ replayed_events: NotRequired[int] # Events replayed from buffer
352
+
353
+ class ReconnectResult(TypedDict):
354
+ restored: bool
355
+ missed_events: NotRequired[int]
356
+ current_namespaces: NotRequired[list[AgentStatusEntry]]
357
+
358
+ class EmptyResult(TypedDict):
359
+ pass
360
+
361
+ class AgentResult(TypedDict):
362
+ tree: AgentTreeNode
363
+
364
+ class StateGetResult(TypedDict):
365
+ values: dict[str, Any]
366
+ checkpoint: NotRequired[CheckpointRef]
367
+
368
+ class ListCheckpointsResult(TypedDict):
369
+ checkpoints: list[CheckpointSummary]
370
+
371
+ class StateForkResult(TypedDict):
372
+ run_id: str
373
+ thread_id: str
374
+
375
+ ErrorCode = Union[Literal["invalid_argument"], Literal["unknown_command"], Literal["unknown_error"], Literal["no_such_run"], Literal["no_such_subscription"], Literal["no_such_namespace"], Literal["no_such_interrupt"], Literal["no_such_checkpoint"], Literal["permission_denied"], Literal["not_supported"]]
376
+
377
+ class ResponseMeta(TypedDict):
378
+ applied_through_seq: NotRequired[JsUint]
379
+
380
+ RunCommand = RunStart
381
+
382
+ class _CommandVariant0(_CommandFields, RunCommand):
383
+ pass
384
+
385
+ class LangSmithTracer(TypedDict):
386
+ project_name: NotRequired[str] # Additional LangSmith project receiving the trace
387
+ example_id: NotRequired[str] # LangSmith dataset example associated with the trace
388
+
389
+ class RunStartParams(TypedDict):
390
+ assistant_id: str # Deployed graph/agent to run
391
+ input: Any # Graph input, resume value, or injected message
392
+ config: NotRequired[dict[str, Any]] # Per-run config overrides
393
+ metadata: NotRequired[dict[str, Any]] # Per-run metadata
394
+ langsmith_tracer: NotRequired[LangSmithTracer] # Optional additional LangSmith trace destination
395
+
396
+ Channel = Union[Literal["values"], Literal["updates"], Literal["messages"], Literal["tools"], Literal["lifecycle"], Literal["input"], Literal["checkpoints"], Literal["tasks"], Literal["custom"], Annotated[str, "custom:.+"]]
397
+
398
+ class EventStreamRequest(TypedDict):
399
+ channels: list[Channel]
400
+ namespaces: NotRequired[list[Namespace]] # Prefix-match these namespace paths
401
+ depth: NotRequired[int] # Max depth below namespace prefix
402
+ since: NotRequired[JsUint] # Replay events after this seq number
403
+
404
+ class SubscribeParams(TypedDict):
405
+ channels: list[Channel]
406
+ namespaces: NotRequired[list[Namespace]] # Prefix-match these namespace paths
407
+ depth: NotRequired[int] # Max depth below namespace prefix
408
+
409
+ class UnsubscribeParams(TypedDict):
410
+ subscription_id: str
411
+
412
+ class ReconnectParams(TypedDict):
413
+ run_id: str
414
+ last_event_id: NotRequired[str] # Last event the client processed
415
+ subscriptions: NotRequired[list[str]] # Subscription IDs to restore
416
+
417
+ class AgentStatusEntry(TypedDict):
418
+ namespace: Namespace
419
+ status: AgentStatus
420
+
421
+ SubscriptionResult = Union[SubscribeResult, ReconnectResult, EmptyResult]
422
+
423
+ AgentCommand = AgentGetTree
424
+
425
+ CommandData = Union[RunCommand, SubscriptionCommand, AgentCommand, InputCommand, StateCommand]
426
+
427
+ class _CommandVariant4(_CommandFields, AgentCommand):
428
+ pass
429
+
430
+ Command = Union[_CommandVariant0, _CommandVariant1, _CommandVariant2, _CommandVariant3, _CommandVariant4, _CommandVariant5, _CommandVariant6, _CommandVariant7, _CommandVariant8, _CommandVariant9]
431
+
432
+ class AgentGetTreeParams(TypedDict):
433
+ run_id: NotRequired[str]
434
+
435
+ class AgentTreeNode(TypedDict):
436
+ namespace: Namespace
437
+ status: AgentStatus
438
+ graph_name: str
439
+ children: NotRequired[list[AgentTreeNode]]
440
+ metadata: NotRequired[dict[str, Any]]
441
+
442
+ AgentStatus = Union[Literal["started"], Literal["running"], Literal["completed"], Literal["failed"], Literal["interrupted"]]
443
+
444
+ class LifecycleCauseToolCall(TypedDict):
445
+ type: Literal["toolCall"] # The `tool_call_id` from the originating `tool-started` event
446
+ tool_call_id: str
447
+
448
+ class LifecycleCauseSend(TypedDict):
449
+ type: Literal["send"] # Name of the parent node that issued the `Send`. Multiple Sends
450
+ from_node: str
451
+
452
+ class LifecycleCauseEdge(TypedDict):
453
+ type: Literal["edge"] # Name of the parent node the edge originated from.
454
+ from_node: str
455
+
456
+ LifecycleCause = Union[LifecycleCauseToolCall, LifecycleCauseSend, LifecycleCauseEdge]
457
+
458
+ class LifecycleData(TypedDict):
459
+ event: AgentStatus
460
+ graph_name: NotRequired[str]
461
+ cause: NotRequired[LifecycleCause] # Causation edge (see LifecycleCause)
462
+ error: NotRequired[str]
463
+ checkpoint: NotRequired[CheckpointRef] # Checkpoint reference for time-travel
464
+
465
+ class MessageStartData(TypedDict):
466
+ event: Literal["message-start"]
467
+ role: MessageRole # Author role for this message
468
+ id: str # Unique ID for this message
469
+ metadata: NotRequired[MessageMetadata] # Concise provider/model metadata for AI messages
470
+
471
+ class ContentBlockStartData(TypedDict):
472
+ event: Literal["content-block-start"]
473
+ index: int # Positional index within the message
474
+ content: ContentBlock
475
+
476
+ class ContentBlockDeltaData(TypedDict):
477
+ event: Literal["content-block-delta"]
478
+ index: int
479
+ delta: ContentBlockDelta
480
+
481
+ class ContentBlockFinishData(TypedDict):
482
+ event: Literal["content-block-finish"]
483
+ index: int
484
+ content: FinalizedContentBlock
485
+
486
+ class MessageFinishData(TypedDict):
487
+ event: Literal["message-finish"]
488
+ usage: NotRequired[UsageInfo] # Token usage for AI-authored messages
489
+
490
+ class MessageErrorData(TypedDict):
491
+ event: Literal["error"]
492
+ message: str
493
+ code: NotRequired[str]
494
+
495
+ MessagesData = Union[MessageStartData, ContentBlockStartData, ContentBlockDeltaData, ContentBlockFinishData, MessageFinishData, MessageErrorData]
496
+
497
+ class InputTokenDetails(TypedDict):
498
+ audio: NotRequired[int]
499
+ cache_creation: NotRequired[int]
500
+ cache_read: NotRequired[int]
501
+
502
+ class OutputTokenDetails(TypedDict):
503
+ audio: NotRequired[int]
504
+ reasoning: NotRequired[int]
505
+
506
+ class UsageInfo(TypedDict):
507
+ input_tokens: NotRequired[int]
508
+ output_tokens: NotRequired[int]
509
+ total_tokens: NotRequired[int]
510
+ input_token_details: NotRequired[InputTokenDetails]
511
+ output_token_details: NotRequired[OutputTokenDetails]
512
+
513
+ class ToolStartedData(TypedDict):
514
+ event: Literal["tool-started"]
515
+ tool_call_id: str
516
+ tool_name: str
517
+ input: NotRequired[Any] # Tool input arguments
518
+
519
+ class ToolOutputDeltaData(TypedDict):
520
+ event: Literal["tool-output-delta"]
521
+ tool_call_id: str
522
+ delta: str
523
+
524
+ class ToolFinishedData(TypedDict):
525
+ event: Literal["tool-finished"]
526
+ tool_call_id: str
527
+ output: Any
528
+
529
+ class ToolErrorData(TypedDict):
530
+ event: Literal["tool-error"]
531
+ tool_call_id: str
532
+ message: str
533
+ code: NotRequired[str]
534
+
535
+ ToolsData = Union[ToolStartedData, ToolOutputDeltaData, ToolFinishedData, ToolErrorData]
536
+
537
+ class InputRespondOne(TypedDict):
538
+ namespace: Namespace
539
+ interrupt_id: str
540
+ response: Any
541
+ update: NotRequired[dict[str, Any]] # State update applied in the same superstep as the resume (CocoGraph Command(update=...))
542
+ goto: NotRequired[Goto] # Directed jump applied in the same superstep as the resume (CocoGraph Command(goto=...))
543
+ config: NotRequired[dict[str, Any]] # Per-run config overrides
544
+ metadata: NotRequired[dict[str, Any]] # Per-run metadata
545
+
546
+ class InputRespondMany(TypedDict):
547
+ responses: list[InputRespondEntry]
548
+ update: NotRequired[dict[str, Any]] # State update applied in the same superstep as the resume (CocoGraph Command(update=...))
549
+ goto: NotRequired[Goto] # Directed jump applied in the same superstep as the resume (CocoGraph Command(goto=...))
550
+ config: NotRequired[dict[str, Any]] # Per-run config overrides
551
+ metadata: NotRequired[dict[str, Any]] # Per-run metadata
552
+
553
+ InputRespondParams = Union[InputRespondOne, InputRespondMany]
554
+
555
+ class RunSend(TypedDict):
556
+ node: str # Target graph node
557
+ input: NotRequired[Any] # Per-send input passed to the node
558
+
559
+ Goto = Union[str, RunSend, list[Union[str, RunSend]]]
560
+
561
+ class InputRespondEntry(TypedDict):
562
+ namespace: Namespace
563
+ interrupt_id: str
564
+ response: Any
565
+
566
+ class InputInjectParams(TypedDict):
567
+ namespace: Namespace
568
+ message: InputMessage
569
+
570
+ class InputMessage(TypedDict):
571
+ role: Union[Literal["user"], Literal["system"]]
572
+ content: str
573
+ name: NotRequired[str]
574
+
575
+ InputResult = EmptyResult
576
+
577
+ class InputRequestedData(TypedDict):
578
+ interrupt_id: str # Correlates this request with input.respond
579
+ payload: Any # Opaque interrupt value from runtime; application-defined shape
580
+
581
+ class StateGetParams(TypedDict):
582
+ namespace: Namespace
583
+ keys: NotRequired[list[str]] # Specific state keys, or omit for all
584
+
585
+ class ListCheckpointsParams(TypedDict):
586
+ namespace: NotRequired[Namespace]
587
+ limit: NotRequired[int]
588
+ before: NotRequired[str] # Cursor for pagination
589
+
590
+ class CheckpointSummary(TypedDict):
591
+ id: str
592
+ timestamp: str # ISO 8601
593
+ step: int
594
+ node_name: NotRequired[str] # Node that produced this checkpoint
595
+ metadata: NotRequired[dict[str, Any]]
596
+
597
+ class CheckpointRef(TypedDict):
598
+ id: str
599
+ ns: NotRequired[str]
600
+
601
+ class StateForkParams(TypedDict):
602
+ checkpoint_id: str
603
+ input: NotRequired[Any] # Input for the forked run
604
+ config: NotRequired[dict[str, Any]] # Config overrides
605
+
606
+ StateResult = Union[StateGetResult, ListCheckpointsResult, StateForkResult, EmptyResult]
607
+
608
+ ResultData = Union[RunResult, SubscriptionResult, AgentResult, InputResult, StateResult, EmptyResult]
609
+
610
+ class Checkpoint(TypedDict):
611
+ id: str # Fork target: pass to state.fork / configurable.checkpoint_id
612
+ parent_id: NotRequired[str] # Parent checkpoint id for tree linkage
613
+ step: int # Superstep number (-1 for first input, 0 for first loop step, ...)
614
+ source: CheckpointSource # Origin of the checkpoint
615
+
616
+ CheckpointSource = Union[Literal["input"], Literal["loop"], Literal["update"], Literal["fork"]]
617
+
618
+ class UpdatesData(TypedDict):
619
+ node: NotRequired[str] # Graph node that produced this update
620
+ values: dict[str, Any] # State delta
621
+
622
+ class CustomData(TypedDict):
623
+ name: NotRequired[str] # Custom event name for dispatch
624
+ payload: Any # User-defined payload
625
+