language-model-common 2.0.76__tar.gz → 2.0.77__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 (202) hide show
  1. {language_model_common-2.0.76/language_model_common.egg-info → language_model_common-2.0.77}/PKG-INFO +1 -1
  2. language_model_common-2.0.77/VERSION +1 -0
  3. {language_model_common-2.0.76 → language_model_common-2.0.77/language_model_common.egg-info}/PKG-INFO +1 -1
  4. {language_model_common-2.0.76 → language_model_common-2.0.77}/language_model_common.egg-info/SOURCES.txt +9 -0
  5. language_model_common-2.0.77/languagemodelcommon/pipeline/context.py +40 -0
  6. language_model_common-2.0.77/languagemodelcommon/pipeline/pipeline.py +100 -0
  7. language_model_common-2.0.77/languagemodelcommon/pipeline/step.py +11 -0
  8. language_model_common-2.0.77/languagemodelcommon/utilities/security/normalize.py +100 -0
  9. language_model_common-2.0.77/languagemodelcommon/utilities/security/off_topic_detector.py +96 -0
  10. language_model_common-2.0.77/languagemodelcommon/utilities/security/prompt_extraction_detector.py +69 -0
  11. language_model_common-2.0.77/languagemodelcommon/utilities/slash_command/__init__.py +0 -0
  12. language_model_common-2.0.77/languagemodelcommon/utilities/slash_command/handlers/__init__.py +0 -0
  13. language_model_common-2.0.77/languagemodelcommon/utilities/token_reducer/__init__.py +0 -0
  14. language_model_common-2.0.76/VERSION +0 -1
  15. {language_model_common-2.0.76 → language_model_common-2.0.77}/LICENSE +0 -0
  16. {language_model_common-2.0.76 → language_model_common-2.0.77}/MANIFEST.in +0 -0
  17. {language_model_common-2.0.76 → language_model_common-2.0.77}/README.md +0 -0
  18. {language_model_common-2.0.76 → language_model_common-2.0.77}/language_model_common.egg-info/dependency_links.txt +0 -0
  19. {language_model_common-2.0.76 → language_model_common-2.0.77}/language_model_common.egg-info/requires.txt +0 -0
  20. {language_model_common-2.0.76 → language_model_common-2.0.77}/language_model_common.egg-info/top_level.txt +0 -0
  21. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/__init__.py +0 -0
  22. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/__init__.py +0 -0
  23. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/authenticator/__init__.py +0 -0
  24. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/exceptions/__init__.py +0 -0
  25. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/exceptions/authorization_mcp_tool_token_invalid_exception.py +0 -0
  26. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_expired_exception.py +0 -0
  27. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/exceptions/authorization_token_cache_item_not_found_exception.py +0 -0
  28. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/models/__init__.py +0 -0
  29. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/models/token_cache_item.py +0 -0
  30. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/oauth_provider_registrar.py +0 -0
  31. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/pass_through_token_manager.py +0 -0
  32. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/token_exchange/__init__.py +0 -0
  33. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/token_exchange/token_exchange_manager.py +0 -0
  34. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/token_storage_auth_manager.py +0 -0
  35. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/tools/__init__.py +0 -0
  36. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/auth/tools/tool_auth_manager.py +0 -0
  37. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/aws/__init__.py +0 -0
  38. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/aws/aws_client_factory.py +0 -0
  39. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/__init__.py +0 -0
  40. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/__init__.py +0 -0
  41. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/config_reader.py +0 -0
  42. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/file_config_reader.py +0 -0
  43. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/github_directory_downloader.py +0 -0
  44. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/github_directory_helper.py +0 -0
  45. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/mcp_json_fetcher.py +0 -0
  46. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/mcp_json_reader.py +0 -0
  47. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/config_reader/s3_config_reader.py +0 -0
  48. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/prompt_library/__init__.py +0 -0
  49. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/prompt_library/prompt_library_environment_variables.py +0 -0
  50. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/prompt_library/prompt_library_manager.py +0 -0
  51. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/prompt_library/prompt_store.py +0 -0
  52. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/schemas/__init__.py +0 -0
  53. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/schemas/config_schema.py +0 -0
  54. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/configs/schemas/mcp_json_schema.py +0 -0
  55. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/container/__init__.py +0 -0
  56. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/container/container_factory.py +0 -0
  57. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/context/__init__.py +0 -0
  58. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/context/request_context.py +0 -0
  59. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/__init__.py +0 -0
  60. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/langgraph_to_openai_converter.py +0 -0
  61. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/stream_buffer.py +0 -0
  62. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/stream_context_mixin.py +0 -0
  63. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/stream_debug_output_manager.py +0 -0
  64. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/streaming_formatters.py +0 -0
  65. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/streaming_manager.py +0 -0
  66. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/streaming_tool_node.py +0 -0
  67. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/converters/tool_event_handlers.py +0 -0
  68. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/exceptions/__init__.py +0 -0
  69. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/exceptions/bailey_exception.py +0 -0
  70. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/file_managers/__init__.py +0 -0
  71. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/file_managers/aws_s3_file_manager.py +0 -0
  72. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/file_managers/file_manager.py +0 -0
  73. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/file_managers/file_manager_factory.py +0 -0
  74. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/file_managers/file_writer.py +0 -0
  75. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/file_managers/local_file_manager.py +0 -0
  76. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/graph/__init__.py +0 -0
  77. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/graph/graph_builder.py +0 -0
  78. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/history/__init__.py +0 -0
  79. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/history/context_compactor.py +0 -0
  80. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/history/conversation_history_manager.py +0 -0
  81. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/history/smart_history_manager.py +0 -0
  82. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/http/__init__.py +0 -0
  83. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/http/http_client_factory.py +0 -0
  84. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/__init__.py +0 -0
  85. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/aws_image_generator.py +0 -0
  86. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/image_generator.py +0 -0
  87. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/image_generator_factory.py +0 -0
  88. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/managers/__init__.py +0 -0
  89. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/managers/image_generation_manager.py +0 -0
  90. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/openai_image_generator.py +0 -0
  91. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/providers/__init__.py +0 -0
  92. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/providers/base_image_generation_provider.py +0 -0
  93. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/image_generation/providers/image_generation_provider.py +0 -0
  94. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/markdown/__init__.py +0 -0
  95. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/markdown/html_to_markdown_converter.py +0 -0
  96. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/__init__.py +0 -0
  97. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/auth/__init__.py +0 -0
  98. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/auth/auth_server_metadata_discovery.py +0 -0
  99. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/auth/mcp_authorization_helper.py +0 -0
  100. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/callbacks.py +0 -0
  101. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/exceptions/__init__.py +0 -0
  102. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/exceptions/mcp_tool_exception.py +0 -0
  103. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/exceptions/mcp_tool_not_found_exception.py +0 -0
  104. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/exceptions/mcp_tool_unauthorized_exception.py +0 -0
  105. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/exceptions/mcp_tool_unknown_exception.py +0 -0
  106. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/interceptors/__init__.py +0 -0
  107. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/interceptors/auth.py +0 -0
  108. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/interceptors/tracing.py +0 -0
  109. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/interceptors/truncation.py +0 -0
  110. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/interceptors/types.py +0 -0
  111. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/__init__.py +0 -0
  112. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/content_conversion.py +0 -0
  113. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/langchain_adapter.py +0 -0
  114. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/mcp_app_proxy.py +0 -0
  115. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/mcp_tool_list_store.py +0 -0
  116. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/server_card_discovery.py +0 -0
  117. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/session.py +0 -0
  118. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/session_pool.py +0 -0
  119. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/tool_invocation.py +0 -0
  120. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/tool_list_cache.py +0 -0
  121. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_client/ui_resource.py +0 -0
  122. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/mcp_tool_provider.py +0 -0
  123. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/tool_catalog.py +0 -0
  124. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mcp/tool_discovery_middleware.py +0 -0
  125. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mocks/__init__.py +0 -0
  126. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mocks/mock_aws_client_factory.py +0 -0
  127. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mocks/mock_http_client_factory.py +0 -0
  128. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mocks/mock_image_generator.py +0 -0
  129. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/mocks/mock_image_generator_factory.py +0 -0
  130. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/models/__init__.py +0 -0
  131. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/models/bedrock_models.py +0 -0
  132. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/models/model_factory.py +0 -0
  133. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/models/sanitizing_bedrock_converse.py +0 -0
  134. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/ocr/__init__.py +0 -0
  135. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/ocr/aws_ocr_extractor.py +0 -0
  136. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/ocr/ocr_extractor.py +0 -0
  137. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/ocr/ocr_extractor_factory.py +0 -0
  138. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/persistence/__init__.py +0 -0
  139. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/persistence/persistence_factory.py +0 -0
  140. {language_model_common-2.0.76/languagemodelcommon/schema → language_model_common-2.0.77/languagemodelcommon/pipeline}/__init__.py +0 -0
  141. {language_model_common-2.0.76/languagemodelcommon/schema/openai → language_model_common-2.0.77/languagemodelcommon/pipeline/output}/__init__.py +0 -0
  142. {language_model_common-2.0.76/languagemodelcommon/state → language_model_common-2.0.77/languagemodelcommon/pipeline/steps}/__init__.py +0 -0
  143. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/py.typed +0 -0
  144. {language_model_common-2.0.76/languagemodelcommon/structures → language_model_common-2.0.77/languagemodelcommon/schema}/__init__.py +0 -0
  145. {language_model_common-2.0.76/languagemodelcommon/structures → language_model_common-2.0.77/languagemodelcommon/schema}/openai/__init__.py +0 -0
  146. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/schema/openai/completions.py +0 -0
  147. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/schema/openai/image_generation.py +0 -0
  148. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/schema/openai/responses.py +0 -0
  149. {language_model_common-2.0.76/languagemodelcommon/structures/openai/message → language_model_common-2.0.77/languagemodelcommon/state}/__init__.py +0 -0
  150. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/state/messages_state.py +0 -0
  151. {language_model_common-2.0.76/languagemodelcommon/structures/openai/request → language_model_common-2.0.77/languagemodelcommon/structures}/__init__.py +0 -0
  152. {language_model_common-2.0.76/languagemodelcommon/tools → language_model_common-2.0.77/languagemodelcommon/structures/openai}/__init__.py +0 -0
  153. {language_model_common-2.0.76/languagemodelcommon/tools/mcp → language_model_common-2.0.77/languagemodelcommon/structures/openai/message}/__init__.py +0 -0
  154. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/structures/openai/message/chat_completion_api_message_wrapper.py +0 -0
  155. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/structures/openai/message/chat_message_wrapper.py +0 -0
  156. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/structures/openai/message/responses_api_message_wrapper.py +0 -0
  157. {language_model_common-2.0.76/languagemodelcommon/utilities → language_model_common-2.0.77/languagemodelcommon/structures/openai/request}/__init__.py +0 -0
  158. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/structures/openai/request/chat_completion_api_request_wrapper.py +0 -0
  159. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/structures/openai/request/chat_request_wrapper.py +0 -0
  160. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/structures/openai/request/responses_api_request_wrapper.py +0 -0
  161. {language_model_common-2.0.76/languagemodelcommon/utilities/cache → language_model_common-2.0.77/languagemodelcommon/tools}/__init__.py +0 -0
  162. {language_model_common-2.0.76/languagemodelcommon/utilities/environment → language_model_common-2.0.77/languagemodelcommon/tools/mcp}/__init__.py +0 -0
  163. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/tools/mcp/call_tool_tool.py +0 -0
  164. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/tools/mcp/search_tools_tool.py +0 -0
  165. {language_model_common-2.0.76/languagemodelcommon/utilities/header_reader → language_model_common-2.0.77/languagemodelcommon/utilities}/__init__.py +0 -0
  166. {language_model_common-2.0.76/languagemodelcommon/utilities/logger → language_model_common-2.0.77/languagemodelcommon/utilities/cache}/__init__.py +0 -0
  167. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/cache/advisory_lock.py +0 -0
  168. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/cache/model_config_cache_store.py +0 -0
  169. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/chat_message_helpers.py +0 -0
  170. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/config_substitution.py +0 -0
  171. {language_model_common-2.0.76/languagemodelcommon/utilities/message_preprocessing → language_model_common-2.0.77/languagemodelcommon/utilities/environment}/__init__.py +0 -0
  172. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/environment/language_model_common_environment_variables.py +0 -0
  173. {language_model_common-2.0.76/languagemodelcommon/utilities/openai → language_model_common-2.0.77/languagemodelcommon/utilities/header_reader}/__init__.py +0 -0
  174. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/header_reader/header_reader.py +0 -0
  175. {language_model_common-2.0.76/languagemodelcommon/utilities/security → language_model_common-2.0.77/languagemodelcommon/utilities/logger}/__init__.py +0 -0
  176. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/logger/debug_configuration.py +0 -0
  177. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/logger/exception_formatter.py +0 -0
  178. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/logger/exception_logger.py +0 -0
  179. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/logger/log_levels.py +0 -0
  180. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/logger/logging_response.py +0 -0
  181. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/logger/logging_transport.py +0 -0
  182. {language_model_common-2.0.76/languagemodelcommon/utilities/slash_command → language_model_common-2.0.77/languagemodelcommon/utilities/message_preprocessing}/__init__.py +0 -0
  183. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/message_preprocessing/composite_message_preprocessor.py +0 -0
  184. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py +0 -0
  185. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/mongo_url_utils.py +0 -0
  186. {language_model_common-2.0.76/languagemodelcommon/utilities/slash_command/handlers → language_model_common-2.0.77/languagemodelcommon/utilities/openai}/__init__.py +0 -0
  187. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/openai/responses_api_converter.py +0 -0
  188. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/request_information.py +0 -0
  189. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/s3_url.py +0 -0
  190. {language_model_common-2.0.76/languagemodelcommon/utilities/token_reducer → language_model_common-2.0.77/languagemodelcommon/utilities/security}/__init__.py +0 -0
  191. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/security/prompt_sanitizer.py +0 -0
  192. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/slash_command/handlers/debug_command_handler.py +0 -0
  193. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/slash_command/handlers/skill_command_handler.py +0 -0
  194. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/slash_command/slash_command_handler.py +0 -0
  195. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/slash_command/slash_command_parser.py +0 -0
  196. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/slash_command/slash_command_processor.py +0 -0
  197. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/text_humanizer.py +0 -0
  198. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/token_reducer/token_reducer.py +0 -0
  199. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/tool_display_name_mapper.py +0 -0
  200. {language_model_common-2.0.76 → language_model_common-2.0.77}/languagemodelcommon/utilities/url_parser.py +0 -0
  201. {language_model_common-2.0.76 → language_model_common-2.0.77}/pyproject.toml +0 -0
  202. {language_model_common-2.0.76 → language_model_common-2.0.77}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: language-model-common
3
- Version: 2.0.76
3
+ Version: 2.0.77
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.77
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: language-model-common
3
- Version: 2.0.76
3
+ Version: 2.0.77
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
@@ -128,6 +128,12 @@ languagemodelcommon/ocr/ocr_extractor.py
128
128
  languagemodelcommon/ocr/ocr_extractor_factory.py
129
129
  languagemodelcommon/persistence/__init__.py
130
130
  languagemodelcommon/persistence/persistence_factory.py
131
+ languagemodelcommon/pipeline/__init__.py
132
+ languagemodelcommon/pipeline/context.py
133
+ languagemodelcommon/pipeline/pipeline.py
134
+ languagemodelcommon/pipeline/step.py
135
+ languagemodelcommon/pipeline/output/__init__.py
136
+ languagemodelcommon/pipeline/steps/__init__.py
131
137
  languagemodelcommon/schema/__init__.py
132
138
  languagemodelcommon/schema/openai/__init__.py
133
139
  languagemodelcommon/schema/openai/completions.py
@@ -178,6 +184,9 @@ languagemodelcommon/utilities/message_preprocessing/message_preprocessor.py
178
184
  languagemodelcommon/utilities/openai/__init__.py
179
185
  languagemodelcommon/utilities/openai/responses_api_converter.py
180
186
  languagemodelcommon/utilities/security/__init__.py
187
+ languagemodelcommon/utilities/security/normalize.py
188
+ languagemodelcommon/utilities/security/off_topic_detector.py
189
+ languagemodelcommon/utilities/security/prompt_extraction_detector.py
181
190
  languagemodelcommon/utilities/security/prompt_sanitizer.py
182
191
  languagemodelcommon/utilities/slash_command/__init__.py
183
192
  languagemodelcommon/utilities/slash_command/slash_command_handler.py
@@ -0,0 +1,40 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, AsyncGenerator
5
+
6
+ from langchain_core.messages import AnyMessage
7
+ from langchain_core.runnables import RunnableConfig
8
+ from langgraph.graph.state import CompiledStateGraph
9
+
10
+ from languagemodelcommon.state.messages_state import MyMessagesState
11
+ from languagemodelcommon.structures.openai.request.chat_request_wrapper import (
12
+ ChatRequestWrapper,
13
+ )
14
+ from languagemodelcommon.utilities.request_information import RequestInformation
15
+
16
+
17
+ @dataclass
18
+ class PipelineContext:
19
+ """Shared mutable state that flows through all pipeline steps."""
20
+
21
+ chat_request_wrapper: ChatRequestWrapper
22
+ request: Any = None
23
+
24
+ request_information: RequestInformation | None = None
25
+
26
+ messages: list[AnyMessage] = field(default_factory=list)
27
+ prior_messages: list[AnyMessage] = field(default_factory=list)
28
+ previous_context: dict[str, Any] | None = None
29
+
30
+ state: MyMessagesState | None = None
31
+ config: RunnableConfig | None = None
32
+ graph: CompiledStateGraph[MyMessagesState] | None = None
33
+
34
+ content_stream: AsyncGenerator[str, None] | None = None
35
+
36
+ accumulated_content: str = ""
37
+ response_messages: list[AnyMessage] = field(default_factory=list)
38
+
39
+ conversation_id: str = ""
40
+ user_id: str = ""
@@ -0,0 +1,100 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import Any, AsyncGenerator, Protocol
5
+
6
+ from languagemodelcommon.pipeline.context import PipelineContext
7
+ from languagemodelcommon.pipeline.step import PipelineStep
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class OutputStep(Protocol):
13
+ def format_response(self, *, context: PipelineContext) -> Any: ...
14
+ def stream_response(
15
+ self, *, context: PipelineContext
16
+ ) -> AsyncGenerator[str, None]: ...
17
+ def format_error(self, *, context: PipelineContext, error: Exception) -> Any: ...
18
+
19
+
20
+ class Pipeline:
21
+ """Runs an ordered list of steps against a shared PipelineContext."""
22
+
23
+ def __init__(
24
+ self,
25
+ *,
26
+ pre_execution_steps: list[PipelineStep],
27
+ execution_step: PipelineStep,
28
+ post_execution_steps: list[PipelineStep],
29
+ output_step: OutputStep,
30
+ ) -> None:
31
+ self._pre_execution_steps = pre_execution_steps
32
+ self._execution_step = execution_step
33
+ self._post_execution_steps = post_execution_steps
34
+ self._output_step = output_step
35
+
36
+ async def run_non_streaming(self, *, context: PipelineContext) -> Any:
37
+ try:
38
+ for step in self._pre_execution_steps:
39
+ await step.run(context=context)
40
+ await self._execution_step.run(context=context)
41
+ await self._drain_stream(context=context)
42
+ for step in self._post_execution_steps:
43
+ await step.run(context=context)
44
+ return self._output_step.format_response(context=context)
45
+ except Exception as e:
46
+ return self._output_step.format_error(context=context, error=e)
47
+
48
+ @staticmethod
49
+ async def _drain_stream(*, context: PipelineContext) -> None:
50
+ """Consume content_stream fully, populating accumulated_content and response_messages."""
51
+ if context.content_stream is None:
52
+ return
53
+ import json as _json
54
+
55
+ from langchain_core.messages import AIMessage
56
+
57
+ async for chunk in context.content_stream:
58
+ for line in chunk.strip().splitlines():
59
+ if not line.startswith("data: "):
60
+ continue
61
+ payload = line[6:]
62
+ if payload == "[DONE]":
63
+ continue
64
+ try:
65
+ event = _json.loads(payload)
66
+ if "delta" in event and isinstance(event["delta"], str):
67
+ context.accumulated_content += event["delta"]
68
+ elif (
69
+ "choices" in event
70
+ and event["choices"]
71
+ and "delta" in event["choices"][0]
72
+ ):
73
+ delta_content = event["choices"][0]["delta"].get("content", "")
74
+ if delta_content:
75
+ context.accumulated_content += delta_content
76
+ except (ValueError, KeyError, IndexError):
77
+ # Non-content SSE events (tool calls, metadata) don't match
78
+ # either delta format — safe to skip during stream draining.
79
+ logger.debug(
80
+ "Skipping non-content SSE event during drain: %s", payload[:100]
81
+ )
82
+ if context.accumulated_content:
83
+ context.response_messages = [AIMessage(content=context.accumulated_content)]
84
+
85
+ async def run_streaming(
86
+ self, *, context: PipelineContext
87
+ ) -> AsyncGenerator[Any, None]:
88
+ try:
89
+ for step in self._pre_execution_steps:
90
+ await step.run(context=context)
91
+ await self._execution_step.run(context=context)
92
+ except Exception as e:
93
+ yield self._output_step.format_error(context=context, error=e)
94
+ return
95
+
96
+ async for chunk in self._output_step.stream_response(context=context):
97
+ yield chunk
98
+
99
+ for step in self._post_execution_steps:
100
+ await step.run(context=context)
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Protocol
4
+
5
+ from languagemodelcommon.pipeline.context import PipelineContext
6
+
7
+
8
+ class PipelineStep(Protocol):
9
+ """Protocol for a single step in the request processing pipeline."""
10
+
11
+ async def run(self, *, context: PipelineContext) -> None: ...
@@ -0,0 +1,100 @@
1
+ """Input normalization for security detection.
2
+
3
+ Centralizes Unicode normalization, zero-width stripping, and homoglyph
4
+ mapping so both prompt_extraction_detector and off_topic_detector apply
5
+ consistent pre-processing before regex matching.
6
+ """
7
+
8
+ import re
9
+ import unicodedata
10
+
11
+ REFUSAL_MESSAGE = (
12
+ "I'm here to help you with your medical records. What can I help you with?"
13
+ )
14
+
15
+
16
+ _ZERO_WIDTH_RE = re.compile(
17
+ "[​‌‍‎‏⁠⁡⁢⁣⁤­]" # nosec B613
18
+ )
19
+
20
+ # Cyrillic/Greek characters that visually resemble Latin letters.
21
+ # Covers the practical attack surface for trigger words in our patterns.
22
+ _HOMOGLYPH_MAP: dict[str, str] = {
23
+ # Cyrillic -> Latin
24
+ "А": "A", # А
25
+ "В": "B", # В
26
+ "С": "C", # С
27
+ "Е": "E", # Е
28
+ "Н": "H", # Н
29
+ "К": "K", # К
30
+ "М": "M", # М
31
+ "О": "O", # О
32
+ "Р": "P", # Р
33
+ "Т": "T", # Т
34
+ "Х": "X", # Х
35
+ "а": "a", # а
36
+ "е": "e", # е
37
+ "о": "o", # о
38
+ "р": "p", # р
39
+ "с": "c", # с
40
+ "у": "y", # у
41
+ "х": "x", # х
42
+ "ѕ": "s", # ѕ
43
+ "і": "i", # і
44
+ "ј": "j", # ј
45
+ "һ": "h", # һ
46
+ "ӏ": "l", # ӏ
47
+ # Greek -> Latin
48
+ "Α": "A", # Α
49
+ "Β": "B", # Β
50
+ "Ε": "E", # Ε
51
+ "Η": "H", # Η
52
+ "Ι": "I", # Ι
53
+ "Κ": "K", # Κ
54
+ "Μ": "M", # Μ
55
+ "Ν": "N", # Ν
56
+ "Ο": "O", # Ο
57
+ "Ρ": "P", # Ρ
58
+ "Τ": "T", # Τ
59
+ "Υ": "Y", # Υ
60
+ "Χ": "X", # Χ
61
+ "α": "a", # α (borderline but used in attacks)
62
+ "ο": "o", # ο
63
+ "ρ": "p", # ρ (lowercase rho)
64
+ # Fullwidth Latin -> ASCII Latin
65
+ # NFKC handles most of these, but belt-and-suspenders for the critical ones
66
+ "a": "a",
67
+ "b": "b",
68
+ "c": "c",
69
+ "d": "d",
70
+ "e": "e",
71
+ "i": "i",
72
+ "l": "l",
73
+ "m": "m",
74
+ "n": "n",
75
+ "o": "o",
76
+ "p": "p",
77
+ "r": "r",
78
+ "s": "s",
79
+ "t": "t",
80
+ "u": "u",
81
+ "y": "y",
82
+ }
83
+
84
+ _HOMOGLYPH_TRANS = str.maketrans(_HOMOGLYPH_MAP)
85
+
86
+
87
+ def normalize_for_detection(*, text: str) -> str:
88
+ """Normalize user input for security pattern matching.
89
+
90
+ Applies in order:
91
+ 1. NFKC Unicode normalization (collapses compatibility equivalents)
92
+ 2. Zero-width character removal
93
+ 3. Homoglyph transliteration (Cyrillic/Greek -> Latin)
94
+ 4. Whitespace collapse
95
+ """
96
+ result = unicodedata.normalize("NFKC", text)
97
+ result = _ZERO_WIDTH_RE.sub("", result)
98
+ result = result.translate(_HOMOGLYPH_TRANS)
99
+ result = re.sub(r"\s+", " ", result)
100
+ return result
@@ -0,0 +1,96 @@
1
+ """Detection of off-topic and encoding-based content manipulation attempts."""
2
+
3
+ import re
4
+ from typing import Optional
5
+
6
+ from languagemodelcommon.utilities.security.normalize import (
7
+ REFUSAL_MESSAGE,
8
+ normalize_for_detection,
9
+ )
10
+
11
+
12
+ ENCODING_PATTERNS: list[re.Pattern[str]] = [
13
+ re.compile(
14
+ r"\b(decode|encode|convert|translate|interpret)\b.*\b(ascii|base64|hex|binary|unicode|rot13|utf|latin)\b",
15
+ re.IGNORECASE,
16
+ ),
17
+ re.compile(
18
+ r"\b(ascii|base64|hex|binary|unicode|rot13|utf|latin)\b.*\b(decode|encode|convert|translate|interpret)\b",
19
+ re.IGNORECASE,
20
+ ),
21
+ re.compile(
22
+ r"\b(what(\'s| is| does))\b.*\b(in ascii|in base64|in hex|in binary)\b",
23
+ re.IGNORECASE,
24
+ ),
25
+ re.compile(
26
+ r"(\b\d{2,3}\b[\s,]+){5,}",
27
+ re.IGNORECASE,
28
+ ),
29
+ re.compile(
30
+ r"\b(respond|answer|reply|output)\b.*\b(in ascii|in base64|in hex|in binary|encoded)\b",
31
+ re.IGNORECASE,
32
+ ),
33
+ ]
34
+
35
+ OFFENSIVE_CONTENT_PATTERNS: list[re.Pattern[str]] = [
36
+ re.compile(
37
+ r"\b(is\s+(it|this|that)\s+)?(a\s+)?(derogatory|offensive|slur|racial|racist|sexist|hate)\s*(term|word|phrase|language)?\b",
38
+ re.IGNORECASE,
39
+ ),
40
+ re.compile(
41
+ r"\b(what|why)\b.*\b(derogatory|offensive|slur|racist|sexist)\b",
42
+ re.IGNORECASE,
43
+ ),
44
+ re.compile(
45
+ r"\b(explain|define|tell me about)\b.*\b(slur|derogatory|hate speech|offensive term)\b",
46
+ re.IGNORECASE,
47
+ ),
48
+ ]
49
+
50
+
51
+ class OffTopicAttempt(Exception):
52
+ """Raised when an off-topic manipulation attempt is detected."""
53
+
54
+ def __init__(self, *, category: str) -> None:
55
+ self.category = category
56
+ super().__init__(REFUSAL_MESSAGE)
57
+
58
+
59
+ def detect_encoding_manipulation(*, text: str) -> Optional[str]:
60
+ """Check if user input attempts encoding-based content manipulation.
61
+
62
+ Returns the matched pattern description if detected, None otherwise.
63
+ """
64
+ for pattern in ENCODING_PATTERNS:
65
+ if pattern.search(text):
66
+ return pattern.pattern
67
+ return None
68
+
69
+
70
+ def detect_offensive_content_request(*, text: str) -> Optional[str]:
71
+ """Check if user input requests discussion of offensive language.
72
+
73
+ Returns the matched pattern description if detected, None otherwise.
74
+ """
75
+ for pattern in OFFENSIVE_CONTENT_PATTERNS:
76
+ if pattern.search(text):
77
+ return pattern.pattern
78
+ return None
79
+
80
+
81
+ def detect_off_topic_manipulation(*, text: str) -> Optional[str]:
82
+ """Check for any off-topic manipulation attempt (encoding or offensive content).
83
+
84
+ Returns the category of detection if found, None otherwise.
85
+ """
86
+ cleaned = normalize_for_detection(text=text)
87
+
88
+ result = detect_encoding_manipulation(text=cleaned)
89
+ if result:
90
+ return "encoding_manipulation"
91
+
92
+ result = detect_offensive_content_request(text=cleaned)
93
+ if result:
94
+ return "offensive_content_request"
95
+
96
+ return None
@@ -0,0 +1,69 @@
1
+ """Detection of prompt extraction and system instruction disclosure attempts."""
2
+
3
+ import re
4
+ from typing import Optional
5
+
6
+ from languagemodelcommon.utilities.security.normalize import (
7
+ REFUSAL_MESSAGE,
8
+ normalize_for_detection,
9
+ )
10
+
11
+
12
+ class PromptExtractionAttempt(Exception):
13
+ """Raised when a prompt extraction attempt is detected in user input."""
14
+
15
+ def __init__(self) -> None:
16
+ super().__init__(REFUSAL_MESSAGE)
17
+
18
+
19
+ PROMPT_EXTRACTION_PATTERNS: list[re.Pattern[str]] = [
20
+ re.compile(
21
+ r"\b(repeat|output|print|show|display|reveal|disclose|give me|write out|put)\b"
22
+ r".*\b(system prompt|system instructions?|your instructions?|your prompt|the prompt|system message|your configuration|your rules)\b",
23
+ re.IGNORECASE | re.DOTALL,
24
+ ),
25
+ re.compile(
26
+ r"\b(what are|tell me|share)\b.*\b(your system instructions?|your system prompt|your prompt|your rules|your system message)\b",
27
+ re.IGNORECASE | re.DOTALL,
28
+ ),
29
+ re.compile(
30
+ r"\b(text|everything|all)\s+(above|before this)\b",
31
+ re.IGNORECASE,
32
+ ),
33
+ re.compile(
34
+ r"\bcode\s*block\b.*\b(above|instructions?|prompt|system)\b",
35
+ re.IGNORECASE | re.DOTALL,
36
+ ),
37
+ re.compile(
38
+ r"\b(above|instructions?|prompt|system)\b.*\bcode\s*block\b",
39
+ re.IGNORECASE | re.DOTALL,
40
+ ),
41
+ re.compile(
42
+ r"\b(ignore|forget|disregard)\b.*\b(previous|above|prior|instructions?|rules)\b",
43
+ re.IGNORECASE | re.DOTALL,
44
+ ),
45
+ re.compile(
46
+ r"\b(pretend|act as if|imagine|you are now)\b.*\b(no rules|no restrictions|unrestricted|jailbreak)\b",
47
+ re.IGNORECASE | re.DOTALL,
48
+ ),
49
+ re.compile(
50
+ r"\binitial\s+(instructions?|prompt|message)\b",
51
+ re.IGNORECASE,
52
+ ),
53
+ re.compile(
54
+ r"\b(the|your)\s+system\s*(:|message|prompt|instructions?)\b",
55
+ re.IGNORECASE,
56
+ ),
57
+ ]
58
+
59
+
60
+ def detect_prompt_extraction(*, text: str) -> Optional[str]:
61
+ """Check if user input attempts to extract system instructions.
62
+
63
+ Returns the matched pattern description if detected, None otherwise.
64
+ """
65
+ normalized = normalize_for_detection(text=text)
66
+ for pattern in PROMPT_EXTRACTION_PATTERNS:
67
+ if pattern.search(normalized):
68
+ return pattern.pattern
69
+ return None
@@ -1 +0,0 @@
1
- 2.0.76