language-model-common 2.1.0__tar.gz → 2.1.2__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.0/language_model_common.egg-info → language_model_common-2.1.2}/PKG-INFO +1 -1
- language_model_common-2.1.2/VERSION +1 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2/language_model_common.egg-info}/PKG-INFO +1 -1
- {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/SOURCES.txt +1 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/config_reader.py +33 -11
- language_model_common-2.1.2/languagemodelcommon/converters/history_cache_middleware.py +66 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/langgraph_to_openai_converter.py +5 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/tool_event_handlers.py +2 -2
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/environment/language_model_common_environment_variables.py +13 -0
- language_model_common-2.1.0/VERSION +0 -1
- {language_model_common-2.1.0 → language_model_common-2.1.2}/LICENSE +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/MANIFEST.in +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/README.md +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/dependency_links.txt +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/requires.txt +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/top_level.txt +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/token_reducer → language_model_common-2.1.2/languagemodelcommon}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/slash_command/handlers → language_model_common-2.1.2/languagemodelcommon/auth}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/slash_command → language_model_common-2.1.2/languagemodelcommon/auth/authenticator}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/security → language_model_common-2.1.2/languagemodelcommon/auth/exceptions}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_not_found_exception.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/openai → language_model_common-2.1.2/languagemodelcommon/auth/models}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/models/token_cache_item.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/oauth_provider_registrar.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/pass_through_token_manager.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/message_preprocessing → language_model_common-2.1.2/languagemodelcommon/auth/token_exchange}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/token_exchange/token_exchange_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/token_storage_auth_manager.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/logger → language_model_common-2.1.2/languagemodelcommon/auth/tools}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/tools/tool_auth_manager.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/header_reader → language_model_common-2.1.2/languagemodelcommon/aws}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/aws/aws_client_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/environment → language_model_common-2.1.2/languagemodelcommon/configs}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities/cache → language_model_common-2.1.2/languagemodelcommon/configs/config_reader}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/file_config_reader.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/github_directory_downloader.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/github_directory_helper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/mcp_json_fetcher.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/mcp_json_reader.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/s3_config_reader.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/utilities → language_model_common-2.1.2/languagemodelcommon/configs/prompt_library}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/prompt_library/prompt_library_environment_variables.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/prompt_library/prompt_library_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/prompt_library/prompt_store.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/tools/mcp → language_model_common-2.1.2/languagemodelcommon/configs/schemas}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/schemas/config_schema.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/schemas/mcp_json_schema.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/tools → language_model_common-2.1.2/languagemodelcommon/container}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/container/container_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/structures/openai/request → language_model_common-2.1.2/languagemodelcommon/context}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/context/request_context.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/structures/openai/message → language_model_common-2.1.2/languagemodelcommon/converters}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/stream_buffer.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/stream_context_mixin.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/stream_debug_output_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/streaming_formatters.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/streaming_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/streaming_tool_node.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/structures/openai → language_model_common-2.1.2/languagemodelcommon/exceptions}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/exceptions/bailey_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/exceptions/rate_limit_exception.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/structures → language_model_common-2.1.2/languagemodelcommon/file_managers}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/aws_s3_file_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/file_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/file_manager_factory.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/file_writer.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/local_file_manager.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/state → language_model_common-2.1.2/languagemodelcommon/github}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/github/token_provider.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/schema/openai → language_model_common-2.1.2/languagemodelcommon/graph}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/graph/graph_builder.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/schema → language_model_common-2.1.2/languagemodelcommon/history}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/history/context_compactor.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/history/conversation_history_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/history/smart_history_manager.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/pipeline/steps → language_model_common-2.1.2/languagemodelcommon/http}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/http/http_client_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/pipeline/output → language_model_common-2.1.2/languagemodelcommon/image_generation}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/aws_image_generator.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/image_generator.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/image_generator_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/pipeline → language_model_common-2.1.2/languagemodelcommon/image_generation/managers}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/managers/image_generation_manager.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/openai_image_generator.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/persistence → language_model_common-2.1.2/languagemodelcommon/image_generation/providers}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/providers/base_image_generation_provider.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/providers/image_generation_provider.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/ocr → language_model_common-2.1.2/languagemodelcommon/markdown}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/markdown/html_to_markdown_converter.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/models → language_model_common-2.1.2/languagemodelcommon/mcp}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/mocks → language_model_common-2.1.2/languagemodelcommon/mcp/auth}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/auth/mcp_authorization_helper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/callbacks.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/mcp/mcp_client → language_model_common-2.1.2/languagemodelcommon/mcp/exceptions}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/auth.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/tracing.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/truncation.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/types.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/mcp/exceptions → language_model_common-2.1.2/languagemodelcommon/mcp/mcp_client}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/content_conversion.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/langchain_adapter.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/server_card_discovery.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/session.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/session_pool.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/tool_invocation.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/tool_list_cache.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/ui_resource.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_tool_provider.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/tool_catalog.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/tool_discovery_middleware.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/mcp/auth → language_model_common-2.1.2/languagemodelcommon/mocks}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_aws_client_factory.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_http_client_factory.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_image_generator.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_image_generator_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/mcp → language_model_common-2.1.2/languagemodelcommon/models}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/models/bedrock_models.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/models/model_factory.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/models/sanitizing_bedrock_converse.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/markdown → language_model_common-2.1.2/languagemodelcommon/ocr}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/aws_ocr_extractor.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/ocr_extractor.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/ocr_extractor_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/image_generation/providers → language_model_common-2.1.2/languagemodelcommon/persistence}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/persistence/persistence_factory.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/image_generation/managers → language_model_common-2.1.2/languagemodelcommon/pipeline}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/context.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/image_generation → language_model_common-2.1.2/languagemodelcommon/pipeline/output}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/pipeline.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/step.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/http → language_model_common-2.1.2/languagemodelcommon/pipeline/steps}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/py.typed +0 -0
- {language_model_common-2.1.0/languagemodelcommon/history → language_model_common-2.1.2/languagemodelcommon/schema}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/graph → language_model_common-2.1.2/languagemodelcommon/schema/openai}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/schema/openai/completions.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/schema/openai/image_generation.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/schema/openai/responses.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/github → language_model_common-2.1.2/languagemodelcommon/state}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/state/messages_state.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/file_managers → language_model_common-2.1.2/languagemodelcommon/structures}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/exceptions → language_model_common-2.1.2/languagemodelcommon/structures/openai}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/converters → language_model_common-2.1.2/languagemodelcommon/structures/openai/message}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/message/chat_completion_api_message_wrapper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/message/chat_message_wrapper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/message/responses_api_message_wrapper.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/context → language_model_common-2.1.2/languagemodelcommon/structures/openai/request}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/request/chat_completion_api_request_wrapper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/request/chat_request_wrapper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/container → language_model_common-2.1.2/languagemodelcommon/tools}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/configs/schemas → language_model_common-2.1.2/languagemodelcommon/tools/mcp}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/tools/mcp/call_tool_tool.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/tools/mcp/search_tools_tool.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/configs/prompt_library → language_model_common-2.1.2/languagemodelcommon/utilities}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/configs/config_reader → language_model_common-2.1.2/languagemodelcommon/utilities/cache}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/cache/advisory_lock.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/cache/model_config_cache_store.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/chat_message_helpers.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/config_substitution.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/configs → language_model_common-2.1.2/languagemodelcommon/utilities/environment}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/aws → language_model_common-2.1.2/languagemodelcommon/utilities/header_reader}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/header_reader/header_reader.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/auth/tools → language_model_common-2.1.2/languagemodelcommon/utilities/logger}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/debug_configuration.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/exception_formatter.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/exception_logger.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/log_levels.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/logging_response.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/logging_transport.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/auth/token_exchange → language_model_common-2.1.2/languagemodelcommon/utilities/message_preprocessing}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/message_preprocessing/composite_message_preprocessor.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/mongo_url_utils.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/auth/models → language_model_common-2.1.2/languagemodelcommon/utilities/openai}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/openai/responses_api_converter.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/request_information.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/s3_url.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/auth/exceptions → language_model_common-2.1.2/languagemodelcommon/utilities/security}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/normalize.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/off_topic_detector.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/prompt_extraction_detector.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/prompt_sanitizer.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/url_validation.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/auth/authenticator → language_model_common-2.1.2/languagemodelcommon/utilities/slash_command}/__init__.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon/auth → language_model_common-2.1.2/languagemodelcommon/utilities/slash_command/handlers}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/handlers/debug_command_handler.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/handlers/skill_command_handler.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/slash_command_handler.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/slash_command_parser.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/slash_command_processor.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/text_humanizer.py +0 -0
- {language_model_common-2.1.0/languagemodelcommon → language_model_common-2.1.2/languagemodelcommon/utilities/token_reducer}/__init__.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/token_reducer/token_reducer.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/tool_display_name_mapper.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/url_parser.py +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/pyproject.toml +0 -0
- {language_model_common-2.1.0 → language_model_common-2.1.2}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.2
|
|
@@ -48,6 +48,7 @@ languagemodelcommon/container/container_factory.py
|
|
|
48
48
|
languagemodelcommon/context/__init__.py
|
|
49
49
|
languagemodelcommon/context/request_context.py
|
|
50
50
|
languagemodelcommon/converters/__init__.py
|
|
51
|
+
languagemodelcommon/converters/history_cache_middleware.py
|
|
51
52
|
languagemodelcommon/converters/langgraph_to_openai_converter.py
|
|
52
53
|
languagemodelcommon/converters/stream_buffer.py
|
|
53
54
|
languagemodelcommon/converters/stream_context_mixin.py
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import hashlib
|
|
2
3
|
import logging
|
|
3
4
|
|
|
4
5
|
from pathlib import Path
|
|
@@ -108,7 +109,7 @@ class ConfigReader:
|
|
|
108
109
|
models_testing_path: Optional[str],
|
|
109
110
|
) -> List[ChatModelConfig]:
|
|
110
111
|
# Read from MongoDB model config cache
|
|
111
|
-
models = await self._read_from_model_config_cache()
|
|
112
|
+
models = await self._read_from_model_config_cache(config_path=config_path)
|
|
112
113
|
if models:
|
|
113
114
|
return models
|
|
114
115
|
|
|
@@ -119,7 +120,7 @@ class ConfigReader:
|
|
|
119
120
|
|
|
120
121
|
async with self._lock:
|
|
121
122
|
# Double-check after acquiring lock
|
|
122
|
-
models = await self._read_from_model_config_cache()
|
|
123
|
+
models = await self._read_from_model_config_cache(config_path=config_path)
|
|
123
124
|
if models:
|
|
124
125
|
return models
|
|
125
126
|
|
|
@@ -145,17 +146,33 @@ class ConfigReader:
|
|
|
145
146
|
)
|
|
146
147
|
return models
|
|
147
148
|
|
|
148
|
-
await self._write_to_model_config_cache(
|
|
149
|
+
await self._write_to_model_config_cache(
|
|
150
|
+
models=models, config_path=config_path
|
|
151
|
+
)
|
|
149
152
|
return models
|
|
150
153
|
|
|
151
|
-
|
|
152
|
-
|
|
154
|
+
@staticmethod
|
|
155
|
+
def _config_ref_hash(*, config_path: str) -> str:
|
|
156
|
+
"""Short hash identifying the config source (including its ref/tag).
|
|
157
|
+
|
|
158
|
+
Scopes cache keys by source so that pods on different config refs
|
|
159
|
+
(e.g. mid-rollout, where an old pod's MODELS_OFFICIAL_PATH still
|
|
160
|
+
points at a stale ref) never read or write each other's cached
|
|
161
|
+
content under the same key -- see BAI-720.
|
|
162
|
+
"""
|
|
163
|
+
return hashlib.sha256(config_path.encode("utf-8")).hexdigest()[:12]
|
|
164
|
+
|
|
165
|
+
def _model_config_cache_key(self, *, config_path: str, model_name: str) -> str:
|
|
166
|
+
ref_hash = self._config_ref_hash(config_path=config_path)
|
|
167
|
+
return f"v{self.SCHEMA_VERSION}:{ref_hash}:{model_name}"
|
|
153
168
|
|
|
154
|
-
async def _read_from_model_config_cache(
|
|
169
|
+
async def _read_from_model_config_cache(
|
|
170
|
+
self, *, config_path: str
|
|
171
|
+
) -> List[ChatModelConfig] | None:
|
|
155
172
|
"""Load model configs from the model config cache (one row per model).
|
|
156
173
|
|
|
157
174
|
Scans the collection for all entries matching the current schema
|
|
158
|
-
version prefix.
|
|
175
|
+
version and config-source prefix.
|
|
159
176
|
|
|
160
177
|
Returns ``None`` when the cache has no entries.
|
|
161
178
|
Raises on store or deserialization errors so that a misconfigured
|
|
@@ -163,7 +180,8 @@ class ConfigReader:
|
|
|
163
180
|
"""
|
|
164
181
|
if not self._model_config_cache_store:
|
|
165
182
|
return None
|
|
166
|
-
|
|
183
|
+
ref_hash = self._config_ref_hash(config_path=config_path)
|
|
184
|
+
prefix = f"v{self.SCHEMA_VERSION}:{ref_hash}:"
|
|
167
185
|
model_keys = await self._get_cache_keys_by_prefix(prefix=prefix)
|
|
168
186
|
if not model_keys:
|
|
169
187
|
return None
|
|
@@ -205,7 +223,9 @@ class ConfigReader:
|
|
|
205
223
|
|
|
206
224
|
return []
|
|
207
225
|
|
|
208
|
-
async def _write_to_model_config_cache(
|
|
226
|
+
async def _write_to_model_config_cache(
|
|
227
|
+
self, *, models: List[ChatModelConfig], config_path: str
|
|
228
|
+
) -> None:
|
|
209
229
|
"""Store each model config as a separate row in the cache.
|
|
210
230
|
|
|
211
231
|
Raises on write errors so that a misconfigured cache backend
|
|
@@ -215,7 +235,9 @@ class ConfigReader:
|
|
|
215
235
|
return
|
|
216
236
|
ttl = self._environment_variables.model_config_cache_ttl_seconds
|
|
217
237
|
for model in models:
|
|
218
|
-
key = self._model_config_cache_key(
|
|
238
|
+
key = self._model_config_cache_key(
|
|
239
|
+
config_path=config_path, model_name=model.name
|
|
240
|
+
)
|
|
219
241
|
await self._model_config_cache_store.put(
|
|
220
242
|
key,
|
|
221
243
|
model.model_dump(),
|
|
@@ -471,7 +493,7 @@ class ConfigReader:
|
|
|
471
493
|
"""
|
|
472
494
|
logger.info("Retrying MCP server resolution for models with unresolved refs")
|
|
473
495
|
await self._resolve_mcp_servers_async(models=models, config_path=config_path)
|
|
474
|
-
await self._write_to_model_config_cache(models)
|
|
496
|
+
await self._write_to_model_config_cache(models=models, config_path=config_path)
|
|
475
497
|
unresolved = self._get_unresolved_mcp_servers(models)
|
|
476
498
|
if unresolved:
|
|
477
499
|
fetcher_url = (
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from typing import Any, Awaitable, Callable
|
|
2
|
+
|
|
3
|
+
from langchain.agents.middleware import (
|
|
4
|
+
AgentMiddleware,
|
|
5
|
+
ExtendedModelResponse,
|
|
6
|
+
ModelRequest,
|
|
7
|
+
ModelResponse,
|
|
8
|
+
)
|
|
9
|
+
from langchain_aws import ChatAnthropicBedrock
|
|
10
|
+
from langchain_core.messages import AIMessage, ToolMessage
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class HistoryCacheMiddleware(AgentMiddleware):
|
|
14
|
+
"""Caches conversation/tool-call history within a multi-round tool-calling turn.
|
|
15
|
+
|
|
16
|
+
Anchors a `cache_control` breakpoint at the end of the message list before
|
|
17
|
+
each model call after the first in a turn, so repeat calls read prior
|
|
18
|
+
history from cache instead of resending it at full price. `ChatAnthropicBedrock`
|
|
19
|
+
(via `langchain_anthropic`'s `_apply_cache_control_to_last_eligible_block`)
|
|
20
|
+
recomputes the breakpoint's position from the live message list on every
|
|
21
|
+
call, so it always re-anchors to the current last message rather than a
|
|
22
|
+
fixed offset -- including after any history trimming -- with no
|
|
23
|
+
bookkeeping needed here.
|
|
24
|
+
|
|
25
|
+
Scoped to within-turn only (BAI-706 ADR, Phase 2 / Option C). Cross-turn
|
|
26
|
+
history caching is a separate, larger follow-up requiring its own PHI
|
|
27
|
+
review and is explicitly out of scope.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
async def awrap_model_call(
|
|
31
|
+
self,
|
|
32
|
+
request: ModelRequest[Any],
|
|
33
|
+
handler: Callable[[ModelRequest[Any]], Awaitable[ModelResponse[Any]]],
|
|
34
|
+
) -> ModelResponse[Any] | AIMessage | ExtendedModelResponse[Any]:
|
|
35
|
+
if not self._should_cache(request):
|
|
36
|
+
return await handler(request)
|
|
37
|
+
return await handler(self._with_cache_control(request))
|
|
38
|
+
|
|
39
|
+
def wrap_model_call(
|
|
40
|
+
self,
|
|
41
|
+
request: ModelRequest[Any],
|
|
42
|
+
handler: Callable[[ModelRequest[Any]], ModelResponse[Any]],
|
|
43
|
+
) -> ModelResponse[Any] | AIMessage | ExtendedModelResponse[Any]:
|
|
44
|
+
if not self._should_cache(request):
|
|
45
|
+
return handler(request)
|
|
46
|
+
return handler(self._with_cache_control(request))
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def _should_cache(request: ModelRequest[Any]) -> bool:
|
|
50
|
+
"""Only cache from the second model call in a turn onward.
|
|
51
|
+
|
|
52
|
+
A `ToolMessage` in the message list means at least one full
|
|
53
|
+
model -> tool -> result round-trip already happened, i.e. this is a
|
|
54
|
+
subsequent call. The first call has no prior history worth reading
|
|
55
|
+
from cache, and tagging it would only add a write premium with no
|
|
56
|
+
matching read if the turn never calls a tool.
|
|
57
|
+
"""
|
|
58
|
+
if not isinstance(request.model, ChatAnthropicBedrock):
|
|
59
|
+
return False
|
|
60
|
+
return any(isinstance(message, ToolMessage) for message in request.messages)
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def _with_cache_control(request: ModelRequest[Any]) -> ModelRequest[Any]:
|
|
64
|
+
model_settings = dict(request.model_settings)
|
|
65
|
+
model_settings["cache_control"] = {"type": "ephemeral"}
|
|
66
|
+
return request.override(model_settings=model_settings)
|
|
@@ -55,6 +55,9 @@ from languagemodelcommon.exceptions.bailey_exception import BaileyException
|
|
|
55
55
|
from languagemodelcommon.exceptions.rate_limit_exception import RateLimitException
|
|
56
56
|
from languagemodelcommon.mcp.tool_catalog import ToolCatalog
|
|
57
57
|
from languagemodelcommon.mcp.tool_discovery_middleware import ToolDiscoveryMiddleware
|
|
58
|
+
from languagemodelcommon.converters.history_cache_middleware import (
|
|
59
|
+
HistoryCacheMiddleware,
|
|
60
|
+
)
|
|
58
61
|
from languagemodelcommon.state.messages_state import MyMessagesState
|
|
59
62
|
from languagemodelcommon.structures.openai.message.chat_message_wrapper import (
|
|
60
63
|
ChatMessageWrapper,
|
|
@@ -1260,6 +1263,8 @@ class LangGraphToOpenAIConverter(StreamContextMixin):
|
|
|
1260
1263
|
middleware: list[AgentMiddleware] = []
|
|
1261
1264
|
if tool_catalog is not None:
|
|
1262
1265
|
middleware.append(ToolDiscoveryMiddleware(catalog=tool_catalog))
|
|
1266
|
+
if self.environment_variables.enable_history_prompt_caching:
|
|
1267
|
+
middleware.append(HistoryCacheMiddleware())
|
|
1263
1268
|
|
|
1264
1269
|
react_agent_runnable = create_agent(
|
|
1265
1270
|
model=llm,
|
|
@@ -378,10 +378,10 @@ class ToolEventHandler(StreamContextMixin):
|
|
|
378
378
|
|
|
379
379
|
if self._environment_variables.write_tool_output_to_file:
|
|
380
380
|
error_content: str = (
|
|
381
|
-
f"Tool: {tool_name}\nError: {
|
|
381
|
+
f"Tool: {tool_name}\nError: {display_message}\nRuntime: {runtime_str}"
|
|
382
382
|
)
|
|
383
383
|
self._stream_debug_output_manager.append_fragment(
|
|
384
|
-
text=f"\n--- Tool Error: {tool_name} ({runtime_str}) ---\n{
|
|
384
|
+
text=f"\n--- Tool Error: {tool_name} ({runtime_str}) ---\n{display_message}\n",
|
|
385
385
|
)
|
|
386
386
|
tool_display_name: str = self._tool_display_name_mapper.get_name_for_tool(
|
|
387
387
|
tool_name=tool_name or "unknown",
|
|
@@ -236,6 +236,19 @@ class LanguageModelCommonEnvironmentVariables(
|
|
|
236
236
|
"""When True, automatically compact conversation context on input-too-long errors."""
|
|
237
237
|
return self.str2bool(os.environ.get("CONTEXT_COMPACTION_ENABLED", "true"))
|
|
238
238
|
|
|
239
|
+
@property
|
|
240
|
+
def enable_history_prompt_caching(self) -> bool:
|
|
241
|
+
"""When True, cache conversation/tool-call history within a tool-calling turn.
|
|
242
|
+
|
|
243
|
+
Defaults to False. Conversation messages (patient questions, clinical
|
|
244
|
+
note contents, tool results containing FHIR resources) are far more
|
|
245
|
+
likely to contain PHI than the system prompt or tool schemas that are
|
|
246
|
+
already cached today. This must stay off until security/EA confirm
|
|
247
|
+
Bedrock prompt-cache storage is covered by existing PHI/BAA
|
|
248
|
+
commitments (BAI-706 ADR Open Question 4) — do not flip this default.
|
|
249
|
+
"""
|
|
250
|
+
return self.str2bool(os.environ.get("ENABLE_HISTORY_PROMPT_CACHING", "false"))
|
|
251
|
+
|
|
239
252
|
@property
|
|
240
253
|
def rate_limit_retry_enabled(self) -> bool:
|
|
241
254
|
"""When True, retry upstream model rate limits (HTTP 429) before surfacing them."""
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.1.0
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/callbacks.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
|
|
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.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/tool_catalog.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
|
{language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/ocr_extractor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/context.py
RENAMED
|
File without changes
|
|
File without changes
|
{language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/pipeline.py
RENAMED
|
File without changes
|
{language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/step.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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
{language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/s3_url.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|