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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Chat result schema."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from coco_core.outputs.chat_generation import ChatGeneration
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ChatResult(BaseModel):
|
|
11
|
+
"""Use to represent the result of a chat model call with a single prompt.
|
|
12
|
+
|
|
13
|
+
This container is used internally by some implementations of chat model, it will
|
|
14
|
+
eventually be mapped to a more general `LLMResult` object, and then projected into
|
|
15
|
+
an `AIMessage` object.
|
|
16
|
+
|
|
17
|
+
Coco users working with chat models will usually access information via
|
|
18
|
+
`AIMessage` (returned from runnable interfaces) or `LLMResult` (available via
|
|
19
|
+
callbacks). Please refer the `AIMessage` and `LLMResult` schema documentation for
|
|
20
|
+
more information.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
generations: list[ChatGeneration]
|
|
24
|
+
"""List of the chat generations.
|
|
25
|
+
|
|
26
|
+
Generations is a list to allow for multiple candidate generations for a single
|
|
27
|
+
input prompt.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
llm_output: dict[str, Any] | None = None
|
|
31
|
+
"""For arbitrary model provider-specific output.
|
|
32
|
+
|
|
33
|
+
This dictionary is a free-form dictionary that can contain any information that the
|
|
34
|
+
provider wants to return. It is not standardized and keys may vary by provider and
|
|
35
|
+
over time.
|
|
36
|
+
|
|
37
|
+
Users should generally avoid relying on this field and instead rely on accessing
|
|
38
|
+
relevant information from standardized fields present in `AIMessage`.
|
|
39
|
+
"""
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Generation output schema."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
|
|
7
|
+
from coco_core.load import Serializable
|
|
8
|
+
from coco_core.utils._merge import merge_dicts
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Generation(Serializable):
|
|
12
|
+
"""A single text generation output.
|
|
13
|
+
|
|
14
|
+
Generation represents the response from an "old-fashioned" LLM (string-in,
|
|
15
|
+
string-out) that generates regular text (not chat messages).
|
|
16
|
+
|
|
17
|
+
This model is used internally by chat model and will eventually be mapped to a more
|
|
18
|
+
general `LLMResult` object, and then projected into an `AIMessage` object.
|
|
19
|
+
|
|
20
|
+
Coco users working with chat models will usually access information via
|
|
21
|
+
`AIMessage` (returned from runnable interfaces) or `LLMResult` (available via
|
|
22
|
+
callbacks). Please refer to `AIMessage` and `LLMResult` for more information.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
text: str
|
|
26
|
+
"""Generated text output."""
|
|
27
|
+
|
|
28
|
+
generation_info: dict[str, Any] | None = None
|
|
29
|
+
"""Raw response from the provider.
|
|
30
|
+
|
|
31
|
+
May include things like the reason for finishing or token log probabilities.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
type: Literal["Generation"] = "Generation"
|
|
35
|
+
"""Type is used exclusively for serialization purposes.
|
|
36
|
+
|
|
37
|
+
Set to `'Generation'` for this class.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def is_lc_serializable(cls) -> bool:
|
|
42
|
+
"""Return `True` as this class is serializable."""
|
|
43
|
+
return True
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def get_lc_namespace(cls) -> list[str]:
|
|
47
|
+
"""Get the namespace of the Coco object.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
`["coco", "schema", "output"]`
|
|
51
|
+
"""
|
|
52
|
+
return ["coco", "schema", "output"]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class GenerationChunk(Generation):
|
|
56
|
+
"""`GenerationChunk`, which can be concatenated with other `Generation` chunks."""
|
|
57
|
+
|
|
58
|
+
def __add__(self, other: GenerationChunk) -> GenerationChunk:
|
|
59
|
+
"""Concatenate two `GenerationChunk` objects.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
other: Another `GenerationChunk` to concatenate with.
|
|
63
|
+
|
|
64
|
+
Raises:
|
|
65
|
+
TypeError: If other is not a `GenerationChunk`.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
A new `GenerationChunk` concatenated from self and other.
|
|
69
|
+
"""
|
|
70
|
+
if isinstance(other, GenerationChunk):
|
|
71
|
+
generation_info = merge_dicts(
|
|
72
|
+
self.generation_info or {},
|
|
73
|
+
other.generation_info or {},
|
|
74
|
+
)
|
|
75
|
+
return GenerationChunk(
|
|
76
|
+
text=self.text + other.text,
|
|
77
|
+
generation_info=generation_info or None,
|
|
78
|
+
)
|
|
79
|
+
msg = f"unsupported operand type(s) for +: '{type(self)}' and '{type(other)}'" # type: ignore[unreachable]
|
|
80
|
+
raise TypeError(msg)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""`LLMResult` class."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from copy import deepcopy
|
|
6
|
+
from typing import Any, Literal
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from coco_core.outputs.chat_generation import ChatGeneration, ChatGenerationChunk
|
|
11
|
+
from coco_core.outputs.generation import Generation, GenerationChunk
|
|
12
|
+
from coco_core.outputs.run_info import RunInfo
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LLMResult(BaseModel):
|
|
16
|
+
"""A container for results of an LLM call.
|
|
17
|
+
|
|
18
|
+
Both chat models and LLMs generate an `LLMResult` object. This object contains the
|
|
19
|
+
generated outputs and any additional information that the model provider wants to
|
|
20
|
+
return.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
generations: list[
|
|
24
|
+
list[Generation | ChatGeneration | GenerationChunk | ChatGenerationChunk]
|
|
25
|
+
]
|
|
26
|
+
"""Generated outputs.
|
|
27
|
+
|
|
28
|
+
The first dimension of the list represents completions for different input prompts.
|
|
29
|
+
|
|
30
|
+
The second dimension of the list represents different candidate generations for a
|
|
31
|
+
given prompt.
|
|
32
|
+
|
|
33
|
+
- When returned from **an LLM**, the type is `list[list[Generation]]`.
|
|
34
|
+
- When returned from a **chat model**, the type is `list[list[ChatGeneration]]`.
|
|
35
|
+
|
|
36
|
+
`ChatGeneration` is a subclass of `Generation` that has a field for a structured
|
|
37
|
+
chat message.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
llm_output: dict[str, Any] | None = None
|
|
41
|
+
"""For arbitrary model provider-specific output.
|
|
42
|
+
|
|
43
|
+
This dictionary is a free-form dictionary that can contain any information that the
|
|
44
|
+
provider wants to return. It is not standardized and keys may vary by provider and
|
|
45
|
+
over time.
|
|
46
|
+
|
|
47
|
+
Users should generally avoid relying on this field and instead rely on accessing
|
|
48
|
+
relevant information from standardized fields present in AIMessage.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
run: list[RunInfo] | None = None
|
|
52
|
+
"""List of metadata info for model call for each input.
|
|
53
|
+
|
|
54
|
+
See `coco_core.outputs.run_info.RunInfo` for details.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
type: Literal["LLMResult"] = "LLMResult"
|
|
58
|
+
"""Type is used exclusively for serialization purposes."""
|
|
59
|
+
|
|
60
|
+
def flatten(self) -> list[LLMResult]:
|
|
61
|
+
"""Flatten generations into a single list.
|
|
62
|
+
|
|
63
|
+
Unpack `list[list[Generation]] -> list[LLMResult]` where each returned
|
|
64
|
+
`LLMResult` contains only a single `Generation`. If token usage information is
|
|
65
|
+
available, it is kept only for the `LLMResult` corresponding to the top-choice
|
|
66
|
+
`Generation`, to avoid over-counting of token usage downstream.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
List of `LLMResult` objects where each returned `LLMResult` contains a
|
|
70
|
+
single `Generation`.
|
|
71
|
+
"""
|
|
72
|
+
llm_results = []
|
|
73
|
+
for i, gen_list in enumerate(self.generations):
|
|
74
|
+
# Avoid double counting tokens in OpenAICallback
|
|
75
|
+
if i == 0:
|
|
76
|
+
llm_results.append(
|
|
77
|
+
LLMResult(
|
|
78
|
+
generations=[gen_list],
|
|
79
|
+
llm_output=self.llm_output,
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
else:
|
|
83
|
+
if self.llm_output is not None:
|
|
84
|
+
llm_output = deepcopy(self.llm_output)
|
|
85
|
+
llm_output["token_usage"] = {}
|
|
86
|
+
else:
|
|
87
|
+
llm_output = None
|
|
88
|
+
llm_results.append(
|
|
89
|
+
LLMResult(
|
|
90
|
+
generations=[gen_list],
|
|
91
|
+
llm_output=llm_output,
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
return llm_results
|
|
95
|
+
|
|
96
|
+
def __eq__(self, other: object) -> bool:
|
|
97
|
+
"""Check for `LLMResult` equality by ignoring any metadata related to runs.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
other: Another `LLMResult` object to compare against.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
`True` if the generations and `llm_output` are equal, `False` otherwise.
|
|
104
|
+
"""
|
|
105
|
+
if not isinstance(other, LLMResult):
|
|
106
|
+
return NotImplemented
|
|
107
|
+
return (
|
|
108
|
+
self.generations == other.generations
|
|
109
|
+
and self.llm_output == other.llm_output
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
__hash__ = None # type: ignore[assignment]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""`RunInfo` class."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from uuid import UUID
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunInfo(BaseModel):
|
|
11
|
+
"""Class that contains metadata for a single execution of a chain or model.
|
|
12
|
+
|
|
13
|
+
Defined for backwards compatibility with older versions of `coco_core`.
|
|
14
|
+
|
|
15
|
+
!!! warning "This model will likely be deprecated in the future."
|
|
16
|
+
|
|
17
|
+
Users can acquire the `run_id` information from callbacks or via `run_id`
|
|
18
|
+
information present in the `astream_event` API (depending on the use case).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
run_id: UUID
|
|
22
|
+
"""A unique identifier for the model or chain run."""
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""**Prompt values** for language model prompts.
|
|
2
|
+
|
|
3
|
+
Prompt values are used to represent different pieces of prompts. They can be used to
|
|
4
|
+
represent text, images, or chat message pieces.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from collections.abc import Sequence
|
|
11
|
+
from typing import Any, Literal, cast
|
|
12
|
+
|
|
13
|
+
from typing_extensions import TypedDict
|
|
14
|
+
|
|
15
|
+
from coco_core.load.serializable import Serializable
|
|
16
|
+
from coco_core.messages import (
|
|
17
|
+
AnyMessage,
|
|
18
|
+
BaseMessage,
|
|
19
|
+
HumanMessage,
|
|
20
|
+
get_buffer_string,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class PromptValue(Serializable, ABC):
|
|
25
|
+
"""Base abstract class for inputs to any language model.
|
|
26
|
+
|
|
27
|
+
`PromptValues` can be converted to both LLM (pure text-generation) inputs and
|
|
28
|
+
chat model inputs.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def is_lc_serializable(cls) -> bool:
|
|
33
|
+
"""Return `True` as this class is serializable."""
|
|
34
|
+
return True
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def get_lc_namespace(cls) -> list[str]:
|
|
38
|
+
"""Get the namespace of the Coco object.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
`["coco", "schema", "prompt"]`
|
|
42
|
+
"""
|
|
43
|
+
return ["coco", "schema", "prompt"]
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def to_string(self) -> str:
|
|
47
|
+
"""Return prompt value as string."""
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def to_messages(self) -> list[BaseMessage]:
|
|
51
|
+
"""Return prompt as a list of messages."""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class StringPromptValue(PromptValue):
|
|
55
|
+
"""String prompt value."""
|
|
56
|
+
|
|
57
|
+
text: str
|
|
58
|
+
"""Prompt text."""
|
|
59
|
+
|
|
60
|
+
type: Literal["StringPromptValue"] = "StringPromptValue"
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def get_lc_namespace(cls) -> list[str]:
|
|
64
|
+
"""Get the namespace of the Coco object.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
`["coco", "prompts", "base"]`
|
|
68
|
+
"""
|
|
69
|
+
return ["coco", "prompts", "base"]
|
|
70
|
+
|
|
71
|
+
def to_string(self) -> str:
|
|
72
|
+
"""Return prompt as string."""
|
|
73
|
+
return self.text
|
|
74
|
+
|
|
75
|
+
def to_messages(self) -> list[BaseMessage]:
|
|
76
|
+
"""Return prompt as messages."""
|
|
77
|
+
return [HumanMessage(content=self.text)]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class ChatPromptValue(PromptValue):
|
|
81
|
+
"""Chat prompt value.
|
|
82
|
+
|
|
83
|
+
A type of a prompt value that is built from messages.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
messages: Sequence[BaseMessage]
|
|
87
|
+
"""List of messages."""
|
|
88
|
+
|
|
89
|
+
def to_string(self) -> str:
|
|
90
|
+
"""Return prompt as string."""
|
|
91
|
+
return get_buffer_string(self.messages)
|
|
92
|
+
|
|
93
|
+
def to_messages(self) -> list[BaseMessage]:
|
|
94
|
+
"""Return prompt as a list of messages."""
|
|
95
|
+
return list(self.messages)
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def get_lc_namespace(cls) -> list[str]:
|
|
99
|
+
"""Get the namespace of the Coco object.
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
`["coco", "prompts", "chat"]`
|
|
103
|
+
"""
|
|
104
|
+
return ["coco", "prompts", "chat"]
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class ImageURL(TypedDict, total=False):
|
|
108
|
+
"""Image URL for multimodal model inputs (OpenAI format).
|
|
109
|
+
|
|
110
|
+
Represents the inner `image_url` object in OpenAI's Chat Completion API format. This
|
|
111
|
+
is used by `ImagePromptTemplate` and `ChatPromptTemplate`.
|
|
112
|
+
|
|
113
|
+
See Also:
|
|
114
|
+
`ImageContentBlock`: Coco's provider-agnostic image format used in message
|
|
115
|
+
content blocks. Use `ImageContentBlock` when working with the standardized
|
|
116
|
+
message format across different providers.
|
|
117
|
+
|
|
118
|
+
Note:
|
|
119
|
+
The `detail` field values are not validated locally. Invalid values
|
|
120
|
+
will be rejected by the downstream API, allowing new valid values to
|
|
121
|
+
be used without requiring a Coco update.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
detail: Literal["auto", "low", "high"]
|
|
125
|
+
"""Specifies the detail level of the image.
|
|
126
|
+
|
|
127
|
+
Defaults to ``'auto'`` if not specified. Higher detail levels consume
|
|
128
|
+
more tokens but provide better image understanding.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
url: str
|
|
132
|
+
"""URL of the image or base64-encoded image data."""
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class ImagePromptValue(PromptValue):
|
|
136
|
+
"""Image prompt value."""
|
|
137
|
+
|
|
138
|
+
image_url: ImageURL
|
|
139
|
+
"""Image URL."""
|
|
140
|
+
|
|
141
|
+
type: Literal["ImagePromptValue"] = "ImagePromptValue"
|
|
142
|
+
|
|
143
|
+
def to_string(self) -> str:
|
|
144
|
+
"""Return prompt (image URL) as string."""
|
|
145
|
+
return self.image_url.get("url", "")
|
|
146
|
+
|
|
147
|
+
def to_messages(self) -> list[BaseMessage]:
|
|
148
|
+
"""Return prompt (image URL) as messages."""
|
|
149
|
+
return [HumanMessage(content=[cast("dict[str, Any]", self.image_url)])]
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class ChatPromptValueConcrete(ChatPromptValue):
|
|
153
|
+
"""Chat prompt value which explicitly lists out the message types it accepts.
|
|
154
|
+
|
|
155
|
+
For use in external schemas.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
messages: Sequence[AnyMessage]
|
|
159
|
+
"""Sequence of messages."""
|
|
160
|
+
|
|
161
|
+
type: Literal["ChatPromptValueConcrete"] = "ChatPromptValueConcrete"
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""A prompt is the input to the model.
|
|
2
|
+
|
|
3
|
+
Prompt is often constructed from multiple components and prompt values. Prompt classes
|
|
4
|
+
and functions make constructing and working with prompts easy.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
from coco_core._import_utils import import_attr
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from coco_core.prompts.base import (
|
|
13
|
+
BasePromptTemplate,
|
|
14
|
+
aformat_document,
|
|
15
|
+
format_document,
|
|
16
|
+
)
|
|
17
|
+
from coco_core.prompts.chat import (
|
|
18
|
+
AIMessagePromptTemplate,
|
|
19
|
+
BaseChatPromptTemplate,
|
|
20
|
+
ChatMessagePromptTemplate,
|
|
21
|
+
ChatPromptTemplate,
|
|
22
|
+
HumanMessagePromptTemplate,
|
|
23
|
+
MessagesPlaceholder,
|
|
24
|
+
SystemMessagePromptTemplate,
|
|
25
|
+
)
|
|
26
|
+
from coco_core.prompts.dict import DictPromptTemplate
|
|
27
|
+
from coco_core.prompts.few_shot import (
|
|
28
|
+
FewShotChatMessagePromptTemplate,
|
|
29
|
+
FewShotPromptTemplate,
|
|
30
|
+
)
|
|
31
|
+
from coco_core.prompts.few_shot_with_templates import (
|
|
32
|
+
FewShotPromptWithTemplates,
|
|
33
|
+
)
|
|
34
|
+
from coco_core.prompts.loading import load_prompt
|
|
35
|
+
from coco_core.prompts.prompt import PromptTemplate
|
|
36
|
+
from coco_core.prompts.string import (
|
|
37
|
+
StringPromptTemplate,
|
|
38
|
+
check_valid_template,
|
|
39
|
+
get_template_variables,
|
|
40
|
+
jinja2_formatter,
|
|
41
|
+
validate_jinja2,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
__all__ = (
|
|
45
|
+
"AIMessagePromptTemplate",
|
|
46
|
+
"BaseChatPromptTemplate",
|
|
47
|
+
"BasePromptTemplate",
|
|
48
|
+
"ChatMessagePromptTemplate",
|
|
49
|
+
"ChatPromptTemplate",
|
|
50
|
+
"DictPromptTemplate",
|
|
51
|
+
"FewShotChatMessagePromptTemplate",
|
|
52
|
+
"FewShotPromptTemplate",
|
|
53
|
+
"FewShotPromptWithTemplates",
|
|
54
|
+
"HumanMessagePromptTemplate",
|
|
55
|
+
"MessagesPlaceholder",
|
|
56
|
+
"PromptTemplate",
|
|
57
|
+
"StringPromptTemplate",
|
|
58
|
+
"SystemMessagePromptTemplate",
|
|
59
|
+
"aformat_document",
|
|
60
|
+
"check_valid_template",
|
|
61
|
+
"format_document",
|
|
62
|
+
"get_template_variables",
|
|
63
|
+
"jinja2_formatter",
|
|
64
|
+
"load_prompt",
|
|
65
|
+
"validate_jinja2",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
_dynamic_imports = {
|
|
69
|
+
"BasePromptTemplate": "base",
|
|
70
|
+
"format_document": "base",
|
|
71
|
+
"aformat_document": "base",
|
|
72
|
+
"AIMessagePromptTemplate": "chat",
|
|
73
|
+
"BaseChatPromptTemplate": "chat",
|
|
74
|
+
"ChatMessagePromptTemplate": "chat",
|
|
75
|
+
"ChatPromptTemplate": "chat",
|
|
76
|
+
"DictPromptTemplate": "dict",
|
|
77
|
+
"HumanMessagePromptTemplate": "chat",
|
|
78
|
+
"MessagesPlaceholder": "chat",
|
|
79
|
+
"SystemMessagePromptTemplate": "chat",
|
|
80
|
+
"FewShotChatMessagePromptTemplate": "few_shot",
|
|
81
|
+
"FewShotPromptTemplate": "few_shot",
|
|
82
|
+
"FewShotPromptWithTemplates": "few_shot_with_templates",
|
|
83
|
+
"load_prompt": "loading",
|
|
84
|
+
"PromptTemplate": "prompt",
|
|
85
|
+
"StringPromptTemplate": "string",
|
|
86
|
+
"check_valid_template": "string",
|
|
87
|
+
"get_template_variables": "string",
|
|
88
|
+
"jinja2_formatter": "string",
|
|
89
|
+
"validate_jinja2": "string",
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def __getattr__(attr_name: str) -> object:
|
|
94
|
+
module_name = _dynamic_imports.get(attr_name)
|
|
95
|
+
result = import_attr(attr_name, module_name, __spec__.parent)
|
|
96
|
+
globals()[attr_name] = result
|
|
97
|
+
return result
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def __dir__() -> list[str]:
|
|
101
|
+
return list(__all__)
|