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,266 @@
|
|
|
1
|
+
"""Callback handler that writes to a file."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import TYPE_CHECKING, Any, TextIO, cast
|
|
7
|
+
|
|
8
|
+
from typing_extensions import Self, override
|
|
9
|
+
|
|
10
|
+
from coco_core._api import warn_deprecated
|
|
11
|
+
from coco_core.callbacks import BaseCallbackHandler
|
|
12
|
+
from coco_core.utils.input import print_text
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from coco_core.agents import AgentAction, AgentFinish
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
_GLOBAL_DEPRECATION_WARNED = False
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FileCallbackHandler(BaseCallbackHandler):
|
|
22
|
+
"""Callback handler that writes to a file.
|
|
23
|
+
|
|
24
|
+
This handler supports both context manager usage (recommended) and direct
|
|
25
|
+
instantiation (deprecated) for backwards compatibility.
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
Using as a context manager (recommended):
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
with FileCallbackHandler("output.txt") as handler:
|
|
32
|
+
# Use handler with your chain/agent
|
|
33
|
+
chain.invoke(inputs, config={"callbacks": [handler]})
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Direct instantiation (deprecated):
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
handler = FileCallbackHandler("output.txt")
|
|
40
|
+
# File remains open until handler is garbage collected
|
|
41
|
+
try:
|
|
42
|
+
chain.invoke(inputs, config={"callbacks": [handler]})
|
|
43
|
+
finally:
|
|
44
|
+
handler.close() # Explicit cleanup recommended
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
filename: The file path to write to.
|
|
49
|
+
mode: The file open mode. Defaults to `'a'` (append).
|
|
50
|
+
color: Default color for text output.
|
|
51
|
+
|
|
52
|
+
!!! note
|
|
53
|
+
|
|
54
|
+
When not used as a context manager, a deprecation warning will be issued on
|
|
55
|
+
first use. The file will be opened immediately in `__init__` and closed in
|
|
56
|
+
`__del__` or when `close()` is called explicitly.
|
|
57
|
+
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def __init__(
|
|
61
|
+
self, filename: str, mode: str = "a", color: str | None = None
|
|
62
|
+
) -> None:
|
|
63
|
+
"""Initialize the file callback handler.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
filename: Path to the output file.
|
|
67
|
+
mode: File open mode (e.g., `'w'`, `'a'`, `'x'`). Defaults to `'a'`.
|
|
68
|
+
color: Default text color for output.
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
self.filename = filename
|
|
72
|
+
self.mode = mode
|
|
73
|
+
self.color = color
|
|
74
|
+
self._file_opened_in_context = False
|
|
75
|
+
self.file: TextIO = cast(
|
|
76
|
+
"TextIO",
|
|
77
|
+
# Open the file in the specified mode with UTF-8 encoding.
|
|
78
|
+
Path(self.filename).open(self.mode, encoding="utf-8"), # noqa: SIM115
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def __enter__(self) -> Self:
|
|
82
|
+
"""Enter the context manager.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
The `FileCallbackHandler` instance.
|
|
86
|
+
|
|
87
|
+
!!! note
|
|
88
|
+
|
|
89
|
+
The file is already opened in `__init__`, so this just marks that the
|
|
90
|
+
handler is being used as a context manager.
|
|
91
|
+
|
|
92
|
+
"""
|
|
93
|
+
self._file_opened_in_context = True
|
|
94
|
+
return self
|
|
95
|
+
|
|
96
|
+
def __exit__(
|
|
97
|
+
self,
|
|
98
|
+
exc_type: type[BaseException] | None,
|
|
99
|
+
exc_val: BaseException | None,
|
|
100
|
+
exc_tb: object,
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Exit the context manager and close the file.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
exc_type: Exception type if an exception occurred.
|
|
106
|
+
exc_val: Exception value if an exception occurred.
|
|
107
|
+
exc_tb: Exception traceback if an exception occurred.
|
|
108
|
+
|
|
109
|
+
"""
|
|
110
|
+
self.close()
|
|
111
|
+
|
|
112
|
+
def __del__(self) -> None:
|
|
113
|
+
"""Destructor to cleanup when done."""
|
|
114
|
+
self.close()
|
|
115
|
+
|
|
116
|
+
def close(self) -> None:
|
|
117
|
+
"""Close the file if it's open.
|
|
118
|
+
|
|
119
|
+
This method is safe to call multiple times and will only close
|
|
120
|
+
the file if it's currently open.
|
|
121
|
+
|
|
122
|
+
"""
|
|
123
|
+
if hasattr(self, "file") and self.file and not self.file.closed:
|
|
124
|
+
self.file.close()
|
|
125
|
+
|
|
126
|
+
def _write(
|
|
127
|
+
self,
|
|
128
|
+
text: str,
|
|
129
|
+
color: str | None = None,
|
|
130
|
+
end: str = "",
|
|
131
|
+
) -> None:
|
|
132
|
+
"""Write text to the file with deprecation warning if needed.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
text: The text to write to the file.
|
|
136
|
+
color: Optional color for the text. Defaults to `self.color`.
|
|
137
|
+
end: String appended after the text.
|
|
138
|
+
|
|
139
|
+
Raises:
|
|
140
|
+
RuntimeError: If the file is closed or not available.
|
|
141
|
+
|
|
142
|
+
"""
|
|
143
|
+
global _GLOBAL_DEPRECATION_WARNED # noqa: PLW0603
|
|
144
|
+
if not self._file_opened_in_context and not _GLOBAL_DEPRECATION_WARNED:
|
|
145
|
+
warn_deprecated(
|
|
146
|
+
since="0.3.67",
|
|
147
|
+
pending=True,
|
|
148
|
+
message=(
|
|
149
|
+
"Using FileCallbackHandler without a context manager is "
|
|
150
|
+
"deprecated. Use 'with FileCallbackHandler(...) as "
|
|
151
|
+
"handler:' instead."
|
|
152
|
+
),
|
|
153
|
+
)
|
|
154
|
+
_GLOBAL_DEPRECATION_WARNED = True
|
|
155
|
+
|
|
156
|
+
if not hasattr(self, "file") or self.file is None or self.file.closed:
|
|
157
|
+
msg = "File is not open. Use FileCallbackHandler as a context manager."
|
|
158
|
+
raise RuntimeError(msg)
|
|
159
|
+
|
|
160
|
+
print_text(text, file=self.file, color=color, end=end)
|
|
161
|
+
|
|
162
|
+
@override
|
|
163
|
+
def on_chain_start(
|
|
164
|
+
self, serialized: dict[str, Any], inputs: dict[str, Any], **kwargs: Any
|
|
165
|
+
) -> None:
|
|
166
|
+
"""Print that we are entering a chain.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
serialized: The serialized chain information.
|
|
170
|
+
inputs: The inputs to the chain.
|
|
171
|
+
**kwargs: Additional keyword arguments that may contain `'name'`.
|
|
172
|
+
|
|
173
|
+
"""
|
|
174
|
+
name = (
|
|
175
|
+
kwargs.get("name")
|
|
176
|
+
or serialized.get("name", serialized.get("id", ["<unknown>"])[-1])
|
|
177
|
+
or "<unknown>"
|
|
178
|
+
)
|
|
179
|
+
self._write(f"\n\n> Entering new {name} chain...", end="\n")
|
|
180
|
+
|
|
181
|
+
@override
|
|
182
|
+
def on_chain_end(self, outputs: dict[str, Any], **kwargs: Any) -> None:
|
|
183
|
+
"""Print that we finished a chain.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
outputs: The outputs of the chain.
|
|
187
|
+
**kwargs: Additional keyword arguments.
|
|
188
|
+
|
|
189
|
+
"""
|
|
190
|
+
self._write("\n> Finished chain.", end="\n")
|
|
191
|
+
|
|
192
|
+
@override
|
|
193
|
+
def on_agent_action(
|
|
194
|
+
self, action: AgentAction, color: str | None = None, **kwargs: Any
|
|
195
|
+
) -> Any:
|
|
196
|
+
"""Handle agent action by writing the action log.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
action: The agent action containing the log to write.
|
|
200
|
+
color: Color override for this specific output.
|
|
201
|
+
|
|
202
|
+
If `None`, uses `self.color`.
|
|
203
|
+
**kwargs: Additional keyword arguments.
|
|
204
|
+
|
|
205
|
+
"""
|
|
206
|
+
self._write(action.log, color=color or self.color)
|
|
207
|
+
|
|
208
|
+
@override
|
|
209
|
+
def on_tool_end(
|
|
210
|
+
self,
|
|
211
|
+
output: str,
|
|
212
|
+
color: str | None = None,
|
|
213
|
+
observation_prefix: str | None = None,
|
|
214
|
+
llm_prefix: str | None = None,
|
|
215
|
+
**kwargs: Any,
|
|
216
|
+
) -> None:
|
|
217
|
+
"""Handle tool end by writing the output with optional prefixes.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
output: The tool output to write.
|
|
221
|
+
color: Color override for this specific output.
|
|
222
|
+
|
|
223
|
+
If `None`, uses `self.color`.
|
|
224
|
+
observation_prefix: Optional prefix to write before the output.
|
|
225
|
+
llm_prefix: Optional prefix to write after the output.
|
|
226
|
+
**kwargs: Additional keyword arguments.
|
|
227
|
+
|
|
228
|
+
"""
|
|
229
|
+
if observation_prefix is not None:
|
|
230
|
+
self._write(f"\n{observation_prefix}")
|
|
231
|
+
self._write(output)
|
|
232
|
+
if llm_prefix is not None:
|
|
233
|
+
self._write(f"\n{llm_prefix}")
|
|
234
|
+
|
|
235
|
+
@override
|
|
236
|
+
def on_text(
|
|
237
|
+
self, text: str, color: str | None = None, end: str = "", **kwargs: Any
|
|
238
|
+
) -> None:
|
|
239
|
+
"""Handle text output.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
text: The text to write.
|
|
243
|
+
color: Color override for this specific output.
|
|
244
|
+
|
|
245
|
+
If `None`, uses `self.color`.
|
|
246
|
+
end: String appended after the text.
|
|
247
|
+
**kwargs: Additional keyword arguments.
|
|
248
|
+
|
|
249
|
+
"""
|
|
250
|
+
self._write(text, color=color or self.color, end=end)
|
|
251
|
+
|
|
252
|
+
@override
|
|
253
|
+
def on_agent_finish(
|
|
254
|
+
self, finish: AgentFinish, color: str | None = None, **kwargs: Any
|
|
255
|
+
) -> None:
|
|
256
|
+
"""Handle agent finish by writing the finish log.
|
|
257
|
+
|
|
258
|
+
Args:
|
|
259
|
+
finish: The agent finish object containing the log to write.
|
|
260
|
+
color: Color override for this specific output.
|
|
261
|
+
|
|
262
|
+
If `None`, uses `self.color`.
|
|
263
|
+
**kwargs: Additional keyword arguments.
|
|
264
|
+
|
|
265
|
+
"""
|
|
266
|
+
self._write(finish.log, color=color or self.color, end="\n")
|