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.
- coco/__init__.py +3 -0
- coco/agents/__init__.py +9 -0
- coco/agents/_subagent_transformer.py +307 -0
- coco/agents/factory.py +2164 -0
- coco/agents/middleware/__init__.py +100 -0
- coco/agents/middleware/_execution.py +385 -0
- coco/agents/middleware/_redaction.py +454 -0
- coco/agents/middleware/_retry.py +134 -0
- coco/agents/middleware/_trace_policy.py +61 -0
- coco/agents/middleware/context_editing.py +306 -0
- coco/agents/middleware/file_search.py +433 -0
- coco/agents/middleware/human_in_the_loop.py +680 -0
- coco/agents/middleware/internal_call_transformer.py +108 -0
- coco/agents/middleware/model_call_limit.py +267 -0
- coco/agents/middleware/model_fallback.py +417 -0
- coco/agents/middleware/model_retry.py +327 -0
- coco/agents/middleware/pii.py +878 -0
- coco/agents/middleware/provider_tool_search.py +307 -0
- coco/agents/middleware/shell_tool.py +949 -0
- coco/agents/middleware/summarization.py +910 -0
- coco/agents/middleware/todo.py +357 -0
- coco/agents/middleware/tool_call_limit.py +495 -0
- coco/agents/middleware/tool_emulator.py +251 -0
- coco/agents/middleware/tool_error.py +209 -0
- coco/agents/middleware/tool_retry.py +421 -0
- coco/agents/middleware/tool_selection.py +515 -0
- coco/agents/middleware/types.py +2201 -0
- coco/agents/structured_output.py +472 -0
- coco/chat_models/__init__.py +7 -0
- coco/chat_models/base.py +1082 -0
- coco/embeddings/__init__.py +18 -0
- coco/embeddings/base.py +279 -0
- coco/mcp/__init__.py +36 -0
- coco/mcp/adapter.py +245 -0
- coco/mcp/elicitation.py +394 -0
- coco/mcp/tools.py +307 -0
- coco/messages/__init__.py +73 -0
- coco/py.typed +0 -0
- coco/rate_limiters/__init__.py +13 -0
- coco/tools/__init__.py +22 -0
- coco/tools/tool_node.py +20 -0
- coco_anthropic/__init__.py +15 -0
- coco_anthropic/_client_utils.py +81 -0
- coco_anthropic/_compat.py +228 -0
- coco_anthropic/_sdk_compat.py +124 -0
- coco_anthropic/_version.py +3 -0
- coco_anthropic/chat_models.py +3349 -0
- coco_anthropic/data/__init__.py +1 -0
- coco_anthropic/data/_profiles.py +491 -0
- coco_anthropic/data/profile_augmentations.toml +69 -0
- coco_anthropic/experimental.py +140 -0
- coco_anthropic/llms.py +428 -0
- coco_anthropic/middleware/__init__.py +25 -0
- coco_anthropic/middleware/anthropic_tools.py +1197 -0
- coco_anthropic/middleware/bash.py +84 -0
- coco_anthropic/middleware/file_search.py +360 -0
- coco_anthropic/middleware/prompt_caching.py +276 -0
- coco_anthropic/output_parsers.py +93 -0
- coco_anthropic/py.typed +0 -0
- coco_core/__init__.py +20 -0
- coco_core/_api/__init__.py +87 -0
- coco_core/_api/beta_decorator.py +266 -0
- coco_core/_api/deprecation.py +637 -0
- coco_core/_api/internal.py +23 -0
- coco_core/_api/path.py +50 -0
- coco_core/_import_utils.py +41 -0
- coco_core/_protocol.py +625 -0
- coco_core/_security/__init__.py +36 -0
- coco_core/_security/_exceptions.py +9 -0
- coco_core/_security/_policy.py +313 -0
- coco_core/_security/_ssrf_protection.py +155 -0
- coco_core/_security/_transport.py +254 -0
- coco_core/agents.py +258 -0
- coco_core/caches.py +272 -0
- coco_core/callbacks/__init__.py +132 -0
- coco_core/callbacks/base.py +1229 -0
- coco_core/callbacks/file.py +266 -0
- coco_core/callbacks/manager.py +2826 -0
- coco_core/callbacks/stdout.py +123 -0
- coco_core/callbacks/streaming_stdout.py +154 -0
- coco_core/callbacks/usage.py +124 -0
- coco_core/chat_history.py +267 -0
- coco_core/chat_loaders.py +26 -0
- coco_core/chat_sessions.py +19 -0
- coco_core/cross_encoders.py +18 -0
- coco_core/document_loaders/__init__.py +36 -0
- coco_core/document_loaders/base.py +155 -0
- coco_core/document_loaders/blob_loaders.py +38 -0
- coco_core/documents/__init__.py +55 -0
- coco_core/documents/base.py +347 -0
- coco_core/documents/compressor.py +74 -0
- coco_core/documents/transformers.py +79 -0
- coco_core/embeddings/__init__.py +31 -0
- coco_core/embeddings/embeddings.py +78 -0
- coco_core/embeddings/fake.py +129 -0
- coco_core/env.py +22 -0
- coco_core/example_selectors/__init__.py +47 -0
- coco_core/example_selectors/base.py +60 -0
- coco_core/example_selectors/length_based.py +131 -0
- coco_core/example_selectors/semantic_similarity.py +366 -0
- coco_core/exceptions.py +166 -0
- coco_core/globals.py +72 -0
- coco_core/indexing/__init__.py +53 -0
- coco_core/indexing/api.py +954 -0
- coco_core/indexing/base.py +661 -0
- coco_core/indexing/in_memory.py +104 -0
- coco_core/language_models/__init__.py +116 -0
- coco_core/language_models/_compat_bridge.py +844 -0
- coco_core/language_models/_utils.py +343 -0
- coco_core/language_models/base.py +500 -0
- coco_core/language_models/chat_model_stream.py +1525 -0
- coco_core/language_models/chat_models.py +2748 -0
- coco_core/language_models/fake.py +137 -0
- coco_core/language_models/fake_chat_models.py +396 -0
- coco_core/language_models/llms.py +1569 -0
- coco_core/language_models/model_profile.py +183 -0
- coco_core/load/__init__.py +44 -0
- coco_core/load/_validation.py +191 -0
- coco_core/load/dump.py +120 -0
- coco_core/load/load.py +828 -0
- coco_core/load/mapping.py +1097 -0
- coco_core/load/serializable.py +406 -0
- coco_core/messages/__init__.py +198 -0
- coco_core/messages/ai.py +854 -0
- coco_core/messages/base.py +518 -0
- coco_core/messages/block_translators/__init__.py +112 -0
- coco_core/messages/block_translators/anthropic.py +534 -0
- coco_core/messages/block_translators/bedrock.py +108 -0
- coco_core/messages/block_translators/bedrock_converse.py +329 -0
- coco_core/messages/block_translators/coco_v0.py +303 -0
- coco_core/messages/block_translators/google_genai.py +610 -0
- coco_core/messages/block_translators/google_vertexai.py +21 -0
- coco_core/messages/block_translators/groq.py +157 -0
- coco_core/messages/block_translators/openai.py +1089 -0
- coco_core/messages/chat.py +64 -0
- coco_core/messages/content.py +1488 -0
- coco_core/messages/function.py +62 -0
- coco_core/messages/human.py +70 -0
- coco_core/messages/modifier.py +33 -0
- coco_core/messages/system.py +70 -0
- coco_core/messages/tool.py +418 -0
- coco_core/messages/utils.py +2442 -0
- coco_core/output_parsers/__init__.py +101 -0
- coco_core/output_parsers/base.py +361 -0
- coco_core/output_parsers/format_instructions.py +16 -0
- coco_core/output_parsers/json.py +139 -0
- coco_core/output_parsers/list.py +249 -0
- coco_core/output_parsers/openai_functions.py +324 -0
- coco_core/output_parsers/openai_tools.py +383 -0
- coco_core/output_parsers/pydantic.py +141 -0
- coco_core/output_parsers/string.py +63 -0
- coco_core/output_parsers/transform.py +175 -0
- coco_core/output_parsers/xml.py +301 -0
- coco_core/outputs/__init__.py +66 -0
- coco_core/outputs/chat_generation.py +147 -0
- coco_core/outputs/chat_result.py +39 -0
- coco_core/outputs/generation.py +80 -0
- coco_core/outputs/llm_result.py +112 -0
- coco_core/outputs/run_info.py +22 -0
- coco_core/prompt_values.py +161 -0
- coco_core/prompts/__init__.py +101 -0
- coco_core/prompts/base.py +508 -0
- coco_core/prompts/chat.py +1495 -0
- coco_core/prompts/dict.py +177 -0
- coco_core/prompts/few_shot.py +483 -0
- coco_core/prompts/few_shot_with_templates.py +239 -0
- coco_core/prompts/image.py +177 -0
- coco_core/prompts/loading.py +296 -0
- coco_core/prompts/message.py +97 -0
- coco_core/prompts/prompt.py +312 -0
- coco_core/prompts/string.py +399 -0
- coco_core/prompts/structured.py +214 -0
- coco_core/py.typed +0 -0
- coco_core/rate_limiters.py +254 -0
- coco_core/retrievers.py +328 -0
- coco_core/runnables/__init__.py +136 -0
- coco_core/runnables/base.py +6725 -0
- coco_core/runnables/branch.py +457 -0
- coco_core/runnables/config.py +712 -0
- coco_core/runnables/configurable.py +710 -0
- coco_core/runnables/fallbacks.py +663 -0
- coco_core/runnables/graph.py +741 -0
- coco_core/runnables/graph_ascii.py +366 -0
- coco_core/runnables/graph_mermaid.py +503 -0
- coco_core/runnables/graph_png.py +215 -0
- coco_core/runnables/history.py +631 -0
- coco_core/runnables/passthrough.py +849 -0
- coco_core/runnables/retry.py +379 -0
- coco_core/runnables/router.py +239 -0
- coco_core/runnables/schema.py +188 -0
- coco_core/runnables/utils.py +798 -0
- coco_core/stores.py +291 -0
- coco_core/structured_query.py +203 -0
- coco_core/sys_info.py +154 -0
- coco_core/tools/__init__.py +95 -0
- coco_core/tools/base.py +1948 -0
- coco_core/tools/convert.py +497 -0
- coco_core/tools/render.py +67 -0
- coco_core/tools/retriever.py +94 -0
- coco_core/tools/simple.py +208 -0
- coco_core/tools/structured.py +322 -0
- coco_core/tracers/__init__.py +47 -0
- coco_core/tracers/_compat.py +95 -0
- coco_core/tracers/_context.py +337 -0
- coco_core/tracers/_streaming.py +53 -0
- coco_core/tracers/base.py +955 -0
- coco_core/tracers/coco.py +279 -0
- coco_core/tracers/context.py +205 -0
- coco_core/tracers/core.py +766 -0
- coco_core/tracers/event_stream.py +1101 -0
- coco_core/tracers/log_stream.py +765 -0
- coco_core/tracers/memory_stream.py +200 -0
- coco_core/tracers/root_listeners.py +130 -0
- coco_core/tracers/run_collector.py +40 -0
- coco_core/tracers/schemas.py +14 -0
- coco_core/tracers/stdout.py +205 -0
- coco_core/utils/__init__.py +111 -0
- coco_core/utils/_gateway.py +274 -0
- coco_core/utils/_merge.py +218 -0
- coco_core/utils/aiter.py +357 -0
- coco_core/utils/env.py +86 -0
- coco_core/utils/formatting.py +80 -0
- coco_core/utils/function_calling.py +869 -0
- coco_core/utils/html.py +132 -0
- coco_core/utils/image.py +15 -0
- coco_core/utils/input.py +82 -0
- coco_core/utils/interactive_env.py +12 -0
- coco_core/utils/iter.py +229 -0
- coco_core/utils/json.py +230 -0
- coco_core/utils/json_schema.py +273 -0
- coco_core/utils/mustache.py +706 -0
- coco_core/utils/pydantic.py +631 -0
- coco_core/utils/strings.py +69 -0
- coco_core/utils/usage.py +61 -0
- coco_core/utils/utils.py +528 -0
- coco_core/utils/uuid.py +57 -0
- coco_core/vectorstores/__init__.py +53 -0
- coco_core/vectorstores/base.py +1111 -0
- coco_core/vectorstores/in_memory.py +546 -0
- coco_core/vectorstores/utils.py +163 -0
- coco_core/version.py +3 -0
- coco_framework-0.1.0.dist-info/METADATA +184 -0
- coco_framework-0.1.0.dist-info/RECORD +400 -0
- coco_framework-0.1.0.dist-info/WHEEL +4 -0
- coco_framework-0.1.0.dist-info/licenses/LICENSE +24 -0
- coco_framework-0.1.0.dist-info/licenses/NOTICE +15 -0
- coco_graph/_internal/__init__.py +4 -0
- coco_graph/_internal/_cache.py +31 -0
- coco_graph/_internal/_config.py +474 -0
- coco_graph/_internal/_constants.py +140 -0
- coco_graph/_internal/_fields.py +213 -0
- coco_graph/_internal/_future.py +220 -0
- coco_graph/_internal/_pydantic.py +275 -0
- coco_graph/_internal/_queue.py +124 -0
- coco_graph/_internal/_replay.py +90 -0
- coco_graph/_internal/_retry.py +29 -0
- coco_graph/_internal/_runnable.py +969 -0
- coco_graph/_internal/_scratchpad.py +19 -0
- coco_graph/_internal/_serde.py +253 -0
- coco_graph/_internal/_timeout.py +25 -0
- coco_graph/_internal/_typing.py +54 -0
- coco_graph/cache/base/__init__.py +48 -0
- coco_graph/cache/base/py.typed +0 -0
- coco_graph/cache/memory/__init__.py +73 -0
- coco_graph/cache/redis/__init__.py +144 -0
- coco_graph/cache/sqlite/__init__.py +120 -0
- coco_graph/callbacks.py +394 -0
- coco_graph/channels/__init__.py +29 -0
- coco_graph/channels/any_value.py +72 -0
- coco_graph/channels/base.py +121 -0
- coco_graph/channels/binop.py +155 -0
- coco_graph/channels/delta.py +202 -0
- coco_graph/channels/ephemeral_value.py +79 -0
- coco_graph/channels/last_value.py +151 -0
- coco_graph/channels/named_barrier_value.py +167 -0
- coco_graph/channels/topic.py +94 -0
- coco_graph/channels/untracked_value.py +73 -0
- coco_graph/checkpoint/base/__init__.py +861 -0
- coco_graph/checkpoint/base/id.py +109 -0
- coco_graph/checkpoint/base/py.typed +0 -0
- coco_graph/checkpoint/memory/__init__.py +698 -0
- coco_graph/checkpoint/memory/py.typed +0 -0
- coco_graph/checkpoint/postgres/__init__.py +602 -0
- coco_graph/checkpoint/postgres/_ainternal.py +23 -0
- coco_graph/checkpoint/postgres/_internal.py +21 -0
- coco_graph/checkpoint/postgres/aio.py +691 -0
- coco_graph/checkpoint/postgres/base.py +666 -0
- coco_graph/checkpoint/postgres/py.typed +0 -0
- coco_graph/checkpoint/postgres/shallow.py +967 -0
- coco_graph/checkpoint/serde/__init__.py +0 -0
- coco_graph/checkpoint/serde/_msgpack.py +97 -0
- coco_graph/checkpoint/serde/base.py +64 -0
- coco_graph/checkpoint/serde/encrypted.py +80 -0
- coco_graph/checkpoint/serde/event_hooks.py +52 -0
- coco_graph/checkpoint/serde/jsonplus.py +883 -0
- coco_graph/checkpoint/serde/py.typed +0 -0
- coco_graph/checkpoint/serde/types.py +68 -0
- coco_graph/checkpoint/sqlite/__init__.py +645 -0
- coco_graph/checkpoint/sqlite/_delta.py +172 -0
- coco_graph/checkpoint/sqlite/aio.py +738 -0
- coco_graph/checkpoint/sqlite/py.typed +0 -0
- coco_graph/checkpoint/sqlite/utils.py +116 -0
- coco_graph/config.py +196 -0
- coco_graph/constants.py +64 -0
- coco_graph/errors.py +241 -0
- coco_graph/func/__init__.py +620 -0
- coco_graph/graph/__init__.py +12 -0
- coco_graph/graph/_branch.py +225 -0
- coco_graph/graph/_node.py +103 -0
- coco_graph/graph/message.py +437 -0
- coco_graph/graph/state.py +1978 -0
- coco_graph/graph/ui.py +227 -0
- coco_graph/managed/__init__.py +3 -0
- coco_graph/managed/base.py +31 -0
- coco_graph/managed/is_last_step.py +24 -0
- coco_graph/prebuilt/__init__.py +23 -0
- coco_graph/prebuilt/_tool_call_stream.py +117 -0
- coco_graph/prebuilt/_tool_call_transformer.py +165 -0
- coco_graph/prebuilt/chat_agent_executor.py +1015 -0
- coco_graph/prebuilt/interrupt.py +105 -0
- coco_graph/prebuilt/py.typed +0 -0
- coco_graph/prebuilt/tool_node.py +2030 -0
- coco_graph/prebuilt/tool_validator.py +221 -0
- coco_graph/pregel/__init__.py +3 -0
- coco_graph/pregel/_algo.py +1460 -0
- coco_graph/pregel/_call.py +298 -0
- coco_graph/pregel/_checkpoint.py +331 -0
- coco_graph/pregel/_config.py +0 -0
- coco_graph/pregel/_draw.py +294 -0
- coco_graph/pregel/_executor.py +223 -0
- coco_graph/pregel/_io.py +174 -0
- coco_graph/pregel/_log.py +3 -0
- coco_graph/pregel/_loop.py +1988 -0
- coco_graph/pregel/_messages.py +461 -0
- coco_graph/pregel/_read.py +312 -0
- coco_graph/pregel/_retry.py +854 -0
- coco_graph/pregel/_runner.py +941 -0
- coco_graph/pregel/_tools.py +268 -0
- coco_graph/pregel/_utils.py +221 -0
- coco_graph/pregel/_validate.py +120 -0
- coco_graph/pregel/_write.py +192 -0
- coco_graph/pregel/debug.py +302 -0
- coco_graph/pregel/main.py +4364 -0
- coco_graph/pregel/protocol.py +288 -0
- coco_graph/pregel/types.py +38 -0
- coco_graph/py.typed +0 -0
- coco_graph/runtime.py +350 -0
- coco_graph/store/base/__init__.py +1322 -0
- coco_graph/store/base/batch.py +371 -0
- coco_graph/store/base/embed.py +436 -0
- coco_graph/store/base/py.typed +0 -0
- coco_graph/store/memory/__init__.py +592 -0
- coco_graph/store/memory/py.typed +0 -0
- coco_graph/store/postgres/__init__.py +4 -0
- coco_graph/store/postgres/aio.py +592 -0
- coco_graph/store/postgres/base.py +1480 -0
- coco_graph/store/postgres/py.typed +0 -0
- coco_graph/store/sqlite/__init__.py +4 -0
- coco_graph/store/sqlite/aio.py +632 -0
- coco_graph/store/sqlite/base.py +1514 -0
- coco_graph/stream/__init__.py +45 -0
- coco_graph/stream/_convert.py +32 -0
- coco_graph/stream/_mux.py +523 -0
- coco_graph/stream/_types.py +330 -0
- coco_graph/stream/run_stream.py +735 -0
- coco_graph/stream/stream_channel.py +341 -0
- coco_graph/stream/transformers.py +1039 -0
- coco_graph/types.py +1079 -0
- coco_graph/typing.py +48 -0
- coco_graph/utils/__init__.py +1 -0
- coco_graph/utils/config.py +4 -0
- coco_graph/utils/runnable.py +3 -0
- coco_graph/version.py +13 -0
- coco_graph/warnings.py +69 -0
- coco_openai/__init__.py +20 -0
- coco_openai/_compat.py +45 -0
- coco_openai/_version.py +3 -0
- coco_openai/chat_models/__init__.py +6 -0
- coco_openai/chat_models/_client_utils.py +684 -0
- coco_openai/chat_models/_compat.py +525 -0
- coco_openai/chat_models/azure.py +1227 -0
- coco_openai/chat_models/base.py +5654 -0
- coco_openai/chat_models/codex.py +557 -0
- coco_openai/chatgpt_oauth.py +1063 -0
- coco_openai/data/__init__.py +1 -0
- coco_openai/data/_profiles.py +1655 -0
- coco_openai/data/profile_augmentations.toml +127 -0
- coco_openai/embeddings/__init__.py +6 -0
- coco_openai/embeddings/azure.py +240 -0
- coco_openai/embeddings/base.py +820 -0
- coco_openai/llms/__init__.py +6 -0
- coco_openai/llms/azure.py +249 -0
- coco_openai/llms/base.py +919 -0
- coco_openai/middleware/__init__.py +11 -0
- coco_openai/middleware/openai_moderation.py +484 -0
- coco_openai/output_parsers/__init__.py +9 -0
- coco_openai/output_parsers/tools.py +9 -0
- coco_openai/py.typed +0 -0
- coco_openai/tools/__init__.py +5 -0
- 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
|
+
|