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.
Files changed (207) hide show
  1. {language_model_common-2.1.0/language_model_common.egg-info → language_model_common-2.1.2}/PKG-INFO +1 -1
  2. language_model_common-2.1.2/VERSION +1 -0
  3. {language_model_common-2.1.0 → language_model_common-2.1.2/language_model_common.egg-info}/PKG-INFO +1 -1
  4. {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/SOURCES.txt +1 -0
  5. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/config_reader.py +33 -11
  6. language_model_common-2.1.2/languagemodelcommon/converters/history_cache_middleware.py +66 -0
  7. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/langgraph_to_openai_converter.py +5 -0
  8. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/tool_event_handlers.py +2 -2
  9. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/environment/language_model_common_environment_variables.py +13 -0
  10. language_model_common-2.1.0/VERSION +0 -1
  11. {language_model_common-2.1.0 → language_model_common-2.1.2}/LICENSE +0 -0
  12. {language_model_common-2.1.0 → language_model_common-2.1.2}/MANIFEST.in +0 -0
  13. {language_model_common-2.1.0 → language_model_common-2.1.2}/README.md +0 -0
  14. {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/dependency_links.txt +0 -0
  15. {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/requires.txt +0 -0
  16. {language_model_common-2.1.0 → language_model_common-2.1.2}/language_model_common.egg-info/top_level.txt +0 -0
  17. {language_model_common-2.1.0/languagemodelcommon/utilities/token_reducer → language_model_common-2.1.2/languagemodelcommon}/__init__.py +0 -0
  18. {language_model_common-2.1.0/languagemodelcommon/utilities/slash_command/handlers → language_model_common-2.1.2/languagemodelcommon/auth}/__init__.py +0 -0
  19. {language_model_common-2.1.0/languagemodelcommon/utilities/slash_command → language_model_common-2.1.2/languagemodelcommon/auth/authenticator}/__init__.py +0 -0
  20. {language_model_common-2.1.0/languagemodelcommon/utilities/security → language_model_common-2.1.2/languagemodelcommon/auth/exceptions}/__init__.py +0 -0
  21. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py +0 -0
  22. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py +0 -0
  23. {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
  24. {language_model_common-2.1.0/languagemodelcommon/utilities/openai → language_model_common-2.1.2/languagemodelcommon/auth/models}/__init__.py +0 -0
  25. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/models/token_cache_item.py +0 -0
  26. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/oauth_provider_registrar.py +0 -0
  27. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/pass_through_token_manager.py +0 -0
  28. {language_model_common-2.1.0/languagemodelcommon/utilities/message_preprocessing → language_model_common-2.1.2/languagemodelcommon/auth/token_exchange}/__init__.py +0 -0
  29. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/token_exchange/token_exchange_manager.py +0 -0
  30. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/token_storage_auth_manager.py +0 -0
  31. {language_model_common-2.1.0/languagemodelcommon/utilities/logger → language_model_common-2.1.2/languagemodelcommon/auth/tools}/__init__.py +0 -0
  32. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/auth/tools/tool_auth_manager.py +0 -0
  33. {language_model_common-2.1.0/languagemodelcommon/utilities/header_reader → language_model_common-2.1.2/languagemodelcommon/aws}/__init__.py +0 -0
  34. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/aws/aws_client_factory.py +0 -0
  35. {language_model_common-2.1.0/languagemodelcommon/utilities/environment → language_model_common-2.1.2/languagemodelcommon/configs}/__init__.py +0 -0
  36. {language_model_common-2.1.0/languagemodelcommon/utilities/cache → language_model_common-2.1.2/languagemodelcommon/configs/config_reader}/__init__.py +0 -0
  37. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/file_config_reader.py +0 -0
  38. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/github_directory_downloader.py +0 -0
  39. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/github_directory_helper.py +0 -0
  40. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/mcp_json_fetcher.py +0 -0
  41. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/mcp_json_reader.py +0 -0
  42. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/config_reader/s3_config_reader.py +0 -0
  43. {language_model_common-2.1.0/languagemodelcommon/utilities → language_model_common-2.1.2/languagemodelcommon/configs/prompt_library}/__init__.py +0 -0
  44. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/prompt_library/prompt_library_environment_variables.py +0 -0
  45. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/prompt_library/prompt_library_manager.py +0 -0
  46. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/prompt_library/prompt_store.py +0 -0
  47. {language_model_common-2.1.0/languagemodelcommon/tools/mcp → language_model_common-2.1.2/languagemodelcommon/configs/schemas}/__init__.py +0 -0
  48. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/schemas/config_schema.py +0 -0
  49. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/configs/schemas/mcp_json_schema.py +0 -0
  50. {language_model_common-2.1.0/languagemodelcommon/tools → language_model_common-2.1.2/languagemodelcommon/container}/__init__.py +0 -0
  51. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/container/container_factory.py +0 -0
  52. {language_model_common-2.1.0/languagemodelcommon/structures/openai/request → language_model_common-2.1.2/languagemodelcommon/context}/__init__.py +0 -0
  53. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/context/request_context.py +0 -0
  54. {language_model_common-2.1.0/languagemodelcommon/structures/openai/message → language_model_common-2.1.2/languagemodelcommon/converters}/__init__.py +0 -0
  55. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/stream_buffer.py +0 -0
  56. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/stream_context_mixin.py +0 -0
  57. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/stream_debug_output_manager.py +0 -0
  58. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/streaming_formatters.py +0 -0
  59. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/streaming_manager.py +0 -0
  60. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/converters/streaming_tool_node.py +0 -0
  61. {language_model_common-2.1.0/languagemodelcommon/structures/openai → language_model_common-2.1.2/languagemodelcommon/exceptions}/__init__.py +0 -0
  62. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/exceptions/bailey_exception.py +0 -0
  63. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/exceptions/rate_limit_exception.py +0 -0
  64. {language_model_common-2.1.0/languagemodelcommon/structures → language_model_common-2.1.2/languagemodelcommon/file_managers}/__init__.py +0 -0
  65. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/aws_s3_file_manager.py +0 -0
  66. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/file_manager.py +0 -0
  67. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/file_manager_factory.py +0 -0
  68. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/file_writer.py +0 -0
  69. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/file_managers/local_file_manager.py +0 -0
  70. {language_model_common-2.1.0/languagemodelcommon/state → language_model_common-2.1.2/languagemodelcommon/github}/__init__.py +0 -0
  71. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/github/token_provider.py +0 -0
  72. {language_model_common-2.1.0/languagemodelcommon/schema/openai → language_model_common-2.1.2/languagemodelcommon/graph}/__init__.py +0 -0
  73. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/graph/graph_builder.py +0 -0
  74. {language_model_common-2.1.0/languagemodelcommon/schema → language_model_common-2.1.2/languagemodelcommon/history}/__init__.py +0 -0
  75. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/history/context_compactor.py +0 -0
  76. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/history/conversation_history_manager.py +0 -0
  77. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/history/smart_history_manager.py +0 -0
  78. {language_model_common-2.1.0/languagemodelcommon/pipeline/steps → language_model_common-2.1.2/languagemodelcommon/http}/__init__.py +0 -0
  79. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/http/http_client_factory.py +0 -0
  80. {language_model_common-2.1.0/languagemodelcommon/pipeline/output → language_model_common-2.1.2/languagemodelcommon/image_generation}/__init__.py +0 -0
  81. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/aws_image_generator.py +0 -0
  82. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/image_generator.py +0 -0
  83. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/image_generator_factory.py +0 -0
  84. {language_model_common-2.1.0/languagemodelcommon/pipeline → language_model_common-2.1.2/languagemodelcommon/image_generation/managers}/__init__.py +0 -0
  85. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/managers/image_generation_manager.py +0 -0
  86. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/openai_image_generator.py +0 -0
  87. {language_model_common-2.1.0/languagemodelcommon/persistence → language_model_common-2.1.2/languagemodelcommon/image_generation/providers}/__init__.py +0 -0
  88. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/providers/base_image_generation_provider.py +0 -0
  89. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/image_generation/providers/image_generation_provider.py +0 -0
  90. {language_model_common-2.1.0/languagemodelcommon/ocr → language_model_common-2.1.2/languagemodelcommon/markdown}/__init__.py +0 -0
  91. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/markdown/html_to_markdown_converter.py +0 -0
  92. {language_model_common-2.1.0/languagemodelcommon/models → language_model_common-2.1.2/languagemodelcommon/mcp}/__init__.py +0 -0
  93. {language_model_common-2.1.0/languagemodelcommon/mocks → language_model_common-2.1.2/languagemodelcommon/mcp/auth}/__init__.py +0 -0
  94. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py +0 -0
  95. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/auth/mcp_authorization_helper.py +0 -0
  96. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/callbacks.py +0 -0
  97. {language_model_common-2.1.0/languagemodelcommon/mcp/mcp_client → language_model_common-2.1.2/languagemodelcommon/mcp/exceptions}/__init__.py +0 -0
  98. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_exception.py +0 -0
  99. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py +0 -0
  100. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py +0 -0
  101. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py +0 -0
  102. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/__init__.py +0 -0
  103. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/auth.py +0 -0
  104. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/tracing.py +0 -0
  105. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/truncation.py +0 -0
  106. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/interceptors/types.py +0 -0
  107. {language_model_common-2.1.0/languagemodelcommon/mcp/exceptions → language_model_common-2.1.2/languagemodelcommon/mcp/mcp_client}/__init__.py +0 -0
  108. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/content_conversion.py +0 -0
  109. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/langchain_adapter.py +0 -0
  110. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py +0 -0
  111. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py +0 -0
  112. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/server_card_discovery.py +0 -0
  113. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/session.py +0 -0
  114. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/session_pool.py +0 -0
  115. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/tool_invocation.py +0 -0
  116. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/tool_list_cache.py +0 -0
  117. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_client/ui_resource.py +0 -0
  118. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/mcp_tool_provider.py +0 -0
  119. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/tool_catalog.py +0 -0
  120. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mcp/tool_discovery_middleware.py +0 -0
  121. {language_model_common-2.1.0/languagemodelcommon/mcp/auth → language_model_common-2.1.2/languagemodelcommon/mocks}/__init__.py +0 -0
  122. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_aws_client_factory.py +0 -0
  123. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_http_client_factory.py +0 -0
  124. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_image_generator.py +0 -0
  125. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/mocks/mock_image_generator_factory.py +0 -0
  126. {language_model_common-2.1.0/languagemodelcommon/mcp → language_model_common-2.1.2/languagemodelcommon/models}/__init__.py +0 -0
  127. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/models/bedrock_models.py +0 -0
  128. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/models/model_factory.py +0 -0
  129. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/models/sanitizing_bedrock_converse.py +0 -0
  130. {language_model_common-2.1.0/languagemodelcommon/markdown → language_model_common-2.1.2/languagemodelcommon/ocr}/__init__.py +0 -0
  131. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/aws_ocr_extractor.py +0 -0
  132. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/ocr_extractor.py +0 -0
  133. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/ocr/ocr_extractor_factory.py +0 -0
  134. {language_model_common-2.1.0/languagemodelcommon/image_generation/providers → language_model_common-2.1.2/languagemodelcommon/persistence}/__init__.py +0 -0
  135. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/persistence/persistence_factory.py +0 -0
  136. {language_model_common-2.1.0/languagemodelcommon/image_generation/managers → language_model_common-2.1.2/languagemodelcommon/pipeline}/__init__.py +0 -0
  137. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/context.py +0 -0
  138. {language_model_common-2.1.0/languagemodelcommon/image_generation → language_model_common-2.1.2/languagemodelcommon/pipeline/output}/__init__.py +0 -0
  139. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/pipeline.py +0 -0
  140. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/pipeline/step.py +0 -0
  141. {language_model_common-2.1.0/languagemodelcommon/http → language_model_common-2.1.2/languagemodelcommon/pipeline/steps}/__init__.py +0 -0
  142. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/py.typed +0 -0
  143. {language_model_common-2.1.0/languagemodelcommon/history → language_model_common-2.1.2/languagemodelcommon/schema}/__init__.py +0 -0
  144. {language_model_common-2.1.0/languagemodelcommon/graph → language_model_common-2.1.2/languagemodelcommon/schema/openai}/__init__.py +0 -0
  145. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/schema/openai/completions.py +0 -0
  146. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/schema/openai/image_generation.py +0 -0
  147. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/schema/openai/responses.py +0 -0
  148. {language_model_common-2.1.0/languagemodelcommon/github → language_model_common-2.1.2/languagemodelcommon/state}/__init__.py +0 -0
  149. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/state/messages_state.py +0 -0
  150. {language_model_common-2.1.0/languagemodelcommon/file_managers → language_model_common-2.1.2/languagemodelcommon/structures}/__init__.py +0 -0
  151. {language_model_common-2.1.0/languagemodelcommon/exceptions → language_model_common-2.1.2/languagemodelcommon/structures/openai}/__init__.py +0 -0
  152. {language_model_common-2.1.0/languagemodelcommon/converters → language_model_common-2.1.2/languagemodelcommon/structures/openai/message}/__init__.py +0 -0
  153. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/message/chat_completion_api_message_wrapper.py +0 -0
  154. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/message/chat_message_wrapper.py +0 -0
  155. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/message/responses_api_message_wrapper.py +0 -0
  156. {language_model_common-2.1.0/languagemodelcommon/context → language_model_common-2.1.2/languagemodelcommon/structures/openai/request}/__init__.py +0 -0
  157. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/request/chat_completion_api_request_wrapper.py +0 -0
  158. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/request/chat_request_wrapper.py +0 -0
  159. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py +0 -0
  160. {language_model_common-2.1.0/languagemodelcommon/container → language_model_common-2.1.2/languagemodelcommon/tools}/__init__.py +0 -0
  161. {language_model_common-2.1.0/languagemodelcommon/configs/schemas → language_model_common-2.1.2/languagemodelcommon/tools/mcp}/__init__.py +0 -0
  162. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/tools/mcp/call_tool_tool.py +0 -0
  163. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/tools/mcp/search_tools_tool.py +0 -0
  164. {language_model_common-2.1.0/languagemodelcommon/configs/prompt_library → language_model_common-2.1.2/languagemodelcommon/utilities}/__init__.py +0 -0
  165. {language_model_common-2.1.0/languagemodelcommon/configs/config_reader → language_model_common-2.1.2/languagemodelcommon/utilities/cache}/__init__.py +0 -0
  166. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/cache/advisory_lock.py +0 -0
  167. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/cache/model_config_cache_store.py +0 -0
  168. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/chat_message_helpers.py +0 -0
  169. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/config_substitution.py +0 -0
  170. {language_model_common-2.1.0/languagemodelcommon/configs → language_model_common-2.1.2/languagemodelcommon/utilities/environment}/__init__.py +0 -0
  171. {language_model_common-2.1.0/languagemodelcommon/aws → language_model_common-2.1.2/languagemodelcommon/utilities/header_reader}/__init__.py +0 -0
  172. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/header_reader/header_reader.py +0 -0
  173. {language_model_common-2.1.0/languagemodelcommon/auth/tools → language_model_common-2.1.2/languagemodelcommon/utilities/logger}/__init__.py +0 -0
  174. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/debug_configuration.py +0 -0
  175. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/exception_formatter.py +0 -0
  176. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/exception_logger.py +0 -0
  177. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/log_levels.py +0 -0
  178. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/logging_response.py +0 -0
  179. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/logger/logging_transport.py +0 -0
  180. {language_model_common-2.1.0/languagemodelcommon/auth/token_exchange → language_model_common-2.1.2/languagemodelcommon/utilities/message_preprocessing}/__init__.py +0 -0
  181. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/message_preprocessing/composite_message_preprocessor.py +0 -0
  182. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py +0 -0
  183. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/mongo_url_utils.py +0 -0
  184. {language_model_common-2.1.0/languagemodelcommon/auth/models → language_model_common-2.1.2/languagemodelcommon/utilities/openai}/__init__.py +0 -0
  185. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/openai/responses_api_converter.py +0 -0
  186. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/request_information.py +0 -0
  187. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/s3_url.py +0 -0
  188. {language_model_common-2.1.0/languagemodelcommon/auth/exceptions → language_model_common-2.1.2/languagemodelcommon/utilities/security}/__init__.py +0 -0
  189. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/normalize.py +0 -0
  190. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/off_topic_detector.py +0 -0
  191. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/prompt_extraction_detector.py +0 -0
  192. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/prompt_sanitizer.py +0 -0
  193. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/security/url_validation.py +0 -0
  194. {language_model_common-2.1.0/languagemodelcommon/auth/authenticator → language_model_common-2.1.2/languagemodelcommon/utilities/slash_command}/__init__.py +0 -0
  195. {language_model_common-2.1.0/languagemodelcommon/auth → language_model_common-2.1.2/languagemodelcommon/utilities/slash_command/handlers}/__init__.py +0 -0
  196. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/handlers/debug_command_handler.py +0 -0
  197. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/handlers/skill_command_handler.py +0 -0
  198. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/slash_command_handler.py +0 -0
  199. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/slash_command_parser.py +0 -0
  200. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/slash_command/slash_command_processor.py +0 -0
  201. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/text_humanizer.py +0 -0
  202. {language_model_common-2.1.0/languagemodelcommon → language_model_common-2.1.2/languagemodelcommon/utilities/token_reducer}/__init__.py +0 -0
  203. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/token_reducer/token_reducer.py +0 -0
  204. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/tool_display_name_mapper.py +0 -0
  205. {language_model_common-2.1.0 → language_model_common-2.1.2}/languagemodelcommon/utilities/url_parser.py +0 -0
  206. {language_model_common-2.1.0 → language_model_common-2.1.2}/pyproject.toml +0 -0
  207. {language_model_common-2.1.0 → language_model_common-2.1.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: language-model-common
3
- Version: 2.1.0
3
+ Version: 2.1.2
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
@@ -0,0 +1 @@
1
+ 2.1.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: language-model-common
3
- Version: 2.1.0
3
+ Version: 2.1.2
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
@@ -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(models)
149
+ await self._write_to_model_config_cache(
150
+ models=models, config_path=config_path
151
+ )
149
152
  return models
150
153
 
151
- def _model_config_cache_key(self, *, model_name: str) -> str:
152
- return f"v{self.SCHEMA_VERSION}:{model_name}"
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(self) -> List[ChatModelConfig] | None:
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
- prefix = f"v{self.SCHEMA_VERSION}:"
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(self, models: List[ChatModelConfig]) -> None:
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(model_name=model.name)
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: {error_message}\nRuntime: {runtime_str}"
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{error_message}\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