iatoolkit 2.24.0__tar.gz → 2.25.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 (246) hide show
  1. {iatoolkit-2.24.0/src/iatoolkit.egg-info → iatoolkit-2.25.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/locales/en.yaml +12 -1
  4. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/locales/es.yaml +12 -1
  5. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/dispatcher_service.py +96 -1
  6. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/http_tool_service.py +62 -6
  7. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/inference_service.py +1 -1
  8. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/llm_client_service.py +1 -0
  9. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/tool_service.py +91 -31
  10. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/tool_api_view.py +4 -0
  11. {iatoolkit-2.24.0 → iatoolkit-2.25.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  12. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/LICENSE +0 -0
  13. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/LICENSE_COMMUNITY.md +0 -0
  14. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/pyproject.toml +0 -0
  15. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/readme.md +0 -0
  16. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/requirements.txt +0 -0
  17. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/setup.cfg +0 -0
  18. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/base_company.py +0 -0
  19. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/cli_commands.py +0 -0
  20. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/__init__.py +0 -0
  21. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/exceptions.py +0 -0
  22. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  23. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  24. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  25. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  26. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  27. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  28. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  29. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  30. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/model_registry.py +0 -0
  31. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/routes.py +0 -0
  32. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  33. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/session_manager.py +0 -0
  34. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/common/util.py +0 -0
  35. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/company_registry.py +0 -0
  36. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/__init__.py +0 -0
  37. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  38. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  39. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  40. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  41. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  42. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  43. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  44. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  45. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  46. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  47. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  48. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  49. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  50. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  51. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  52. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  53. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  54. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  55. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  56. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  57. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  58. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  59. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  60. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  61. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  62. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  63. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  64. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  65. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  66. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/core.py +0 -0
  67. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/__init__.py +0 -0
  68. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  69. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/call_service.py +0 -0
  70. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  71. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  72. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  73. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  74. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  75. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  76. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  77. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  78. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  79. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  80. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  81. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  82. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  83. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  84. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  85. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  86. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  87. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  88. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  89. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  90. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  91. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/llm_response.py +0 -0
  92. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  93. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/__init__.py +0 -0
  94. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  95. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  96. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  97. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  98. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  99. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  100. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  101. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  102. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/models.py +0 -0
  103. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  104. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  105. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  106. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  107. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  108. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/runtime_logging.py +0 -0
  109. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/__init__.py +0 -0
  110. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/api_key_service.py +0 -0
  111. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  112. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/auth_service.py +0 -0
  113. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  114. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/branding_service.py +0 -0
  115. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/company_context_service.py +0 -0
  116. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/configuration_service.py +0 -0
  117. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  118. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/embedding_service.py +0 -0
  119. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/excel_service.py +0 -0
  120. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  121. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  122. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/i18n_service.py +0 -0
  123. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/jwt_service.py +0 -0
  124. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  125. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/language_service.py +0 -0
  126. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/license_service.py +0 -0
  127. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/mail_service.py +0 -0
  128. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  129. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  130. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  131. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  132. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/memory_service.py +0 -0
  133. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  134. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  135. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  136. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  137. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  138. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  139. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  140. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  141. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  142. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  143. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  144. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  145. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  146. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  147. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/pdf_service.py +0 -0
  148. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/profile_service.py +0 -0
  149. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  150. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/prompt_service.py +0 -0
  151. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/query_service.py +0 -0
  152. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  153. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  154. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/sql_service.py +0 -0
  155. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  156. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/storage_service.py +0 -0
  157. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  158. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  159. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/system_tools.py +0 -0
  160. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  161. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  162. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  163. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  164. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  165. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  166. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/warmup_service.py +0 -0
  167. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  168. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  169. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  170. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  171. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/services/web_search_service.py +0 -0
  172. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  173. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  174. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  175. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  176. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  177. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  178. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  179. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  180. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  181. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  182. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  183. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  184. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  185. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  186. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  187. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  188. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  189. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/documents.css +0 -0
  190. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  191. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  192. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  193. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/_company_header.html +0 -0
  194. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  195. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/account.html +0 -0
  196. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/base.html +0 -0
  197. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/change_password.html +0 -0
  198. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/chat.html +0 -0
  199. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  200. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  201. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/error.html +0 -0
  202. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  203. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  204. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  205. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  206. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  207. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  208. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  209. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  210. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/templates/signup.html +0 -0
  211. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/__init__.py +0 -0
  212. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/account_view.py +0 -0
  213. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  214. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/base_login_view.py +0 -0
  215. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  216. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/change_password_view.py +0 -0
  217. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  218. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/chat_view.py +0 -0
  219. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  220. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  221. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  222. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  223. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  224. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/history_api_view.py +0 -0
  225. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/home_view.py +0 -0
  226. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  227. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  228. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  229. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/login_view.py +0 -0
  230. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  231. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  232. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  233. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  234. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  235. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  236. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  237. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  238. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/signup_view.py +0 -0
  239. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/static_page_view.py +0 -0
  240. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  241. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/users_api_view.py +0 -0
  242. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  243. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  244. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  245. {iatoolkit-2.24.0 → iatoolkit-2.25.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  246. {iatoolkit-2.24.0 → iatoolkit-2.25.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.24.0
3
+ Version: 2.25.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.24.0"
6
+ __version__ = "2.25.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -1627,7 +1627,7 @@ ui:
1627
1627
  output_contract_title: "Output Contract"
1628
1628
  output_contract_hint: "Optional. Use YAML/JSON to describe the returned artifact, for example kind/image/file/audio/video plus transport and field names such as image_url or download_link."
1629
1629
  model_output_title: "Model Output"
1630
- model_output_hint: "Define the final JSON returned to the model after the HTTP response is received. Default mode is raw."
1630
+ model_output_hint: "Define the final JSON returned to the model after the HTTP response is received. Default mode is raw. Use include/exclude and describe to keep responses compact and meaningful."
1631
1631
  modal_output_contract_label: "Initial output_contract"
1632
1632
  modal_output_contract_placeholder: "kind: image\nmime_type: image/png\ntransport: signed_url\nurl_field: image_url"
1633
1633
  routing_profile_title: "Routing Profile"
@@ -1859,6 +1859,10 @@ ui:
1859
1859
  company_config_desc: "Core runtime, branding, connector, and company behavior configuration."
1860
1860
  company_card_title: "Company"
1861
1861
  company_card_desc: "Core identity and runtime information for this company."
1862
+ company_editor_desc: "Review and update the full company configuration for identity, runtime, and branding."
1863
+ policies_card_title: "Policies"
1864
+ policies_card_desc: "Manage runtime access policies, quotas, and tool or model controls."
1865
+ policies_editor_desc: "Review and update the runtime policy file used for access decisions."
1862
1866
  company_name: "Company name"
1863
1867
  short_name: "Short name"
1864
1868
  runtime_mode: "Runtime mode"
@@ -2613,9 +2617,16 @@ js_messages:
2613
2617
  tool_http_model_output_label: "model_output"
2614
2618
  tool_http_model_output_object: "model_output must be an object"
2615
2619
  tool_http_model_output_unknown_keys: "model_output has unsupported keys: {keys}"
2620
+ tool_http_model_output_description_invalid: "model_output.description must be a string"
2621
+ tool_http_model_output_list_invalid: "model_output.{field} must be a list"
2622
+ tool_http_model_output_list_item_invalid: "model_output.{field}[{index}] must be a non-empty string"
2623
+ tool_http_model_output_describe_object: "model_output.describe must be an object"
2624
+ tool_http_model_output_describe_field_name_invalid: "model_output.describe must use non-empty field names"
2625
+ tool_http_model_output_describe_field_invalid: "model_output.describe.{field} must be a string"
2616
2626
  tool_http_model_output_mode_invalid: "model_output.mode must be one of raw, extract, map"
2617
2627
  tool_http_model_output_path_required: "model_output.path is required when mode=extract"
2618
2628
  tool_http_model_output_root_invalid: "model_output.root must be a non-empty string"
2629
+ tool_http_model_output_fields_object: "model_output.fields must be an object"
2619
2630
  tool_http_model_output_fields_required: "model_output.fields must be a non-empty object when mode=map"
2620
2631
  tool_http_model_output_field_name_invalid: "model_output.fields must use non-empty field names"
2621
2632
  tool_http_model_output_field_path_required: "model_output.fields.{field} must define a path"
@@ -1631,7 +1631,7 @@ ui:
1631
1631
  output_contract_title: "Output Contract"
1632
1632
  output_contract_hint: "Opcional. Usa YAML/JSON para describir el artefacto devuelto, por ejemplo kind/image/file/audio/video más transport y nombres de campos como image_url o download_link."
1633
1633
  model_output_title: "Model Output"
1634
- model_output_hint: "Define el JSON final que recibe el modelo después de ejecutar la tool HTTP. El modo por defecto es raw."
1634
+ model_output_hint: "Define el JSON final que recibe el modelo después de ejecutar la tool HTTP. El modo por defecto es raw. Usa include/exclude y describe para mantener respuestas compactas y significativas."
1635
1635
  modal_output_contract_label: "output_contract inicial"
1636
1636
  modal_output_contract_placeholder: "kind: image\nmime_type: image/png\ntransport: signed_url\nurl_field: image_url"
1637
1637
  routing_profile_title: "Routing Profile"
@@ -1863,6 +1863,10 @@ ui:
1863
1863
  company_config_desc: "Configuración central de runtime, branding, conectores y comportamiento de la empresa."
1864
1864
  company_card_title: "Empresa"
1865
1865
  company_card_desc: "Identidad principal e información de runtime para esta empresa."
1866
+ company_editor_desc: "Revisa y actualiza la configuración completa de empresa para identidad, runtime y branding."
1867
+ policies_card_title: "Políticas"
1868
+ policies_card_desc: "Administra políticas de acceso, cuotas y controles de tools o modelos en runtime."
1869
+ policies_editor_desc: "Revisa y actualiza el archivo de políticas usado para decisiones de acceso en runtime."
1866
1870
  company_name: "Nombre de la empresa"
1867
1871
  short_name: "Nombre corto"
1868
1872
  runtime_mode: "Modo runtime"
@@ -2616,9 +2620,16 @@ js_messages:
2616
2620
  tool_http_model_output_label: "model_output"
2617
2621
  tool_http_model_output_object: "model_output debe ser un objeto"
2618
2622
  tool_http_model_output_unknown_keys: "model_output tiene claves no soportadas: {keys}"
2623
+ tool_http_model_output_description_invalid: "model_output.description debe ser un string"
2624
+ tool_http_model_output_list_invalid: "model_output.{field} debe ser una lista"
2625
+ tool_http_model_output_list_item_invalid: "model_output.{field}[{index}] debe ser un string no vacío"
2626
+ tool_http_model_output_describe_object: "model_output.describe debe ser un objeto"
2627
+ tool_http_model_output_describe_field_name_invalid: "model_output.describe debe usar nombres de campo no vacíos"
2628
+ tool_http_model_output_describe_field_invalid: "model_output.describe.{field} debe ser un string"
2619
2629
  tool_http_model_output_mode_invalid: "model_output.mode debe ser uno de raw, extract, map"
2620
2630
  tool_http_model_output_path_required: "model_output.path es obligatorio cuando mode=extract"
2621
2631
  tool_http_model_output_root_invalid: "model_output.root debe ser un string no vacío"
2632
+ tool_http_model_output_fields_object: "model_output.fields debe ser un objeto"
2622
2633
  tool_http_model_output_fields_required: "model_output.fields debe ser un objeto no vacío cuando mode=map"
2623
2634
  tool_http_model_output_field_name_invalid: "model_output.fields debe usar nombres de campo no vacíos"
2624
2635
  tool_http_model_output_field_path_required: "model_output.fields.{field} debe definir un path"
@@ -10,10 +10,13 @@ from iatoolkit.common.util import Utility
10
10
  from injector import inject
11
11
  import inspect
12
12
  import logging
13
+ from time import perf_counter
14
+ from uuid import uuid4
13
15
 
14
16
 
15
17
  class Dispatcher:
16
18
  USER_SCOPED_SYSTEM_TOOLS = {"iat_memory_search", "iat_memory_get_page"}
19
+ _tool_execution_hook = None
17
20
 
18
21
  @inject
19
22
  def __init__(self,
@@ -55,6 +58,32 @@ class Dispatcher:
55
58
  for parameter in signature.parameters.values()
56
59
  )
57
60
 
61
+ @classmethod
62
+ def register_tool_execution_hook(cls, hook):
63
+ cls._tool_execution_hook = hook
64
+
65
+ @classmethod
66
+ def clear_tool_execution_hook(cls):
67
+ cls._tool_execution_hook = None
68
+
69
+ def _notify_tool_execution_hook(self, event: str, **payload) -> None:
70
+ hook = type(self)._tool_execution_hook
71
+ if not callable(hook):
72
+ return
73
+
74
+ try:
75
+ hook(event=event, **payload)
76
+ except IAToolkitException:
77
+ raise
78
+ except Exception as exc:
79
+ logging.warning(
80
+ "Tool execution hook failed for event=%s company=%s tool=%s: %s",
81
+ event,
82
+ payload.get("company_short_name"),
83
+ payload.get("function_name"),
84
+ exc,
85
+ )
86
+
58
87
  @property
59
88
  def tool_service(self):
60
89
  """Lazy-loads and returns the ToolService instance to avoid circular imports."""
@@ -91,7 +120,14 @@ class Dispatcher:
91
120
  return self._company_instances
92
121
 
93
122
 
94
- def dispatch(self, company_short_name: str, function_name: str, user_identifier: str | None = None, **kwargs) -> dict:
123
+ def dispatch(
124
+ self,
125
+ company_short_name: str,
126
+ function_name: str,
127
+ user_identifier: str | None = None,
128
+ _iat_runtime_source: str | None = None,
129
+ **kwargs,
130
+ ) -> dict:
95
131
  # 1. Consult the Database (Source of Truth) for the tool definition
96
132
  tool_def = self.tool_service.get_tool_definition(company_short_name, function_name)
97
133
  if not tool_def:
@@ -100,6 +136,65 @@ class Dispatcher:
100
136
  f"Tool '{function_name}' not registered for company '{company_short_name}'"
101
137
  )
102
138
 
139
+ execution_id = uuid4().hex
140
+ self._notify_tool_execution_hook(
141
+ "before_dispatch",
142
+ execution_id=execution_id,
143
+ company_short_name=company_short_name,
144
+ function_name=function_name,
145
+ user_identifier=user_identifier,
146
+ runtime_source=_iat_runtime_source,
147
+ tool_def=tool_def,
148
+ arguments=dict(kwargs),
149
+ )
150
+ started_at = perf_counter()
151
+ try:
152
+ result = self._dispatch_resolved_tool(
153
+ company_short_name=company_short_name,
154
+ function_name=function_name,
155
+ user_identifier=user_identifier,
156
+ tool_def=tool_def,
157
+ **kwargs,
158
+ )
159
+ self._notify_tool_execution_hook(
160
+ "after_dispatch",
161
+ execution_id=execution_id,
162
+ company_short_name=company_short_name,
163
+ function_name=function_name,
164
+ user_identifier=user_identifier,
165
+ runtime_source=_iat_runtime_source,
166
+ tool_def=tool_def,
167
+ arguments=dict(kwargs),
168
+ status="success",
169
+ duration_ms=int(round((perf_counter() - started_at) * 1000)),
170
+ result=result,
171
+ )
172
+ return result
173
+ except Exception as exc:
174
+ self._notify_tool_execution_hook(
175
+ "after_dispatch",
176
+ execution_id=execution_id,
177
+ company_short_name=company_short_name,
178
+ function_name=function_name,
179
+ user_identifier=user_identifier,
180
+ runtime_source=_iat_runtime_source,
181
+ tool_def=tool_def,
182
+ arguments=dict(kwargs),
183
+ status="error",
184
+ duration_ms=int(round((perf_counter() - started_at) * 1000)),
185
+ error=exc,
186
+ )
187
+ raise
188
+
189
+ def _dispatch_resolved_tool(
190
+ self,
191
+ *,
192
+ company_short_name: str,
193
+ function_name: str,
194
+ user_identifier: str | None,
195
+ tool_def,
196
+ **kwargs,
197
+ ) -> dict:
103
198
  # 2. Dispatch based on Tool Type
104
199
  if tool_def.tool_type == 'SYSTEM':
105
200
  # Map to internal handler
@@ -588,13 +588,15 @@ class HttpToolService:
588
588
  root_path = str(model_output.get("root") or "").strip()
589
589
  source = self._extract_path(value, root_path) if root_path else value
590
590
  fields = model_output.get("fields") or {}
591
- if not isinstance(fields, dict) or not fields:
591
+ if not isinstance(fields, dict):
592
592
  raise IAToolkitException(
593
593
  IAToolkitException.ErrorType.INVALID_PARAMETER,
594
- "execution_config.response.model_output.fields must be a non-empty object when mode is 'map'"
594
+ "execution_config.response.model_output.fields must be an object"
595
595
  )
596
596
 
597
597
  exclude_nulls = model_output.get("exclude_nulls") is True
598
+ include_fields = self._normalize_model_output_field_names(model_output.get("include"))
599
+ exclude_fields = set(self._normalize_model_output_field_names(model_output.get("exclude")))
598
600
  max_items = model_output.get("max_items")
599
601
 
600
602
  if isinstance(source, list):
@@ -604,27 +606,81 @@ class HttpToolService:
604
606
  else source
605
607
  )
606
608
  return [
607
- self._map_model_output_item(item, fields, exclude_nulls)
609
+ self._map_model_output_item(
610
+ item,
611
+ fields=fields,
612
+ include_fields=include_fields,
613
+ exclude_fields=exclude_fields,
614
+ exclude_nulls=exclude_nulls,
615
+ )
608
616
  for item in items
609
617
  ]
610
618
  if isinstance(source, dict):
611
- return self._map_model_output_item(source, fields, exclude_nulls)
619
+ return self._map_model_output_item(
620
+ source,
621
+ fields=fields,
622
+ include_fields=include_fields,
623
+ exclude_fields=exclude_fields,
624
+ exclude_nulls=exclude_nulls,
625
+ )
612
626
 
613
627
  raise IAToolkitException(
614
628
  IAToolkitException.ErrorType.INVALID_PARAMETER,
615
629
  f"Cannot map model_output over type '{type(source).__name__}'"
616
630
  )
617
631
 
618
- def _map_model_output_item(self, source: dict, fields: dict, exclude_nulls: bool) -> dict:
619
- mapped = {}
632
+ def _map_model_output_item(
633
+ self,
634
+ source,
635
+ *,
636
+ fields: dict,
637
+ include_fields: list[str],
638
+ exclude_fields: set[str],
639
+ exclude_nulls: bool,
640
+ ) -> dict:
641
+ if not isinstance(source, dict):
642
+ raise IAToolkitException(
643
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
644
+ f"Cannot map model_output item over type '{type(source).__name__}'"
645
+ )
646
+
647
+ if include_fields:
648
+ mapped = {}
649
+ for field_name in include_fields:
650
+ field_value = source.get(field_name)
651
+ if field_value is None and exclude_nulls:
652
+ continue
653
+ mapped[field_name] = field_value
654
+ else:
655
+ mapped = {
656
+ field_name: field_value
657
+ for field_name, field_value in source.items()
658
+ if not (field_value is None and exclude_nulls)
659
+ }
660
+
620
661
  for output_name, field_config in fields.items():
621
662
  path = self._resolve_model_output_field_path(output_name, field_config)
622
663
  found, field_value = self._try_extract_path(source, path)
623
664
  if (not found or field_value is None) and exclude_nulls:
624
665
  continue
625
666
  mapped[output_name] = field_value if found else None
667
+
668
+ for field_name in exclude_fields:
669
+ mapped.pop(field_name, None)
670
+
626
671
  return mapped
627
672
 
673
+ @staticmethod
674
+ def _normalize_model_output_field_names(value) -> list[str]:
675
+ if not isinstance(value, list):
676
+ return []
677
+ names = []
678
+ for item in value:
679
+ text = str(item or "").strip()
680
+ if text:
681
+ names.append(text)
682
+ return names
683
+
628
684
  @staticmethod
629
685
  def _resolve_model_output_field_path(output_name: str, field_config) -> str:
630
686
  if isinstance(field_config, str):
@@ -101,7 +101,7 @@ class InferenceService:
101
101
  payload["parameters"] = parameters
102
102
 
103
103
  # 4. Execute Call
104
- logging.info("Calling inference tool %s with model %s.", tool_name, model_id)
104
+ logging.debug("Calling inference tool %s with model %s.", tool_name, model_id)
105
105
  response_data = self._call_endpoint(
106
106
  endpoint_url,
107
107
  api_key,
@@ -250,6 +250,7 @@ class llmClient:
250
250
  company_short_name=company.short_name,
251
251
  function_name=function_name,
252
252
  user_identifier=user_identifier,
253
+ _iat_runtime_source=request_source,
253
254
  **call_kwargs
254
255
  )
255
256
  force_tool_name = None
@@ -596,7 +596,18 @@ class ToolService:
596
596
  "execution_config.response.model_output must be a JSON object"
597
597
  )
598
598
 
599
- allowed_keys = {"mode", "path", "root", "fields", "exclude_nulls", "max_items"}
599
+ allowed_keys = {
600
+ "mode",
601
+ "path",
602
+ "root",
603
+ "fields",
604
+ "include",
605
+ "exclude",
606
+ "description",
607
+ "describe",
608
+ "exclude_nulls",
609
+ "max_items",
610
+ }
600
611
  unknown_keys = sorted(key for key in model_output.keys() if key not in allowed_keys)
601
612
  if unknown_keys:
602
613
  raise IAToolkitException(
@@ -604,6 +615,17 @@ class ToolService:
604
615
  f"execution_config.response.model_output has unsupported keys: {unknown_keys}"
605
616
  )
606
617
 
618
+ description = model_output.get("description")
619
+ if description is not None and not isinstance(description, str):
620
+ raise IAToolkitException(
621
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
622
+ "execution_config.response.model_output.description must be a string"
623
+ )
624
+
625
+ self._validate_http_model_output_string_list(model_output.get("include"), "include")
626
+ self._validate_http_model_output_string_list(model_output.get("exclude"), "exclude")
627
+ self._validate_http_model_output_descriptions(model_output.get("describe"))
628
+
607
629
  mode = str(model_output.get("mode", "raw")).strip().lower()
608
630
  if mode not in self.HTTP_ALLOWED_MODEL_OUTPUT_MODES:
609
631
  raise IAToolkitException(
@@ -628,42 +650,43 @@ class ToolService:
628
650
  )
629
651
 
630
652
  fields = model_output.get("fields")
631
- if not isinstance(fields, dict) or not fields:
632
- raise IAToolkitException(
633
- IAToolkitException.ErrorType.INVALID_PARAMETER,
634
- "execution_config.response.model_output.fields must be a non-empty object when mode is 'map'"
635
- )
636
- for field_name, field_config in fields.items():
637
- if not isinstance(field_name, str) or not field_name.strip():
653
+ if fields is not None:
654
+ if not isinstance(fields, dict):
638
655
  raise IAToolkitException(
639
656
  IAToolkitException.ErrorType.INVALID_PARAMETER,
640
- "execution_config.response.model_output.fields must use non-empty string field names"
657
+ "execution_config.response.model_output.fields must be an object"
641
658
  )
642
- if isinstance(field_config, str):
643
- if not field_config.strip():
659
+ for field_name, field_config in fields.items():
660
+ if not isinstance(field_name, str) or not field_name.strip():
644
661
  raise IAToolkitException(
645
662
  IAToolkitException.ErrorType.INVALID_PARAMETER,
646
- f"execution_config.response.model_output.fields.{field_name} must be a non-empty path"
663
+ "execution_config.response.model_output.fields must use non-empty string field names"
647
664
  )
648
- continue
649
- if isinstance(field_config, dict):
650
- path = field_config.get("path")
651
- if not isinstance(path, str) or not path.strip():
652
- raise IAToolkitException(
653
- IAToolkitException.ErrorType.INVALID_PARAMETER,
654
- f"execution_config.response.model_output.fields.{field_name}.path must be a non-empty string"
655
- )
656
- description = field_config.get("description")
657
- if description is not None and not isinstance(description, str):
658
- raise IAToolkitException(
659
- IAToolkitException.ErrorType.INVALID_PARAMETER,
660
- f"execution_config.response.model_output.fields.{field_name}.description must be a string"
661
- )
662
- continue
663
- raise IAToolkitException(
664
- IAToolkitException.ErrorType.INVALID_PARAMETER,
665
- f"execution_config.response.model_output.fields.{field_name} must be a path string or object"
666
- )
665
+ if isinstance(field_config, str):
666
+ if not field_config.strip():
667
+ raise IAToolkitException(
668
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
669
+ f"execution_config.response.model_output.fields.{field_name} must be a non-empty path"
670
+ )
671
+ continue
672
+ if isinstance(field_config, dict):
673
+ path = field_config.get("path")
674
+ if not isinstance(path, str) or not path.strip():
675
+ raise IAToolkitException(
676
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
677
+ f"execution_config.response.model_output.fields.{field_name}.path must be a non-empty string"
678
+ )
679
+ description = field_config.get("description")
680
+ if description is not None and not isinstance(description, str):
681
+ raise IAToolkitException(
682
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
683
+ f"execution_config.response.model_output.fields.{field_name}.description must be a string"
684
+ )
685
+ continue
686
+ raise IAToolkitException(
687
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
688
+ f"execution_config.response.model_output.fields.{field_name} must be a path string or object"
689
+ )
667
690
 
668
691
  exclude_nulls = model_output.get("exclude_nulls")
669
692
  if exclude_nulls is not None and not isinstance(exclude_nulls, bool):
@@ -682,6 +705,43 @@ class ToolService:
682
705
  "execution_config.response.model_output.max_items must be a positive integer"
683
706
  )
684
707
 
708
+ @staticmethod
709
+ def _validate_http_model_output_string_list(value, field_name: str) -> None:
710
+ if value is None:
711
+ return
712
+ if not isinstance(value, list):
713
+ raise IAToolkitException(
714
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
715
+ f"execution_config.response.model_output.{field_name} must be a list"
716
+ )
717
+ for index, item in enumerate(value):
718
+ if not isinstance(item, str) or not item.strip():
719
+ raise IAToolkitException(
720
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
721
+ f"execution_config.response.model_output.{field_name}[{index}] must be a non-empty string"
722
+ )
723
+
724
+ @staticmethod
725
+ def _validate_http_model_output_descriptions(value) -> None:
726
+ if value is None:
727
+ return
728
+ if not isinstance(value, dict):
729
+ raise IAToolkitException(
730
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
731
+ "execution_config.response.model_output.describe must be an object"
732
+ )
733
+ for field_name, description in value.items():
734
+ if not isinstance(field_name, str) or not field_name.strip():
735
+ raise IAToolkitException(
736
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
737
+ "execution_config.response.model_output.describe must use non-empty string field names"
738
+ )
739
+ if not isinstance(description, str):
740
+ raise IAToolkitException(
741
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
742
+ f"execution_config.response.model_output.describe.{field_name} must be a string"
743
+ )
744
+
685
745
  @staticmethod
686
746
  def _build_tool_snapshot(tool_obj) -> dict:
687
747
  if tool_obj is None:
@@ -188,6 +188,8 @@ class ToolApiView(MethodView):
188
188
  result = self.dispatcher.dispatch(
189
189
  company_short_name=company_short_name,
190
190
  function_name=tool_name,
191
+ user_identifier=auth_result.get("user_identifier"),
192
+ _iat_runtime_source="api",
191
193
  **call_kwargs
192
194
  )
193
195
 
@@ -211,6 +213,8 @@ class ToolApiView(MethodView):
211
213
  status_code = 404
212
214
  elif e.error_type in [IAToolkitException.ErrorType.MISSING_PARAMETER, IAToolkitException.ErrorType.INVALID_PARAMETER]:
213
215
  status_code = 400
216
+ elif e.error_type == IAToolkitException.ErrorType.PERMISSION:
217
+ status_code = 403
214
218
  elif e.error_type in [IAToolkitException.ErrorType.DUPLICATE_ENTRY, IAToolkitException.ErrorType.INVALID_OPERATION]:
215
219
  status_code = 409
216
220
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.24.0
3
+ Version: 2.25.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
File without changes