language-model-common 2.1.2__tar.gz → 3.0.0__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.1.2/language_model_common.egg-info → language_model_common-3.0.0}/PKG-INFO +2 -14
- {language_model_common-2.1.2 → language_model_common-3.0.0}/README.md +1 -13
- language_model_common-3.0.0/VERSION +1 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0/language_model_common.egg-info}/PKG-INFO +2 -14
- {language_model_common-2.1.2 → language_model_common-3.0.0}/language_model_common.egg-info/SOURCES.txt +0 -25
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/container/container_factory.py +0 -7
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/langgraph_to_openai_converter.py +0 -6
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/stream_buffer.py +27 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/streaming_manager.py +5 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/graph/graph_builder.py +0 -5
- language_model_common-2.1.2/VERSION +0 -1
- language_model_common-2.1.2/languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py +0 -31
- language_model_common-2.1.2/languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py +0 -25
- language_model_common-2.1.2/languagemodelcommon/auth/exceptions/authorization_token_cache_item_not_found_exception.py +0 -23
- language_model_common-2.1.2/languagemodelcommon/auth/models/token_cache_item.py +0 -212
- language_model_common-2.1.2/languagemodelcommon/auth/oauth_provider_registrar.py +0 -328
- language_model_common-2.1.2/languagemodelcommon/auth/pass_through_token_manager.py +0 -475
- language_model_common-2.1.2/languagemodelcommon/auth/token_exchange/token_exchange_manager.py +0 -649
- language_model_common-2.1.2/languagemodelcommon/auth/token_storage_auth_manager.py +0 -254
- language_model_common-2.1.2/languagemodelcommon/auth/tools/tool_auth_manager.py +0 -180
- language_model_common-2.1.2/languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py +0 -214
- language_model_common-2.1.2/languagemodelcommon/mcp/auth/mcp_authorization_helper.py +0 -48
- language_model_common-2.1.2/languagemodelcommon/mcp/exceptions/mcp_tool_exception.py +0 -21
- language_model_common-2.1.2/languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py +0 -11
- language_model_common-2.1.2/languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py +0 -11
- language_model_common-2.1.2/languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py +0 -11
- language_model_common-2.1.2/languagemodelcommon/mcp/interceptors/auth.py +0 -286
- language_model_common-2.1.2/languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py +0 -68
- language_model_common-2.1.2/languagemodelcommon/mcp/mcp_client/ui_resource.py +0 -543
- language_model_common-2.1.2/languagemodelcommon/mcp/mcp_tool_provider.py +0 -1275
- language_model_common-2.1.2/languagemodelcommon/mcp/tool_catalog.py +0 -507
- language_model_common-2.1.2/languagemodelcommon/mcp/tool_discovery_middleware.py +0 -108
- language_model_common-2.1.2/languagemodelcommon/tools/mcp/call_tool_tool.py +0 -221
- language_model_common-2.1.2/languagemodelcommon/tools/mcp/search_tools_tool.py +0 -250
- language_model_common-2.1.2/languagemodelcommon/utilities/slash_command/handlers/__init__.py +0 -0
- language_model_common-2.1.2/languagemodelcommon/utilities/token_reducer/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/LICENSE +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/MANIFEST.in +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/language_model_common.egg-info/dependency_links.txt +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/language_model_common.egg-info/requires.txt +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/language_model_common.egg-info/top_level.txt +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/auth/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/auth/authenticator/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/auth/exceptions/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/auth/models/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/auth/token_exchange → language_model_common-3.0.0/languagemodelcommon/aws}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/aws/aws_client_factory.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/auth/tools → language_model_common-3.0.0/languagemodelcommon/configs}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/aws → language_model_common-3.0.0/languagemodelcommon/configs/config_reader}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/config_reader.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/file_config_reader.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/github_directory_downloader.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/github_directory_helper.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/mcp_json_fetcher.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/mcp_json_reader.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/config_reader/s3_config_reader.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/configs → language_model_common-3.0.0/languagemodelcommon/configs/prompt_library}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/prompt_library/prompt_library_environment_variables.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/prompt_library/prompt_library_manager.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/prompt_library/prompt_store.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/configs/config_reader → language_model_common-3.0.0/languagemodelcommon/configs/schemas}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/schemas/config_schema.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/configs/schemas/mcp_json_schema.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/configs/prompt_library → language_model_common-3.0.0/languagemodelcommon/container}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/configs/schemas → language_model_common-3.0.0/languagemodelcommon/context}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/context/request_context.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/container → language_model_common-3.0.0/languagemodelcommon/converters}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/history_cache_middleware.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/stream_context_mixin.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/stream_debug_output_manager.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/streaming_formatters.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/streaming_tool_node.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/converters/tool_event_handlers.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/context → language_model_common-3.0.0/languagemodelcommon/exceptions}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/exceptions/bailey_exception.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/exceptions/rate_limit_exception.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/converters → language_model_common-3.0.0/languagemodelcommon/file_managers}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/file_managers/aws_s3_file_manager.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/file_managers/file_manager.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/file_managers/file_manager_factory.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/file_managers/file_writer.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/file_managers/local_file_manager.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/exceptions → language_model_common-3.0.0/languagemodelcommon/github}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/github/token_provider.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/file_managers → language_model_common-3.0.0/languagemodelcommon/graph}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/github → language_model_common-3.0.0/languagemodelcommon/history}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/history/context_compactor.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/history/conversation_history_manager.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/history/smart_history_manager.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/graph → language_model_common-3.0.0/languagemodelcommon/http}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/http/http_client_factory.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/history → language_model_common-3.0.0/languagemodelcommon/image_generation}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/aws_image_generator.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/image_generator.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/image_generator_factory.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/http → language_model_common-3.0.0/languagemodelcommon/image_generation/managers}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/managers/image_generation_manager.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/openai_image_generator.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/image_generation → language_model_common-3.0.0/languagemodelcommon/image_generation/providers}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/providers/base_image_generation_provider.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/image_generation/providers/image_generation_provider.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/image_generation/managers → language_model_common-3.0.0/languagemodelcommon/markdown}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/markdown/html_to_markdown_converter.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/image_generation/providers → language_model_common-3.0.0/languagemodelcommon/mcp}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/markdown → language_model_common-3.0.0/languagemodelcommon/mcp/auth}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/callbacks.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/mcp → language_model_common-3.0.0/languagemodelcommon/mcp/exceptions}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/mcp/auth → language_model_common-3.0.0/languagemodelcommon/mcp/interceptors}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/interceptors/tracing.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/interceptors/truncation.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/interceptors/types.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/mcp/exceptions → language_model_common-3.0.0/languagemodelcommon/mcp/mcp_client}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/content_conversion.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/langchain_adapter.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/server_card_discovery.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/session.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/session_pool.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/tool_invocation.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mcp/mcp_client/tool_list_cache.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/mcp/interceptors → language_model_common-3.0.0/languagemodelcommon/mocks}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mocks/mock_aws_client_factory.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mocks/mock_http_client_factory.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mocks/mock_image_generator.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/mocks/mock_image_generator_factory.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/mcp/mcp_client → language_model_common-3.0.0/languagemodelcommon/models}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/models/bedrock_models.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/models/model_factory.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/models/sanitizing_bedrock_converse.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/mocks → language_model_common-3.0.0/languagemodelcommon/ocr}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/ocr/aws_ocr_extractor.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/ocr/ocr_extractor.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/ocr/ocr_extractor_factory.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/models → language_model_common-3.0.0/languagemodelcommon/persistence}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/persistence/persistence_factory.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/ocr → language_model_common-3.0.0/languagemodelcommon/pipeline}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/pipeline/context.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/persistence → language_model_common-3.0.0/languagemodelcommon/pipeline/output}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/pipeline/pipeline.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/pipeline/step.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/pipeline → language_model_common-3.0.0/languagemodelcommon/pipeline/steps}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/py.typed +0 -0
- {language_model_common-2.1.2/languagemodelcommon/pipeline/output → language_model_common-3.0.0/languagemodelcommon/schema}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/pipeline/steps → language_model_common-3.0.0/languagemodelcommon/schema/openai}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/schema/openai/completions.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/schema/openai/image_generation.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/schema/openai/responses.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/schema → language_model_common-3.0.0/languagemodelcommon/state}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/state/messages_state.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/schema/openai → language_model_common-3.0.0/languagemodelcommon/structures}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/state → language_model_common-3.0.0/languagemodelcommon/structures/openai}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/structures → language_model_common-3.0.0/languagemodelcommon/structures/openai/message}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/structures/openai/message/chat_completion_api_message_wrapper.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/structures/openai/message/chat_message_wrapper.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/structures/openai/message/responses_api_message_wrapper.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/structures/openai → language_model_common-3.0.0/languagemodelcommon/structures/openai/request}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/structures/openai/request/chat_completion_api_request_wrapper.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/structures/openai/request/chat_request_wrapper.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/structures/openai/message → language_model_common-3.0.0/languagemodelcommon/tools}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/structures/openai/request → language_model_common-3.0.0/languagemodelcommon/tools/mcp}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/tools → language_model_common-3.0.0/languagemodelcommon/utilities}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/tools/mcp → language_model_common-3.0.0/languagemodelcommon/utilities/cache}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/cache/advisory_lock.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/cache/model_config_cache_store.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/chat_message_helpers.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/config_substitution.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities → language_model_common-3.0.0/languagemodelcommon/utilities/environment}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/environment/language_model_common_environment_variables.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/cache → language_model_common-3.0.0/languagemodelcommon/utilities/header_reader}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/header_reader/header_reader.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/environment → language_model_common-3.0.0/languagemodelcommon/utilities/logger}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/logger/debug_configuration.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/logger/exception_formatter.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/logger/exception_logger.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/logger/log_levels.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/logger/logging_response.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/logger/logging_transport.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/header_reader → language_model_common-3.0.0/languagemodelcommon/utilities/message_preprocessing}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/message_preprocessing/composite_message_preprocessor.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/mongo_url_utils.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/logger → language_model_common-3.0.0/languagemodelcommon/utilities/openai}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/openai/responses_api_converter.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/request_information.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/s3_url.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/message_preprocessing → language_model_common-3.0.0/languagemodelcommon/utilities/security}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/security/normalize.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/security/off_topic_detector.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/security/prompt_extraction_detector.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/security/prompt_sanitizer.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/security/url_validation.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/openai → language_model_common-3.0.0/languagemodelcommon/utilities/slash_command}/__init__.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/security → language_model_common-3.0.0/languagemodelcommon/utilities/slash_command/handlers}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/slash_command/handlers/debug_command_handler.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/slash_command/handlers/skill_command_handler.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/slash_command/slash_command_handler.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/slash_command/slash_command_parser.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/slash_command/slash_command_processor.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/text_humanizer.py +0 -0
- {language_model_common-2.1.2/languagemodelcommon/utilities/slash_command → language_model_common-3.0.0/languagemodelcommon/utilities/token_reducer}/__init__.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/token_reducer/token_reducer.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/tool_display_name_mapper.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/languagemodelcommon/utilities/url_parser.py +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/pyproject.toml +0 -0
- {language_model_common-2.1.2 → language_model_common-3.0.0}/setup.cfg +0 -0
{language_model_common-2.1.2/language_model_common.egg-info → language_model_common-3.0.0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: language-model-common
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Provides the underlying framework to enhance langchain and add loading configurations
|
|
5
5
|
Author-email: Imran Qureshi <imran.qureshi@bwell.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -46,7 +46,7 @@ A shared Python framework for building LLM-powered agent applications with LangC
|
|
|
46
46
|
|
|
47
47
|
- **Multi-source configuration loading** — Read LLM model configs from local filesystem, AWS S3, or GitHub repositories with TTL-based caching and client-specific overrides (see [config reader security notes](docs/config-reader-security.md))
|
|
48
48
|
- **LangGraph-to-OpenAI protocol conversion** — Stream LangGraph agent output as OpenAI-compatible Server-Sent Events (SSE) for chat completion APIs
|
|
49
|
-
- **MCP (Model Context Protocol)
|
|
49
|
+
- **MCP (Model Context Protocol) client toolkit** — Connect to and invoke tools on a single MCP server as LangChain-compatible tools, with session pooling, server-card discovery, and tool-result caching
|
|
50
50
|
- **Prompt template library** — Load and manage prompt templates from organized directory structures with GitHub auto-download support
|
|
51
51
|
- **File management abstraction** — Unified interface for local and AWS S3 storage with factory-based backend selection
|
|
52
52
|
- **Token and cost management** — Token reduction for long conversations and usage metadata tracking via tiktoken
|
|
@@ -123,18 +123,6 @@ manager = factory.create("s3://my-bucket")
|
|
|
123
123
|
await manager.save_file_async(file_data, "s3://my-bucket", "output.json", "application/json")
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
-
### MCP Tool Discovery
|
|
127
|
-
|
|
128
|
-
```python
|
|
129
|
-
from languagemodelcommon.mcp import ToolCatalog
|
|
130
|
-
|
|
131
|
-
catalog = ToolCatalog()
|
|
132
|
-
catalog.register_server("my-server", url="http://localhost:8080")
|
|
133
|
-
|
|
134
|
-
# BM25-ranked search for relevant tools
|
|
135
|
-
results = catalog.search("search patient records")
|
|
136
|
-
```
|
|
137
|
-
|
|
138
126
|
### Using the Dependency Injection Container
|
|
139
127
|
|
|
140
128
|
```python
|
|
@@ -6,7 +6,7 @@ A shared Python framework for building LLM-powered agent applications with LangC
|
|
|
6
6
|
|
|
7
7
|
- **Multi-source configuration loading** — Read LLM model configs from local filesystem, AWS S3, or GitHub repositories with TTL-based caching and client-specific overrides (see [config reader security notes](docs/config-reader-security.md))
|
|
8
8
|
- **LangGraph-to-OpenAI protocol conversion** — Stream LangGraph agent output as OpenAI-compatible Server-Sent Events (SSE) for chat completion APIs
|
|
9
|
-
- **MCP (Model Context Protocol)
|
|
9
|
+
- **MCP (Model Context Protocol) client toolkit** — Connect to and invoke tools on a single MCP server as LangChain-compatible tools, with session pooling, server-card discovery, and tool-result caching
|
|
10
10
|
- **Prompt template library** — Load and manage prompt templates from organized directory structures with GitHub auto-download support
|
|
11
11
|
- **File management abstraction** — Unified interface for local and AWS S3 storage with factory-based backend selection
|
|
12
12
|
- **Token and cost management** — Token reduction for long conversations and usage metadata tracking via tiktoken
|
|
@@ -83,18 +83,6 @@ manager = factory.create("s3://my-bucket")
|
|
|
83
83
|
await manager.save_file_async(file_data, "s3://my-bucket", "output.json", "application/json")
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
### MCP Tool Discovery
|
|
87
|
-
|
|
88
|
-
```python
|
|
89
|
-
from languagemodelcommon.mcp import ToolCatalog
|
|
90
|
-
|
|
91
|
-
catalog = ToolCatalog()
|
|
92
|
-
catalog.register_server("my-server", url="http://localhost:8080")
|
|
93
|
-
|
|
94
|
-
# BM25-ranked search for relevant tools
|
|
95
|
-
results = catalog.search("search patient records")
|
|
96
|
-
```
|
|
97
|
-
|
|
98
86
|
### Using the Dependency Injection Container
|
|
99
87
|
|
|
100
88
|
```python
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.0.0
|
{language_model_common-2.1.2 → language_model_common-3.0.0/language_model_common.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: language-model-common
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Provides the underlying framework to enhance langchain and add loading configurations
|
|
5
5
|
Author-email: Imran Qureshi <imran.qureshi@bwell.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -46,7 +46,7 @@ A shared Python framework for building LLM-powered agent applications with LangC
|
|
|
46
46
|
|
|
47
47
|
- **Multi-source configuration loading** — Read LLM model configs from local filesystem, AWS S3, or GitHub repositories with TTL-based caching and client-specific overrides (see [config reader security notes](docs/config-reader-security.md))
|
|
48
48
|
- **LangGraph-to-OpenAI protocol conversion** — Stream LangGraph agent output as OpenAI-compatible Server-Sent Events (SSE) for chat completion APIs
|
|
49
|
-
- **MCP (Model Context Protocol)
|
|
49
|
+
- **MCP (Model Context Protocol) client toolkit** — Connect to and invoke tools on a single MCP server as LangChain-compatible tools, with session pooling, server-card discovery, and tool-result caching
|
|
50
50
|
- **Prompt template library** — Load and manage prompt templates from organized directory structures with GitHub auto-download support
|
|
51
51
|
- **File management abstraction** — Unified interface for local and AWS S3 storage with factory-based backend selection
|
|
52
52
|
- **Token and cost management** — Token reduction for long conversations and usage metadata tracking via tiktoken
|
|
@@ -123,18 +123,6 @@ manager = factory.create("s3://my-bucket")
|
|
|
123
123
|
await manager.save_file_async(file_data, "s3://my-bucket", "output.json", "application/json")
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
-
### MCP Tool Discovery
|
|
127
|
-
|
|
128
|
-
```python
|
|
129
|
-
from languagemodelcommon.mcp import ToolCatalog
|
|
130
|
-
|
|
131
|
-
catalog = ToolCatalog()
|
|
132
|
-
catalog.register_server("my-server", url="http://localhost:8080")
|
|
133
|
-
|
|
134
|
-
# BM25-ranked search for relevant tools
|
|
135
|
-
results = catalog.search("search patient records")
|
|
136
|
-
```
|
|
137
|
-
|
|
138
126
|
### Using the Dependency Injection Container
|
|
139
127
|
|
|
140
128
|
```python
|
|
@@ -11,20 +11,9 @@ language_model_common.egg-info/top_level.txt
|
|
|
11
11
|
languagemodelcommon/__init__.py
|
|
12
12
|
languagemodelcommon/py.typed
|
|
13
13
|
languagemodelcommon/auth/__init__.py
|
|
14
|
-
languagemodelcommon/auth/oauth_provider_registrar.py
|
|
15
|
-
languagemodelcommon/auth/pass_through_token_manager.py
|
|
16
|
-
languagemodelcommon/auth/token_storage_auth_manager.py
|
|
17
14
|
languagemodelcommon/auth/authenticator/__init__.py
|
|
18
15
|
languagemodelcommon/auth/exceptions/__init__.py
|
|
19
|
-
languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py
|
|
20
|
-
languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py
|
|
21
|
-
languagemodelcommon/auth/exceptions/authorization_token_cache_item_not_found_exception.py
|
|
22
16
|
languagemodelcommon/auth/models/__init__.py
|
|
23
|
-
languagemodelcommon/auth/models/token_cache_item.py
|
|
24
|
-
languagemodelcommon/auth/token_exchange/__init__.py
|
|
25
|
-
languagemodelcommon/auth/token_exchange/token_exchange_manager.py
|
|
26
|
-
languagemodelcommon/auth/tools/__init__.py
|
|
27
|
-
languagemodelcommon/auth/tools/tool_auth_manager.py
|
|
28
17
|
languagemodelcommon/aws/__init__.py
|
|
29
18
|
languagemodelcommon/aws/aws_client_factory.py
|
|
30
19
|
languagemodelcommon/configs/__init__.py
|
|
@@ -90,33 +79,21 @@ languagemodelcommon/markdown/__init__.py
|
|
|
90
79
|
languagemodelcommon/markdown/html_to_markdown_converter.py
|
|
91
80
|
languagemodelcommon/mcp/__init__.py
|
|
92
81
|
languagemodelcommon/mcp/callbacks.py
|
|
93
|
-
languagemodelcommon/mcp/mcp_tool_provider.py
|
|
94
|
-
languagemodelcommon/mcp/tool_catalog.py
|
|
95
|
-
languagemodelcommon/mcp/tool_discovery_middleware.py
|
|
96
82
|
languagemodelcommon/mcp/auth/__init__.py
|
|
97
|
-
languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py
|
|
98
|
-
languagemodelcommon/mcp/auth/mcp_authorization_helper.py
|
|
99
83
|
languagemodelcommon/mcp/exceptions/__init__.py
|
|
100
|
-
languagemodelcommon/mcp/exceptions/mcp_tool_exception.py
|
|
101
|
-
languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py
|
|
102
|
-
languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py
|
|
103
|
-
languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py
|
|
104
84
|
languagemodelcommon/mcp/interceptors/__init__.py
|
|
105
|
-
languagemodelcommon/mcp/interceptors/auth.py
|
|
106
85
|
languagemodelcommon/mcp/interceptors/tracing.py
|
|
107
86
|
languagemodelcommon/mcp/interceptors/truncation.py
|
|
108
87
|
languagemodelcommon/mcp/interceptors/types.py
|
|
109
88
|
languagemodelcommon/mcp/mcp_client/__init__.py
|
|
110
89
|
languagemodelcommon/mcp/mcp_client/content_conversion.py
|
|
111
90
|
languagemodelcommon/mcp/mcp_client/langchain_adapter.py
|
|
112
|
-
languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py
|
|
113
91
|
languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py
|
|
114
92
|
languagemodelcommon/mcp/mcp_client/server_card_discovery.py
|
|
115
93
|
languagemodelcommon/mcp/mcp_client/session.py
|
|
116
94
|
languagemodelcommon/mcp/mcp_client/session_pool.py
|
|
117
95
|
languagemodelcommon/mcp/mcp_client/tool_invocation.py
|
|
118
96
|
languagemodelcommon/mcp/mcp_client/tool_list_cache.py
|
|
119
|
-
languagemodelcommon/mcp/mcp_client/ui_resource.py
|
|
120
97
|
languagemodelcommon/mocks/__init__.py
|
|
121
98
|
languagemodelcommon/mocks/mock_aws_client_factory.py
|
|
122
99
|
languagemodelcommon/mocks/mock_http_client_factory.py
|
|
@@ -157,8 +134,6 @@ languagemodelcommon/structures/openai/request/chat_request_wrapper.py
|
|
|
157
134
|
languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py
|
|
158
135
|
languagemodelcommon/tools/__init__.py
|
|
159
136
|
languagemodelcommon/tools/mcp/__init__.py
|
|
160
|
-
languagemodelcommon/tools/mcp/call_tool_tool.py
|
|
161
|
-
languagemodelcommon/tools/mcp/search_tools_tool.py
|
|
162
137
|
languagemodelcommon/utilities/__init__.py
|
|
163
138
|
languagemodelcommon/utilities/chat_message_helpers.py
|
|
164
139
|
languagemodelcommon/utilities/config_substitution.py
|
|
@@ -38,9 +38,6 @@ from languagemodelcommon.ocr.ocr_extractor_factory import OCRExtractorFactory
|
|
|
38
38
|
from languagemodelcommon.persistence.persistence_factory import PersistenceFactory
|
|
39
39
|
from key_value.aio.stores.base import BaseStore as KeyValueBaseStore
|
|
40
40
|
|
|
41
|
-
from languagemodelcommon.mcp.auth.auth_server_metadata_discovery import (
|
|
42
|
-
McpAuthServerDiscovery,
|
|
43
|
-
)
|
|
44
41
|
from languagemodelcommon.mcp.mcp_client.mcp_tool_list_store import McpToolListStore
|
|
45
42
|
from languagemodelcommon.mcp.mcp_client.server_card_discovery import (
|
|
46
43
|
ServerCardDiscovery,
|
|
@@ -165,10 +162,6 @@ class LanguageModelCommonContainerFactory:
|
|
|
165
162
|
container.singleton(
|
|
166
163
|
service_type=McpJsonFetcher, factory=_create_mcp_json_fetcher
|
|
167
164
|
)
|
|
168
|
-
container.singleton(
|
|
169
|
-
service_type=McpAuthServerDiscovery,
|
|
170
|
-
factory=lambda c: McpAuthServerDiscovery(),
|
|
171
|
-
)
|
|
172
165
|
container.singleton(
|
|
173
166
|
service_type=ServerCardDiscovery,
|
|
174
167
|
factory=lambda c: ServerCardDiscovery(),
|
|
@@ -53,8 +53,6 @@ from languagemodelcommon.converters.stream_debug_output_manager import (
|
|
|
53
53
|
from languagemodelcommon.converters.streaming_manager import LangGraphStreamingManager
|
|
54
54
|
from languagemodelcommon.exceptions.bailey_exception import BaileyException
|
|
55
55
|
from languagemodelcommon.exceptions.rate_limit_exception import RateLimitException
|
|
56
|
-
from languagemodelcommon.mcp.tool_catalog import ToolCatalog
|
|
57
|
-
from languagemodelcommon.mcp.tool_discovery_middleware import ToolDiscoveryMiddleware
|
|
58
56
|
from languagemodelcommon.converters.history_cache_middleware import (
|
|
59
57
|
HistoryCacheMiddleware,
|
|
60
58
|
)
|
|
@@ -1209,7 +1207,6 @@ class LangGraphToOpenAIConverter(StreamContextMixin):
|
|
|
1209
1207
|
store: BaseStore | None,
|
|
1210
1208
|
checkpointer: BaseCheckpointSaver[str] | None,
|
|
1211
1209
|
system_prompts: List[PromptConfig] | None = None,
|
|
1212
|
-
tool_catalog: ToolCatalog | None = None,
|
|
1213
1210
|
) -> CompiledStateGraph[MyMessagesState]:
|
|
1214
1211
|
"""
|
|
1215
1212
|
Create a graph for the language model asynchronously.
|
|
@@ -1225,7 +1222,6 @@ class LangGraphToOpenAIConverter(StreamContextMixin):
|
|
|
1225
1222
|
system_prompts: Optional list of PromptConfig objects. Each becomes a
|
|
1226
1223
|
separate content block in the system message. Blocks with cache=True
|
|
1227
1224
|
are marked for prompt caching (cache_control: ephemeral).
|
|
1228
|
-
tool_catalog: Optional tool catalog for tool discovery middleware
|
|
1229
1225
|
"""
|
|
1230
1226
|
prompt: SystemMessage | None = None
|
|
1231
1227
|
if system_prompts:
|
|
@@ -1261,8 +1257,6 @@ class LangGraphToOpenAIConverter(StreamContextMixin):
|
|
|
1261
1257
|
)
|
|
1262
1258
|
# Create the react agent with optional system prompt
|
|
1263
1259
|
middleware: list[AgentMiddleware] = []
|
|
1264
|
-
if tool_catalog is not None:
|
|
1265
|
-
middleware.append(ToolDiscoveryMiddleware(catalog=tool_catalog))
|
|
1266
1260
|
if self.environment_variables.enable_history_prompt_caching:
|
|
1267
1261
|
middleware.append(HistoryCacheMiddleware())
|
|
1268
1262
|
|
|
@@ -18,6 +18,29 @@ class StreamBufferManager:
|
|
|
18
18
|
self._flush_interval_seconds = flush_interval_seconds
|
|
19
19
|
self._enabled = enabled
|
|
20
20
|
self._buffer = StreamBuffer(chunks=[], last_flush_ts=time.monotonic())
|
|
21
|
+
self._last_emitted_char: str | None = None
|
|
22
|
+
self._pending_invocation_boundary = False
|
|
23
|
+
|
|
24
|
+
def mark_new_invocation_boundary(self) -> None:
|
|
25
|
+
"""Flag that the next content flows from a fresh chat-model invocation.
|
|
26
|
+
|
|
27
|
+
LangGraph re-invokes the chat model independently after each tool
|
|
28
|
+
call, so the resumed completion has no guaranteed leading whitespace
|
|
29
|
+
against whatever this request already streamed. The flag is consumed
|
|
30
|
+
by the next non-empty ``content_text`` passed to ``buffer_content``.
|
|
31
|
+
"""
|
|
32
|
+
self._pending_invocation_boundary = True
|
|
33
|
+
|
|
34
|
+
def _apply_invocation_boundary(self, *, content_text: str) -> str:
|
|
35
|
+
if not self._pending_invocation_boundary:
|
|
36
|
+
return content_text
|
|
37
|
+
self._pending_invocation_boundary = False
|
|
38
|
+
needs_separator = (
|
|
39
|
+
self._last_emitted_char is not None
|
|
40
|
+
and not self._last_emitted_char.isspace()
|
|
41
|
+
and not content_text[0].isspace()
|
|
42
|
+
)
|
|
43
|
+
return f" {content_text}" if needs_separator else content_text
|
|
21
44
|
|
|
22
45
|
async def buffer_content(
|
|
23
46
|
self,
|
|
@@ -25,6 +48,10 @@ class StreamBufferManager:
|
|
|
25
48
|
content_text: str,
|
|
26
49
|
force_flush: bool = False,
|
|
27
50
|
) -> str | None:
|
|
51
|
+
if content_text:
|
|
52
|
+
content_text = self._apply_invocation_boundary(content_text=content_text)
|
|
53
|
+
self._last_emitted_char = content_text[-1]
|
|
54
|
+
|
|
28
55
|
if not self._enabled:
|
|
29
56
|
existing_text = "".join(self._buffer.chunks) if self._buffer.chunks else ""
|
|
30
57
|
self._buffer.chunks.clear()
|
|
@@ -293,6 +293,11 @@ class LangGraphStreamingManager(StreamContextMixin):
|
|
|
293
293
|
chat_request_wrapper: ChatRequestWrapper,
|
|
294
294
|
request_information: RequestInformation,
|
|
295
295
|
) -> AsyncGenerator[str | None, None]:
|
|
296
|
+
# Each on_chat_model_start after the first marks a fresh model
|
|
297
|
+
# invocation (e.g. resuming after a tool call) whose first token has
|
|
298
|
+
# no guaranteed whitespace against what was already streamed -- see
|
|
299
|
+
# StreamBufferManager.mark_new_invocation_boundary.
|
|
300
|
+
self._stream_buffer_manager.mark_new_invocation_boundary()
|
|
296
301
|
yield None
|
|
297
302
|
|
|
298
303
|
async def _handle_on_chat_model_end(
|
|
@@ -19,8 +19,6 @@ from languagemodelcommon.history.conversation_history_manager import (
|
|
|
19
19
|
ConversationHistoryManager,
|
|
20
20
|
)
|
|
21
21
|
from languagemodelcommon.history.smart_history_manager import SmartHistoryManager
|
|
22
|
-
from languagemodelcommon.mcp.tool_catalog import ToolCatalog
|
|
23
|
-
from languagemodelcommon.mcp.tool_discovery_middleware import ToolDiscoveryMiddleware
|
|
24
22
|
from languagemodelcommon.state.messages_state import MyMessagesState
|
|
25
23
|
|
|
26
24
|
logger = logging.getLogger(__name__)
|
|
@@ -46,7 +44,6 @@ class GraphBuilder:
|
|
|
46
44
|
store: BaseStore | None,
|
|
47
45
|
checkpointer: BaseCheckpointSaver[str] | None,
|
|
48
46
|
system_prompts: List[str] | None = None,
|
|
49
|
-
tool_catalog: ToolCatalog | None = None,
|
|
50
47
|
max_messages: int = 20,
|
|
51
48
|
max_tokens: int = 4000,
|
|
52
49
|
) -> CompiledStateGraph[MyMessagesState]:
|
|
@@ -98,8 +95,6 @@ class GraphBuilder:
|
|
|
98
95
|
|
|
99
96
|
# Create react agent
|
|
100
97
|
middleware: list[AgentMiddleware] = []
|
|
101
|
-
if tool_catalog is not None:
|
|
102
|
-
middleware.append(ToolDiscoveryMiddleware(catalog=tool_catalog))
|
|
103
98
|
|
|
104
99
|
react_agent_runnable = create_agent(
|
|
105
100
|
model=llm,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.1.2
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
from oidcauthlib.auth.exceptions.authorization_needed_exception import (
|
|
2
|
-
AuthorizationNeededException,
|
|
3
|
-
)
|
|
4
|
-
from oidcauthlib.auth.models.token import Token
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class AuthorizationMcpToolTokenInvalidException(AuthorizationNeededException):
|
|
8
|
-
"""
|
|
9
|
-
Exception raised when a tool token is invalid.
|
|
10
|
-
This exception is used to indicate that the provided tool token does not meet the
|
|
11
|
-
required format or is not recognized by the authentication system.
|
|
12
|
-
It inherits from AuthorizationNeededException and provides additional context
|
|
13
|
-
about the invalid token and the tool URL.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
def __init__(self, *, message: str, token: Token | None, tool_url: str) -> None:
|
|
17
|
-
"""
|
|
18
|
-
Initialize the AuthorizationNeededException with a message and an optional token cache item.
|
|
19
|
-
"""
|
|
20
|
-
super().__init__(message=message)
|
|
21
|
-
self.message = message
|
|
22
|
-
self.token: Token | None = token
|
|
23
|
-
self.tool_url: str = tool_url
|
|
24
|
-
|
|
25
|
-
@staticmethod
|
|
26
|
-
def build_login_required_message(tool_name: str) -> str:
|
|
27
|
-
"""Build the user-facing prefix shown before login links."""
|
|
28
|
-
return (
|
|
29
|
-
f"I found a tool **{tool_name}** that can help with your task. "
|
|
30
|
-
"This tool requires you to log in below."
|
|
31
|
-
)
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
from oidcauthlib.auth.exceptions.authorization_needed_exception import (
|
|
2
|
-
AuthorizationNeededException,
|
|
3
|
-
)
|
|
4
|
-
|
|
5
|
-
from languagemodelcommon.auth.models.token_cache_item import TokenCacheItem
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class AuthorizationTokenCacheItemExpiredException(AuthorizationNeededException):
|
|
9
|
-
"""
|
|
10
|
-
Exception raised when a token cache item has expired.
|
|
11
|
-
This exception is used to indicate that the cached token is no longer valid
|
|
12
|
-
and needs to be refreshed or re-obtained.
|
|
13
|
-
It inherits from AuthorizationNeededException and provides a message to indicate the
|
|
14
|
-
nature of the error, along with an optional token cache item for further context.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
def __init__(
|
|
18
|
-
self, *, message: str, token_cache_item: TokenCacheItem | None
|
|
19
|
-
) -> None:
|
|
20
|
-
"""
|
|
21
|
-
Initialize the AuthorizationNeededException with a message and an optional token cache item.
|
|
22
|
-
"""
|
|
23
|
-
super().__init__(message=message)
|
|
24
|
-
self.message = message
|
|
25
|
-
self.token_cache_item: TokenCacheItem | None = token_cache_item
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
from oidcauthlib.auth.exceptions.authorization_needed_exception import (
|
|
2
|
-
AuthorizationNeededException,
|
|
3
|
-
)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class AuthorizationTokenCacheItemNotFoundException(AuthorizationNeededException):
|
|
7
|
-
"""
|
|
8
|
-
Exception raised when a token cache item is not found.
|
|
9
|
-
This exception is used to indicate that the requested token cache item does not exist
|
|
10
|
-
in the cache, which may occur if the token has never been cached or has been removed
|
|
11
|
-
due to expiration or other reasons.
|
|
12
|
-
It inherits from AuthorizationNeededException and provides a message to indicate the
|
|
13
|
-
nature of the error, along with an optional list of tool authentication audiences
|
|
14
|
-
that may be relevant for the authorization process.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
def __init__(self, *, message: str, tool_auth_providers: list[str] | None) -> None:
|
|
18
|
-
"""
|
|
19
|
-
Initialize the AuthorizationNeededException with a message and an optional token cache item.
|
|
20
|
-
"""
|
|
21
|
-
super().__init__(message=message)
|
|
22
|
-
self.message = message
|
|
23
|
-
self.tool_auth_providers = tool_auth_providers
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
from bson import ObjectId
|
|
4
|
-
from oidcauthlib.auth.models.base_db_model import BaseDbModel
|
|
5
|
-
from pydantic import Field
|
|
6
|
-
|
|
7
|
-
from datetime import datetime, UTC
|
|
8
|
-
|
|
9
|
-
from oidcauthlib.auth.models.token import Token
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TokenCacheItem(BaseDbModel):
|
|
13
|
-
"""
|
|
14
|
-
Represents a token cache item in the database.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
schema_version: Optional[str] = Field(
|
|
18
|
-
default=None,
|
|
19
|
-
description="Schema version of this cache entry. Used to filter out stale entries after schema changes.",
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
created: datetime = Field(
|
|
23
|
-
description="The creation time of the token as a datetime object."
|
|
24
|
-
)
|
|
25
|
-
updated: Optional[datetime] = Field(
|
|
26
|
-
default=None,
|
|
27
|
-
description="The last update time of the token as a datetime object.",
|
|
28
|
-
)
|
|
29
|
-
refreshed: Optional[datetime] = Field(
|
|
30
|
-
default=None,
|
|
31
|
-
description="The last refresh time of the token as a datetime object.",
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
auth_provider: str = Field(
|
|
35
|
-
description="The authentication provider associated with the token."
|
|
36
|
-
)
|
|
37
|
-
client_id: Optional[str] = Field(
|
|
38
|
-
default=None,
|
|
39
|
-
description="The client ID associated with the token, if applicable.",
|
|
40
|
-
)
|
|
41
|
-
issuer: str | None = Field(
|
|
42
|
-
default=None,
|
|
43
|
-
description="The issuer of the token, typically the authorization server.",
|
|
44
|
-
)
|
|
45
|
-
audience: str = Field(
|
|
46
|
-
description="The intended audience for the token, usually the resource server."
|
|
47
|
-
)
|
|
48
|
-
email: Optional[str] = Field(
|
|
49
|
-
description="The email associated with the token, used for user identification."
|
|
50
|
-
)
|
|
51
|
-
subject: str = Field(
|
|
52
|
-
description="The subject of the token, typically the user ID or unique identifier."
|
|
53
|
-
)
|
|
54
|
-
referring_email: Optional[str] = Field(
|
|
55
|
-
description="The email of the original token that is linked to this token, if applicable."
|
|
56
|
-
)
|
|
57
|
-
referring_subject: str = Field(
|
|
58
|
-
description="The subject of the original token that is linked to this token, if applicable."
|
|
59
|
-
)
|
|
60
|
-
referrer: Optional[str] = Field(
|
|
61
|
-
default=None, description="The URL associated with the token, if applicable."
|
|
62
|
-
)
|
|
63
|
-
access_token: Optional[Token] = Field(
|
|
64
|
-
default=None, description="The access token used for authentication."
|
|
65
|
-
)
|
|
66
|
-
id_token: Optional[Token] = Field(
|
|
67
|
-
default=None, description="The ID token containing user information."
|
|
68
|
-
)
|
|
69
|
-
refresh_token: Optional[Token] = Field(
|
|
70
|
-
default=None, description="The refresh token used to obtain new access tokens."
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
access_token_raw: Optional[str] = Field(
|
|
74
|
-
default=None,
|
|
75
|
-
description="The raw access token string. Stored because the access token may be opaque (non-JWT) for some providers (e.g., Atlassian).",
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
refresh_token_raw: Optional[str] = Field(
|
|
79
|
-
default=None,
|
|
80
|
-
description="The raw refresh token string, stored for use in token refresh operations. This is necessary because the refresh token may not be a JWT and may not have the same structure as access or ID tokens.",
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
def is_valid_id_token(self) -> bool:
|
|
84
|
-
"""
|
|
85
|
-
Check if the token is valid based on its expiration time.
|
|
86
|
-
Returns:
|
|
87
|
-
bool: True if the token is valid, False otherwise.
|
|
88
|
-
"""
|
|
89
|
-
return self.id_token.is_valid() if self.id_token else False
|
|
90
|
-
|
|
91
|
-
def is_valid_refresh_token(self) -> bool:
|
|
92
|
-
"""
|
|
93
|
-
Check if the refresh token is valid based on its expiration time.
|
|
94
|
-
Returns:
|
|
95
|
-
bool: True if the refresh token is valid, False otherwise.
|
|
96
|
-
"""
|
|
97
|
-
return self.refresh_token.is_valid() if self.refresh_token else False
|
|
98
|
-
|
|
99
|
-
def is_valid_access_token(self) -> bool:
|
|
100
|
-
"""
|
|
101
|
-
Check if the access token is valid based on its expiration time.
|
|
102
|
-
For opaque tokens (no decoded Token object), returns True if a raw
|
|
103
|
-
access token string exists since expiry cannot be determined locally.
|
|
104
|
-
Returns:
|
|
105
|
-
bool: True if the access token is valid, False otherwise.
|
|
106
|
-
"""
|
|
107
|
-
if self.access_token:
|
|
108
|
-
return self.access_token.is_valid()
|
|
109
|
-
# Opaque token — we have the raw string but can't check expiry locally
|
|
110
|
-
return self.access_token_raw is not None
|
|
111
|
-
|
|
112
|
-
def get_access_token_string(self) -> Optional[str]:
|
|
113
|
-
"""
|
|
114
|
-
Gets the raw access token string, preferring the decoded Token's string
|
|
115
|
-
but falling back to access_token_raw for opaque tokens.
|
|
116
|
-
"""
|
|
117
|
-
if self.access_token:
|
|
118
|
-
return self.access_token.token
|
|
119
|
-
return self.access_token_raw
|
|
120
|
-
|
|
121
|
-
def get_access_token(self) -> Optional[Token]:
|
|
122
|
-
"""
|
|
123
|
-
Gets the access token Token object if available.
|
|
124
|
-
Returns:
|
|
125
|
-
Optional[Token]: The access token if present, otherwise None.
|
|
126
|
-
"""
|
|
127
|
-
return self.access_token if self.access_token else None
|
|
128
|
-
|
|
129
|
-
def get_id_token(self) -> Optional[Token]:
|
|
130
|
-
"""
|
|
131
|
-
Gets the ID token if it is valid, otherwise returns the access token.
|
|
132
|
-
Returns:
|
|
133
|
-
Optional[str]: The id token if valid, otherwise the access token.
|
|
134
|
-
"""
|
|
135
|
-
return self.id_token if self.id_token else None
|
|
136
|
-
|
|
137
|
-
def get_refresh_token(self) -> Optional[Token]:
|
|
138
|
-
"""
|
|
139
|
-
Gets the refresh token if it is valid.
|
|
140
|
-
Returns:
|
|
141
|
-
Optional[str]: The refresh token if valid, otherwise None.
|
|
142
|
-
"""
|
|
143
|
-
return self.refresh_token if self.refresh_token else None
|
|
144
|
-
|
|
145
|
-
@classmethod
|
|
146
|
-
def create(
|
|
147
|
-
cls,
|
|
148
|
-
*,
|
|
149
|
-
token: Token,
|
|
150
|
-
auth_provider: str,
|
|
151
|
-
referring_email: Optional[str],
|
|
152
|
-
referring_subject: str,
|
|
153
|
-
) -> "TokenCacheItem":
|
|
154
|
-
# see what the token this is
|
|
155
|
-
|
|
156
|
-
audience: str | None = None
|
|
157
|
-
if isinstance(token.audience, list):
|
|
158
|
-
if len(token.audience) == 1:
|
|
159
|
-
audience = token.audience[0]
|
|
160
|
-
elif isinstance(token.audience, str):
|
|
161
|
-
audience = token.audience
|
|
162
|
-
|
|
163
|
-
if audience is None:
|
|
164
|
-
raise ValueError("Audience must be a string or a list with one string.")
|
|
165
|
-
|
|
166
|
-
if token.subject is None:
|
|
167
|
-
raise ValueError("Token must have a subject claim.")
|
|
168
|
-
|
|
169
|
-
token_cache_item: TokenCacheItem = TokenCacheItem(
|
|
170
|
-
id=ObjectId(),
|
|
171
|
-
created=datetime.now(UTC),
|
|
172
|
-
updated=None,
|
|
173
|
-
refreshed=None,
|
|
174
|
-
auth_provider=auth_provider,
|
|
175
|
-
issuer=token.issuer,
|
|
176
|
-
audience=audience,
|
|
177
|
-
email=token.email or referring_email,
|
|
178
|
-
subject=token.subject or referring_subject,
|
|
179
|
-
referrer=None,
|
|
180
|
-
access_token=token,
|
|
181
|
-
id_token=None,
|
|
182
|
-
refresh_token=None,
|
|
183
|
-
referring_email=referring_email,
|
|
184
|
-
referring_subject=referring_subject,
|
|
185
|
-
)
|
|
186
|
-
if token.is_id_token:
|
|
187
|
-
token_cache_item.id_token = token
|
|
188
|
-
elif token.is_access_token:
|
|
189
|
-
token_cache_item.access_token = token
|
|
190
|
-
elif token.is_refresh_token:
|
|
191
|
-
token_cache_item.refresh_token = token
|
|
192
|
-
else:
|
|
193
|
-
raise ValueError(
|
|
194
|
-
f"Token type must be id, bearer or refresh but was: {token.token_type}"
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
return token_cache_item
|
|
198
|
-
|
|
199
|
-
def is_expired(self) -> bool:
|
|
200
|
-
"""
|
|
201
|
-
Check if the token cache item is expired based on the access token.
|
|
202
|
-
For opaque tokens, returns False (not expired) if a raw access token exists.
|
|
203
|
-
Returns:
|
|
204
|
-
bool: True if the access token is expired, False otherwise.
|
|
205
|
-
"""
|
|
206
|
-
return (
|
|
207
|
-
not self.id_token.is_valid()
|
|
208
|
-
if self.id_token
|
|
209
|
-
else not self.access_token.is_valid()
|
|
210
|
-
if self.access_token
|
|
211
|
-
else self.access_token_raw is None
|
|
212
|
-
)
|