iatoolkit 2.64.5__tar.gz → 2.65.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 (268) hide show
  1. {iatoolkit-2.64.5/src/iatoolkit.egg-info → iatoolkit-2.65.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/locales/en.yaml +18 -1
  4. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/locales/es.yaml +18 -1
  5. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/memory_compiler_service.py +31 -3
  6. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/memory_question_service.py +3 -0
  7. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/system_agent_runner.py +81 -15
  8. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/wiki_page_view.py +10 -1
  9. {iatoolkit-2.64.5 → iatoolkit-2.65.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  10. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/LICENSE +0 -0
  11. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/LICENSE_COMMUNITY.md +0 -0
  12. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/pyproject.toml +0 -0
  13. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/readme.md +0 -0
  14. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/setup.cfg +0 -0
  15. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/base_company.py +0 -0
  16. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/cli_commands.py +0 -0
  17. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/__init__.py +0 -0
  18. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  19. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/company_paths.py +0 -0
  20. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/exceptions.py +0 -0
  21. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  22. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  23. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  24. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  25. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  26. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  27. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  28. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/model_registry.py +0 -0
  29. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/routes.py +0 -0
  30. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/search_terms.py +0 -0
  31. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  32. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/session_manager.py +0 -0
  33. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/text_splitter.py +0 -0
  34. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/url_safety.py +0 -0
  35. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/common/util.py +0 -0
  36. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/company_registry.py +0 -0
  37. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/__init__.py +0 -0
  38. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  39. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_agents/memory_compiler.prompt +0 -0
  40. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_agents/memory_correction.prompt +0 -0
  41. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_agents/memory_question_review.prompt +0 -0
  42. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_agents_pack.yaml +0 -0
  43. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  44. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  45. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  46. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  47. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  48. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  49. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  50. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  51. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  52. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  53. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  54. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  55. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  56. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  57. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  58. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  59. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  60. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  61. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  62. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  63. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  64. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  65. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  66. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  67. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  68. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  69. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  70. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  71. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/core.py +0 -0
  72. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/__init__.py +0 -0
  73. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  74. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/call_service.py +0 -0
  75. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  76. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  77. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  78. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  79. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  80. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  81. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  82. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  83. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  84. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  85. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  86. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  87. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  88. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  89. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  90. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  91. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  92. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  93. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  94. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  95. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  96. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/llm_response.py +0 -0
  97. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  98. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/__init__.py +0 -0
  99. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  100. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  101. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  102. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  103. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  104. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  105. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  106. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  107. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  108. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/memory_question_repo.py +0 -0
  109. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  110. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/models.py +0 -0
  111. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  112. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  113. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  114. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  115. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  116. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/runtime_logging.py +0 -0
  117. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/__init__.py +0 -0
  118. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/api_key_service.py +0 -0
  119. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  120. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/auth_service.py +0 -0
  121. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/branding_service.py +0 -0
  122. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/company_context_service.py +0 -0
  123. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/configuration_service.py +0 -0
  124. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  125. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  126. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/embedding_service.py +0 -0
  127. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/excel_service.py +0 -0
  128. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  129. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  130. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  131. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/i18n_service.py +0 -0
  132. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/inference_service.py +0 -0
  133. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/jwt_service.py +0 -0
  134. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  135. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/language_service.py +0 -0
  136. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/license_service.py +0 -0
  137. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  138. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/mail_service.py +0 -0
  139. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  140. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  141. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  142. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/memory_service.py +0 -0
  143. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  144. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  145. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
  146. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  147. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  148. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  149. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  150. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  151. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  152. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  153. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  154. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  155. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  156. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  157. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/pdf_service.py +0 -0
  158. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/profile_service.py +0 -0
  159. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  160. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/prompt_service.py +0 -0
  161. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/query_service.py +0 -0
  162. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  163. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  164. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/sql_service.py +0 -0
  165. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  166. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/storage_service.py +0 -0
  167. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  168. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/system_agent_catalog.py +0 -0
  169. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  170. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/system_tools.py +0 -0
  171. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  172. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  173. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  174. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/tool_service.py +0 -0
  175. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  176. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  177. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  178. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  179. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/warmup_service.py +0 -0
  180. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  181. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  182. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  183. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  184. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/services/web_search_service.py +0 -0
  185. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/images/favicon.ico +0 -0
  186. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/images/favicon.png +0 -0
  187. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  188. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  189. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  190. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  191. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  192. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_header_navigation.js +0 -0
  193. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  194. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  195. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  196. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  197. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  198. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  199. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  200. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  201. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  202. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/account.css +0 -0
  203. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  204. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  205. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  206. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/documents.css +0 -0
  207. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  208. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  209. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  210. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/static/styles/wiki_page.css +0 -0
  211. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/_chat_header.html +0 -0
  212. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/_company_header.html +0 -0
  213. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  214. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/account.html +0 -0
  215. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/base.html +0 -0
  216. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/change_password.html +0 -0
  217. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/chat.html +0 -0
  218. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  219. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  220. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/error.html +0 -0
  221. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  222. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  223. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/login_global.html +0 -0
  224. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  225. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  226. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  227. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  228. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  229. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  230. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/signup.html +0 -0
  231. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/templates/wiki_page.html +0 -0
  232. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/__init__.py +0 -0
  233. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/account_view.py +0 -0
  234. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  235. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/base_login_view.py +0 -0
  236. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  237. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/change_password_view.py +0 -0
  238. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  239. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/chat_view.py +0 -0
  240. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  241. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  242. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  243. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  244. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  245. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/history_api_view.py +0 -0
  246. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/home_view.py +0 -0
  247. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  248. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  249. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  250. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/login_view.py +0 -0
  251. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  252. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  253. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  254. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  255. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  256. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  257. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  258. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  259. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/signup_view.py +0 -0
  260. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/static_page_view.py +0 -0
  261. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  262. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  263. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/users_api_view.py +0 -0
  264. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  265. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  266. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  267. {iatoolkit-2.64.5 → iatoolkit-2.65.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  268. {iatoolkit-2.64.5 → iatoolkit-2.65.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.64.5
3
+ Version: 2.65.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.64.5"
6
+ __version__ = "2.65.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -55,7 +55,6 @@ ui:
55
55
  tab_chats: "Live Chats"
56
56
  tab_agents: "Agents"
57
57
  tab_logs: "Access Logs"
58
- tab_tools: "Tools Router"
59
58
  tab_apps: "Apps"
60
59
  search_placeholder: "Search user or text..."
61
60
  tool_router_config_title: "Router configuration"
@@ -81,6 +80,24 @@ ui:
81
80
  tab_overview: "Overview"
82
81
  tab_input: "Input / Context"
83
82
  tab_response: "Full Response"
83
+ tab_tools: "Tools"
84
+ routing_title: "Tool routing"
85
+ routing_none: "No routing: the run had every tool available."
86
+ routing_mode: "Mode / Reason"
87
+ routing_latency: "Selector latency"
88
+ routing_selection: "Selected / candidates"
89
+ routing_system_prompts: "System prompts selected"
90
+ routing_forced_tools: "Always-included system tools"
91
+ routing_ranked: "Ranked tools"
92
+ routing_metadata: "Router metadata"
93
+ tools_summary: "Execution summary"
94
+ tools_unique: "Unique tools"
95
+ tools_calls: "Total calls"
96
+ tools_time: "Tool time"
97
+ tools_avg: "Avg / call"
98
+ tools_coverage: "Coverage"
99
+ tools_coverage_hit: "Selected and executed"
100
+ tools_coverage_miss: "Selected but not executed"
84
101
  session_meta: "Session Metadata"
85
102
  user_id: "User Identifier"
86
103
  timestamp: "Timestamp"
@@ -68,7 +68,6 @@ ui:
68
68
  tab_chats: "Chats en Vivo"
69
69
  tab_agents: "Agentes"
70
70
  tab_logs: "Logs de Acceso"
71
- tab_tools: "Router de Herramientas"
72
71
  tab_apps: "Apps"
73
72
  search_placeholder: "Buscar usuario o texto..."
74
73
  tool_router_config_title: "Configuración del router"
@@ -94,6 +93,24 @@ ui:
94
93
  tab_overview: "Resumen"
95
94
  tab_input: "Entrada / Contexto"
96
95
  tab_response: "Respuesta Completa"
96
+ tab_tools: "Herramientas"
97
+ routing_title: "Routing de herramientas"
98
+ routing_none: "Sin routing: la ejecución tuvo todas las herramientas disponibles."
99
+ routing_mode: "Modo / Motivo"
100
+ routing_latency: "Latencia del selector"
101
+ routing_selection: "Seleccionadas / candidatas"
102
+ routing_system_prompts: "System prompts seleccionados"
103
+ routing_forced_tools: "Herramientas de sistema siempre incluidas"
104
+ routing_ranked: "Ranking de herramientas"
105
+ routing_metadata: "Metadatos del router"
106
+ tools_summary: "Resumen de ejecución"
107
+ tools_unique: "Herramientas distintas"
108
+ tools_calls: "Llamadas totales"
109
+ tools_time: "Tiempo en herramientas"
110
+ tools_avg: "Promedio / llamada"
111
+ tools_coverage: "Cobertura"
112
+ tools_coverage_hit: "Seleccionadas y ejecutadas"
113
+ tools_coverage_miss: "Seleccionadas y no ejecutadas"
97
114
  session_meta: "Metadatos de Sesión"
98
115
  user_id: "Identificador Usuario"
99
116
  timestamp: "Fecha/Hora"
@@ -23,7 +23,7 @@ from iatoolkit.repositories.models import Company, MemoryCapture, MemoryCaptureS
23
23
  from iatoolkit.repositories.profile_repo import ProfileRepo
24
24
  from iatoolkit.services.memory_wiki_service import MemoryWikiService
25
25
  from iatoolkit.services.storage_service import StorageService
26
- from iatoolkit.services.system_agent_runner import SystemAgentRunner
26
+ from iatoolkit.services.system_agent_runner import SystemAgentDisabled, SystemAgentRunner
27
27
  from iatoolkit.services.tenant_wiki_service import TenantWikiService
28
28
 
29
29
 
@@ -85,6 +85,7 @@ class MemoryCompilerService:
85
85
 
86
86
  compiled_count = 0
87
87
  processed_count = 0
88
+ waiting_count = 0
88
89
  with self._company_lock(company.id):
89
90
  # Keep draining: a capture saved while this run held the lock waited
90
91
  # for it instead of compiling concurrently, and must not be left behind.
@@ -92,15 +93,29 @@ class MemoryCompilerService:
92
93
  pending_captures = self.memory_repo.get_pending_captures(company.id, limit=limit)
93
94
  if not pending_captures:
94
95
  break
96
+ batch_waiting = 0
95
97
  for capture in pending_captures:
98
+ if not SystemAgentRunner.is_enabled(self._agent_for(capture)):
99
+ # Its agent is turned off by the platform: the capture stays
100
+ # pending and is compiled when the agent is turned on again.
101
+ batch_waiting += 1
102
+ continue
96
103
  processed_count += 1
97
- if self._compile_capture_safely(company, capture):
104
+ compiled = self._compile_capture_safely(company, capture)
105
+ if compiled is None:
106
+ batch_waiting += 1
107
+ elif compiled:
98
108
  compiled_count += 1
109
+ waiting_count += batch_waiting
110
+ if batch_waiting == len(pending_captures):
111
+ # Nothing in this batch could move; reading it again would only repeat that.
112
+ break
99
113
 
100
114
  return {
101
115
  "status": "success",
102
116
  "compiled_count": compiled_count,
103
117
  "processed_count": processed_count,
118
+ "waiting_count": waiting_count,
104
119
  "pending_count": len(self.memory_repo.get_pending_captures(company.id, limit=limit)),
105
120
  }
106
121
 
@@ -136,7 +151,12 @@ class MemoryCompilerService:
136
151
  finally:
137
152
  connection.close()
138
153
 
139
- def _compile_capture_safely(self, company: Company, capture: MemoryCapture) -> bool:
154
+ def _agent_for(self, capture: MemoryCapture) -> str:
155
+ is_correction = dict(capture.meta or {}).get("mode") == self.CORRECTION_MODE
156
+ return self.CORRECTION_AGENT if is_correction else self.COMPILER_AGENT
157
+
158
+ def _compile_capture_safely(self, company: Company, capture: MemoryCapture) -> bool | None:
159
+ """Whether the capture became a page; None when it stays pending (its agent was turned off)."""
140
160
  items = self.memory_repo.list_capture_items(capture.id)
141
161
  if not items:
142
162
  self._mark_capture_compiled(capture, items)
@@ -145,6 +165,10 @@ class MemoryCompilerService:
145
165
  for item in items:
146
166
  self._enrich_item(company.short_name, item)
147
167
  return self._compile_single_capture(company, capture, items)
168
+ except SystemAgentDisabled:
169
+ # Turned off while this run was going: leave it pending, untouched.
170
+ self.memory_repo.rollback()
171
+ return None
148
172
  except Exception as exc:
149
173
  logging.exception("Memory compilation failed for capture %s: %s", capture.id, exc)
150
174
  self.memory_repo.rollback()
@@ -316,6 +340,8 @@ class MemoryCompilerService:
316
340
  user_identifier=capture.user_identifier,
317
341
  question=f"Apply memory correction {capture.id}",
318
342
  )
343
+ except SystemAgentDisabled:
344
+ raise
319
345
  except Exception as exc:
320
346
  logging.warning("Memory correction %s could not reach the model: %s", capture.id, exc)
321
347
  return None
@@ -406,6 +432,8 @@ class MemoryCompilerService:
406
432
  question=f"Compile memory capture {capture.id}",
407
433
  attachments=native_pdf_attachments,
408
434
  )
435
+ except SystemAgentDisabled:
436
+ raise
409
437
  except Exception as exc:
410
438
  logging.warning("Memory compiler LLM fallback activated for capture %s: %s", capture.id, exc)
411
439
  return None
@@ -198,6 +198,9 @@ class MemoryQuestionService:
198
198
  self._advance(cursor, queries[-1].id if queries else None)
199
199
  return {"status": "success", "counts": counts}
200
200
 
201
+ if not SystemAgentRunner.is_enabled(self.REVIEW_AGENT):
202
+ # Turned off by the platform: the cursor stays, so the turns are reviewed once it is on again.
203
+ return {"status": "skipped", "reason": "the review agent is turned off", "counts": counts}
201
204
  if not self.system_agent_runner.resolve_model(
202
205
  company.short_name, SystemAgentCatalog.get(self.REVIEW_AGENT)).model:
203
206
  return {"status": "error", "error_message": "the company has no model configured", "counts": counts}
@@ -8,6 +8,7 @@ from __future__ import annotations
8
8
  import json
9
9
  import logging
10
10
  from dataclasses import dataclass
11
+ from typing import Callable
11
12
 
12
13
  from injector import inject
13
14
  from jinja2 import StrictUndefined
@@ -23,14 +24,28 @@ class SystemAgentUnavailable(Exception):
23
24
  """The company has no model to run the agent with."""
24
25
 
25
26
 
27
+ class SystemAgentDisabled(SystemAgentUnavailable):
28
+ """The platform turned the agent off: its work waits until it is turned on again."""
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class PlatformAgentSettings:
33
+ """What the platform operator set for an agent, for every tenant (BL-012, Fase 2)."""
34
+ default_model: str | None = None
35
+ enabled: bool = True
36
+
37
+
26
38
  @dataclass(frozen=True)
27
39
  class ResolvedModel:
28
40
  model: str | None
29
- # Where it came from: "tenant" (company.yaml), "catalog" (the agent's default)
30
- # or "company" (the company's default model).
41
+ # Where it came from: "tenant" (company.yaml), "platform" (the operator's
42
+ # default for the agent), "catalog" (the agent's default in its pack) or
43
+ # "company" (the company's default model).
31
44
  source: str | None
32
45
  # The tenant's choice when it could not be used (no longer enabled).
33
46
  ignored_choice: str | None = None
47
+ # The platform's model when this company does not have it enabled.
48
+ ignored_platform_model: str | None = None
34
49
 
35
50
 
36
51
  class SystemAgentRunner:
@@ -40,11 +55,16 @@ class SystemAgentRunner:
40
55
  output contract. Interpreting and repairing the answer stays with the caller.
41
56
 
42
57
  The model is resolved from the most specific to the most general: the one the
43
- tenant picked (`system_agents.<key>.model` in company.yaml), the agent's
44
- default in the catalog, the company's default model. A pick that is no
45
- longer among the company's models falls through to the next level, and a
46
- call that fails with a picked model is retried once with the company's
47
- default, so a bad choice never stops the agent.
58
+ tenant picked (`system_agents.<key>.model` in company.yaml), the one the
59
+ platform set for the agent, the agent's default in the catalog, the
60
+ company's default model. A model the company does not have enabled is
61
+ skipped (the platform's too: a tenant is never charged for a model it does
62
+ not have), and a call that fails with a picked model is retried once with
63
+ the company's default, so a bad choice never stops the agent.
64
+
65
+ The platform's settings (default model, on/off) come from a provider the
66
+ deployment registers (`register_platform_settings_provider`); without one,
67
+ every agent is on and has no platform model.
48
68
 
49
69
  Deliberately light: it does not go through tasks or the agent runtime, so
50
70
  the services that use it gain no dependency beyond the model client.
@@ -52,9 +72,12 @@ class SystemAgentRunner:
52
72
 
53
73
  CONFIG_SECTION = "system_agents"
54
74
  SOURCE_TENANT = "tenant"
75
+ SOURCE_PLATFORM = "platform"
55
76
  SOURCE_CATALOG = "catalog"
56
77
  SOURCE_COMPANY = "company"
57
78
 
79
+ _platform_settings_provider: Callable[[str], PlatformAgentSettings | None] | None = None
80
+
58
81
  _template_env = ImmutableSandboxedEnvironment(
59
82
  undefined=StrictUndefined,
60
83
  trim_blocks=True,
@@ -69,6 +92,33 @@ class SystemAgentRunner:
69
92
  self.llm_client = llm_client
70
93
  self.configuration_service = configuration_service
71
94
 
95
+ # =====================================================================
96
+ # Platform settings
97
+ # =====================================================================
98
+
99
+ @classmethod
100
+ def register_platform_settings_provider(cls,
101
+ provider: Callable[[str], PlatformAgentSettings | None] | None) -> None:
102
+ """`provider(agent_key)` returns the platform's settings for an agent, or None for the defaults."""
103
+ cls._platform_settings_provider = provider
104
+
105
+ @classmethod
106
+ def platform_settings(cls, agent_key: str) -> PlatformAgentSettings:
107
+ provider = cls._platform_settings_provider
108
+ if provider is None:
109
+ return PlatformAgentSettings()
110
+ try:
111
+ settings = provider(agent_key)
112
+ except Exception as exc:
113
+ # The platform's store unreachable must not stop the tenants' agents.
114
+ logging.warning("Platform settings of system agent '%s' could not be read: %s", agent_key, exc)
115
+ return PlatformAgentSettings()
116
+ return settings if isinstance(settings, PlatformAgentSettings) else PlatformAgentSettings()
117
+
118
+ @classmethod
119
+ def is_enabled(cls, agent_key: str) -> bool:
120
+ return cls.platform_settings(agent_key).enabled
121
+
72
122
  # =====================================================================
73
123
  # Running
74
124
  # =====================================================================
@@ -83,11 +133,15 @@ class SystemAgentRunner:
83
133
  attachments: list | None = None) -> dict:
84
134
  """
85
135
  The model's response (as llmClient.invoke returns it). Raises
136
+ SystemAgentDisabled when the platform turned the agent off,
86
137
  SystemAgentUnavailable without a model, and whatever the model client
87
138
  raises when even the company's default model fails.
88
139
  """
89
140
  agent = SystemAgentCatalog.get(agent_key)
90
- resolved = self.resolve_model(company.short_name, agent)
141
+ platform = self.platform_settings(agent.key)
142
+ if not platform.enabled:
143
+ raise SystemAgentDisabled(f"system agent '{agent.key}' is turned off by the platform")
144
+ resolved = self.resolve_model(company.short_name, agent, platform=platform)
91
145
  if not resolved.model:
92
146
  raise SystemAgentUnavailable(f"{company.short_name} has no model for system agent '{agent.key}'")
93
147
  prompt = self.render_prompt(agent, inputs)
@@ -135,11 +189,12 @@ class SystemAgentRunner:
135
189
  def resolve_model(self,
136
190
  company_short_name: str,
137
191
  agent: SystemAgent,
138
- llm_configuration: tuple | None = None) -> ResolvedModel:
192
+ llm_configuration: tuple | None = None,
193
+ platform: PlatformAgentSettings | None = None) -> ResolvedModel:
139
194
  """
140
- `llm_configuration` is get_llm_configuration's (default, available) when
141
- the caller already read it: resolving many agents then costs one read,
142
- which in enterprise is a query to the model catalogue.
195
+ `llm_configuration` is get_llm_configuration's (default, available) and
196
+ `platform` the agent's platform settings, when the caller already read
197
+ them: resolving many agents then costs one read of each.
143
198
  """
144
199
  default_model, available = llm_configuration or self.configuration_service.get_llm_configuration(company_short_name)
145
200
  enabled = self._model_ids(available)
@@ -158,9 +213,16 @@ class SystemAgentRunner:
158
213
  "System agent '%s' of %s: model '%s' is no longer enabled; using the next level.",
159
214
  agent.key, company_short_name, chosen,
160
215
  )
216
+ platform = platform or self.platform_settings(agent.key)
217
+ ignored_platform = None
218
+ if platform.default_model:
219
+ if usable(platform.default_model):
220
+ return ResolvedModel(platform.default_model, self.SOURCE_PLATFORM, ignored)
221
+ ignored_platform = platform.default_model
161
222
  if usable(agent.default_model):
162
- return ResolvedModel(agent.default_model, self.SOURCE_CATALOG, ignored)
163
- return ResolvedModel(default_model or None, self.SOURCE_COMPANY if default_model else None, ignored)
223
+ return ResolvedModel(agent.default_model, self.SOURCE_CATALOG, ignored, ignored_platform)
224
+ return ResolvedModel(default_model or None, self.SOURCE_COMPANY if default_model else None,
225
+ ignored, ignored_platform)
164
226
 
165
227
  def tenant_choice(self, company_short_name: str, agent_key: str) -> str | None:
166
228
  section = self._tenant_section(company_short_name)
@@ -243,7 +305,8 @@ class SystemAgentRunner:
243
305
  llm_configuration = llm_configuration or self.configuration_service.get_llm_configuration(company_short_name)
244
306
  result = []
245
307
  for agent in SystemAgentCatalog.list():
246
- resolved = self.resolve_model(company_short_name, agent, llm_configuration)
308
+ platform = self.platform_settings(agent.key)
309
+ resolved = self.resolve_model(company_short_name, agent, llm_configuration, platform)
247
310
  result.append({
248
311
  "key": agent.key,
249
312
  "name": agent.name,
@@ -260,5 +323,8 @@ class SystemAgentRunner:
260
323
  "effective_model": resolved.model,
261
324
  "model_source": resolved.source,
262
325
  "ignored_model": resolved.ignored_choice,
326
+ "platform_model": platform.default_model,
327
+ "ignored_platform_model": resolved.ignored_platform_model,
328
+ "enabled": platform.enabled,
263
329
  })
264
330
  return result
@@ -3,6 +3,8 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
+ import re
7
+
6
8
  import markdown2
7
9
  import nh3
8
10
  from flask import redirect, render_template, request, url_for
@@ -78,7 +80,7 @@ class WikiPageView(MethodView):
78
80
  return render_template(
79
81
  "wiki_page.html",
80
82
  **context,
81
- page_title=page.get("title") or page_path or context["wiki_name"],
83
+ page_title=self.plain_title(page.get("title")) or page_path or context["wiki_name"],
82
84
  body_html=self.render_markdown(body, wiki_root=context["root_url"]),
83
85
  message=None if body else self.i18n_service.t('ui.wiki_page.empty'),
84
86
  )
@@ -92,6 +94,13 @@ class WikiPageView(MethodView):
92
94
  message=message,
93
95
  ), status_code
94
96
 
97
+ @staticmethod
98
+ def plain_title(title: str | None) -> str:
99
+ """A page title is markdown (`Sistema `portal-backend``); the browser
100
+ tab shows it as text, so the code and emphasis marks go. Underscores
101
+ stay: they belong to names like SYS_alertas_push."""
102
+ return " ".join(re.sub(r"[`*]", "", str(title or "")).split())
103
+
95
104
  @classmethod
96
105
  def render_markdown(cls, markdown: str | None, wiki_root: str | None = None) -> str:
97
106
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.64.5
3
+ Version: 2.65.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes