language-model-common 2.1.2__tar.gz → 3.0.0__tar.gz

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