iatoolkit 2.45.1__tar.gz → 2.45.3__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 (253) hide show
  1. {iatoolkit-2.45.1/src/iatoolkit.egg-info → iatoolkit-2.45.3}/PKG-INFO +1 -1
  2. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +5 -0
  4. iatoolkit-2.45.3/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +155 -0
  5. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_response.py +4 -0
  6. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/llm_client_service.py +97 -3
  7. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/operator_identity_service.py +18 -8
  8. {iatoolkit-2.45.1 → iatoolkit-2.45.3/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  9. iatoolkit-2.45.1/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -65
  10. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/LICENSE +0 -0
  11. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/LICENSE_COMMUNITY.md +0 -0
  12. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/pyproject.toml +0 -0
  13. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/readme.md +0 -0
  14. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/requirements.txt +0 -0
  15. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/setup.cfg +0 -0
  16. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/base_company.py +0 -0
  17. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/cli_commands.py +0 -0
  18. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/__init__.py +0 -0
  19. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/bridge_validation.py +0 -0
  20. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/exceptions.py +0 -0
  21. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  22. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  23. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  24. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  25. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  26. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  27. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  28. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  29. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/model_registry.py +0 -0
  30. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/routes.py +0 -0
  31. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/secret_resolver.py +0 -0
  32. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/session_manager.py +0 -0
  33. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/common/util.py +0 -0
  34. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/company_registry.py +0 -0
  35. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/__init__.py +0 -0
  36. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  37. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  38. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  39. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  40. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  41. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  42. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  43. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  44. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  45. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  46. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  47. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  48. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  49. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  50. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  51. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  52. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  53. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  54. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  55. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  56. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  57. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  58. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  59. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  60. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  61. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  62. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  63. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  64. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  65. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/core.py +0 -0
  66. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/__init__.py +0 -0
  67. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  68. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/call_service.py +0 -0
  69. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  70. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  71. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  72. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  73. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  74. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  75. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  76. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/google_auth_client.py +0 -0
  77. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/google_chat_app.py +0 -0
  78. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  79. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/inference_handler.py +0 -0
  80. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  81. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  82. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  83. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  84. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  85. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  86. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  87. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/llm_proxy.py +0 -0
  88. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  89. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/locales/en.yaml +0 -0
  90. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/locales/es.yaml +0 -0
  91. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/__init__.py +0 -0
  92. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  93. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  94. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/database_manager.py +0 -0
  95. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/document_repo.py +0 -0
  96. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  97. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  98. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  99. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  100. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  101. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/memory_repo.py +0 -0
  102. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/models.py +0 -0
  103. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/profile_repo.py +0 -0
  104. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  105. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  106. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  107. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/repositories/vs_repo.py +0 -0
  108. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/runtime_logging.py +0 -0
  109. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/__init__.py +0 -0
  110. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/api_key_service.py +0 -0
  111. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  112. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/auth_service.py +0 -0
  113. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/benchmark_service.py +0 -0
  114. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/branding_service.py +0 -0
  115. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/company_context_service.py +0 -0
  116. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/configuration_service.py +0 -0
  117. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/context_builder_service.py +0 -0
  118. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/dispatcher_service.py +0 -0
  119. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/embedding_service.py +0 -0
  120. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/excel_service.py +0 -0
  121. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/file_processor_service.py +0 -0
  122. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/history_manager_service.py +0 -0
  123. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/http_tool_service.py +0 -0
  124. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/i18n_service.py +0 -0
  125. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/inference_service.py +0 -0
  126. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/jwt_service.py +0 -0
  127. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  128. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/language_service.py +0 -0
  129. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/license_service.py +0 -0
  130. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/mail_service.py +0 -0
  131. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  132. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/mcp_token_service.py +0 -0
  133. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  134. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/memory_lint_service.py +0 -0
  135. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  136. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/memory_service.py +0 -0
  137. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  138. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  139. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  140. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/__init__.py +0 -0
  141. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/contracts.py +0 -0
  142. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  143. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  144. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  145. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  146. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  147. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  148. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  149. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  150. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/parsers/validator.py +0 -0
  151. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/pdf_service.py +0 -0
  152. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/profile_service.py +0 -0
  153. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  154. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/prompt_service.py +0 -0
  155. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/query_service.py +0 -0
  156. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  157. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  158. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/sql_service.py +0 -0
  159. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/sql_source_service.py +0 -0
  160. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/storage_service.py +0 -0
  161. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/structured_output_service.py +0 -0
  162. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  163. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/system_tools.py +0 -0
  164. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/telemetry_service.py +0 -0
  165. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  166. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/tool_output_contract.py +0 -0
  167. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/tool_service.py +0 -0
  168. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/user_feedback_service.py +0 -0
  169. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/user_session_context_service.py +0 -0
  170. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/visual_kb_service.py +0 -0
  171. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/visual_tool_service.py +0 -0
  172. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/warmup_service.py +0 -0
  173. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/web_search/__init__.py +0 -0
  174. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  175. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  176. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  177. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/services/web_search_service.py +0 -0
  178. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  179. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  180. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  181. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  182. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  183. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  184. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  185. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  186. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_main.js +0 -0
  187. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  188. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  189. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  190. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  191. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  192. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  193. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  194. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/chat_public.css +0 -0
  195. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/documents.css +0 -0
  196. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/landing_page.css +0 -0
  197. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/llm_output.css +0 -0
  198. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/static/styles/onboarding.css +0 -0
  199. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/_company_header.html +0 -0
  200. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/_login_widget.html +0 -0
  201. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/account.html +0 -0
  202. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/base.html +0 -0
  203. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/change_password.html +0 -0
  204. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/chat.html +0 -0
  205. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  206. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/chat_modals.html +0 -0
  207. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/error.html +0 -0
  208. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/forgot_password.html +0 -0
  209. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  210. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  211. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  212. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/pdf/base.html +0 -0
  213. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/pdf/letter.html +0 -0
  214. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/pdf/report.html +0 -0
  215. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/pdf/simple.html +0 -0
  216. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/templates/signup.html +0 -0
  217. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/__init__.py +0 -0
  218. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/account_view.py +0 -0
  219. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/api_key_api_view.py +0 -0
  220. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/base_login_view.py +0 -0
  221. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/categories_api_view.py +0 -0
  222. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/change_password_view.py +0 -0
  223. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  224. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/chat_view.py +0 -0
  225. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/configuration_api_view.py +0 -0
  226. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/connectors_api_view.py +0 -0
  227. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/embedding_api_view.py +0 -0
  228. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/forgot_password_view.py +0 -0
  229. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/help_content_api_view.py +0 -0
  230. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/history_api_view.py +0 -0
  231. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/home_view.py +0 -0
  232. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/init_context_api_view.py +0 -0
  233. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  234. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/load_document_api_view.py +0 -0
  235. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/login_view.py +0 -0
  236. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/logout_api_view.py +0 -0
  237. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/memory_api_view.py +0 -0
  238. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/profile_api_view.py +0 -0
  239. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/prompt_api_view.py +0 -0
  240. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  241. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  242. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/rag_api_view.py +0 -0
  243. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/root_redirect_view.py +0 -0
  244. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/signup_view.py +0 -0
  245. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/static_page_view.py +0 -0
  246. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/tool_api_view.py +0 -0
  247. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  248. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/users_api_view.py +0 -0
  249. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit/views/verify_user_view.py +0 -0
  250. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  251. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  252. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit.egg-info/requires.txt +0 -0
  253. {iatoolkit-2.45.1 → iatoolkit-2.45.3}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.45.1
3
+ Version: 2.45.3
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.45.1"
6
+ __version__ = "2.45.3"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -744,6 +744,7 @@ class OpenAICompatibleChatAdapter:
744
744
  reasoning_content=reasoning_content,
745
745
  reasoning_details=reasoning_details,
746
746
  content_parts=content_parts,
747
+ provider_metadata=self._extract_provider_metadata(response),
747
748
  )
748
749
 
749
750
  # Backward-compatible alias retained while the old DeepSeek-specific name
@@ -831,3 +832,7 @@ class OpenAICompatibleChatAdapter:
831
832
  if type(value).__module__.startswith("unittest.mock"):
832
833
  return ""
833
834
  return str(value or "").strip()
835
+
836
+ def _extract_provider_metadata(self, response: Any) -> Dict[str, Any]:
837
+ _ = response
838
+ return {}
@@ -0,0 +1,155 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from typing import Any, Dict
7
+
8
+ from iatoolkit.infra.llm_providers.openai_compatible_chat_adapter import OpenAICompatibleChatAdapter
9
+
10
+
11
+ class OpenRouterAdapter(OpenAICompatibleChatAdapter):
12
+ """OpenRouter-specific adapter built on top of the shared chat.completions core."""
13
+
14
+ supports_multimodal = True
15
+ supports_reasoning = False
16
+ supports_reasoning_content_messages = True
17
+ supports_reasoning_details_messages = True
18
+ reasoning_content_message_field = "reasoning"
19
+ supports_metadata = True
20
+ supports_parallel_tool_calls = True
21
+
22
+ def __init__(self, openrouter_client):
23
+ super().__init__(openai_compatible_client=openrouter_client, provider_label="OpenRouter")
24
+
25
+ def _extend_call_kwargs(self, call_kwargs: Dict[str, Any], kwargs: Dict[str, Any]) -> None:
26
+ text = kwargs.get("text") or {}
27
+ verbosity = text.get("verbosity") if isinstance(text, dict) else None
28
+ if verbosity:
29
+ call_kwargs["verbosity"] = verbosity
30
+
31
+ passthrough_keys = (
32
+ "service_tier",
33
+ "temperature",
34
+ "top_p",
35
+ "max_tokens",
36
+ "max_completion_tokens",
37
+ "seed",
38
+ "stop",
39
+ "stream",
40
+ "stream_options",
41
+ "modalities",
42
+ "user",
43
+ )
44
+ for key in passthrough_keys:
45
+ if kwargs.get(key) is not None:
46
+ call_kwargs[key] = kwargs.get(key)
47
+
48
+ extra_body = dict(call_kwargs.get("extra_body") or {})
49
+
50
+ reasoning_payload = self._build_reasoning_payload(kwargs.get("reasoning"), kwargs)
51
+ if reasoning_payload:
52
+ extra_body["reasoning"] = reasoning_payload
53
+
54
+ vendor_specific_keys = (
55
+ "models",
56
+ "provider",
57
+ "plugins",
58
+ "session_id",
59
+ )
60
+ for key in vendor_specific_keys:
61
+ if kwargs.get(key) is not None:
62
+ extra_body[key] = kwargs.get(key)
63
+
64
+ if extra_body:
65
+ call_kwargs["extra_body"] = extra_body
66
+
67
+ def _extract_provider_metadata(self, response: Any) -> Dict[str, Any]:
68
+ raw_metadata = self._get_message_value(response, "openrouter_metadata")
69
+ metadata = self._normalize_metadata_object(raw_metadata)
70
+
71
+ provider_name = self._extract_provider_name(metadata)
72
+ if not provider_name:
73
+ provider_name = self._coerce_optional_text(
74
+ self._get_message_value(response, "provider_name")
75
+ )
76
+
77
+ provider_metadata: Dict[str, Any] = {"provider": "openrouter"}
78
+ if provider_name:
79
+ provider_metadata["provider_name"] = provider_name
80
+ if metadata:
81
+ provider_metadata["openrouter"] = metadata
82
+
83
+ return provider_metadata
84
+
85
+ @classmethod
86
+ def _extract_provider_name(cls, metadata: Dict[str, Any]) -> str:
87
+ for key in ("provider_name", "provider", "upstream_provider", "selected_provider"):
88
+ value = metadata.get(key)
89
+ if isinstance(value, dict):
90
+ nested = cls._extract_provider_name(value)
91
+ if nested:
92
+ return nested
93
+ normalized = cls._coerce_optional_text(value)
94
+ if normalized:
95
+ return normalized
96
+
97
+ for value in metadata.values():
98
+ if isinstance(value, dict):
99
+ nested = cls._extract_provider_name(value)
100
+ if nested:
101
+ return nested
102
+
103
+ return ""
104
+
105
+ @classmethod
106
+ def _normalize_metadata_object(cls, value: Any) -> Dict[str, Any]:
107
+ if value is None or type(value).__module__.startswith("unittest.mock"):
108
+ return {}
109
+
110
+ if isinstance(value, dict):
111
+ return cls._sanitize_metadata_dict(value)
112
+
113
+ model_dump = getattr(value, "model_dump", None)
114
+ if callable(model_dump):
115
+ try:
116
+ dumped = model_dump()
117
+ if isinstance(dumped, dict):
118
+ return cls._sanitize_metadata_dict(dumped)
119
+ except Exception:
120
+ return {}
121
+
122
+ raw_dict = getattr(value, "__dict__", None)
123
+ if isinstance(raw_dict, dict):
124
+ return cls._sanitize_metadata_dict({
125
+ key: item
126
+ for key, item in raw_dict.items()
127
+ if not key.startswith("_") and not callable(item)
128
+ })
129
+
130
+ return {}
131
+
132
+ @classmethod
133
+ def _sanitize_metadata_dict(cls, metadata: Dict[str, Any]) -> Dict[str, Any]:
134
+ sanitized: Dict[str, Any] = {}
135
+ for key, value in dict(metadata or {}).items():
136
+ normalized_key = cls._coerce_optional_text(key)
137
+ if not normalized_key:
138
+ continue
139
+
140
+ if isinstance(value, dict):
141
+ sanitized_value = cls._sanitize_metadata_dict(value)
142
+ elif isinstance(value, list):
143
+ sanitized_value = [
144
+ cls._sanitize_metadata_dict(item) if isinstance(item, dict) else item
145
+ for item in value
146
+ if not type(item).__module__.startswith("unittest.mock")
147
+ ]
148
+ elif type(value).__module__.startswith("unittest.mock"):
149
+ continue
150
+ else:
151
+ sanitized_value = value
152
+
153
+ sanitized[normalized_key] = sanitized_value
154
+
155
+ return sanitized
@@ -38,6 +38,7 @@ class LLMResponse:
38
38
  # ordered list of content blocks (text and image mixed)
39
39
  # Example: [{"type": "text", "text": "..."}, {"type": "image", "source": {"type": "base64", "data": "..."}}]
40
40
  content_parts: List[Dict] = None
41
+ provider_metadata: Dict[str, Any] = None
41
42
 
42
43
  def __post_init__(self):
43
44
  """Asegura que output sea una lista"""
@@ -56,3 +57,6 @@ class LLMResponse:
56
57
  "type": "text",
57
58
  "text": self.output_text
58
59
  })
60
+
61
+ if self.provider_metadata is None:
62
+ self.provider_metadata = {}
@@ -404,7 +404,7 @@ class llmClient:
404
404
  if key == "request_source":
405
405
  continue
406
406
  if value is not None:
407
- combined_stats[key] = value
407
+ combined_stats[key] = self._compact_execution_metadata_for_stats(key, value)
408
408
 
409
409
  # decode the LLM response
410
410
  decoded_response = self.decode_response(response)
@@ -1255,17 +1255,111 @@ class llmClient:
1255
1255
  "output_tokens": response.usage.output_tokens,
1256
1256
  "total_tokens": response.usage.total_tokens
1257
1257
  }
1258
+ provider_stats = self._build_provider_stats(getattr(response, "provider_metadata", None))
1259
+ if provider_stats:
1260
+ stats_dict.update(provider_stats)
1258
1261
  return stats_dict
1259
1262
 
1260
- def add_stats(self, stats1: dict, stats2: dict) -> dict:
1263
+ @staticmethod
1264
+ def _build_provider_stats(provider_metadata: dict | None) -> dict:
1265
+ if not isinstance(provider_metadata, dict) or not provider_metadata:
1266
+ return {}
1267
+
1268
+ provider = str(provider_metadata.get("provider") or "").strip()
1269
+ routed_provider = str(provider_metadata.get("provider_name") or "").strip()
1270
+
1271
+ stats: dict = {}
1272
+ if provider:
1273
+ stats["provider"] = provider
1274
+ if routed_provider:
1275
+ stats["routed_provider"] = routed_provider
1276
+
1277
+ openrouter_metadata = provider_metadata.get("openrouter")
1278
+ if isinstance(openrouter_metadata, dict) and openrouter_metadata:
1279
+ stats["openrouter"] = openrouter_metadata
1280
+
1281
+ provider_call = {}
1282
+ if provider:
1283
+ provider_call["provider"] = provider
1284
+ if routed_provider:
1285
+ provider_call["routed_provider"] = routed_provider
1286
+ if provider_call:
1287
+ stats["provider_calls"] = [provider_call]
1288
+
1289
+ return stats
1290
+
1291
+ @staticmethod
1292
+ def add_stats(stats1: dict, stats2: dict) -> dict:
1293
+ stats1 = dict(stats1 or {})
1294
+ stats2 = dict(stats2 or {})
1261
1295
  stats_dict = {
1262
- "model": stats1.get('model', ''),
1296
+ **stats1,
1297
+ **stats2,
1298
+ "model": stats2.get('model') or stats1.get('model', ''),
1263
1299
  "input_tokens": (stats1.get('input_tokens') or 0) + (stats2.get('input_tokens') or 0),
1264
1300
  "output_tokens": (stats1.get('output_tokens') or 0) + (stats2.get('output_tokens') or 0),
1265
1301
  "total_tokens": (stats1.get('total_tokens') or 0) + (stats2.get('total_tokens') or 0),
1266
1302
  }
1303
+ provider_calls = []
1304
+ for stats in (stats1, stats2):
1305
+ for provider_call in stats.get("provider_calls") or []:
1306
+ if isinstance(provider_call, dict) and provider_call not in provider_calls:
1307
+ provider_calls.append(provider_call)
1308
+ if provider_calls:
1309
+ stats_dict["provider_calls"] = provider_calls
1267
1310
  return stats_dict
1268
1311
 
1312
+ @classmethod
1313
+ def _compact_execution_metadata_for_stats(cls, key: str, value):
1314
+ if key == "tool_router":
1315
+ return cls._compact_tool_router_stats(value)
1316
+ return value
1317
+
1318
+ @staticmethod
1319
+ def _compact_tool_router_stats(metrics):
1320
+ if not isinstance(metrics, dict):
1321
+ return metrics
1322
+
1323
+ compact = {}
1324
+ scalar_keys = (
1325
+ "candidate_count",
1326
+ "selected_count",
1327
+ "selection_mode",
1328
+ "fallback_reason",
1329
+ "selector_latency_ms",
1330
+ "router_skipped",
1331
+ "hard_disable_tools",
1332
+ )
1333
+ for key in scalar_keys:
1334
+ if key in metrics:
1335
+ compact[key] = metrics.get(key)
1336
+
1337
+ list_count_keys = {
1338
+ "configured_tool_names": "configured_count",
1339
+ "matched_tool_names": "matched_count",
1340
+ "missing_tool_names": "missing_count",
1341
+ "forced_tool_names": "forced_count",
1342
+ "selected_system_prompt_keys": "selected_system_prompt_count",
1343
+ }
1344
+ for source_key, target_key in list_count_keys.items():
1345
+ value = metrics.get(source_key)
1346
+ if isinstance(value, list):
1347
+ compact[target_key] = len(value)
1348
+
1349
+ hook_metadata = metrics.get("hook_metadata")
1350
+ if isinstance(hook_metadata, dict):
1351
+ for key in ("top_k", "top_n", "min_confidence", "shadow_mode"):
1352
+ if key in hook_metadata:
1353
+ compact[key] = hook_metadata.get(key)
1354
+ selected_tool_names = hook_metadata.get("selected_tool_names")
1355
+ if isinstance(selected_tool_names, list):
1356
+ compact["hook_selected_count"] = len(selected_tool_names)
1357
+ ranked_tools_preview = hook_metadata.get("ranked_tools_preview")
1358
+ if isinstance(ranked_tools_preview, list):
1359
+ compact["ranked_preview_count"] = len(ranked_tools_preview)
1360
+
1361
+ return compact
1362
+
1269
1363
 
1270
1364
  def _create_sql_retry_prompt(self, function_name: str, sql_query: str, db_error: str) -> str:
1271
1365
  return f"""
@@ -39,6 +39,17 @@ class OperatorIdentityService:
39
39
  SETTING_NAMES = ("IAT_OPERATOR_COMPANY", "IAT_BILLING_COMPANY_SHORT_NAME")
40
40
  SETTING_NAME = SETTING_NAMES[0]
41
41
 
42
+ #: Held on the class, not the instance. Callers that have a repository at hand
43
+ #: build their own instance rather than asking the injector, so an instance
44
+ #: cache resolved — and logged, and queried the database — once per request
45
+ #: instead of once per process.
46
+ _resolved: str | None = None
47
+
48
+ @classmethod
49
+ def reset_cache(cls) -> None:
50
+ """Forget the resolved name. For tests: it cannot change at runtime."""
51
+ OperatorIdentityService._resolved = None
52
+
42
53
  @classmethod
43
54
  def stated_name(cls) -> str:
44
55
  """What this deployment calls its operator, without checking it exists.
@@ -57,7 +68,6 @@ class OperatorIdentityService:
57
68
  @inject
58
69
  def __init__(self, profile_repo: ProfileRepo):
59
70
  self.profile_repo = profile_repo
60
- self._resolved: str | None = None
61
71
 
62
72
  def company_short_name(self) -> str:
63
73
  """The operator company, resolved once per process.
@@ -65,24 +75,24 @@ class OperatorIdentityService:
65
75
  Cached because the answer cannot change without a deployment, and this is
66
76
  read on paths that run per request and per invoice.
67
77
  """
68
- if self._resolved:
69
- return self._resolved
78
+ if OperatorIdentityService._resolved:
79
+ return OperatorIdentityService._resolved
70
80
 
71
81
  for setting in self.SETTING_NAMES:
72
82
  configured = (os.getenv(setting) or "").strip().lower()
73
83
  if configured:
74
- self._resolved = configured
84
+ OperatorIdentityService._resolved = configured
75
85
  logging.info("Operator company: '%s' (from %s).", configured, setting)
76
- return self._resolved
86
+ return configured
77
87
 
78
88
  if self._company_exists(self.LEGACY_COMPANY_SHORT_NAME):
79
- self._resolved = self.LEGACY_COMPANY_SHORT_NAME
89
+ OperatorIdentityService._resolved = self.LEGACY_COMPANY_SHORT_NAME
80
90
  logging.info(
81
91
  "Operator company: '%s' (default). Set %s to name it explicitly.",
82
- self._resolved,
92
+ OperatorIdentityService._resolved,
83
93
  self.SETTING_NAME,
84
94
  )
85
- return self._resolved
95
+ return OperatorIdentityService._resolved
86
96
 
87
97
  # Deliberately loud. The alternative is what used to happen: a name from
88
98
  # another deployment travels down to the payment configuration and the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.45.1
3
+ Version: 2.45.3
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -1,65 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- from typing import Any, Dict
7
-
8
- from iatoolkit.infra.llm_providers.openai_compatible_chat_adapter import OpenAICompatibleChatAdapter
9
-
10
-
11
- class OpenRouterAdapter(OpenAICompatibleChatAdapter):
12
- """OpenRouter-specific adapter built on top of the shared chat.completions core."""
13
-
14
- supports_multimodal = True
15
- supports_reasoning = False
16
- supports_reasoning_content_messages = True
17
- supports_reasoning_details_messages = True
18
- reasoning_content_message_field = "reasoning"
19
- supports_metadata = True
20
- supports_parallel_tool_calls = True
21
-
22
- def __init__(self, openrouter_client):
23
- super().__init__(openai_compatible_client=openrouter_client, provider_label="OpenRouter")
24
-
25
- def _extend_call_kwargs(self, call_kwargs: Dict[str, Any], kwargs: Dict[str, Any]) -> None:
26
- text = kwargs.get("text") or {}
27
- verbosity = text.get("verbosity") if isinstance(text, dict) else None
28
- if verbosity:
29
- call_kwargs["verbosity"] = verbosity
30
-
31
- passthrough_keys = (
32
- "service_tier",
33
- "temperature",
34
- "top_p",
35
- "max_tokens",
36
- "max_completion_tokens",
37
- "seed",
38
- "stop",
39
- "stream",
40
- "stream_options",
41
- "modalities",
42
- "user",
43
- )
44
- for key in passthrough_keys:
45
- if kwargs.get(key) is not None:
46
- call_kwargs[key] = kwargs.get(key)
47
-
48
- extra_body = dict(call_kwargs.get("extra_body") or {})
49
-
50
- reasoning_payload = self._build_reasoning_payload(kwargs.get("reasoning"), kwargs)
51
- if reasoning_payload:
52
- extra_body["reasoning"] = reasoning_payload
53
-
54
- vendor_specific_keys = (
55
- "models",
56
- "provider",
57
- "plugins",
58
- "session_id",
59
- )
60
- for key in vendor_specific_keys:
61
- if kwargs.get(key) is not None:
62
- extra_body[key] = kwargs.get(key)
63
-
64
- if extra_body:
65
- call_kwargs["extra_body"] = extra_body
File without changes
File without changes
File without changes
File without changes
File without changes