language-model-common 2.0.90__tar.gz → 2.0.91__tar.gz
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.
- {language_model_common-2.0.90/language_model_common.egg-info → language_model_common-2.0.91}/PKG-INFO +1 -1
- language_model_common-2.0.91/VERSION +1 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91/language_model_common.egg-info}/PKG-INFO +1 -1
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/streaming_manager.py +0 -9
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/tool_event_handlers.py +8 -31
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/langchain_adapter.py +0 -2
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/tool_invocation.py +11 -77
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_tool_provider.py +0 -22
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/models/model_factory.py +39 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/request/chat_completion_api_request_wrapper.py +0 -23
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/request/chat_request_wrapper.py +0 -23
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py +2 -36
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/tools/mcp/call_tool_tool.py +4 -11
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/environment/language_model_common_environment_variables.py +0 -16
- language_model_common-2.0.90/VERSION +0 -1
- {language_model_common-2.0.90 → language_model_common-2.0.91}/LICENSE +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/MANIFEST.in +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/README.md +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/language_model_common.egg-info/SOURCES.txt +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/language_model_common.egg-info/dependency_links.txt +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/language_model_common.egg-info/requires.txt +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/language_model_common.egg-info/top_level.txt +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/authenticator/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/exceptions/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_not_found_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/models/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/models/token_cache_item.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/oauth_provider_registrar.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/pass_through_token_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/token_exchange/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/token_exchange/token_exchange_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/token_storage_auth_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/tools/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/tools/tool_auth_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/aws/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/aws/aws_client_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/config_reader.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/file_config_reader.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/github_directory_downloader.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/github_directory_helper.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/mcp_json_fetcher.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/mcp_json_reader.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/config_reader/s3_config_reader.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/prompt_library/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/prompt_library/prompt_library_environment_variables.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/prompt_library/prompt_library_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/prompt_library/prompt_store.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/schemas/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/schemas/config_schema.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/configs/schemas/mcp_json_schema.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/container/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/container/container_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/context/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/context/request_context.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/langgraph_to_openai_converter.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/stream_buffer.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/stream_context_mixin.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/stream_debug_output_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/streaming_formatters.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/converters/streaming_tool_node.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/exceptions/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/exceptions/bailey_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/exceptions/rate_limit_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/file_managers/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/file_managers/aws_s3_file_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/file_managers/file_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/file_managers/file_manager_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/file_managers/file_writer.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/file_managers/local_file_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/github/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/github/token_provider.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/graph/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/graph/graph_builder.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/history/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/history/context_compactor.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/history/conversation_history_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/history/smart_history_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/http/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/http/http_client_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/aws_image_generator.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/image_generator.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/image_generator_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/managers/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/managers/image_generation_manager.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/openai_image_generator.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/providers/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/providers/base_image_generation_provider.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/image_generation/providers/image_generation_provider.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/markdown/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/markdown/html_to_markdown_converter.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/auth/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/auth/mcp_authorization_helper.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/callbacks.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/exceptions/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/exceptions/mcp_tool_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/interceptors/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/interceptors/auth.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/interceptors/tracing.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/interceptors/truncation.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/interceptors/types.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/content_conversion.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/server_card_discovery.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/session.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/session_pool.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/tool_list_cache.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/mcp_client/ui_resource.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/tool_catalog.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mcp/tool_discovery_middleware.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mocks/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mocks/mock_aws_client_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mocks/mock_http_client_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mocks/mock_image_generator.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/mocks/mock_image_generator_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/models/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/models/bedrock_models.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/models/sanitizing_bedrock_converse.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/ocr/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/ocr/aws_ocr_extractor.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/ocr/ocr_extractor.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/ocr/ocr_extractor_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/persistence/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/persistence/persistence_factory.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/pipeline/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/pipeline/context.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/pipeline/output/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/pipeline/pipeline.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/pipeline/step.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/pipeline/steps/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/py.typed +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/schema/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/schema/openai/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/schema/openai/completions.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/schema/openai/image_generation.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/schema/openai/responses.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/state/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/state/messages_state.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/message/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/message/chat_completion_api_message_wrapper.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/message/chat_message_wrapper.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/message/responses_api_message_wrapper.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/structures/openai/request/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/tools/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/tools/mcp/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/tools/mcp/search_tools_tool.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/cache/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/cache/advisory_lock.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/cache/model_config_cache_store.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/chat_message_helpers.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/config_substitution.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/environment/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/header_reader/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/header_reader/header_reader.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/debug_configuration.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/exception_formatter.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/exception_logger.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/log_levels.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/logging_response.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/logger/logging_transport.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/message_preprocessing/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/message_preprocessing/composite_message_preprocessor.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/mongo_url_utils.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/openai/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/openai/responses_api_converter.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/request_information.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/s3_url.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/security/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/security/normalize.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/security/off_topic_detector.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/security/prompt_extraction_detector.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/security/prompt_sanitizer.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/handlers/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/handlers/debug_command_handler.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/handlers/skill_command_handler.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/slash_command_handler.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/slash_command_parser.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/slash_command/slash_command_processor.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/text_humanizer.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/token_reducer/__init__.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/token_reducer/token_reducer.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/tool_display_name_mapper.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/utilities/url_parser.py +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/pyproject.toml +0 -0
- {language_model_common-2.0.90 → language_model_common-2.0.91}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.0.91
|
|
@@ -379,15 +379,6 @@ class LangGraphStreamingManager(StreamContextMixin):
|
|
|
379
379
|
)
|
|
380
380
|
if chunk:
|
|
381
381
|
yield chunk
|
|
382
|
-
elif name == "mcp_tool_heartbeat":
|
|
383
|
-
data = dict(event.get("data", {}))
|
|
384
|
-
chunk = chat_request_wrapper.create_tool_heartbeat_sse_event(
|
|
385
|
-
request_id=request_information.request_id,
|
|
386
|
-
tool_name=data.get("tool_name", "unknown"),
|
|
387
|
-
elapsed_seconds=float(data.get("elapsed_seconds", 0.0)),
|
|
388
|
-
)
|
|
389
|
-
if chunk:
|
|
390
|
-
yield chunk
|
|
391
382
|
else:
|
|
392
383
|
logger.debug("Skipped custom event: %s", name)
|
|
393
384
|
|
|
@@ -36,20 +36,6 @@ from languagemodelcommon.utilities.tool_display_name_mapper import ToolDisplayNa
|
|
|
36
36
|
logger = logging.getLogger(__name__)
|
|
37
37
|
logger.setLevel(SRC_LOG_LEVELS.LLM)
|
|
38
38
|
|
|
39
|
-
# Cap on the tool result/error text forwarded to the response.output_item.done
|
|
40
|
-
# SSE event, so a tool that echoes back large content (e.g. a full skill body)
|
|
41
|
-
# doesn't bloat every trace event; full output remains available via the
|
|
42
|
-
# existing debug-file-writer path for cases that need it.
|
|
43
|
-
TOOL_END_OUTPUT_TRACE_MAX_CHARS = 2000
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def _truncate_for_trace(
|
|
47
|
-
text: str, *, max_chars: int = TOOL_END_OUTPUT_TRACE_MAX_CHARS
|
|
48
|
-
) -> str:
|
|
49
|
-
if len(text) <= max_chars:
|
|
50
|
-
return text
|
|
51
|
-
return text[:max_chars] + f"...[truncated {len(text) - max_chars} chars]"
|
|
52
|
-
|
|
53
39
|
|
|
54
40
|
class ToolEventHandler(StreamContextMixin):
|
|
55
41
|
def __init__(
|
|
@@ -175,32 +161,23 @@ class ToolEventHandler(StreamContextMixin):
|
|
|
175
161
|
tool_name,
|
|
176
162
|
)
|
|
177
163
|
|
|
178
|
-
tool_message_content: str = (
|
|
179
|
-
convert_message_content_into_string(tool_message=tool_message)
|
|
180
|
-
if tool_message
|
|
181
|
-
else ""
|
|
182
|
-
)
|
|
183
|
-
artifact: Optional[Any] = tool_message.artifact
|
|
184
|
-
# tool_message.status only flips to "error" for an uncaught exception;
|
|
185
|
-
# meta-tools like call_tool catch their own failures and report them via
|
|
186
|
-
# the artifact instead (see CallToolTool), so check both signals.
|
|
187
|
-
is_error: bool = tool_message.status == "error" or (
|
|
188
|
-
isinstance(artifact, dict) and artifact.get("is_error") is True
|
|
189
|
-
)
|
|
190
|
-
|
|
191
164
|
tool_end_event = chat_request_wrapper.create_tool_end_sse_event(
|
|
192
165
|
request_id=request_information.request_id,
|
|
193
166
|
tool_name=tool_name,
|
|
194
167
|
tool_input=tool_input,
|
|
195
168
|
runtime_seconds=runtime_seconds,
|
|
196
|
-
output=_truncate_for_trace(tool_message_content)
|
|
197
|
-
if tool_message_content
|
|
198
|
-
else None,
|
|
199
|
-
is_error=is_error,
|
|
200
169
|
)
|
|
201
170
|
if tool_end_event:
|
|
202
171
|
yield tool_end_event
|
|
203
172
|
|
|
173
|
+
tool_message_content: str = (
|
|
174
|
+
convert_message_content_into_string(tool_message=tool_message)
|
|
175
|
+
if tool_message
|
|
176
|
+
else ""
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
artifact: Optional[Any] = tool_message.artifact
|
|
180
|
+
|
|
204
181
|
logger.debug(
|
|
205
182
|
"Tool %s has artifact of type %s: %s",
|
|
206
183
|
tool_name,
|
|
@@ -62,7 +62,6 @@ def mcp_tool_to_langchain_tool(
|
|
|
62
62
|
server_name: str | None = None,
|
|
63
63
|
session_pool: McpSessionPool | None = None,
|
|
64
64
|
tool_list_cache: ToolListCache | None = None,
|
|
65
|
-
heartbeat_interval_seconds: float = 15.0,
|
|
66
65
|
) -> BaseTool:
|
|
67
66
|
"""Convert an MCP Tool to a LangChain BaseTool.
|
|
68
67
|
|
|
@@ -85,7 +84,6 @@ def mcp_tool_to_langchain_tool(
|
|
|
85
84
|
mcp_callbacks=mcp_callbacks,
|
|
86
85
|
session_pool=session_pool,
|
|
87
86
|
tool_list_cache=tool_list_cache,
|
|
88
|
-
heartbeat_interval_seconds=heartbeat_interval_seconds,
|
|
89
87
|
)
|
|
90
88
|
handler = build_interceptor_chain(
|
|
91
89
|
base_handler=execute_tool, tool_interceptors=tool_interceptors
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"""Tool invocation — interceptor chain and raw MCP tool calls."""
|
|
2
2
|
|
|
3
|
-
import asyncio
|
|
4
|
-
import contextlib
|
|
5
3
|
import logging
|
|
6
4
|
from collections.abc import Awaitable, Callable
|
|
7
5
|
from typing import Any
|
|
8
6
|
|
|
9
|
-
from langchain_core.callbacks.manager import adispatch_custom_event
|
|
10
7
|
from mcp.types import CallToolResult
|
|
11
8
|
from pydantic import ValidationError
|
|
12
9
|
|
|
@@ -177,6 +174,8 @@ async def _execute_tool_as_task(
|
|
|
177
174
|
Raises TaskProtocolError if the server does not respond with a valid
|
|
178
175
|
CreateTaskResult (e.g., returns a plain CallToolResult instead).
|
|
179
176
|
"""
|
|
177
|
+
from langchain_core.callbacks.manager import adispatch_custom_event
|
|
178
|
+
|
|
180
179
|
try:
|
|
181
180
|
create_result = await session.experimental.call_tool_as_task(
|
|
182
181
|
name, arguments, ttl=60000
|
|
@@ -223,66 +222,12 @@ async def _execute_tool_as_task(
|
|
|
223
222
|
return result
|
|
224
223
|
|
|
225
224
|
|
|
226
|
-
async def _execute_tool_call_with_heartbeat(
|
|
227
|
-
*,
|
|
228
|
-
session: Any,
|
|
229
|
-
name: str,
|
|
230
|
-
arguments: dict[str, Any],
|
|
231
|
-
progress_callback: Any,
|
|
232
|
-
server_name: str,
|
|
233
|
-
heartbeat_interval_seconds: float,
|
|
234
|
-
) -> CallToolResult:
|
|
235
|
-
"""Call ``session.call_tool``, emitting a synthetic ``mcp_tool_heartbeat``
|
|
236
|
-
custom event every ``heartbeat_interval_seconds`` while the call is in
|
|
237
|
-
flight, regardless of whether the tool reports real progress.
|
|
238
|
-
|
|
239
|
-
Uses ``asyncio.shield`` so a heartbeat tick's wait_for timeout never
|
|
240
|
-
cancels the underlying tool call -- only the local wait is abandoned and
|
|
241
|
-
retried on the same call_task. If this coroutine itself is cancelled
|
|
242
|
-
(e.g. the overall chat turn is aborted), the inner call_task is
|
|
243
|
-
cancelled too rather than left running in the background.
|
|
244
|
-
"""
|
|
245
|
-
call_task: "asyncio.Task[CallToolResult]" = asyncio.ensure_future(
|
|
246
|
-
session.call_tool(name, arguments, progress_callback=progress_callback)
|
|
247
|
-
)
|
|
248
|
-
elapsed_seconds = 0.0
|
|
249
|
-
try:
|
|
250
|
-
while True:
|
|
251
|
-
try:
|
|
252
|
-
return await asyncio.wait_for(
|
|
253
|
-
asyncio.shield(call_task), timeout=heartbeat_interval_seconds
|
|
254
|
-
)
|
|
255
|
-
except asyncio.TimeoutError:
|
|
256
|
-
elapsed_seconds += heartbeat_interval_seconds
|
|
257
|
-
try:
|
|
258
|
-
await adispatch_custom_event(
|
|
259
|
-
"mcp_tool_heartbeat",
|
|
260
|
-
{
|
|
261
|
-
"server_name": server_name,
|
|
262
|
-
"tool_name": name,
|
|
263
|
-
"elapsed_seconds": elapsed_seconds,
|
|
264
|
-
},
|
|
265
|
-
)
|
|
266
|
-
except RuntimeError as e:
|
|
267
|
-
logger.debug(
|
|
268
|
-
"Skipping mcp_tool_heartbeat event dispatch: %s (tool=%s)",
|
|
269
|
-
e,
|
|
270
|
-
name,
|
|
271
|
-
)
|
|
272
|
-
except asyncio.CancelledError:
|
|
273
|
-
call_task.cancel()
|
|
274
|
-
with contextlib.suppress(asyncio.CancelledError):
|
|
275
|
-
await call_task
|
|
276
|
-
raise
|
|
277
|
-
|
|
278
|
-
|
|
279
225
|
def _make_execute_tool(
|
|
280
226
|
*,
|
|
281
227
|
config: MCPConnectionConfig,
|
|
282
228
|
mcp_callbacks: _MCPCallbacks,
|
|
283
229
|
session_pool: McpSessionPool | None = None,
|
|
284
230
|
tool_list_cache: ToolListCache | None = None,
|
|
285
|
-
heartbeat_interval_seconds: float = 15.0,
|
|
286
231
|
) -> Callable[[MCPToolCallRequest], Awaitable[MCPToolCallResult]]:
|
|
287
232
|
"""Create an execute_tool handler that opens a session and calls the tool.
|
|
288
233
|
|
|
@@ -340,13 +285,10 @@ def _make_execute_tool(
|
|
|
340
285
|
)
|
|
341
286
|
if tool_list_cache is not None:
|
|
342
287
|
await tool_list_cache.invalidate_async(key=cache_key)
|
|
343
|
-
return await
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
arguments=request.args,
|
|
288
|
+
return await session.call_tool(
|
|
289
|
+
request.name,
|
|
290
|
+
request.args,
|
|
347
291
|
progress_callback=mcp_callbacks.progress_callback,
|
|
348
|
-
server_name=request.server_name,
|
|
349
|
-
heartbeat_interval_seconds=heartbeat_interval_seconds,
|
|
350
292
|
)
|
|
351
293
|
except Exception:
|
|
352
294
|
await session_pool.evict(effective_config)
|
|
@@ -382,22 +324,16 @@ def _make_execute_tool(
|
|
|
382
324
|
)
|
|
383
325
|
if tool_list_cache is not None:
|
|
384
326
|
await tool_list_cache.invalidate_async(key=cache_key)
|
|
385
|
-
result = await
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
arguments=request.args,
|
|
327
|
+
result = await session.call_tool(
|
|
328
|
+
request.name,
|
|
329
|
+
request.args,
|
|
389
330
|
progress_callback=mcp_callbacks.progress_callback,
|
|
390
|
-
server_name=request.server_name,
|
|
391
|
-
heartbeat_interval_seconds=heartbeat_interval_seconds,
|
|
392
331
|
)
|
|
393
332
|
else:
|
|
394
|
-
result = await
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
arguments=request.args,
|
|
333
|
+
result = await session.call_tool(
|
|
334
|
+
request.name,
|
|
335
|
+
request.args,
|
|
398
336
|
progress_callback=mcp_callbacks.progress_callback,
|
|
399
|
-
server_name=request.server_name,
|
|
400
|
-
heartbeat_interval_seconds=heartbeat_interval_seconds,
|
|
401
337
|
)
|
|
402
338
|
except Exception as e:
|
|
403
339
|
captured_exception = e
|
|
@@ -419,7 +355,6 @@ async def call_mcp_tool_raw(
|
|
|
419
355
|
tool_interceptors: list[ToolCallInterceptor] | None = None,
|
|
420
356
|
session_pool: McpSessionPool | None = None,
|
|
421
357
|
tool_list_cache: ToolListCache | None = None,
|
|
422
|
-
heartbeat_interval_seconds: float = 15.0,
|
|
423
358
|
) -> CallToolResult:
|
|
424
359
|
"""Call an MCP tool and return the raw CallToolResult.
|
|
425
360
|
|
|
@@ -439,7 +374,6 @@ async def call_mcp_tool_raw(
|
|
|
439
374
|
mcp_callbacks=mcp_callbacks,
|
|
440
375
|
session_pool=session_pool,
|
|
441
376
|
tool_list_cache=tool_list_cache,
|
|
442
|
-
heartbeat_interval_seconds=heartbeat_interval_seconds,
|
|
443
377
|
)
|
|
444
378
|
handler = build_interceptor_chain(
|
|
445
379
|
base_handler=execute_tool, tool_interceptors=tool_interceptors
|
|
@@ -6,7 +6,6 @@ from typing import Any, Dict, List
|
|
|
6
6
|
|
|
7
7
|
import httpx
|
|
8
8
|
from httpx import HTTPStatusError
|
|
9
|
-
from langchain_core.callbacks.manager import adispatch_custom_event
|
|
10
9
|
from langchain_core.tools import BaseTool
|
|
11
10
|
from mcp import ClientSession
|
|
12
11
|
from mcp.types import (
|
|
@@ -211,24 +210,6 @@ class MCPToolProvider:
|
|
|
211
210
|
logger.info(
|
|
212
211
|
f"MCP Tool Progress - Server: {context.server_name}, Progress: {progress}, Total: {total}, Message: {message}"
|
|
213
212
|
)
|
|
214
|
-
try:
|
|
215
|
-
await adispatch_custom_event(
|
|
216
|
-
"mcp_task_progress",
|
|
217
|
-
{
|
|
218
|
-
"task_id": "",
|
|
219
|
-
"status": f"{progress:g}/{total:g}" if total else f"{progress:g}",
|
|
220
|
-
"message": message,
|
|
221
|
-
"server_name": context.server_name,
|
|
222
|
-
"tool_name": context.tool_name,
|
|
223
|
-
},
|
|
224
|
-
)
|
|
225
|
-
except RuntimeError as e:
|
|
226
|
-
logger.debug(
|
|
227
|
-
"Skipping mcp_task_progress event dispatch: %s (server=%s, tool=%s)",
|
|
228
|
-
e,
|
|
229
|
-
context.server_name,
|
|
230
|
-
context.tool_name,
|
|
231
|
-
)
|
|
232
213
|
|
|
233
214
|
def _build_connection_config(self, tool_config: AgentConfig) -> MCPConnectionConfig:
|
|
234
215
|
"""Build an MCPConnectionConfig from an AgentConfig."""
|
|
@@ -304,7 +285,6 @@ class MCPToolProvider:
|
|
|
304
285
|
],
|
|
305
286
|
server_name=tool_config.name,
|
|
306
287
|
tool_list_cache=self.tool_list_cache,
|
|
307
|
-
heartbeat_interval_seconds=self.environment_variables.mcp_tool_heartbeat_interval_seconds,
|
|
308
288
|
)
|
|
309
289
|
tools.append(langchain_tool)
|
|
310
290
|
|
|
@@ -471,7 +451,6 @@ class MCPToolProvider:
|
|
|
471
451
|
server_name=tool_config.name,
|
|
472
452
|
session_pool=session_pool,
|
|
473
453
|
tool_list_cache=self.tool_list_cache,
|
|
474
|
-
heartbeat_interval_seconds=self.environment_variables.mcp_tool_heartbeat_interval_seconds,
|
|
475
454
|
)
|
|
476
455
|
for mcp_tool in mcp_tools
|
|
477
456
|
]
|
|
@@ -1031,7 +1010,6 @@ class MCPToolProvider:
|
|
|
1031
1010
|
],
|
|
1032
1011
|
session_pool=session_pool,
|
|
1033
1012
|
tool_list_cache=self.tool_list_cache,
|
|
1034
|
-
heartbeat_interval_seconds=self.environment_variables.mcp_tool_heartbeat_interval_seconds,
|
|
1035
1013
|
)
|
|
1036
1014
|
|
|
1037
1015
|
async def fetch_mcp_app_embed(
|
|
@@ -151,6 +151,34 @@ class ModelFactory:
|
|
|
151
151
|
def _is_anthropic_model(model_name: str) -> bool:
|
|
152
152
|
return model_name.startswith(("anthropic.", "us.anthropic."))
|
|
153
153
|
|
|
154
|
+
@staticmethod
|
|
155
|
+
def _resolve_anthropic_bedrock_max_tokens(model_name: str) -> int | None:
|
|
156
|
+
"""Look up the real max_output_tokens for a Bedrock Anthropic model ID.
|
|
157
|
+
|
|
158
|
+
``ChatAnthropicBedrock`` inherits ``ChatAnthropic.set_default_max_tokens``,
|
|
159
|
+
which resolves an unset ``max_tokens`` from ``langchain_anthropic``'s own
|
|
160
|
+
model-profile registry — keyed by bare Anthropic API names (e.g.
|
|
161
|
+
``claude-sonnet-4-5-20250929``), not Bedrock cross-region inference
|
|
162
|
+
profile IDs (e.g. ``us.anthropic.claude-sonnet-4-5-20250929-v1:0``). For
|
|
163
|
+
every Bedrock-prefixed ID that lookup misses, silently capping output at
|
|
164
|
+
``_FALLBACK_MAX_OUTPUT_TOKENS`` (4096) even when the model supports far
|
|
165
|
+
more (64000 for Claude Sonnet 4.5) — which truncates long tool-call
|
|
166
|
+
arguments (e.g. a full skill/document body) mid-generation.
|
|
167
|
+
``langchain_aws``'s own Bedrock-aware profile registry (used elsewhere,
|
|
168
|
+
e.g. by ``ChatAnthropicBedrock._set_model_profile``, but too late to
|
|
169
|
+
affect ``max_tokens``) does have entries keyed by the full Bedrock ID, so
|
|
170
|
+
look the real limit up there and pass it through explicitly.
|
|
171
|
+
"""
|
|
172
|
+
try:
|
|
173
|
+
from langchain_aws.chat_models.anthropic import (
|
|
174
|
+
_get_default_model_profile,
|
|
175
|
+
)
|
|
176
|
+
except ImportError:
|
|
177
|
+
return None
|
|
178
|
+
profile = _get_default_model_profile(model_name)
|
|
179
|
+
max_output_tokens = profile.get("max_output_tokens")
|
|
180
|
+
return int(max_output_tokens) if max_output_tokens else None
|
|
181
|
+
|
|
154
182
|
def _create_anthropic_bedrock_model(
|
|
155
183
|
self,
|
|
156
184
|
*,
|
|
@@ -164,6 +192,17 @@ class ModelFactory:
|
|
|
164
192
|
from pydantic import SecretStr
|
|
165
193
|
import boto3
|
|
166
194
|
|
|
195
|
+
if "max_tokens" not in model_parameters_dict:
|
|
196
|
+
resolved_max_tokens = self._resolve_anthropic_bedrock_max_tokens(model_name)
|
|
197
|
+
if resolved_max_tokens is not None:
|
|
198
|
+
model_parameters_dict["max_tokens"] = resolved_max_tokens
|
|
199
|
+
logger.info(
|
|
200
|
+
"Resolved max_tokens=%d for Bedrock model %s from profile "
|
|
201
|
+
"(overriding langchain_anthropic's unprefixed-lookup default)",
|
|
202
|
+
resolved_max_tokens,
|
|
203
|
+
model_name,
|
|
204
|
+
)
|
|
205
|
+
|
|
167
206
|
if thinking_budget and thinking_budget > 0:
|
|
168
207
|
model_parameters_dict["thinking"] = {
|
|
169
208
|
"type": "enabled",
|
|
@@ -67,7 +67,6 @@ class ChatCompletionApiRequestWrapper(ChatRequestWrapper):
|
|
|
67
67
|
enable_debug_logging: bool,
|
|
68
68
|
environment_variables: "LanguageModelCommonEnvironmentVariables",
|
|
69
69
|
emit_task_progress: bool | None = None,
|
|
70
|
-
emit_tool_heartbeat: bool | None = None,
|
|
71
70
|
) -> None:
|
|
72
71
|
"""
|
|
73
72
|
Wraps an OpenAI /chat/completions request to provide a consistent interface for different request types.
|
|
@@ -85,11 +84,6 @@ class ChatCompletionApiRequestWrapper(ChatRequestWrapper):
|
|
|
85
84
|
if emit_task_progress is not None
|
|
86
85
|
else environment_variables.emit_task_progress_in_chat_completions
|
|
87
86
|
)
|
|
88
|
-
self._emit_tool_heartbeat: bool = (
|
|
89
|
-
emit_tool_heartbeat
|
|
90
|
-
if emit_tool_heartbeat is not None
|
|
91
|
-
else environment_variables.emit_tool_heartbeat_in_chat_completions
|
|
92
|
-
)
|
|
93
87
|
self._debug_prefixes = environment_variables.debug_prefixes
|
|
94
88
|
self._apply_debug_prefix_toggle()
|
|
95
89
|
|
|
@@ -284,23 +278,6 @@ class ChatCompletionApiRequestWrapper(ChatRequestWrapper):
|
|
|
284
278
|
source="task_progress",
|
|
285
279
|
)
|
|
286
280
|
|
|
287
|
-
@override
|
|
288
|
-
def create_tool_heartbeat_sse_event(
|
|
289
|
-
self,
|
|
290
|
-
*,
|
|
291
|
-
request_id: str,
|
|
292
|
-
tool_name: str,
|
|
293
|
-
elapsed_seconds: float,
|
|
294
|
-
) -> str | None:
|
|
295
|
-
if not self._emit_tool_heartbeat:
|
|
296
|
-
return None
|
|
297
|
-
return self.create_sse_message(
|
|
298
|
-
request_id=request_id,
|
|
299
|
-
content=f"\n[Still running {tool_name}... ({elapsed_seconds:.0f}s)]\n",
|
|
300
|
-
usage_metadata=None,
|
|
301
|
-
source="tool_heartbeat",
|
|
302
|
-
)
|
|
303
|
-
|
|
304
281
|
@override
|
|
305
282
|
def create_non_streaming_response(
|
|
306
283
|
self,
|
|
@@ -272,21 +272,6 @@ class ChatRequestWrapper(abc.ABC):
|
|
|
272
272
|
"""
|
|
273
273
|
return None
|
|
274
274
|
|
|
275
|
-
def create_tool_heartbeat_sse_event(
|
|
276
|
-
self,
|
|
277
|
-
*,
|
|
278
|
-
request_id: str,
|
|
279
|
-
tool_name: str,
|
|
280
|
-
elapsed_seconds: float,
|
|
281
|
-
) -> str | None:
|
|
282
|
-
"""Emit a synthetic heartbeat while a tool call is in flight without
|
|
283
|
-
reporting real progress.
|
|
284
|
-
|
|
285
|
-
The default implementation returns None (no-op). Subclasses override
|
|
286
|
-
to emit the event in their respective SSE formats.
|
|
287
|
-
"""
|
|
288
|
-
return None
|
|
289
|
-
|
|
290
275
|
def create_tool_start_sse_event(
|
|
291
276
|
self,
|
|
292
277
|
*,
|
|
@@ -309,17 +294,9 @@ class ChatRequestWrapper(abc.ABC):
|
|
|
309
294
|
tool_name: str,
|
|
310
295
|
tool_input: dict[str, Any] | None,
|
|
311
296
|
runtime_seconds: float | None,
|
|
312
|
-
output: str | None = None,
|
|
313
|
-
is_error: bool = False,
|
|
314
297
|
) -> str | None:
|
|
315
298
|
"""Emit an SSE event when a tool finishes execution.
|
|
316
299
|
|
|
317
|
-
``output`` is the tool's own result/error text (already converted to a
|
|
318
|
-
plain string and truncated by the caller) and ``is_error`` reflects the
|
|
319
|
-
underlying ToolMessage's status, so consumers can distinguish a tool
|
|
320
|
-
that ran to completion from one that failed without having to parse
|
|
321
|
-
free-text content.
|
|
322
|
-
|
|
323
300
|
The default implementation returns None (no-op). Subclasses that
|
|
324
301
|
support structured tool events (e.g. Responses API) override this
|
|
325
302
|
to emit a typed SSE frame the client can use for status updates.
|
|
@@ -338,16 +338,8 @@ class ResponsesApiRequestWrapper(ChatRequestWrapper):
|
|
|
338
338
|
tool_name: str,
|
|
339
339
|
tool_input: Dict[str, Any] | None,
|
|
340
340
|
runtime_seconds: float | None,
|
|
341
|
-
output: str | None = None,
|
|
342
|
-
is_error: bool = False,
|
|
343
341
|
) -> str | None:
|
|
344
|
-
"""Emit a ``response.output_item.done`` event with a ``function_call`` item.
|
|
345
|
-
|
|
346
|
-
Includes ``runtime_seconds`` and the tool's own ``output``/``is_error``
|
|
347
|
-
so consuming UIs (e.g. baileyai-skills-service's Stream events panel)
|
|
348
|
-
can show how long a call took and surface failures, rather than only
|
|
349
|
-
ever seeing a "completed" status with no result.
|
|
350
|
-
"""
|
|
342
|
+
"""Emit a ``response.output_item.done`` event with a ``function_call`` item."""
|
|
351
343
|
event: Dict[str, Any] = {
|
|
352
344
|
"type": "response.output_item.done",
|
|
353
345
|
"output_index": 0,
|
|
@@ -358,10 +350,7 @@ class ResponsesApiRequestWrapper(ChatRequestWrapper):
|
|
|
358
350
|
"call_id": f"call_{request_id}_{tool_name}",
|
|
359
351
|
"name": tool_name,
|
|
360
352
|
"arguments": json.dumps(tool_input) if tool_input else "",
|
|
361
|
-
"status": "
|
|
362
|
-
"runtime_seconds": runtime_seconds,
|
|
363
|
-
"output": output or "",
|
|
364
|
-
"is_error": is_error,
|
|
353
|
+
"status": "completed",
|
|
365
354
|
},
|
|
366
355
|
}
|
|
367
356
|
return f"data: {json.dumps(event)}\n\n"
|
|
@@ -384,29 +373,6 @@ class ResponsesApiRequestWrapper(ChatRequestWrapper):
|
|
|
384
373
|
}
|
|
385
374
|
return f"data: {json.dumps(event)}\n\n"
|
|
386
375
|
|
|
387
|
-
@override
|
|
388
|
-
def create_tool_heartbeat_sse_event(
|
|
389
|
-
self,
|
|
390
|
-
*,
|
|
391
|
-
request_id: str,
|
|
392
|
-
tool_name: str,
|
|
393
|
-
elapsed_seconds: float,
|
|
394
|
-
) -> str | None:
|
|
395
|
-
"""Emit a synthetic heartbeat as a ``task.progress`` SSE event.
|
|
396
|
-
|
|
397
|
-
Reuses the exact same wire format as create_task_progress_sse_event
|
|
398
|
-
so existing consumers (e.g. baileyai-skills-service's frontend, which
|
|
399
|
-
already treats any `type: "task.progress"` payload as a non-content
|
|
400
|
-
trace event) require no changes.
|
|
401
|
-
"""
|
|
402
|
-
event: Dict[str, Any] = {
|
|
403
|
-
"type": "task.progress",
|
|
404
|
-
"task_id": "",
|
|
405
|
-
"status": "in_progress",
|
|
406
|
-
"message": f"Still running {tool_name}... ({elapsed_seconds:.0f}s)",
|
|
407
|
-
}
|
|
408
|
-
return f"data: {json.dumps(event)}\n\n"
|
|
409
|
-
|
|
410
376
|
@staticmethod
|
|
411
377
|
def _convert_usage_to_response_usage(
|
|
412
378
|
usages: list[UsageMetadata],
|
|
@@ -98,7 +98,7 @@ class CallToolTool(BaseTool):
|
|
|
98
98
|
if entry is None:
|
|
99
99
|
return (
|
|
100
100
|
f"Tool '{name}' not found. Use search_tools to find available tools.",
|
|
101
|
-
|
|
101
|
+
None,
|
|
102
102
|
)
|
|
103
103
|
|
|
104
104
|
try:
|
|
@@ -122,16 +122,9 @@ class CallToolTool(BaseTool):
|
|
|
122
122
|
session_token=self.session_token,
|
|
123
123
|
)
|
|
124
124
|
|
|
125
|
-
# Surface the *inner* tool's own error status (result.isError), not just
|
|
126
|
-
# transport-level failures — CallToolTool itself never raises for a
|
|
127
|
-
# rejected/invalid call, so this is the only place that signal exists.
|
|
128
125
|
artifact: dict[str, Any] | None = None
|
|
129
|
-
if app_embed is not None
|
|
130
|
-
artifact = {}
|
|
131
|
-
if app_embed is not None:
|
|
132
|
-
artifact["mcp_app_embed"] = app_embed
|
|
133
|
-
if result.isError:
|
|
134
|
-
artifact["is_error"] = True
|
|
126
|
+
if app_embed is not None:
|
|
127
|
+
artifact = {"mcp_app_embed": app_embed}
|
|
135
128
|
|
|
136
129
|
return text, artifact
|
|
137
130
|
except AuthorizationNeededException:
|
|
@@ -145,4 +138,4 @@ class CallToolTool(BaseTool):
|
|
|
145
138
|
entry.server_name,
|
|
146
139
|
error_detail,
|
|
147
140
|
)
|
|
148
|
-
return f"Error calling tool '{name}': {error_detail}",
|
|
141
|
+
return f"Error calling tool '{name}': {error_detail}", None
|
|
@@ -289,22 +289,6 @@ class LanguageModelCommonEnvironmentVariables(
|
|
|
289
289
|
"""Timeout in seconds for tool calls."""
|
|
290
290
|
return int(os.environ.get("TOOL_CALL_TIMEOUT_SECONDS", "600"))
|
|
291
291
|
|
|
292
|
-
@property
|
|
293
|
-
def mcp_tool_heartbeat_interval_seconds(self) -> float:
|
|
294
|
-
"""Interval in seconds between synthetic heartbeat events emitted
|
|
295
|
-
while an MCP tool call is in flight without reporting progress."""
|
|
296
|
-
return float(os.environ.get("MCP_TOOL_HEARTBEAT_INTERVAL_SECONDS", "15"))
|
|
297
|
-
|
|
298
|
-
@property
|
|
299
|
-
def emit_tool_heartbeat_in_chat_completions(self) -> bool:
|
|
300
|
-
"""When True, synthetic MCP tool heartbeats are emitted as content
|
|
301
|
-
deltas in the Chat Completions streaming format. Separate from
|
|
302
|
-
emit_task_progress_in_chat_completions so enabling one does not
|
|
303
|
-
change the volume/behavior of the other."""
|
|
304
|
-
return self.str2bool(
|
|
305
|
-
os.environ.get("EMIT_TOOL_HEARTBEAT_IN_CHAT_COMPLETIONS", "false")
|
|
306
|
-
)
|
|
307
|
-
|
|
308
292
|
@property
|
|
309
293
|
def app_login_uri(self) -> str:
|
|
310
294
|
value = os.environ.get("APP_LOGIN_URI")
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.0.90
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/__init__.py
RENAMED
|
File without changes
|
{language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/auth/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{language_model_common-2.0.90 → language_model_common-2.0.91}/languagemodelcommon/aws/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|