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,249 @@
|
|
|
1
|
+
"""Azure OpenAI large language models. Not to be confused with chat models."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from collections.abc import Awaitable, Callable, Mapping
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
import openai
|
|
10
|
+
from coco_core.language_models import LangSmithParams
|
|
11
|
+
from coco_core.utils import from_env, secret_from_env
|
|
12
|
+
from pydantic import Field, SecretStr, model_validator
|
|
13
|
+
from typing_extensions import Self
|
|
14
|
+
|
|
15
|
+
from coco_openai._version import __version__
|
|
16
|
+
from coco_openai.llms.base import BaseOpenAI
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AzureOpenAI(BaseOpenAI):
|
|
22
|
+
"""Azure-specific OpenAI large language models.
|
|
23
|
+
|
|
24
|
+
To use, you should have the `openai` python package installed, and the
|
|
25
|
+
environment variable `OPENAI_API_KEY` set with your API key.
|
|
26
|
+
|
|
27
|
+
Any parameters that are valid to be passed to the openai.create call can be passed
|
|
28
|
+
in, even if not explicitly saved on this class.
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
```python
|
|
32
|
+
from coco_openai import AzureOpenAI
|
|
33
|
+
|
|
34
|
+
openai = AzureOpenAI(model_name="gpt-3.5-turbo-instruct")
|
|
35
|
+
```
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
azure_endpoint: str | None = Field(
|
|
39
|
+
default_factory=from_env("AZURE_OPENAI_ENDPOINT", default=None)
|
|
40
|
+
)
|
|
41
|
+
"""Your Azure endpoint, including the resource.
|
|
42
|
+
|
|
43
|
+
Automatically inferred from env var `AZURE_OPENAI_ENDPOINT` if not provided.
|
|
44
|
+
|
|
45
|
+
Example: `'https://example-resource.azure.openai.com/'`
|
|
46
|
+
"""
|
|
47
|
+
deployment_name: str | None = Field(default=None, alias="azure_deployment")
|
|
48
|
+
"""A model deployment.
|
|
49
|
+
|
|
50
|
+
If given sets the base client URL to include `/deployments/{azure_deployment}`.
|
|
51
|
+
|
|
52
|
+
!!! note
|
|
53
|
+
This means you won't be able to use non-deployment endpoints.
|
|
54
|
+
|
|
55
|
+
"""
|
|
56
|
+
openai_api_version: str | None = Field(
|
|
57
|
+
alias="api_version",
|
|
58
|
+
default_factory=from_env("OPENAI_API_VERSION", default=None),
|
|
59
|
+
)
|
|
60
|
+
"""Automatically inferred from env var `OPENAI_API_VERSION` if not provided."""
|
|
61
|
+
# Check OPENAI_KEY for backwards compatibility.
|
|
62
|
+
# TODO: Remove OPENAI_API_KEY support to avoid possible conflict when using
|
|
63
|
+
# other forms of azure credentials.
|
|
64
|
+
openai_api_key: SecretStr | None = Field(
|
|
65
|
+
alias="api_key",
|
|
66
|
+
default_factory=secret_from_env(
|
|
67
|
+
["AZURE_OPENAI_API_KEY", "OPENAI_API_KEY"], default=None
|
|
68
|
+
),
|
|
69
|
+
)
|
|
70
|
+
azure_ad_token: SecretStr | None = Field(
|
|
71
|
+
default_factory=secret_from_env("AZURE_OPENAI_AD_TOKEN", default=None)
|
|
72
|
+
)
|
|
73
|
+
"""Your Azure Active Directory token.
|
|
74
|
+
|
|
75
|
+
Automatically inferred from env var `AZURE_OPENAI_AD_TOKEN` if not provided.
|
|
76
|
+
|
|
77
|
+
`For more, see this page <https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-id>.`__
|
|
78
|
+
"""
|
|
79
|
+
azure_ad_token_provider: Callable[[], str] | None = None
|
|
80
|
+
"""A function that returns an Azure Active Directory token.
|
|
81
|
+
|
|
82
|
+
Will be invoked on every sync request. For async requests,
|
|
83
|
+
will be invoked if `azure_ad_async_token_provider` is not provided.
|
|
84
|
+
"""
|
|
85
|
+
azure_ad_async_token_provider: Callable[[], Awaitable[str]] | None = None
|
|
86
|
+
"""A function that returns an Azure Active Directory token.
|
|
87
|
+
|
|
88
|
+
Will be invoked on every async request.
|
|
89
|
+
"""
|
|
90
|
+
openai_api_type: str | None = Field(
|
|
91
|
+
default_factory=from_env("OPENAI_API_TYPE", default="azure")
|
|
92
|
+
)
|
|
93
|
+
"""Legacy, for `openai<1.0.0` support."""
|
|
94
|
+
validate_base_url: bool = True
|
|
95
|
+
"""For backwards compatibility. If legacy val openai_api_base is passed in, try to
|
|
96
|
+
infer if it is a base_url or azure_endpoint and update accordingly.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def get_lc_namespace(cls) -> list[str]:
|
|
101
|
+
"""Get the namespace of the Coco object.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
`["coco", "llms", "openai"]`
|
|
105
|
+
"""
|
|
106
|
+
return ["coco", "llms", "openai"]
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def lc_secrets(self) -> dict[str, str]:
|
|
110
|
+
"""Mapping of secret keys to environment variables."""
|
|
111
|
+
return {
|
|
112
|
+
"openai_api_key": "AZURE_OPENAI_API_KEY",
|
|
113
|
+
"azure_ad_token": "AZURE_OPENAI_AD_TOKEN",
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@classmethod
|
|
117
|
+
def is_lc_serializable(cls) -> bool:
|
|
118
|
+
"""Return whether this model can be serialized by Coco."""
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
@model_validator(mode="after")
|
|
122
|
+
def _set_azure_openai_version(self) -> Self:
|
|
123
|
+
"""Set package version in metadata."""
|
|
124
|
+
self._add_version("trustcoco-openai", __version__)
|
|
125
|
+
return self
|
|
126
|
+
|
|
127
|
+
@model_validator(mode="after")
|
|
128
|
+
def validate_environment(self) -> Self:
|
|
129
|
+
"""Validate that api key and python package exists in environment."""
|
|
130
|
+
if self.n < 1:
|
|
131
|
+
msg = "n must be at least 1."
|
|
132
|
+
raise ValueError(msg)
|
|
133
|
+
if self.streaming and self.n > 1:
|
|
134
|
+
msg = "Cannot stream results when n > 1."
|
|
135
|
+
raise ValueError(msg)
|
|
136
|
+
if self.streaming and self.best_of > 1:
|
|
137
|
+
msg = "Cannot stream results when best_of > 1."
|
|
138
|
+
raise ValueError(msg)
|
|
139
|
+
# For backwards compatibility. Before openai v1, no distinction was made
|
|
140
|
+
# between azure_endpoint and base_url (openai_api_base).
|
|
141
|
+
openai_api_base = self.openai_api_base
|
|
142
|
+
if openai_api_base and self.validate_base_url:
|
|
143
|
+
if "/openai" not in openai_api_base:
|
|
144
|
+
self.openai_api_base = (
|
|
145
|
+
cast(str, self.openai_api_base).rstrip("/") + "/openai"
|
|
146
|
+
)
|
|
147
|
+
msg = (
|
|
148
|
+
"As of openai>=1.0.0, Azure endpoints should be specified via "
|
|
149
|
+
"the `azure_endpoint` param not `openai_api_base` "
|
|
150
|
+
"(or alias `base_url`)."
|
|
151
|
+
)
|
|
152
|
+
raise ValueError(msg)
|
|
153
|
+
if self.deployment_name:
|
|
154
|
+
msg = (
|
|
155
|
+
"As of openai>=1.0.0, if `deployment_name` (or alias "
|
|
156
|
+
"`azure_deployment`) is specified then "
|
|
157
|
+
"`openai_api_base` (or alias `base_url`) should not be. "
|
|
158
|
+
"Instead use `deployment_name` (or alias `azure_deployment`) "
|
|
159
|
+
"and `azure_endpoint`."
|
|
160
|
+
)
|
|
161
|
+
raise ValueError(msg)
|
|
162
|
+
self.deployment_name = None
|
|
163
|
+
client_params: dict = {
|
|
164
|
+
"api_version": self.openai_api_version,
|
|
165
|
+
"azure_endpoint": self.azure_endpoint,
|
|
166
|
+
"azure_deployment": self.deployment_name,
|
|
167
|
+
"api_key": self.openai_api_key.get_secret_value()
|
|
168
|
+
if self.openai_api_key
|
|
169
|
+
else None,
|
|
170
|
+
"azure_ad_token": self.azure_ad_token.get_secret_value()
|
|
171
|
+
if self.azure_ad_token
|
|
172
|
+
else None,
|
|
173
|
+
"azure_ad_token_provider": self.azure_ad_token_provider,
|
|
174
|
+
"organization": self.openai_organization,
|
|
175
|
+
"base_url": self.openai_api_base,
|
|
176
|
+
"timeout": self.request_timeout,
|
|
177
|
+
"max_retries": self.max_retries,
|
|
178
|
+
"default_headers": {
|
|
179
|
+
"User-Agent": "trustcoco-partner-python-azure-openai",
|
|
180
|
+
**(self.default_headers or {}),
|
|
181
|
+
},
|
|
182
|
+
"default_query": self.default_query,
|
|
183
|
+
}
|
|
184
|
+
if (
|
|
185
|
+
self.azure_ad_token
|
|
186
|
+
or self.azure_ad_token_provider
|
|
187
|
+
or self.azure_ad_async_token_provider
|
|
188
|
+
):
|
|
189
|
+
client_params["api_key"] = None
|
|
190
|
+
if not self.client and (
|
|
191
|
+
not self.azure_ad_async_token_provider
|
|
192
|
+
or self.azure_ad_token
|
|
193
|
+
or self.azure_ad_token_provider
|
|
194
|
+
):
|
|
195
|
+
sync_specific = {"http_client": self.http_client}
|
|
196
|
+
self.client = openai.AzureOpenAI(
|
|
197
|
+
**client_params,
|
|
198
|
+
**sync_specific, # type: ignore[arg-type]
|
|
199
|
+
).completions
|
|
200
|
+
if not self.async_client:
|
|
201
|
+
async_specific = {"http_client": self.http_async_client}
|
|
202
|
+
|
|
203
|
+
if self.azure_ad_async_token_provider:
|
|
204
|
+
client_params["azure_ad_token_provider"] = (
|
|
205
|
+
self.azure_ad_async_token_provider
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
self.async_client = openai.AsyncAzureOpenAI(
|
|
209
|
+
**client_params,
|
|
210
|
+
**async_specific, # type: ignore[arg-type]
|
|
211
|
+
).completions
|
|
212
|
+
|
|
213
|
+
return self
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def _identifying_params(self) -> Mapping[str, Any]:
|
|
217
|
+
return {
|
|
218
|
+
"deployment_name": self.deployment_name,
|
|
219
|
+
**super()._identifying_params,
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def _invocation_params(self) -> dict[str, Any]:
|
|
224
|
+
openai_params = {"model": self.deployment_name}
|
|
225
|
+
return {**openai_params, **super()._invocation_params}
|
|
226
|
+
|
|
227
|
+
def _get_ls_params(
|
|
228
|
+
self, stop: list[str] | None = None, **kwargs: Any
|
|
229
|
+
) -> LangSmithParams:
|
|
230
|
+
"""Get standard params for tracing."""
|
|
231
|
+
params = super()._get_ls_params(stop=stop, **kwargs)
|
|
232
|
+
invocation_params = self._invocation_params
|
|
233
|
+
params["ls_provider"] = "azure"
|
|
234
|
+
if model_name := invocation_params.get("model"):
|
|
235
|
+
params["ls_model_name"] = model_name
|
|
236
|
+
return params
|
|
237
|
+
|
|
238
|
+
@property
|
|
239
|
+
def _llm_type(self) -> str:
|
|
240
|
+
"""Return type of llm."""
|
|
241
|
+
return "azure"
|
|
242
|
+
|
|
243
|
+
@property
|
|
244
|
+
def lc_attributes(self) -> dict[str, Any]:
|
|
245
|
+
"""Attributes relevant to tracing."""
|
|
246
|
+
return {
|
|
247
|
+
"openai_api_type": self.openai_api_type,
|
|
248
|
+
"openai_api_version": self.openai_api_version,
|
|
249
|
+
}
|