iatoolkit 2.4.1__tar.gz → 2.5.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 (233) hide show
  1. {iatoolkit-2.4.1/src/iatoolkit.egg-info → iatoolkit-2.5.0}/PKG-INFO +2 -1
  2. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/pyproject.toml +1 -1
  3. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/requirements.txt +1 -0
  4. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/__init__.py +1 -1
  5. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/core.py +2 -0
  6. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/locales/en.yaml +7 -0
  7. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/locales/es.yaml +7 -0
  8. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/configuration_service.py +66 -0
  9. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/llm_client_service.py +51 -1
  10. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/prompt_service.py +10 -0
  11. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/query_service.py +54 -0
  12. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/system_prompt_catalog.py +6 -2
  13. iatoolkit-2.5.0/src/iatoolkit/services/telemetry_service.py +418 -0
  14. {iatoolkit-2.4.1 → iatoolkit-2.5.0/src/iatoolkit.egg-info}/PKG-INFO +2 -1
  15. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit.egg-info/SOURCES.txt +20 -19
  16. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit.egg-info/requires.txt +1 -0
  17. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/LICENSE +0 -0
  18. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/LICENSE_COMMUNITY.md +0 -0
  19. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/readme.md +0 -0
  20. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/setup.cfg +0 -0
  21. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/base_company.py +0 -0
  22. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/cli_commands.py +0 -0
  23. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/__init__.py +0 -0
  24. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/exceptions.py +0 -0
  25. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  26. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  27. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  28. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  29. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  30. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  31. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  32. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  33. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/model_registry.py +0 -0
  34. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/routes.py +0 -0
  35. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  36. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/session_manager.py +0 -0
  37. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/util.py +0 -0
  38. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/company_registry.py +0 -0
  39. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/__init__.py +0 -0
  40. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  41. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/chat_state_rules.prompt +0 -0
  42. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/chat_user_profile.prompt +0 -0
  43. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/core_identity.prompt +0 -0
  44. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/email_output.prompt +0 -0
  45. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/file_download_output.prompt +0 -0
  46. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/format_styles.prompt +0 -0
  47. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/html_structures.prompt +0 -0
  48. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/links_documents.prompt +0 -0
  49. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/memory_usage.prompt +0 -0
  50. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/multimodal_basics.prompt +0 -0
  51. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/output_basics.prompt +0 -0
  52. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/presentation_formatting.prompt +0 -0
  53. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/query_main.prompt +0 -0
  54. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_aggregation_scope.prompt +0 -0
  55. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_casting.prompt +0 -0
  56. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_core.prompt +0 -0
  57. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_jsonb.prompt +0 -0
  58. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_rules.prompt +0 -0
  59. {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/tool_html_passthrough.prompt +0 -0
  60. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  61. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  62. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/__init__.py +0 -0
  63. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  64. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/call_service.py +0 -0
  65. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  66. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  67. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  68. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  69. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  70. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  71. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  72. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  73. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  74. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  75. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  76. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  77. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  78. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  79. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  80. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  81. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  82. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  83. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  84. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  85. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_response.py +0 -0
  86. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  87. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/__init__.py +0 -0
  88. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  89. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  90. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  91. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  92. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  93. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  94. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  95. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/models.py +0 -0
  96. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  97. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  98. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  99. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  100. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  101. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/__init__.py +0 -0
  102. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/api_key_service.py +0 -0
  103. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  104. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/auth_service.py +0 -0
  105. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  106. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/branding_service.py +0 -0
  107. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/company_context_service.py +0 -0
  108. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  109. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  110. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/embedding_service.py +0 -0
  111. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/excel_service.py +0 -0
  112. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  113. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  114. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  115. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/i18n_service.py +0 -0
  116. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/inference_service.py +0 -0
  117. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/jwt_service.py +0 -0
  118. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  119. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/language_service.py +0 -0
  120. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/license_service.py +0 -0
  121. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/mail_service.py +0 -0
  122. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  123. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  124. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  125. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_service.py +0 -0
  126. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  127. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  128. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  129. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  130. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  131. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  132. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  133. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  134. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  135. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  136. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  137. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  138. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  139. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  140. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/pdf_service.py +0 -0
  141. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/profile_service.py +0 -0
  142. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  143. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  144. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  145. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/sql_service.py +0 -0
  146. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  147. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/storage_service.py +0 -0
  148. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  149. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/system_tools.py +0 -0
  150. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/tool_service.py +0 -0
  151. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  152. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  153. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  154. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  155. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/warmup_service.py +0 -0
  156. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  157. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  158. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  159. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  160. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search_service.py +0 -0
  161. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  162. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  163. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  164. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  165. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  166. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  167. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  168. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  169. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  170. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  171. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  172. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  173. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  174. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  175. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  176. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  177. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  178. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/documents.css +0 -0
  179. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  180. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  181. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  182. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/system_prompts/__init__.py +0 -0
  183. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/_company_header.html +0 -0
  184. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  185. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/base.html +0 -0
  186. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/change_password.html +0 -0
  187. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/chat.html +0 -0
  188. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  189. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  190. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/error.html +0 -0
  191. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  192. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  193. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  194. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  195. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  196. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  197. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  198. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  199. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/signup.html +0 -0
  200. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/__init__.py +0 -0
  201. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  202. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/base_login_view.py +0 -0
  203. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  204. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/change_password_view.py +0 -0
  205. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  206. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/chat_view.py +0 -0
  207. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  208. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  209. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  210. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  211. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  212. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/history_api_view.py +0 -0
  213. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/home_view.py +0 -0
  214. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  215. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  216. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  217. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/login_view.py +0 -0
  218. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  219. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  220. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  221. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  222. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  223. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  224. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  225. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  226. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/signup_view.py +0 -0
  227. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/static_page_view.py +0 -0
  228. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  229. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  230. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/users_api_view.py +0 -0
  231. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  232. {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  233. {iatoolkit-2.4.1 → iatoolkit-2.5.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.4.1
3
+ Version: 2.5.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -12,6 +12,7 @@ Requires-Dist: bcrypt==4.2.1
12
12
  Requires-Dist: anthropic>=0.83.0
13
13
  Requires-Dist: boto3==1.36.22
14
14
  Requires-Dist: botocore==1.36.22
15
+ Requires-Dist: braintrust>=0.17.0
15
16
  Requires-Dist: build==1.2.2.post1
16
17
  Requires-Dist: click==8.1.8
17
18
  Requires-Dist: cryptography==44.0.3
@@ -29,4 +29,4 @@ version = { attr = "iatoolkit.__version__" }
29
29
  dependencies = { file = ["requirements.txt"] }
30
30
 
31
31
  [tool.setuptools.package-data]
32
- iatoolkit = ["system_prompts/*.prompt", "templates/**/*", "static/**/*", "locales/*.yaml", "config/*.yaml"]
32
+ iatoolkit = ["templates/**/*", "static/**/*", "locales/*.yaml", "config/*.yaml", "config/system_prompts/*.prompt"]
@@ -2,6 +2,7 @@ bcrypt==4.2.1
2
2
  anthropic>=0.83.0
3
3
  boto3==1.36.22
4
4
  botocore==1.36.22
5
+ braintrust>=0.17.0
5
6
  build==1.2.2.post1
6
7
  click==8.1.8
7
8
  cryptography==44.0.3
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.4.1"
6
+ __version__ = "2.5.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -402,6 +402,7 @@ class IAToolkit:
402
402
  from iatoolkit.services.i18n_service import I18nService
403
403
  from iatoolkit.services.language_service import LanguageService
404
404
  from iatoolkit.services.configuration_service import ConfigurationService
405
+ from iatoolkit.services.telemetry_service import TelemetryService
405
406
  from iatoolkit.services.embedding_service import EmbeddingService
406
407
  from iatoolkit.services.history_manager_service import HistoryManagerService
407
408
  from iatoolkit.services.tool_service import ToolService
@@ -443,6 +444,7 @@ class IAToolkit:
443
444
  binder.bind(I18nService, to=I18nService)
444
445
  binder.bind(LanguageService, to=LanguageService)
445
446
  binder.bind(ConfigurationService, to=ConfigurationService)
447
+ binder.bind(TelemetryService, to=TelemetryService)
446
448
  binder.bind(EmbeddingService, to=EmbeddingService)
447
449
  binder.bind(HistoryManagerService, to=HistoryManagerService)
448
450
  binder.bind(ToolService, to=ToolService)
@@ -69,6 +69,11 @@ ui:
69
69
  primary_input: "Primary Input"
70
70
  prompt_args: "Prompt Arguments (Client Data)"
71
71
  llm_output: "LLM Output (Raw JSON)"
72
+ telemetry_label: "Telemetry"
73
+ telemetry_open_trace: "Open Trace"
74
+ telemetry_not_recorded: "Not recorded"
75
+ telemetry_disabled: "Disabled"
76
+ telemetry_unknown_provider: "unknown provider"
72
77
 
73
78
  login_widget:
74
79
  title: "Sign In"
@@ -1041,6 +1046,8 @@ ui:
1041
1046
  store_response_default: "Provider default"
1042
1047
  store_response_true: "Yes"
1043
1048
  store_response_false: "No"
1049
+ telemetry_enabled_label: "LLM Telemetry"
1050
+ telemetry_enabled_help: "Send this agent's LLM runs to the company telemetry backend when telemetry is enabled in company configuration."
1044
1051
  tools_title: "Tool Selection"
1045
1052
  tools_mode_label: "Tools Mode"
1046
1053
  tools_mode_inherit: "Automatic"
@@ -70,6 +70,11 @@ ui:
70
70
  primary_input: "Entrada Principal"
71
71
  prompt_args: "Argumentos del Prompt (Client Data)"
72
72
  llm_output: "Salida LLM (JSON Crudo)"
73
+ telemetry_label: "Telemetría"
74
+ telemetry_open_trace: "Abrir traza"
75
+ telemetry_not_recorded: "No registrada"
76
+ telemetry_disabled: "Deshabilitada"
77
+ telemetry_unknown_provider: "provider desconocido"
73
78
 
74
79
 
75
80
  login_widget:
@@ -1044,6 +1049,8 @@ ui:
1044
1049
  store_response_default: "Por defecto del provider"
1045
1050
  store_response_true: "Sí"
1046
1051
  store_response_false: "No"
1052
+ telemetry_enabled_label: "Telemetría LLM"
1053
+ telemetry_enabled_help: "Envía las ejecuciones LLM de este agente al backend de telemetría de la empresa cuando la telemetría esté habilitada en la configuración de la compañía."
1047
1054
  tools_title: "Selección de Tools"
1048
1055
  tools_mode_label: "Modo de Tools"
1049
1056
  tools_mode_inherit: "Automático"
@@ -521,6 +521,56 @@ class ConfigurationService:
521
521
  if raw_x_title is not None and (not isinstance(raw_x_title, str) or not raw_x_title.strip()):
522
522
  add_error("llm.openrouter.x_title", "Must be a non-empty string.")
523
523
 
524
+ telemetry_cfg = config.get("llm", {}).get("telemetry")
525
+ if telemetry_cfg is not None:
526
+ if not isinstance(telemetry_cfg, dict):
527
+ add_error("llm.telemetry", "Must be a dictionary.")
528
+ else:
529
+ telemetry_enabled = telemetry_cfg.get("enabled", False)
530
+ if not isinstance(telemetry_enabled, bool):
531
+ add_error("llm.telemetry.enabled", "Must be a boolean.")
532
+
533
+ telemetry_provider = telemetry_cfg.get("provider")
534
+ normalized_telemetry_provider = ""
535
+ if telemetry_provider is not None:
536
+ if not isinstance(telemetry_provider, str) or not telemetry_provider.strip():
537
+ add_error("llm.telemetry.provider", "Must be a non-empty string.")
538
+ else:
539
+ normalized_telemetry_provider = telemetry_provider.strip().lower()
540
+ if normalized_telemetry_provider not in {"braintrust"}:
541
+ add_error(
542
+ "llm.telemetry.provider",
543
+ "Unsupported provider. Must be 'braintrust'.",
544
+ )
545
+ elif telemetry_enabled:
546
+ add_error("llm.telemetry.provider", "Missing required key: 'provider'.")
547
+
548
+ if normalized_telemetry_provider == "braintrust":
549
+ braintrust_cfg = telemetry_cfg.get("braintrust")
550
+ if not isinstance(braintrust_cfg, dict):
551
+ add_error("llm.telemetry.braintrust", "Must be a dictionary.")
552
+ else:
553
+ if telemetry_enabled:
554
+ project = braintrust_cfg.get("project")
555
+ if not isinstance(project, str) or not project.strip():
556
+ add_error("llm.telemetry.braintrust.project", "Must be a non-empty string.")
557
+
558
+ api_key = braintrust_cfg.get("api_key")
559
+ if not isinstance(api_key, str) or not api_key.strip():
560
+ add_error("llm.telemetry.braintrust.api_key", "Must be a non-empty string.")
561
+
562
+ api_url = braintrust_cfg.get("api_url")
563
+ if api_url is not None:
564
+ if not isinstance(api_url, str) or not api_url.strip():
565
+ add_error("llm.telemetry.braintrust.api_url", "Must be a non-empty string.")
566
+ else:
567
+ parsed = urlparse(api_url.strip())
568
+ if parsed.scheme.lower() not in {"http", "https"} or not parsed.netloc:
569
+ add_error(
570
+ "llm.telemetry.braintrust.api_url",
571
+ "Must be an absolute HTTP or HTTPS URL.",
572
+ )
573
+
524
574
  # 3. Embedding Provider
525
575
  if isinstance(config.get("embedding_provider"), dict):
526
576
  if not config.get("embedding_provider", {}).get("provider"):
@@ -678,6 +728,7 @@ class ConfigurationService:
678
728
  "text_verbosity",
679
729
  "prompt_version",
680
730
  "prompt_variant",
731
+ "telemetry_enabled",
681
732
  }
682
733
  unknown_option_keys = sorted(
683
734
  key for key in llm_request_options.keys() if key not in allowed_option_keys
@@ -724,6 +775,15 @@ class ConfigurationService:
724
775
  "Must be a non-empty string.",
725
776
  )
726
777
 
778
+ if "telemetry_enabled" in llm_request_options and not isinstance(
779
+ llm_request_options.get("telemetry_enabled"),
780
+ bool,
781
+ ):
782
+ add_error(
783
+ f"prompts[{i}].llm_request_options.telemetry_enabled",
784
+ "Must be a boolean.",
785
+ )
786
+
727
787
  tool_policy = prompt.get("tool_policy")
728
788
  if tool_policy is not None:
729
789
  if not isinstance(tool_policy, dict):
@@ -1110,6 +1170,12 @@ class ConfigurationService:
1110
1170
  provider_cfg = providers_cfg.get(candidate)
1111
1171
  return dict(provider_cfg) if isinstance(provider_cfg, dict) else {}
1112
1172
 
1173
+ def get_llm_telemetry_config(self, company_short_name: str) -> dict:
1174
+ self._ensure_config_loaded(company_short_name)
1175
+ llm_config = self._loaded_configs[company_short_name].get("llm") or {}
1176
+ telemetry_cfg = llm_config.get("telemetry")
1177
+ return dict(telemetry_cfg) if isinstance(telemetry_cfg, dict) else {}
1178
+
1113
1179
 
1114
1180
  def _load_and_merge_configs(self, company_short_name: str) -> dict:
1115
1181
  """
@@ -23,6 +23,7 @@ from typing import Dict, Optional, List, Any
23
23
  from iatoolkit.services.dispatcher_service import Dispatcher
24
24
  from iatoolkit.services.storage_service import StorageService
25
25
  from iatoolkit.services.structured_output_service import StructuredOutputService
26
+ from iatoolkit.services.telemetry_service import NoopTelemetryService
26
27
 
27
28
  CONTEXT_ERROR_MESSAGE = 'Tu consulta supera el límite de contexto, utiliza el boton de recarga de contexto.'
28
29
 
@@ -36,7 +37,8 @@ class llmClient:
36
37
  llm_proxy: LLMProxy,
37
38
  model_registry: ModelRegistry,
38
39
  storage_service: StorageService,
39
- util: Utility
40
+ util: Utility,
41
+ telemetry_service=None,
40
42
  ):
41
43
  self.llmquery_repo = llmquery_repo
42
44
  self.llm_proxy = llm_proxy
@@ -44,6 +46,7 @@ class llmClient:
44
46
  self.storage_service = storage_service
45
47
  self.util = util
46
48
  self._dispatcher = None # Cache for the lazy-loaded dispatcher
49
+ self._telemetry_service = telemetry_service
47
50
 
48
51
  # Lazy init to avoid network/bootstrap failures during app startup.
49
52
  self.encoding = None
@@ -62,6 +65,18 @@ class llmClient:
62
65
  self._dispatcher = current_iatoolkit().get_injector().get(Dispatcher)
63
66
  return self._dispatcher
64
67
 
68
+ @property
69
+ def telemetry_service(self):
70
+ if self._telemetry_service is None:
71
+ try:
72
+ from iatoolkit import current_iatoolkit
73
+ from iatoolkit.services.telemetry_service import TelemetryService
74
+
75
+ self._telemetry_service = current_iatoolkit().get_injector().get(TelemetryService)
76
+ except Exception:
77
+ self._telemetry_service = NoopTelemetryService()
78
+ return self._telemetry_service
79
+
65
80
 
66
81
  def invoke(self,
67
82
  company: Company,
@@ -81,6 +96,7 @@ class llmClient:
81
96
  task_id: Optional[int] = None,
82
97
  execution_metadata: Optional[Dict[str, Any]] = None,
83
98
  request_metadata: Optional[Dict[str, str]] = None,
99
+ telemetry_request: Optional[Dict[str, Any]] = None,
84
100
  response_contract: Optional[Dict[str, Any]] = None
85
101
  ) -> dict:
86
102
 
@@ -102,6 +118,7 @@ class llmClient:
102
118
  )
103
119
  text_payload = request_params["text"]
104
120
  reasoning_payload = request_params["reasoning"]
121
+ telemetry_execution = self.telemetry_service.start_execution(telemetry_request)
105
122
 
106
123
  try:
107
124
  start_time = time.time()
@@ -285,6 +302,22 @@ class llmClient:
285
302
  answer_time=stats['response_time']
286
303
  )
287
304
  self.llmquery_repo.add_query(query)
305
+ telemetry_execution.finalize(
306
+ query_id=query.id,
307
+ success=decoded_response.get('status', False),
308
+ answer_preview=decoded_response.get('answer', ''),
309
+ metrics={
310
+ "total_tokens": combined_stats.get("total_tokens"),
311
+ "response_time": combined_stats.get("response_time"),
312
+ "sql_retry_count": combined_stats.get("sql_retry_count"),
313
+ },
314
+ )
315
+ telemetry_stats = telemetry_execution.build_stats()
316
+ if telemetry_stats:
317
+ query.stats = dict(query.stats or {})
318
+ query.stats["telemetry"] = telemetry_stats
319
+ self.llmquery_repo.commit()
320
+ combined_stats = dict(query.stats or {})
288
321
  logging.info(f"finish llm call in {int(time.time() - start_time)} secs..")
289
322
  if function_calls:
290
323
  logging.info(f"time within the function calls {f_call_time:.1f} secs.")
@@ -312,9 +345,17 @@ class llmClient:
312
345
  except SQLAlchemyError as db_error:
313
346
  # rollback
314
347
  self.llmquery_repo.session.rollback()
348
+ telemetry_execution.finalize(
349
+ success=False,
350
+ error_message=str(db_error),
351
+ )
315
352
  logging.error(f"Error de base de datos: {str(db_error)}")
316
353
  raise db_error
317
354
  except OperationalError as e:
355
+ telemetry_execution.finalize(
356
+ success=False,
357
+ error_message=str(e),
358
+ )
318
359
  logging.error(f"Operational error: {str(e)}")
319
360
  raise e
320
361
  except Exception as e:
@@ -331,6 +372,15 @@ class llmClient:
331
372
  function_calls=f_calls,
332
373
  )
333
374
  self.llmquery_repo.add_query(query)
375
+ telemetry_execution.finalize(
376
+ query_id=query.id,
377
+ success=False,
378
+ error_message=error_message,
379
+ )
380
+ telemetry_stats = telemetry_execution.build_stats()
381
+ if telemetry_stats:
382
+ query.stats = {"telemetry": telemetry_stats}
383
+ self.llmquery_repo.commit()
334
384
 
335
385
  # in case of context error
336
386
  if "context_length_exceeded" in str(e):
@@ -345,6 +345,7 @@ class PromptService:
345
345
  "text_verbosity",
346
346
  "prompt_version",
347
347
  "prompt_variant",
348
+ "telemetry_enabled",
348
349
  }
349
350
  unknown_keys = sorted(
350
351
  key for key in llm_request_options.keys() if key not in allowed_keys
@@ -422,6 +423,15 @@ class PromptService:
422
423
  )
423
424
  normalized_options["prompt_variant"] = candidate_prompt_variant
424
425
 
426
+ raw_telemetry_enabled = llm_request_options.get("telemetry_enabled")
427
+ if raw_telemetry_enabled is not None:
428
+ if not isinstance(raw_telemetry_enabled, bool):
429
+ raise IAToolkitException(
430
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
431
+ "llm_request_options.telemetry_enabled must be a boolean.",
432
+ )
433
+ normalized_options["telemetry_enabled"] = raw_telemetry_enabled
434
+
425
435
  return normalized_options
426
436
 
427
437
  def get_prompts(self, company_short_name: str, include_all: bool = False) -> dict:
@@ -14,6 +14,7 @@ from iatoolkit.services.history_manager_service import HistoryManagerService
14
14
  from iatoolkit.services.context_builder_service import ContextBuilderService
15
15
  from iatoolkit.services.attachment_policy_service import AttachmentPolicyService
16
16
  from iatoolkit.services.memory_lookup_policy_service import MemoryLookupPolicyService
17
+ from iatoolkit.services.telemetry_service import NoopTelemetryService
17
18
  from iatoolkit.common.model_registry import ModelRegistry
18
19
  from injector import inject
19
20
  import logging
@@ -58,6 +59,7 @@ class QueryService:
58
59
  context_builder: ContextBuilderService,
59
60
  attachment_policy_service: AttachmentPolicyService | None = None,
60
61
  memory_lookup_policy_service: MemoryLookupPolicyService | None = None,
62
+ telemetry_service=None,
61
63
  ):
62
64
  self.profile_repo = profile_repo
63
65
  self.tool_service = tool_service
@@ -71,6 +73,19 @@ class QueryService:
71
73
  self.context_builder = context_builder
72
74
  self.attachment_policy_service = attachment_policy_service
73
75
  self.memory_lookup_policy_service = memory_lookup_policy_service or MemoryLookupPolicyService()
76
+ self._telemetry_service = telemetry_service
77
+
78
+ @property
79
+ def telemetry_service(self):
80
+ if self._telemetry_service is None:
81
+ try:
82
+ from iatoolkit import current_iatoolkit
83
+ from iatoolkit.services.telemetry_service import TelemetryService
84
+
85
+ self._telemetry_service = current_iatoolkit().get_injector().get(TelemetryService)
86
+ except Exception:
87
+ self._telemetry_service = NoopTelemetryService()
88
+ return self._telemetry_service
74
89
 
75
90
  @classmethod
76
91
  def register_tool_selector_hook(cls, hook: Callable | None):
@@ -294,6 +309,8 @@ class QueryService:
294
309
  prompt_variant = str(raw_llm_request_options.get("prompt_variant") or "").strip()
295
310
  if prompt_variant:
296
311
  normalized_llm_request_options["prompt_variant"] = prompt_variant
312
+ if isinstance(raw_llm_request_options.get("telemetry_enabled"), bool):
313
+ normalized_llm_request_options["telemetry_enabled"] = raw_llm_request_options["telemetry_enabled"]
297
314
  contract["llm_request_options"] = normalized_llm_request_options
298
315
  raw_resource_bindings = contract.get("resource_bindings")
299
316
  normalized_resource_bindings = []
@@ -583,6 +600,29 @@ class QueryService:
583
600
  "prompt_variant": prompt_variant[:512],
584
601
  }
585
602
 
603
+ def _resolve_telemetry_request(
604
+ self,
605
+ *,
606
+ company_short_name: str,
607
+ user_identifier: str,
608
+ effective_model: str,
609
+ provider: str,
610
+ task_id: int | None,
611
+ prompt_output_contract: dict | None,
612
+ execution_metadata: dict | None = None,
613
+ request_metadata: dict | None = None,
614
+ ) -> dict:
615
+ return self.telemetry_service.resolve_execution_request(
616
+ company_short_name=company_short_name,
617
+ prompt_output_contract=prompt_output_contract,
618
+ model=effective_model,
619
+ provider=provider,
620
+ task_id=task_id,
621
+ user_identifier=user_identifier,
622
+ execution_metadata=execution_metadata,
623
+ request_metadata=request_metadata,
624
+ )
625
+
586
626
  @staticmethod
587
627
  def _append_memory_search_instruction(prompt: str, should_suggest_memory_search: bool) -> str:
588
628
  if not should_suggest_memory_search:
@@ -825,6 +865,7 @@ class QueryService:
825
865
  attachment_plan: dict,
826
866
  execution_metadata: dict,
827
867
  request_metadata: dict | None,
868
+ telemetry_request: dict | None,
828
869
  prompt_output_contract: dict,
829
870
  history_handle: HistoryHandle,
830
871
  ignore_history: bool) -> tuple[dict, HistoryHandle]:
@@ -850,6 +891,7 @@ class QueryService:
850
891
  store=store,
851
892
  execution_metadata=execution_metadata,
852
893
  request_metadata=request_metadata,
894
+ telemetry_request=telemetry_request,
853
895
  response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
854
896
  )
855
897
  return response, history_handle
@@ -907,6 +949,7 @@ class QueryService:
907
949
  store=store,
908
950
  execution_metadata=execution_metadata,
909
951
  request_metadata=request_metadata,
952
+ telemetry_request=telemetry_request,
910
953
  response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
911
954
  )
912
955
  return response, retry_history_handle
@@ -1340,6 +1383,16 @@ class QueryService:
1340
1383
  "provider": provider,
1341
1384
  "company_defaults": self._resolve_company_attachment_defaults(company_short_name, prompt_name=prompt_name),
1342
1385
  }
1386
+ telemetry_request = self._resolve_telemetry_request(
1387
+ company_short_name=company_short_name,
1388
+ user_identifier=user_identifier,
1389
+ effective_model=effective_model,
1390
+ provider=provider,
1391
+ task_id=task_id,
1392
+ prompt_output_contract=prompt_output_contract,
1393
+ execution_metadata=execution_metadata,
1394
+ request_metadata=request_metadata,
1395
+ )
1343
1396
 
1344
1397
  response, history_handle = self._invoke_with_history_recovery(
1345
1398
  company=company,
@@ -1358,6 +1411,7 @@ class QueryService:
1358
1411
  attachment_plan=attachment_plan,
1359
1412
  execution_metadata=execution_metadata,
1360
1413
  request_metadata=request_metadata,
1414
+ telemetry_request=telemetry_request,
1361
1415
  prompt_output_contract=prompt_output_contract,
1362
1416
  history_handle=history_handle,
1363
1417
  ignore_history=ignore_history,
@@ -10,7 +10,7 @@ import yaml
10
10
 
11
11
  SYSTEM_PROMPTS_CONFIG_PACKAGE = "iatoolkit.config"
12
12
  SYSTEM_PROMPTS_CONFIG_FILENAME = "system_prompts_pack.yaml"
13
- SYSTEM_PROMPTS_PACKAGE = "iatoolkit.system_prompts"
13
+ SYSTEM_PROMPTS_DIRNAME = "system_prompts"
14
14
  SYSTEM_PROMPT_SECTION_ORDER = (
15
15
  "identity",
16
16
  "business_context",
@@ -209,7 +209,11 @@ def _load_catalog() -> tuple[dict, ...]:
209
209
 
210
210
  @lru_cache(maxsize=64)
211
211
  def _read_prompt_text(filename: str) -> str:
212
- return importlib.resources.read_text(SYSTEM_PROMPTS_PACKAGE, filename)
212
+ return (
213
+ importlib.resources.files(SYSTEM_PROMPTS_CONFIG_PACKAGE)
214
+ .joinpath(SYSTEM_PROMPTS_DIRNAME, filename)
215
+ .read_text(encoding="utf-8")
216
+ )
213
217
 
214
218
 
215
219
  def get_system_prompt_entries() -> list[dict]: