iatoolkit 2.56.0__tar.gz → 2.58.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 (260) hide show
  1. {iatoolkit-2.56.0/src/iatoolkit.egg-info → iatoolkit-2.58.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/__init__.py +1 -1
  3. iatoolkit-2.58.0/src/iatoolkit/base_company.py +48 -0
  4. iatoolkit-2.58.0/src/iatoolkit/common/company_paths.py +25 -0
  5. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/routes.py +13 -0
  6. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/util.py +2 -1
  7. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/core.py +28 -0
  8. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +23 -12
  9. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +2 -1
  10. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/llm_query_repo.py +8 -0
  11. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/models.py +10 -0
  12. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/history_manager_service.py +2 -1
  13. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/llm_client_service.py +356 -137
  14. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/query_service.py +11 -0
  15. iatoolkit-2.58.0/src/iatoolkit/static/images/favicon.ico +0 -0
  16. iatoolkit-2.58.0/src/iatoolkit/static/images/favicon.png +0 -0
  17. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/base.html +1 -0
  18. {iatoolkit-2.56.0 → iatoolkit-2.58.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  19. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit.egg-info/SOURCES.txt +3 -0
  20. iatoolkit-2.56.0/src/iatoolkit/base_company.py +0 -21
  21. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/LICENSE +0 -0
  22. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/LICENSE_COMMUNITY.md +0 -0
  23. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/pyproject.toml +0 -0
  24. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/readme.md +0 -0
  25. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/setup.cfg +0 -0
  26. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/cli_commands.py +0 -0
  27. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/__init__.py +0 -0
  28. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  29. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/exceptions.py +0 -0
  30. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  31. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  32. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  33. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  34. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  35. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  36. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  37. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  38. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/model_registry.py +0 -0
  39. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  40. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/session_manager.py +0 -0
  41. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/text_splitter.py +0 -0
  42. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/common/url_safety.py +0 -0
  43. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/company_registry.py +0 -0
  44. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/__init__.py +0 -0
  45. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  46. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  47. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  48. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  49. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  50. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  51. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  52. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  53. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  54. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  55. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  56. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  57. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  58. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  59. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  60. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  61. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  62. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  63. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  64. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  65. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  66. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  67. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  68. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  69. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  70. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  71. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  72. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  73. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  74. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/__init__.py +0 -0
  75. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  76. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/call_service.py +0 -0
  77. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  78. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  79. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  80. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  81. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  82. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  83. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  84. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  85. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  86. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  87. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  88. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  89. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  90. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  91. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  92. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  93. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  94. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  95. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  96. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  97. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/llm_response.py +0 -0
  98. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  99. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/locales/en.yaml +0 -0
  100. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/locales/es.yaml +0 -0
  101. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/__init__.py +0 -0
  102. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  103. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  104. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  105. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  106. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  107. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  108. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  109. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  110. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  111. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  112. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  113. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  114. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  115. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/runtime_logging.py +0 -0
  116. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/__init__.py +0 -0
  117. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/api_key_service.py +0 -0
  118. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  119. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/auth_service.py +0 -0
  120. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/branding_service.py +0 -0
  121. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/company_context_service.py +0 -0
  122. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/configuration_service.py +0 -0
  123. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  124. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  125. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/embedding_service.py +0 -0
  126. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/excel_service.py +0 -0
  127. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  128. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  129. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/i18n_service.py +0 -0
  130. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/inference_service.py +0 -0
  131. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/jwt_service.py +0 -0
  132. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  133. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/language_service.py +0 -0
  134. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/license_service.py +0 -0
  135. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/mail_service.py +0 -0
  136. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  137. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  138. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  139. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  140. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  141. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/memory_service.py +0 -0
  142. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  143. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  144. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  145. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
  146. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  147. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  148. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  149. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  150. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  151. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  152. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  153. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  154. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  155. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  156. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  157. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/pdf_service.py +0 -0
  158. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/profile_service.py +0 -0
  159. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  160. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/prompt_service.py +0 -0
  161. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  162. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  163. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/sql_service.py +0 -0
  164. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  165. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/storage_service.py +0 -0
  166. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  167. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  168. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/system_tools.py +0 -0
  169. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  170. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  171. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  172. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/tool_service.py +0 -0
  173. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  174. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  175. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  176. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  177. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/warmup_service.py +0 -0
  178. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  179. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  180. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  181. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  182. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/services/web_search_service.py +0 -0
  183. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  184. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  185. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  186. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  187. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  188. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_header_navigation.js +0 -0
  189. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  190. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  191. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  192. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  193. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  194. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  195. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  196. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  197. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  198. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/account.css +0 -0
  199. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  200. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  201. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  202. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/documents.css +0 -0
  203. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  204. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  205. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  206. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/_chat_header.html +0 -0
  207. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/_company_header.html +0 -0
  208. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  209. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/account.html +0 -0
  210. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/change_password.html +0 -0
  211. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/chat.html +0 -0
  212. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  213. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  214. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/error.html +0 -0
  215. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  216. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  217. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/login_global.html +0 -0
  218. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  219. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  220. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  221. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  222. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  223. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  224. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/templates/signup.html +0 -0
  225. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/__init__.py +0 -0
  226. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/account_view.py +0 -0
  227. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  228. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/base_login_view.py +0 -0
  229. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  230. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/change_password_view.py +0 -0
  231. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  232. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/chat_view.py +0 -0
  233. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  234. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  235. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  236. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  237. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  238. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/history_api_view.py +0 -0
  239. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/home_view.py +0 -0
  240. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  241. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  242. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  243. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/login_view.py +0 -0
  244. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  245. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  246. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  247. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  248. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  249. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  250. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  251. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  252. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/signup_view.py +0 -0
  253. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/static_page_view.py +0 -0
  254. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  255. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  256. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/users_api_view.py +0 -0
  257. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  258. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  259. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  260. {iatoolkit-2.56.0 → iatoolkit-2.58.0}/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.56.0
3
+ Version: 2.58.0
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.56.0"
6
+ __version__ = "2.58.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -0,0 +1,48 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ # companies/base_company.py
7
+ from abc import ABC, abstractmethod
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ from flask import Blueprint
12
+
13
+ class BaseCompany(ABC):
14
+
15
+ @abstractmethod
16
+ # execute the specific action configured in the intent table
17
+ def handle_request(self, tag: str, params: dict) -> dict:
18
+ raise NotImplementedError("La subclase debe implementar el método handle_request()")
19
+
20
+ def register_cli_commands(self, app):
21
+ # Optional extension point. Community/Enterprise can override as needed.
22
+ return None
23
+
24
+ def get_blueprint(self) -> Optional[Blueprint]:
25
+ """
26
+ Optional extension point: the web routes, templates and static files this
27
+ company owns. The core registers the blueprint at boot for every company
28
+ that is loaded, so the host application never imports a company's views.
29
+
30
+ The blueprint must be named after the company short name: that name is
31
+ the namespace of its endpoints (``url_for('<company>.<endpoint>')``).
32
+ URLs are not prefixed by the core; the company chooses them.
33
+ """
34
+ return None
35
+
36
+ @classmethod
37
+ def get_resource_root(cls) -> Optional[Path]:
38
+ """
39
+ Directory that holds this company's files (config, prompts, schemas,
40
+ context, templates). ``None`` keeps the classic layout,
41
+ ``companies/<company_short_name>`` under the working directory. A company
42
+ installed as a package returns its own directory, usually
43
+ ``Path(__file__).resolve().parent``.
44
+ """
45
+ return None
46
+
47
+ def unsupported_operation(self, tag):
48
+ raise NotImplementedError(f"La operación '{tag}' no está soportada por esta empresa.")
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from pathlib import Path
7
+
8
+
9
+ def get_company_root(company_short_name: str) -> Path:
10
+ """
11
+ Directory that holds a company's files: config, prompts, schemas, context,
12
+ templates.
13
+
14
+ A company module installed as a package declares it through
15
+ ``BaseCompany.get_resource_root()``. Every other company keeps the classic
16
+ layout, ``companies/<company_short_name>`` relative to the working directory,
17
+ which is why that is the fallback and not an error.
18
+ """
19
+ from iatoolkit.company_registry import get_registered_companies
20
+
21
+ company_class = get_registered_companies().get((company_short_name or "").lower())
22
+ root = company_class.get_resource_root() if company_class else None
23
+ if root:
24
+ return Path(root)
25
+ return Path("companies") / company_short_name
@@ -5,6 +5,7 @@
5
5
 
6
6
  from io import BytesIO
7
7
  import mimetypes
8
+ import os
8
9
  from flask import render_template, redirect, url_for, current_app, abort, send_file
9
10
  from flask import jsonify
10
11
  from iatoolkit.common.exceptions import IAToolkitException
@@ -59,6 +60,18 @@ def register_views(app):
59
60
  # must stay reachable even if the company registry or DB is degraded.
60
61
  app.add_url_rule('/', endpoint='liveness', view_func=lambda: ("ok", 200))
61
62
 
63
+ # Browsers and MCP clients (Claude shows it as the connector icon) ask the
64
+ # host for /favicon.ico regardless of the page.
65
+ app.add_url_rule(
66
+ '/favicon.ico',
67
+ endpoint='favicon',
68
+ view_func=lambda: send_file(
69
+ os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'static', 'images', 'favicon.ico'),
70
+ mimetype='image/vnd.microsoft.icon',
71
+ max_age=86400,
72
+ ),
73
+ )
74
+
62
75
  # assign root '/' to our new redirect logic
63
76
  app.add_url_rule('/home', view_func=RootRedirectView.as_view('root_redirect'))
64
77
 
@@ -98,7 +98,8 @@ class Utility:
98
98
 
99
99
  def get_company_template(self, company_short_name: str, template_name: str) -> str:
100
100
  # 1. get the path to the company specific template
101
- template_path = os.path.join(os.getcwd(), f'companies/{company_short_name}/templates/{template_name}')
101
+ from iatoolkit.common.company_paths import get_company_root
102
+ template_path = os.path.join(os.getcwd(), str(get_company_root(company_short_name) / 'templates' / template_name))
102
103
  if not os.path.exists(template_path):
103
104
  return None
104
105
 
@@ -114,6 +114,9 @@ class IAToolkit:
114
114
  # Step 7: load company configuration file
115
115
  self._hydrate_company_configuration()
116
116
 
117
+ # Step 7b: web routes, templates and static files owned by each company
118
+ self._register_company_blueprints()
119
+
117
120
  # Step 8: Finalize setup within the application context
118
121
  self._setup_redis_sessions()
119
122
 
@@ -560,6 +563,31 @@ class IAToolkit:
560
563
  logging.error(f"❌ Failed to register configuration for '{company_short_name}': {e}")
561
564
  raise e
562
565
 
566
+ def _register_company_blueprints(self):
567
+ from iatoolkit.company_registry import get_company_registry
568
+
569
+ registered = []
570
+ for company_short_name, company_instance in get_company_registry().get_all_company_instances().items():
571
+ blueprint = company_instance.get_blueprint()
572
+ if blueprint is None:
573
+ continue
574
+ # The blueprint name is the namespace of the company's endpoints, so
575
+ # it must be the company itself: anything else could collide with
576
+ # another tenant or with the platform.
577
+ if blueprint.name != company_short_name:
578
+ raise RuntimeError(
579
+ f"Company '{company_short_name}' returned a blueprint named "
580
+ f"'{blueprint.name}'; it must be named '{company_short_name}'."
581
+ )
582
+ self.app.register_blueprint(blueprint)
583
+ registered.append(company_short_name)
584
+
585
+ if registered:
586
+ # FlaskInjector wraps the views that exist when it runs, and the first
587
+ # pass ran before any company was loaded.
588
+ FlaskInjector(app=self.app, injector=self._injector)
589
+ logging.info(f"✅ Company blueprints registered: {', '.join(registered)}")
590
+
563
591
  def _setup_cli_commands(self):
564
592
  from iatoolkit.cli_commands import register_core_commands
565
593
  from iatoolkit.company_registry import get_company_registry
@@ -700,23 +700,34 @@ class GeminiAdapter:
700
700
  return {}
701
701
 
702
702
  def _extract_usage_metadata(self, gemini_response) -> Usage:
703
- """Extraer información de uso de tokens de manera segura"""
703
+ """Extraer información de uso de tokens de manera segura.
704
+
705
+ Gemini reports the tokens it bills in four counters. `candidates_token_count`
706
+ excludes the model's reasoning (`thoughts_token_count`), which Google bills as
707
+ output, and `prompt_token_count` excludes the results of its built-in tools
708
+ (`tool_use_prompt_token_count`), billed as input. Reading only the first two
709
+ priced every thinking model's reasoning at zero.
710
+ """
704
711
  input_tokens = 0
705
712
  output_tokens = 0
706
713
  total_tokens = 0
707
714
 
715
+ def _count(metadata, name: str) -> int:
716
+ value = getattr(metadata, name, None)
717
+ return value if isinstance(value, int) and value > 0 else 0
718
+
708
719
  try:
709
- # Verificar si existe usage_metadata
710
- if hasattr(gemini_response, 'usage_metadata') and gemini_response.usage_metadata:
711
- usage_metadata = gemini_response.usage_metadata
712
-
713
- # Acceder a los atributos directamente, no con .get()
714
- if hasattr(usage_metadata, 'prompt_token_count'):
715
- input_tokens = usage_metadata.prompt_token_count
716
- if hasattr(usage_metadata, 'candidates_token_count'):
717
- output_tokens = usage_metadata.candidates_token_count
718
- if hasattr(usage_metadata, 'total_token_count'):
719
- total_tokens = usage_metadata.total_token_count
720
+ usage_metadata = getattr(gemini_response, 'usage_metadata', None)
721
+ if usage_metadata:
722
+ input_tokens = (
723
+ _count(usage_metadata, 'prompt_token_count')
724
+ + _count(usage_metadata, 'tool_use_prompt_token_count')
725
+ )
726
+ output_tokens = (
727
+ _count(usage_metadata, 'candidates_token_count')
728
+ + _count(usage_metadata, 'thoughts_token_count')
729
+ )
730
+ total_tokens = _count(usage_metadata, 'total_token_count')
720
731
 
721
732
  except Exception as e:
722
733
  logging.warning(f"No se pudo extraer usage_metadata de Gemini: {e}")
@@ -1,10 +1,11 @@
1
1
  from iatoolkit.common.interfaces.asset_storage import AssetRepository, AssetType
2
+ from iatoolkit.common.company_paths import get_company_root
2
3
  from pathlib import Path
3
4
 
4
5
 
5
6
  class FileSystemAssetRepository(AssetRepository):
6
7
  def _get_path(self, company_short_name: str, asset_type: AssetType, filename: str = "") -> Path:
7
- return Path("companies") / company_short_name / asset_type.value / filename
8
+ return get_company_root(company_short_name) / asset_type.value / filename
8
9
 
9
10
  def exists(self, company_short_name: str, asset_type: AssetType, filename: str) -> bool:
10
11
  return self._get_path(company_short_name, asset_type, filename).is_file()
@@ -14,6 +14,7 @@ from iatoolkit.repositories.models import (
14
14
  from injector import inject
15
15
  from iatoolkit.repositories.database_manager import DatabaseManager
16
16
  from sqlalchemy import or_, and_
17
+ from iatoolkit.repositories.models import CONTEXT_INIT_REQUEST_SOURCE
17
18
  from typing import List
18
19
 
19
20
 
@@ -34,10 +35,17 @@ class LLMQueryRepo:
34
35
  self.session.commit()
35
36
  return query
36
37
 
38
+ @staticmethod
39
+ def not_context_init():
40
+ """Filter for rows that are a conversation turn, not a context initialization."""
41
+ request_source = LLMQuery.stats["request_source"].as_string()
42
+ return or_(request_source.is_(None), request_source != CONTEXT_INIT_REQUEST_SOURCE)
43
+
37
44
  # get user query history
38
45
  def get_history(self, company: Company, user_identifier: str, limit: int = 100) -> list[LLMQuery]:
39
46
  return self.session.query(LLMQuery).filter(
40
47
  LLMQuery.user_identifier == user_identifier,
48
+ self.not_context_init(),
41
49
  ).filter_by(company_id=company.id).order_by(LLMQuery.created_at.desc()).limit(limit).all()
42
50
 
43
51
 
@@ -593,6 +593,12 @@ class MemoryPageSource(Base):
593
593
  return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
594
594
 
595
595
 
596
+ #: request_source of the iat_queries row that records a context initialization:
597
+ #: the company context sent once to start a server-side conversation. Its tokens
598
+ #: are billed, but it is not a question, so conversation readers skip it.
599
+ CONTEXT_INIT_REQUEST_SOURCE = "context_init"
600
+
601
+
596
602
  class LLMQuery(Base):
597
603
  """Logs a query made to the LLM, including input, output, and metadata."""
598
604
  __tablename__ = 'iat_queries'
@@ -622,6 +628,10 @@ class LLMQuery(Base):
622
628
 
623
629
  __table_args__ = (
624
630
  Index('ix_iat_queries_company_prompt_created', 'company_id', 'prompt_name', 'created_at'),
631
+ # Executions that did not run as a task (synchronous agent calls). They are a
632
+ # tiny fraction of the table, which the Agents monitor would otherwise scan whole.
633
+ Index('ix_iat_queries_company_created_untasked', company_id, created_at.desc(),
634
+ postgresql_where=task_id.is_(None)),
625
635
  )
626
636
 
627
637
  company = relationship("Company", back_populates="llm_queries")
@@ -60,7 +60,8 @@ class HistoryManagerService:
60
60
  response_id = self.llm_client.set_company_context(
61
61
  company=company,
62
62
  company_base_context=prepared_context,
63
- model=model
63
+ model=model,
64
+ user_identifier=user_identifier,
64
65
  )
65
66
  self.session_context.save_last_response_id(company_short_name, user_identifier, response_id, model=model)
66
67
  self.session_context.save_initial_response_id(company_short_name, user_identifier, response_id, model=model)