language-model-common 2.0.87__tar.gz → 2.0.89__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 (205) hide show
  1. {language_model_common-2.0.87/language_model_common.egg-info → language_model_common-2.0.89}/PKG-INFO +1 -1
  2. language_model_common-2.0.89/VERSION +1 -0
  3. {language_model_common-2.0.87 → language_model_common-2.0.89/language_model_common.egg-info}/PKG-INFO +1 -1
  4. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/streaming_manager.py +9 -0
  5. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/langchain_adapter.py +2 -0
  6. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/tool_invocation.py +77 -11
  7. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_tool_provider.py +22 -0
  8. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/request/chat_completion_api_request_wrapper.py +23 -0
  9. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/request/chat_request_wrapper.py +15 -0
  10. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py +23 -0
  11. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/environment/language_model_common_environment_variables.py +16 -0
  12. language_model_common-2.0.87/VERSION +0 -1
  13. {language_model_common-2.0.87 → language_model_common-2.0.89}/LICENSE +0 -0
  14. {language_model_common-2.0.87 → language_model_common-2.0.89}/MANIFEST.in +0 -0
  15. {language_model_common-2.0.87 → language_model_common-2.0.89}/README.md +0 -0
  16. {language_model_common-2.0.87 → language_model_common-2.0.89}/language_model_common.egg-info/SOURCES.txt +0 -0
  17. {language_model_common-2.0.87 → language_model_common-2.0.89}/language_model_common.egg-info/dependency_links.txt +0 -0
  18. {language_model_common-2.0.87 → language_model_common-2.0.89}/language_model_common.egg-info/requires.txt +0 -0
  19. {language_model_common-2.0.87 → language_model_common-2.0.89}/language_model_common.egg-info/top_level.txt +0 -0
  20. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/__init__.py +0 -0
  21. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/__init__.py +0 -0
  22. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/authenticator/__init__.py +0 -0
  23. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/exceptions/__init__.py +0 -0
  24. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py +0 -0
  25. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py +0 -0
  26. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_not_found_exception.py +0 -0
  27. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/models/__init__.py +0 -0
  28. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/models/token_cache_item.py +0 -0
  29. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/oauth_provider_registrar.py +0 -0
  30. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/pass_through_token_manager.py +0 -0
  31. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/token_exchange/__init__.py +0 -0
  32. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/token_exchange/token_exchange_manager.py +0 -0
  33. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/token_storage_auth_manager.py +0 -0
  34. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/tools/__init__.py +0 -0
  35. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/auth/tools/tool_auth_manager.py +0 -0
  36. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/aws/__init__.py +0 -0
  37. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/aws/aws_client_factory.py +0 -0
  38. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/__init__.py +0 -0
  39. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/__init__.py +0 -0
  40. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/config_reader.py +0 -0
  41. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/file_config_reader.py +0 -0
  42. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/github_directory_downloader.py +0 -0
  43. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/github_directory_helper.py +0 -0
  44. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/mcp_json_fetcher.py +0 -0
  45. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/mcp_json_reader.py +0 -0
  46. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/config_reader/s3_config_reader.py +0 -0
  47. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/prompt_library/__init__.py +0 -0
  48. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/prompt_library/prompt_library_environment_variables.py +0 -0
  49. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/prompt_library/prompt_library_manager.py +0 -0
  50. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/prompt_library/prompt_store.py +0 -0
  51. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/schemas/__init__.py +0 -0
  52. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/schemas/config_schema.py +0 -0
  53. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/configs/schemas/mcp_json_schema.py +0 -0
  54. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/container/__init__.py +0 -0
  55. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/container/container_factory.py +0 -0
  56. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/context/__init__.py +0 -0
  57. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/context/request_context.py +0 -0
  58. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/__init__.py +0 -0
  59. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/langgraph_to_openai_converter.py +0 -0
  60. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/stream_buffer.py +0 -0
  61. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/stream_context_mixin.py +0 -0
  62. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/stream_debug_output_manager.py +0 -0
  63. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/streaming_formatters.py +0 -0
  64. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/streaming_tool_node.py +0 -0
  65. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/converters/tool_event_handlers.py +0 -0
  66. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/exceptions/__init__.py +0 -0
  67. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/exceptions/bailey_exception.py +0 -0
  68. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/exceptions/rate_limit_exception.py +0 -0
  69. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/file_managers/__init__.py +0 -0
  70. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/file_managers/aws_s3_file_manager.py +0 -0
  71. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/file_managers/file_manager.py +0 -0
  72. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/file_managers/file_manager_factory.py +0 -0
  73. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/file_managers/file_writer.py +0 -0
  74. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/file_managers/local_file_manager.py +0 -0
  75. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/github/__init__.py +0 -0
  76. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/github/token_provider.py +0 -0
  77. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/graph/__init__.py +0 -0
  78. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/graph/graph_builder.py +0 -0
  79. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/history/__init__.py +0 -0
  80. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/history/context_compactor.py +0 -0
  81. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/history/conversation_history_manager.py +0 -0
  82. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/history/smart_history_manager.py +0 -0
  83. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/http/__init__.py +0 -0
  84. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/http/http_client_factory.py +0 -0
  85. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/__init__.py +0 -0
  86. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/aws_image_generator.py +0 -0
  87. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/image_generator.py +0 -0
  88. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/image_generator_factory.py +0 -0
  89. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/managers/__init__.py +0 -0
  90. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/managers/image_generation_manager.py +0 -0
  91. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/openai_image_generator.py +0 -0
  92. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/providers/__init__.py +0 -0
  93. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/providers/base_image_generation_provider.py +0 -0
  94. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/image_generation/providers/image_generation_provider.py +0 -0
  95. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/markdown/__init__.py +0 -0
  96. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/markdown/html_to_markdown_converter.py +0 -0
  97. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/__init__.py +0 -0
  98. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/auth/__init__.py +0 -0
  99. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py +0 -0
  100. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/auth/mcp_authorization_helper.py +0 -0
  101. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/callbacks.py +0 -0
  102. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/exceptions/__init__.py +0 -0
  103. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/exceptions/mcp_tool_exception.py +0 -0
  104. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py +0 -0
  105. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py +0 -0
  106. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py +0 -0
  107. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/interceptors/__init__.py +0 -0
  108. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/interceptors/auth.py +0 -0
  109. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/interceptors/tracing.py +0 -0
  110. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/interceptors/truncation.py +0 -0
  111. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/interceptors/types.py +0 -0
  112. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/__init__.py +0 -0
  113. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/content_conversion.py +0 -0
  114. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py +0 -0
  115. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py +0 -0
  116. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/server_card_discovery.py +0 -0
  117. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/session.py +0 -0
  118. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/session_pool.py +0 -0
  119. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/tool_list_cache.py +0 -0
  120. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/mcp_client/ui_resource.py +0 -0
  121. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/tool_catalog.py +0 -0
  122. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mcp/tool_discovery_middleware.py +0 -0
  123. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mocks/__init__.py +0 -0
  124. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mocks/mock_aws_client_factory.py +0 -0
  125. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mocks/mock_http_client_factory.py +0 -0
  126. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mocks/mock_image_generator.py +0 -0
  127. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/mocks/mock_image_generator_factory.py +0 -0
  128. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/models/__init__.py +0 -0
  129. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/models/bedrock_models.py +0 -0
  130. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/models/model_factory.py +0 -0
  131. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/models/sanitizing_bedrock_converse.py +0 -0
  132. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/ocr/__init__.py +0 -0
  133. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/ocr/aws_ocr_extractor.py +0 -0
  134. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/ocr/ocr_extractor.py +0 -0
  135. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/ocr/ocr_extractor_factory.py +0 -0
  136. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/persistence/__init__.py +0 -0
  137. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/persistence/persistence_factory.py +0 -0
  138. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/pipeline/__init__.py +0 -0
  139. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/pipeline/context.py +0 -0
  140. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/pipeline/output/__init__.py +0 -0
  141. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/pipeline/pipeline.py +0 -0
  142. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/pipeline/step.py +0 -0
  143. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/pipeline/steps/__init__.py +0 -0
  144. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/py.typed +0 -0
  145. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/schema/__init__.py +0 -0
  146. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/schema/openai/__init__.py +0 -0
  147. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/schema/openai/completions.py +0 -0
  148. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/schema/openai/image_generation.py +0 -0
  149. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/schema/openai/responses.py +0 -0
  150. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/state/__init__.py +0 -0
  151. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/state/messages_state.py +0 -0
  152. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/__init__.py +0 -0
  153. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/__init__.py +0 -0
  154. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/message/__init__.py +0 -0
  155. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/message/chat_completion_api_message_wrapper.py +0 -0
  156. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/message/chat_message_wrapper.py +0 -0
  157. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/message/responses_api_message_wrapper.py +0 -0
  158. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/structures/openai/request/__init__.py +0 -0
  159. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/tools/__init__.py +0 -0
  160. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/tools/mcp/__init__.py +0 -0
  161. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/tools/mcp/call_tool_tool.py +0 -0
  162. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/tools/mcp/search_tools_tool.py +0 -0
  163. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/__init__.py +0 -0
  164. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/cache/__init__.py +0 -0
  165. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/cache/advisory_lock.py +0 -0
  166. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/cache/model_config_cache_store.py +0 -0
  167. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/chat_message_helpers.py +0 -0
  168. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/config_substitution.py +0 -0
  169. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/environment/__init__.py +0 -0
  170. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/header_reader/__init__.py +0 -0
  171. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/header_reader/header_reader.py +0 -0
  172. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/__init__.py +0 -0
  173. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/debug_configuration.py +0 -0
  174. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/exception_formatter.py +0 -0
  175. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/exception_logger.py +0 -0
  176. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/log_levels.py +0 -0
  177. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/logging_response.py +0 -0
  178. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/logger/logging_transport.py +0 -0
  179. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/message_preprocessing/__init__.py +0 -0
  180. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/message_preprocessing/composite_message_preprocessor.py +0 -0
  181. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py +0 -0
  182. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/mongo_url_utils.py +0 -0
  183. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/openai/__init__.py +0 -0
  184. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/openai/responses_api_converter.py +0 -0
  185. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/request_information.py +0 -0
  186. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/s3_url.py +0 -0
  187. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/security/__init__.py +0 -0
  188. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/security/normalize.py +0 -0
  189. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/security/off_topic_detector.py +0 -0
  190. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/security/prompt_extraction_detector.py +0 -0
  191. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/security/prompt_sanitizer.py +0 -0
  192. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/__init__.py +0 -0
  193. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/handlers/__init__.py +0 -0
  194. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/handlers/debug_command_handler.py +0 -0
  195. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/handlers/skill_command_handler.py +0 -0
  196. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/slash_command_handler.py +0 -0
  197. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/slash_command_parser.py +0 -0
  198. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/slash_command/slash_command_processor.py +0 -0
  199. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/text_humanizer.py +0 -0
  200. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/token_reducer/__init__.py +0 -0
  201. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/token_reducer/token_reducer.py +0 -0
  202. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/tool_display_name_mapper.py +0 -0
  203. {language_model_common-2.0.87 → language_model_common-2.0.89}/languagemodelcommon/utilities/url_parser.py +0 -0
  204. {language_model_common-2.0.87 → language_model_common-2.0.89}/pyproject.toml +0 -0
  205. {language_model_common-2.0.87 → language_model_common-2.0.89}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: language-model-common
3
- Version: 2.0.87
3
+ Version: 2.0.89
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.0.89
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: language-model-common
3
- Version: 2.0.87
3
+ Version: 2.0.89
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
@@ -379,6 +379,15 @@ class LangGraphStreamingManager(StreamContextMixin):
379
379
  )
380
380
  if chunk:
381
381
  yield chunk
382
+ elif name == "mcp_tool_heartbeat":
383
+ data = dict(event.get("data", {}))
384
+ chunk = chat_request_wrapper.create_tool_heartbeat_sse_event(
385
+ request_id=request_information.request_id,
386
+ tool_name=data.get("tool_name", "unknown"),
387
+ elapsed_seconds=float(data.get("elapsed_seconds", 0.0)),
388
+ )
389
+ if chunk:
390
+ yield chunk
382
391
  else:
383
392
  logger.debug("Skipped custom event: %s", name)
384
393
 
@@ -62,6 +62,7 @@ def mcp_tool_to_langchain_tool(
62
62
  server_name: str | None = None,
63
63
  session_pool: McpSessionPool | None = None,
64
64
  tool_list_cache: ToolListCache | None = None,
65
+ heartbeat_interval_seconds: float = 15.0,
65
66
  ) -> BaseTool:
66
67
  """Convert an MCP Tool to a LangChain BaseTool.
67
68
 
@@ -84,6 +85,7 @@ def mcp_tool_to_langchain_tool(
84
85
  mcp_callbacks=mcp_callbacks,
85
86
  session_pool=session_pool,
86
87
  tool_list_cache=tool_list_cache,
88
+ heartbeat_interval_seconds=heartbeat_interval_seconds,
87
89
  )
88
90
  handler = build_interceptor_chain(
89
91
  base_handler=execute_tool, tool_interceptors=tool_interceptors
@@ -1,9 +1,12 @@
1
1
  """Tool invocation — interceptor chain and raw MCP tool calls."""
2
2
 
3
+ import asyncio
4
+ import contextlib
3
5
  import logging
4
6
  from collections.abc import Awaitable, Callable
5
7
  from typing import Any
6
8
 
9
+ from langchain_core.callbacks.manager import adispatch_custom_event
7
10
  from mcp.types import CallToolResult
8
11
  from pydantic import ValidationError
9
12
 
@@ -174,8 +177,6 @@ async def _execute_tool_as_task(
174
177
  Raises TaskProtocolError if the server does not respond with a valid
175
178
  CreateTaskResult (e.g., returns a plain CallToolResult instead).
176
179
  """
177
- from langchain_core.callbacks.manager import adispatch_custom_event
178
-
179
180
  try:
180
181
  create_result = await session.experimental.call_tool_as_task(
181
182
  name, arguments, ttl=60000
@@ -222,12 +223,66 @@ async def _execute_tool_as_task(
222
223
  return result
223
224
 
224
225
 
226
+ async def _execute_tool_call_with_heartbeat(
227
+ *,
228
+ session: Any,
229
+ name: str,
230
+ arguments: dict[str, Any],
231
+ progress_callback: Any,
232
+ server_name: str,
233
+ heartbeat_interval_seconds: float,
234
+ ) -> CallToolResult:
235
+ """Call ``session.call_tool``, emitting a synthetic ``mcp_tool_heartbeat``
236
+ custom event every ``heartbeat_interval_seconds`` while the call is in
237
+ flight, regardless of whether the tool reports real progress.
238
+
239
+ Uses ``asyncio.shield`` so a heartbeat tick's wait_for timeout never
240
+ cancels the underlying tool call -- only the local wait is abandoned and
241
+ retried on the same call_task. If this coroutine itself is cancelled
242
+ (e.g. the overall chat turn is aborted), the inner call_task is
243
+ cancelled too rather than left running in the background.
244
+ """
245
+ call_task: "asyncio.Task[CallToolResult]" = asyncio.ensure_future(
246
+ session.call_tool(name, arguments, progress_callback=progress_callback)
247
+ )
248
+ elapsed_seconds = 0.0
249
+ try:
250
+ while True:
251
+ try:
252
+ return await asyncio.wait_for(
253
+ asyncio.shield(call_task), timeout=heartbeat_interval_seconds
254
+ )
255
+ except asyncio.TimeoutError:
256
+ elapsed_seconds += heartbeat_interval_seconds
257
+ try:
258
+ await adispatch_custom_event(
259
+ "mcp_tool_heartbeat",
260
+ {
261
+ "server_name": server_name,
262
+ "tool_name": name,
263
+ "elapsed_seconds": elapsed_seconds,
264
+ },
265
+ )
266
+ except RuntimeError as e:
267
+ logger.debug(
268
+ "Skipping mcp_tool_heartbeat event dispatch: %s (tool=%s)",
269
+ e,
270
+ name,
271
+ )
272
+ except asyncio.CancelledError:
273
+ call_task.cancel()
274
+ with contextlib.suppress(asyncio.CancelledError):
275
+ await call_task
276
+ raise
277
+
278
+
225
279
  def _make_execute_tool(
226
280
  *,
227
281
  config: MCPConnectionConfig,
228
282
  mcp_callbacks: _MCPCallbacks,
229
283
  session_pool: McpSessionPool | None = None,
230
284
  tool_list_cache: ToolListCache | None = None,
285
+ heartbeat_interval_seconds: float = 15.0,
231
286
  ) -> Callable[[MCPToolCallRequest], Awaitable[MCPToolCallResult]]:
232
287
  """Create an execute_tool handler that opens a session and calls the tool.
233
288
 
@@ -285,10 +340,13 @@ def _make_execute_tool(
285
340
  )
286
341
  if tool_list_cache is not None:
287
342
  await tool_list_cache.invalidate_async(key=cache_key)
288
- return await session.call_tool(
289
- request.name,
290
- request.args,
343
+ return await _execute_tool_call_with_heartbeat(
344
+ session=session,
345
+ name=request.name,
346
+ arguments=request.args,
291
347
  progress_callback=mcp_callbacks.progress_callback,
348
+ server_name=request.server_name,
349
+ heartbeat_interval_seconds=heartbeat_interval_seconds,
292
350
  )
293
351
  except Exception:
294
352
  await session_pool.evict(effective_config)
@@ -324,16 +382,22 @@ def _make_execute_tool(
324
382
  )
325
383
  if tool_list_cache is not None:
326
384
  await tool_list_cache.invalidate_async(key=cache_key)
327
- result = await session.call_tool(
328
- request.name,
329
- request.args,
385
+ result = await _execute_tool_call_with_heartbeat(
386
+ session=session,
387
+ name=request.name,
388
+ arguments=request.args,
330
389
  progress_callback=mcp_callbacks.progress_callback,
390
+ server_name=request.server_name,
391
+ heartbeat_interval_seconds=heartbeat_interval_seconds,
331
392
  )
332
393
  else:
333
- result = await session.call_tool(
334
- request.name,
335
- request.args,
394
+ result = await _execute_tool_call_with_heartbeat(
395
+ session=session,
396
+ name=request.name,
397
+ arguments=request.args,
336
398
  progress_callback=mcp_callbacks.progress_callback,
399
+ server_name=request.server_name,
400
+ heartbeat_interval_seconds=heartbeat_interval_seconds,
337
401
  )
338
402
  except Exception as e:
339
403
  captured_exception = e
@@ -355,6 +419,7 @@ async def call_mcp_tool_raw(
355
419
  tool_interceptors: list[ToolCallInterceptor] | None = None,
356
420
  session_pool: McpSessionPool | None = None,
357
421
  tool_list_cache: ToolListCache | None = None,
422
+ heartbeat_interval_seconds: float = 15.0,
358
423
  ) -> CallToolResult:
359
424
  """Call an MCP tool and return the raw CallToolResult.
360
425
 
@@ -374,6 +439,7 @@ async def call_mcp_tool_raw(
374
439
  mcp_callbacks=mcp_callbacks,
375
440
  session_pool=session_pool,
376
441
  tool_list_cache=tool_list_cache,
442
+ heartbeat_interval_seconds=heartbeat_interval_seconds,
377
443
  )
378
444
  handler = build_interceptor_chain(
379
445
  base_handler=execute_tool, tool_interceptors=tool_interceptors
@@ -6,6 +6,7 @@ from typing import Any, Dict, List
6
6
 
7
7
  import httpx
8
8
  from httpx import HTTPStatusError
9
+ from langchain_core.callbacks.manager import adispatch_custom_event
9
10
  from langchain_core.tools import BaseTool
10
11
  from mcp import ClientSession
11
12
  from mcp.types import (
@@ -210,6 +211,24 @@ class MCPToolProvider:
210
211
  logger.info(
211
212
  f"MCP Tool Progress - Server: {context.server_name}, Progress: {progress}, Total: {total}, Message: {message}"
212
213
  )
214
+ try:
215
+ await adispatch_custom_event(
216
+ "mcp_task_progress",
217
+ {
218
+ "task_id": "",
219
+ "status": f"{progress:g}/{total:g}" if total else f"{progress:g}",
220
+ "message": message,
221
+ "server_name": context.server_name,
222
+ "tool_name": context.tool_name,
223
+ },
224
+ )
225
+ except RuntimeError as e:
226
+ logger.debug(
227
+ "Skipping mcp_task_progress event dispatch: %s (server=%s, tool=%s)",
228
+ e,
229
+ context.server_name,
230
+ context.tool_name,
231
+ )
213
232
 
214
233
  def _build_connection_config(self, tool_config: AgentConfig) -> MCPConnectionConfig:
215
234
  """Build an MCPConnectionConfig from an AgentConfig."""
@@ -285,6 +304,7 @@ class MCPToolProvider:
285
304
  ],
286
305
  server_name=tool_config.name,
287
306
  tool_list_cache=self.tool_list_cache,
307
+ heartbeat_interval_seconds=self.environment_variables.mcp_tool_heartbeat_interval_seconds,
288
308
  )
289
309
  tools.append(langchain_tool)
290
310
 
@@ -451,6 +471,7 @@ class MCPToolProvider:
451
471
  server_name=tool_config.name,
452
472
  session_pool=session_pool,
453
473
  tool_list_cache=self.tool_list_cache,
474
+ heartbeat_interval_seconds=self.environment_variables.mcp_tool_heartbeat_interval_seconds,
454
475
  )
455
476
  for mcp_tool in mcp_tools
456
477
  ]
@@ -1010,6 +1031,7 @@ class MCPToolProvider:
1010
1031
  ],
1011
1032
  session_pool=session_pool,
1012
1033
  tool_list_cache=self.tool_list_cache,
1034
+ heartbeat_interval_seconds=self.environment_variables.mcp_tool_heartbeat_interval_seconds,
1013
1035
  )
1014
1036
 
1015
1037
  async def fetch_mcp_app_embed(
@@ -67,6 +67,7 @@ class ChatCompletionApiRequestWrapper(ChatRequestWrapper):
67
67
  enable_debug_logging: bool,
68
68
  environment_variables: "LanguageModelCommonEnvironmentVariables",
69
69
  emit_task_progress: bool | None = None,
70
+ emit_tool_heartbeat: bool | None = None,
70
71
  ) -> None:
71
72
  """
72
73
  Wraps an OpenAI /chat/completions request to provide a consistent interface for different request types.
@@ -84,6 +85,11 @@ class ChatCompletionApiRequestWrapper(ChatRequestWrapper):
84
85
  if emit_task_progress is not None
85
86
  else environment_variables.emit_task_progress_in_chat_completions
86
87
  )
88
+ self._emit_tool_heartbeat: bool = (
89
+ emit_tool_heartbeat
90
+ if emit_tool_heartbeat is not None
91
+ else environment_variables.emit_tool_heartbeat_in_chat_completions
92
+ )
87
93
  self._debug_prefixes = environment_variables.debug_prefixes
88
94
  self._apply_debug_prefix_toggle()
89
95
 
@@ -278,6 +284,23 @@ class ChatCompletionApiRequestWrapper(ChatRequestWrapper):
278
284
  source="task_progress",
279
285
  )
280
286
 
287
+ @override
288
+ def create_tool_heartbeat_sse_event(
289
+ self,
290
+ *,
291
+ request_id: str,
292
+ tool_name: str,
293
+ elapsed_seconds: float,
294
+ ) -> str | None:
295
+ if not self._emit_tool_heartbeat:
296
+ return None
297
+ return self.create_sse_message(
298
+ request_id=request_id,
299
+ content=f"\n[Still running {tool_name}... ({elapsed_seconds:.0f}s)]\n",
300
+ usage_metadata=None,
301
+ source="tool_heartbeat",
302
+ )
303
+
281
304
  @override
282
305
  def create_non_streaming_response(
283
306
  self,
@@ -272,6 +272,21 @@ class ChatRequestWrapper(abc.ABC):
272
272
  """
273
273
  return None
274
274
 
275
+ def create_tool_heartbeat_sse_event(
276
+ self,
277
+ *,
278
+ request_id: str,
279
+ tool_name: str,
280
+ elapsed_seconds: float,
281
+ ) -> str | None:
282
+ """Emit a synthetic heartbeat while a tool call is in flight without
283
+ reporting real progress.
284
+
285
+ The default implementation returns None (no-op). Subclasses override
286
+ to emit the event in their respective SSE formats.
287
+ """
288
+ return None
289
+
275
290
  def create_tool_start_sse_event(
276
291
  self,
277
292
  *,
@@ -373,6 +373,29 @@ class ResponsesApiRequestWrapper(ChatRequestWrapper):
373
373
  }
374
374
  return f"data: {json.dumps(event)}\n\n"
375
375
 
376
+ @override
377
+ def create_tool_heartbeat_sse_event(
378
+ self,
379
+ *,
380
+ request_id: str,
381
+ tool_name: str,
382
+ elapsed_seconds: float,
383
+ ) -> str | None:
384
+ """Emit a synthetic heartbeat as a ``task.progress`` SSE event.
385
+
386
+ Reuses the exact same wire format as create_task_progress_sse_event
387
+ so existing consumers (e.g. baileyai-skills-service's frontend, which
388
+ already treats any `type: "task.progress"` payload as a non-content
389
+ trace event) require no changes.
390
+ """
391
+ event: Dict[str, Any] = {
392
+ "type": "task.progress",
393
+ "task_id": "",
394
+ "status": "in_progress",
395
+ "message": f"Still running {tool_name}... ({elapsed_seconds:.0f}s)",
396
+ }
397
+ return f"data: {json.dumps(event)}\n\n"
398
+
376
399
  @staticmethod
377
400
  def _convert_usage_to_response_usage(
378
401
  usages: list[UsageMetadata],
@@ -289,6 +289,22 @@ class LanguageModelCommonEnvironmentVariables(
289
289
  """Timeout in seconds for tool calls."""
290
290
  return int(os.environ.get("TOOL_CALL_TIMEOUT_SECONDS", "600"))
291
291
 
292
+ @property
293
+ def mcp_tool_heartbeat_interval_seconds(self) -> float:
294
+ """Interval in seconds between synthetic heartbeat events emitted
295
+ while an MCP tool call is in flight without reporting progress."""
296
+ return float(os.environ.get("MCP_TOOL_HEARTBEAT_INTERVAL_SECONDS", "15"))
297
+
298
+ @property
299
+ def emit_tool_heartbeat_in_chat_completions(self) -> bool:
300
+ """When True, synthetic MCP tool heartbeats are emitted as content
301
+ deltas in the Chat Completions streaming format. Separate from
302
+ emit_task_progress_in_chat_completions so enabling one does not
303
+ change the volume/behavior of the other."""
304
+ return self.str2bool(
305
+ os.environ.get("EMIT_TOOL_HEARTBEAT_IN_CHAT_COMPLETIONS", "false")
306
+ )
307
+
292
308
  @property
293
309
  def app_login_uri(self) -> str:
294
310
  value = os.environ.get("APP_LOGIN_URI")
@@ -1 +0,0 @@
1
- 2.0.87