iatoolkit 2.20.0__tar.gz → 2.20.1__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.20.0/src/iatoolkit.egg-info → iatoolkit-2.20.1}/PKG-INFO +1 -1
  2. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_tools_pack.yaml +12 -0
  4. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/locales/en.yaml +24 -0
  5. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/locales/es.yaml +24 -0
  6. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/llm_query_repo.py +1 -0
  7. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/models.py +1 -0
  8. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/inference_service.py +1 -1
  9. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/system_tools.py +4 -0
  10. iatoolkit-2.20.1/src/iatoolkit/services/tool_output_contract.py +108 -0
  11. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/tool_service.py +16 -3
  12. {iatoolkit-2.20.0 → iatoolkit-2.20.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  13. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit.egg-info/SOURCES.txt +1 -0
  14. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/LICENSE +0 -0
  15. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/LICENSE_COMMUNITY.md +0 -0
  16. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/pyproject.toml +0 -0
  17. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/readme.md +0 -0
  18. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/requirements.txt +0 -0
  19. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/setup.cfg +0 -0
  20. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/base_company.py +0 -0
  21. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/cli_commands.py +0 -0
  22. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/__init__.py +0 -0
  23. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/exceptions.py +0 -0
  24. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  25. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  26. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  27. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  28. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  29. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  30. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  31. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  32. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/model_registry.py +0 -0
  33. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/routes.py +0 -0
  34. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/secret_resolver.py +0 -0
  35. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/session_manager.py +0 -0
  36. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/common/util.py +0 -0
  37. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/company_registry.py +0 -0
  38. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/__init__.py +0 -0
  39. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  40. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  41. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  42. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  43. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  44. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  45. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  46. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  47. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  48. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  49. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  50. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  51. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  52. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  53. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  54. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  55. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  56. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  57. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  58. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  59. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  60. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  61. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  62. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  63. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  64. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  65. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  66. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  67. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/core.py +0 -0
  68. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/__init__.py +0 -0
  69. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  70. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/call_service.py +0 -0
  71. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  72. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  73. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  74. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  75. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  76. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  77. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  78. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
  79. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
  80. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  81. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/inference_handler.py +0 -0
  82. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  83. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  84. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  85. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  86. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  87. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  88. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  89. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  90. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  91. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
  92. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/llm_response.py +0 -0
  93. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  94. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/__init__.py +0 -0
  95. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  96. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/database_manager.py +0 -0
  97. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/document_repo.py +0 -0
  98. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  99. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  100. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  101. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
  102. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
  103. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  104. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  105. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  106. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
  107. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/runtime_logging.py +0 -0
  108. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/__init__.py +0 -0
  109. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/api_key_service.py +0 -0
  110. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  111. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/auth_service.py +0 -0
  112. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/benchmark_service.py +0 -0
  113. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/branding_service.py +0 -0
  114. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/company_context_service.py +0 -0
  115. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/configuration_service.py +0 -0
  116. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/context_builder_service.py +0 -0
  117. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/dispatcher_service.py +0 -0
  118. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/embedding_service.py +0 -0
  119. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/excel_service.py +0 -0
  120. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/file_processor_service.py +0 -0
  121. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/history_manager_service.py +0 -0
  122. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/http_tool_service.py +0 -0
  123. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/i18n_service.py +0 -0
  124. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/jwt_service.py +0 -0
  125. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  126. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/language_service.py +0 -0
  127. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/license_service.py +0 -0
  128. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/llm_client_service.py +0 -0
  129. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/mail_service.py +0 -0
  130. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
  131. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  132. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
  133. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  134. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/memory_service.py +0 -0
  135. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  136. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  137. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  138. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
  139. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
  140. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  141. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  142. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  143. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  144. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  145. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  146. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  147. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  148. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/parsers/validator.py +0 -0
  149. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/pdf_service.py +0 -0
  150. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/profile_service.py +0 -0
  151. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  152. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/prompt_service.py +0 -0
  153. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/query_service.py +0 -0
  154. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  155. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  156. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/sql_service.py +0 -0
  157. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/sql_source_service.py +0 -0
  158. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/storage_service.py +0 -0
  159. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/structured_output_service.py +0 -0
  160. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  161. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/telemetry_service.py +0 -0
  162. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
  163. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
  164. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
  165. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
  166. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/warmup_service.py +0 -0
  167. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
  168. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  169. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  170. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  171. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/services/web_search_service.py +0 -0
  172. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  173. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  174. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  175. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  176. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  177. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  178. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  179. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  180. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_main.js +0 -0
  181. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  182. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  183. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  184. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  185. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  186. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  187. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  188. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
  189. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/documents.css +0 -0
  190. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
  191. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
  192. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
  193. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/_company_header.html +0 -0
  194. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/_login_widget.html +0 -0
  195. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/account.html +0 -0
  196. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/base.html +0 -0
  197. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/change_password.html +0 -0
  198. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/chat.html +0 -0
  199. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  200. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/chat_modals.html +0 -0
  201. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/error.html +0 -0
  202. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/forgot_password.html +0 -0
  203. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  204. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  205. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  206. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/pdf/base.html +0 -0
  207. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
  208. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/pdf/report.html +0 -0
  209. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
  210. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/templates/signup.html +0 -0
  211. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/__init__.py +0 -0
  212. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/account_view.py +0 -0
  213. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
  214. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/base_login_view.py +0 -0
  215. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/categories_api_view.py +0 -0
  216. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/change_password_view.py +0 -0
  217. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  218. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/chat_view.py +0 -0
  219. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
  220. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
  221. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
  222. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
  223. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
  224. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/history_api_view.py +0 -0
  225. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/home_view.py +0 -0
  226. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
  227. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  228. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
  229. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/login_view.py +0 -0
  230. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/logout_api_view.py +0 -0
  231. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/memory_api_view.py +0 -0
  232. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/profile_api_view.py +0 -0
  233. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
  234. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  235. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  236. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/rag_api_view.py +0 -0
  237. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
  238. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/signup_view.py +0 -0
  239. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/static_page_view.py +0 -0
  240. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/tool_api_view.py +0 -0
  241. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  242. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/users_api_view.py +0 -0
  243. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit/views/verify_user_view.py +0 -0
  244. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  245. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/src/iatoolkit.egg-info/requires.txt +0 -0
  246. {iatoolkit-2.20.0 → iatoolkit-2.20.1}/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.20.0
3
+ Version: 2.20.1
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.20.0"
6
+ __version__ = "2.20.1"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -5,6 +5,12 @@ pack:
5
5
  tools:
6
6
  - function_name: iat_generate_excel
7
7
  description: Generador de Excel.Genera un archivo Excel (.xlsx) a partir de una lista de diccionarios. Cada diccionario representa una fila del archivo. el archivo se guarda en storage.retorna diccionario con filename y attachment_token (para recuperar el archivo)content_type y download_link
8
+ output_contract:
9
+ kind: file
10
+ mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
11
+ transport: signed_url
12
+ url_field: download_link
13
+ filename_field: filename
8
14
  routing_profile:
9
15
  tags:
10
16
  - excel
@@ -54,6 +60,12 @@ tools:
54
60
  - data
55
61
  - function_name: iat_generate_pdf
56
62
  description: Generador de PDF. Convierte contenido HTML o Markdown en un archivo PDF descargable. El archivo se guarda en storage y retorna filename, attachment_token, content_type y download_link.
63
+ output_contract:
64
+ kind: file
65
+ mime_type: application/pdf
66
+ transport: signed_url
67
+ url_field: download_link
68
+ filename_field: filename
57
69
  routing_profile:
58
70
  tags:
59
71
  - pdf
@@ -1581,12 +1581,29 @@ ui:
1581
1581
  visual_editor: "Visual Editor"
1582
1582
  yaml_badge: "YAML"
1583
1583
  yaml_json_badge: "YAML / JSON"
1584
+ tab_general: "General"
1585
+ tab_input: "Input"
1586
+ tab_execution: "Execution"
1587
+ tab_output: "Output"
1588
+ tab_routing: "Routing"
1589
+ tab_raw: "Raw"
1590
+ general_hint: "Define the tool identity first, then move through input, execution, output, and routing as needed."
1591
+ execution_hint: "Define how this tool executes and what runtime contract it depends on."
1592
+ execution_hint_http: "HTTP tools define request/auth/response behavior in execution_config."
1593
+ execution_hint_inference: "Inference tools usually rely on external runtime model settings; use Output to describe the returned artifact."
1594
+ execution_hint_native: "Native tools execute through toolkit runtime code, so there is no editable execution_config here."
1595
+ inference_execution_hint: "This tool type does not expose an editable execution_config in the GUI. Use the Output tab to document what the runtime returns."
1596
+ native_execution_hint: "This tool type executes through internal runtime code. There is no editable execution_config in this editor."
1597
+ raw_hint: "Edit the full tool definition as YAML. This advanced mode includes parameters, execution_config, output_contract, and routing_profile."
1598
+ raw_footer_hint: "Saving from Raw uses this document as the source of truth for the tool definition."
1584
1599
 
1585
1600
  # Modal
1586
1601
  modal_title: "Create New Tool"
1587
1602
  modal_name_label: "Tool Name (LLM Function)"
1588
1603
  modal_name_help: "Use snake_case. Must be unique."
1589
1604
  modal_type_label: "Type"
1605
+ modal_output_preset_label: "Output preset"
1606
+ modal_output_preset_none: "No preset"
1590
1607
  modal_desc_label: "Short Description"
1591
1608
  modal_desc_placeholder: "Briefly explain what this tool does..."
1592
1609
  modal_cancel: "Cancel"
@@ -1607,6 +1624,10 @@ ui:
1607
1624
  http_config_help_description: "Use version: 1 and define request/auth/response. Keep URLs as absolute HTTPS."
1608
1625
  http_config_help_get_example: "GET example"
1609
1626
  http_config_help_post_example: "POST example (Bearer from secrets_manager)"
1627
+ output_contract_title: "Output Contract"
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
+ modal_output_contract_label: "Initial output_contract"
1630
+ modal_output_contract_placeholder: "kind: image\nmime_type: image/png\ntransport: signed_url\nurl_field: image_url"
1610
1631
  routing_profile_title: "Routing Profile"
1611
1632
  routing_profile_hint: "Used by enterprise tool routing to rank and select candidate tools."
1612
1633
 
@@ -2568,6 +2589,7 @@ js_messages:
2568
2589
  tool_pack_read_only: "PACK tools are read-only. Use Clone to USER."
2569
2590
  tool_invalid_yaml_format: "Invalid YAML format: {message}"
2570
2591
  tool_http_execution_config_label: "HTTP execution_config"
2592
+ tool_output_contract_label: "output_contract"
2571
2593
  tool_invalid_http_execution_config: "Invalid HTTP execution_config"
2572
2594
  tool_error_saving: "Error saving tool"
2573
2595
  tool_saved_ok: "Tool saved successfully"
@@ -2577,6 +2599,7 @@ js_messages:
2577
2599
  tool_error_cloning_pack: "Error cloning PACK tool"
2578
2600
  tool_pack_cloned_ok: "PACK tool cloned as USER tool"
2579
2601
  tool_name_required: "Name is required"
2602
+ tool_description_required: "Description is required"
2580
2603
  tool_error_creating: "Error creating tool"
2581
2604
  tool_created_ok: "Tool created"
2582
2605
  tool_status_active: "Active"
@@ -2590,6 +2613,7 @@ js_messages:
2590
2613
  tool_routing_profile_cost_object: "routing_profile.cost must be an object"
2591
2614
  tool_routing_profile_penalty_non_negative: "routing_profile.cost.penalty must be a non-negative number"
2592
2615
  tool_routing_profile_label: "routing_profile"
2616
+ tool_output_contract_object: "output_contract must be an object"
2593
2617
  tool_invalid_routing_profile: "Invalid routing_profile"
2594
2618
  tool_error_loading_routing_profile: "Error loading routing profile"
2595
2619
  tool_error_saving_routing_profile: "Error saving routing profile"
@@ -1585,12 +1585,29 @@ ui:
1585
1585
  visual_editor: "Editor Visual"
1586
1586
  yaml_badge: "YAML"
1587
1587
  yaml_json_badge: "YAML / JSON"
1588
+ tab_general: "General"
1589
+ tab_input: "Input"
1590
+ tab_execution: "Execution"
1591
+ tab_output: "Output"
1592
+ tab_routing: "Routing"
1593
+ tab_raw: "Raw"
1594
+ general_hint: "Define primero la identidad de la tool y luego avanza por input, execution, output y routing según lo necesites."
1595
+ execution_hint: "Define cómo se ejecuta esta tool y de qué contrato de runtime depende."
1596
+ execution_hint_http: "Las tools HTTP definen request/auth/response en execution_config."
1597
+ execution_hint_inference: "Las tools de inference suelen depender de settings externos del runtime; usa Output para describir el artefacto devuelto."
1598
+ execution_hint_native: "Las tools nativas se ejecutan en código interno del runtime, por eso aquí no existe un execution_config editable."
1599
+ inference_execution_hint: "Este tipo de tool no expone un execution_config editable en la GUI. Usa el tab Output para documentar qué devuelve el runtime."
1600
+ native_execution_hint: "Este tipo de tool se ejecuta mediante código interno del runtime. No hay un execution_config editable en este editor."
1601
+ raw_hint: "Edita la definición completa de la tool como YAML. Este modo avanzado incluye parameters, execution_config, output_contract y routing_profile."
1602
+ raw_footer_hint: "Guardar desde Raw usa este documento como source of truth de la definición de la tool."
1588
1603
 
1589
1604
  # Modal
1590
1605
  modal_title: "Crear Nueva Herramienta"
1591
1606
  modal_name_label: "Nombre (Función LLM)"
1592
1607
  modal_name_help: "Usar snake_case. Debe ser único."
1593
1608
  modal_type_label: "Tipo"
1609
+ modal_output_preset_label: "Preset de output"
1610
+ modal_output_preset_none: "Sin preset"
1594
1611
  modal_desc_label: "Descripción Corta"
1595
1612
  modal_desc_placeholder: "Explica brevemente qué hace esta herramienta..."
1596
1613
  modal_cancel: "Cancelar"
@@ -1611,6 +1628,10 @@ ui:
1611
1628
  http_config_help_description: "Usa version: 1 y define request/auth/response. Mantén URLs HTTPS absolutas."
1612
1629
  http_config_help_get_example: "Ejemplo GET"
1613
1630
  http_config_help_post_example: "Ejemplo POST (Bearer desde secrets_manager)"
1631
+ output_contract_title: "Output Contract"
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
+ modal_output_contract_label: "output_contract inicial"
1634
+ modal_output_contract_placeholder: "kind: image\nmime_type: image/png\ntransport: signed_url\nurl_field: image_url"
1614
1635
  routing_profile_title: "Routing Profile"
1615
1636
  routing_profile_hint: "Usado por el router enterprise para rankear y seleccionar herramientas candidatas."
1616
1637
 
@@ -2571,6 +2592,7 @@ js_messages:
2571
2592
  tool_pack_read_only: "Las herramientas PACK son de solo lectura. Usa Clonar a USER."
2572
2593
  tool_invalid_yaml_format: "Formato YAML inválido: {message}"
2573
2594
  tool_http_execution_config_label: "execution_config HTTP"
2595
+ tool_output_contract_label: "output_contract"
2574
2596
  tool_invalid_http_execution_config: "execution_config HTTP inválido"
2575
2597
  tool_error_saving: "Error guardando herramienta"
2576
2598
  tool_saved_ok: "Herramienta guardada correctamente"
@@ -2580,6 +2602,7 @@ js_messages:
2580
2602
  tool_error_cloning_pack: "Error al clonar herramienta PACK"
2581
2603
  tool_pack_cloned_ok: "Herramienta PACK clonada como herramienta USER"
2582
2604
  tool_name_required: "El nombre es obligatorio"
2605
+ tool_description_required: "La descripción es obligatoria"
2583
2606
  tool_error_creating: "Error creando herramienta"
2584
2607
  tool_created_ok: "Herramienta creada"
2585
2608
  tool_status_active: "Activo"
@@ -2593,6 +2616,7 @@ js_messages:
2593
2616
  tool_routing_profile_cost_object: "routing_profile.cost debe ser un objeto"
2594
2617
  tool_routing_profile_penalty_non_negative: "routing_profile.cost.penalty debe ser un número no negativo"
2595
2618
  tool_routing_profile_label: "routing_profile"
2619
+ tool_output_contract_object: "output_contract debe ser un objeto"
2596
2620
  tool_invalid_routing_profile: "routing_profile inválido"
2597
2621
  tool_error_loading_routing_profile: "Error cargando routing profile"
2598
2622
  tool_error_saving_routing_profile: "Error guardando routing profile"
@@ -120,6 +120,7 @@ class LLMQueryRepo:
120
120
  tool.description = new_tool.description
121
121
  tool.parameters = new_tool.parameters
122
122
  tool.execution_config = new_tool.execution_config
123
+ tool.output_contract = new_tool.output_contract
123
124
  tool.tool_type = new_tool.tool_type
124
125
  tool.source = new_tool.source
125
126
  if new_tool.is_active is not None:
@@ -254,6 +254,7 @@ class Tool(Base):
254
254
  description = Column(Text, nullable=False)
255
255
  parameters = Column(JSON, nullable=False)
256
256
  execution_config = Column(JSON_NATIVE, nullable=True)
257
+ output_contract = Column(JSON_NATIVE, nullable=True)
257
258
  is_active = Column(Boolean, default=True)
258
259
  created_at = Column(DateTime, default=datetime.now)
259
260
 
@@ -101,7 +101,7 @@ class InferenceService:
101
101
  payload["parameters"] = parameters
102
102
 
103
103
  # 4. Execute Call
104
- logging.debug(f"Called inference tool {tool_name} with model {model_id}.")
104
+ logging.info("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,
@@ -6,6 +6,8 @@ from typing import Any
6
6
 
7
7
  import yaml
8
8
 
9
+ from iatoolkit.services.tool_output_contract import clone_output_contract, normalize_output_contract
10
+
9
11
 
10
12
  SYSTEM_TOOLS_CONFIG_PACKAGE = "iatoolkit.config"
11
13
  SYSTEM_TOOLS_CONFIG_FILENAME = "system_tools_pack.yaml"
@@ -59,6 +61,8 @@ def _validate_system_tool_entry(entry: dict, index: int) -> dict:
59
61
  "description": description,
60
62
  "parameters": copy.deepcopy(parameters),
61
63
  }
64
+ if entry.get("output_contract") is not None:
65
+ normalized["output_contract"] = clone_output_contract(normalize_output_contract(entry.get("output_contract")))
62
66
  if normalized_routing is not None:
63
67
  normalized["routing"] = normalized_routing
64
68
  if normalized_routing_profile is not None:
@@ -0,0 +1,108 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ from typing import Any
5
+
6
+ from iatoolkit.common.exceptions import IAToolkitException
7
+
8
+
9
+ ALLOWED_OUTPUT_KINDS = {"json", "html", "image", "file", "audio", "video"}
10
+ ALLOWED_OUTPUT_TRANSPORTS = {"inline_base64", "signed_url", "attachment"}
11
+ ALLOWED_OUTPUT_CONTRACT_KEYS = {
12
+ "kind",
13
+ "mime_type",
14
+ "transport",
15
+ "url_field",
16
+ "base64_field",
17
+ "filename_field",
18
+ }
19
+
20
+
21
+ def normalize_output_contract(output_contract: Any) -> dict | None:
22
+ if output_contract in (None, "", {}):
23
+ return None
24
+ if not isinstance(output_contract, dict):
25
+ raise IAToolkitException(
26
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
27
+ "output_contract must be a JSON object",
28
+ )
29
+
30
+ unknown_keys = sorted(key for key in output_contract.keys() if key not in ALLOWED_OUTPUT_CONTRACT_KEYS)
31
+ if unknown_keys:
32
+ raise IAToolkitException(
33
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
34
+ f"output_contract has unsupported keys: {unknown_keys}",
35
+ )
36
+
37
+ kind = str(output_contract.get("kind") or "").strip().lower()
38
+ if kind not in ALLOWED_OUTPUT_KINDS:
39
+ raise IAToolkitException(
40
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
41
+ f"output_contract.kind must be one of {sorted(ALLOWED_OUTPUT_KINDS)}",
42
+ )
43
+
44
+ normalized = {"kind": kind}
45
+ mime_type = _normalize_optional_string(output_contract.get("mime_type"))
46
+ transport = _normalize_optional_string(output_contract.get("transport"))
47
+ url_field = _normalize_optional_string(output_contract.get("url_field"))
48
+ base64_field = _normalize_optional_string(output_contract.get("base64_field"))
49
+ filename_field = _normalize_optional_string(output_contract.get("filename_field"))
50
+
51
+ if mime_type:
52
+ normalized["mime_type"] = mime_type
53
+ if transport:
54
+ transport = transport.lower()
55
+ if transport not in ALLOWED_OUTPUT_TRANSPORTS:
56
+ raise IAToolkitException(
57
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
58
+ f"output_contract.transport must be one of {sorted(ALLOWED_OUTPUT_TRANSPORTS)}",
59
+ )
60
+ normalized["transport"] = transport
61
+ if url_field:
62
+ normalized["url_field"] = url_field
63
+ if base64_field:
64
+ normalized["base64_field"] = base64_field
65
+ if filename_field:
66
+ normalized["filename_field"] = filename_field
67
+
68
+ if kind in {"json", "html"}:
69
+ if transport or url_field or base64_field or filename_field:
70
+ raise IAToolkitException(
71
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
72
+ "output_contract transport fields are not allowed for json/html outputs",
73
+ )
74
+ return normalized
75
+
76
+ if not transport:
77
+ raise IAToolkitException(
78
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
79
+ f"output_contract.transport is required for output kind '{kind}'",
80
+ )
81
+ if transport == "signed_url" and not url_field:
82
+ raise IAToolkitException(
83
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
84
+ "output_contract.url_field is required when transport is 'signed_url'",
85
+ )
86
+ if transport == "inline_base64" and not base64_field:
87
+ raise IAToolkitException(
88
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
89
+ "output_contract.base64_field is required when transport is 'inline_base64'",
90
+ )
91
+ if transport == "attachment" and not filename_field:
92
+ raise IAToolkitException(
93
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
94
+ "output_contract.filename_field is required when transport is 'attachment'",
95
+ )
96
+
97
+ return normalized
98
+
99
+
100
+ def clone_output_contract(output_contract: Any) -> dict | None:
101
+ if isinstance(output_contract, dict):
102
+ return copy.deepcopy(output_contract)
103
+ return None
104
+
105
+
106
+ def _normalize_optional_string(value: Any) -> str | None:
107
+ text = str(value or "").strip()
108
+ return text or None
@@ -26,6 +26,7 @@ from iatoolkit.services.system_tools import (
26
26
  get_system_tools_catalog_source,
27
27
  get_system_tool_force_include_capabilities,
28
28
  )
29
+ from iatoolkit.services.tool_output_contract import clone_output_contract, normalize_output_contract
29
30
  from iatoolkit import current_iatoolkit
30
31
 
31
32
 
@@ -382,7 +383,8 @@ class ToolService:
382
383
  return text
383
384
  return f"[{text}]({url})"
384
385
 
385
- def _validate_tool_contract(self, tool_type: str, execution_config):
386
+ def _validate_tool_contract(self, tool_type: str, execution_config, output_contract=None):
387
+ normalize_output_contract(output_contract)
386
388
  if tool_type != Tool.TYPE_HTTP:
387
389
  return
388
390
 
@@ -587,6 +589,7 @@ class ToolService:
587
589
  "description",
588
590
  "parameters",
589
591
  "execution_config",
592
+ "output_contract",
590
593
  "tool_type",
591
594
  "source",
592
595
  "is_active",
@@ -640,6 +643,7 @@ class ToolService:
640
643
  name=function['function_name'],
641
644
  description=function['description'],
642
645
  parameters=function['parameters'],
646
+ output_contract=clone_output_contract(function.get("output_contract")),
643
647
  tool_type=Tool.TYPE_SYSTEM,
644
648
  source=Tool.SOURCE_SYSTEM,
645
649
  is_active=True,
@@ -680,6 +684,7 @@ class ToolService:
680
684
  and bool(tool.is_active)
681
685
  and tool.description == definition.get("description")
682
686
  and (tool.parameters or {}) == (definition.get("parameters") or {})
687
+ and (tool.output_contract or {}) == (definition.get("output_contract") or {})
683
688
  )
684
689
 
685
690
  def _system_tools_catalog_has_drift(
@@ -738,6 +743,7 @@ class ToolService:
738
743
  name=function_name,
739
744
  description=function.get("description"),
740
745
  parameters=function.get("parameters") or {},
746
+ output_contract=clone_output_contract(function.get("output_contract")),
741
747
  tool_type=Tool.TYPE_SYSTEM,
742
748
  source=Tool.SOURCE_SYSTEM,
743
749
  is_active=True,
@@ -831,6 +837,7 @@ class ToolService:
831
837
  name=name,
832
838
  description=tool_data['description'],
833
839
  parameters=tool_data['params'],
840
+ output_contract=clone_output_contract(tool_data.get('output_contract')),
834
841
 
835
842
  tool_type=Tool.TYPE_NATIVE,
836
843
  source=Tool.SOURCE_YAML,
@@ -887,7 +894,8 @@ class ToolService:
887
894
 
888
895
  tool_type = tool_data.get('tool_type', Tool.TYPE_NATIVE)
889
896
  execution_config = tool_data.get('execution_config')
890
- self._validate_tool_contract(tool_type, execution_config)
897
+ output_contract = normalize_output_contract(tool_data.get('output_contract'))
898
+ self._validate_tool_contract(tool_type, execution_config, output_contract)
891
899
 
892
900
  new_tool = Tool(
893
901
  company_id=company.id,
@@ -895,6 +903,7 @@ class ToolService:
895
903
  description=tool_data['description'],
896
904
  parameters=tool_data.get('parameters', {"type": "object", "properties": {}}),
897
905
  execution_config=execution_config,
906
+ output_contract=output_contract,
898
907
  tool_type=tool_type,
899
908
  source=Tool.SOURCE_USER,
900
909
  is_active=tool_data.get('is_active', True)
@@ -939,7 +948,9 @@ class ToolService:
939
948
 
940
949
  effective_tool_type = tool_data.get('tool_type', tool.tool_type)
941
950
  effective_execution_config = tool_data.get('execution_config', tool.execution_config)
942
- self._validate_tool_contract(effective_tool_type, effective_execution_config)
951
+ existing_output_contract = clone_output_contract(tool.output_contract) if isinstance(tool.output_contract, dict) else None
952
+ effective_output_contract = normalize_output_contract(tool_data.get('output_contract', existing_output_contract))
953
+ self._validate_tool_contract(effective_tool_type, effective_execution_config, effective_output_contract)
943
954
 
944
955
  # Update fields
945
956
  if 'name' in tool_data:
@@ -950,6 +961,8 @@ class ToolService:
950
961
  tool.parameters = tool_data['parameters']
951
962
  if 'execution_config' in tool_data:
952
963
  tool.execution_config = tool_data['execution_config']
964
+ if 'output_contract' in tool_data:
965
+ tool.output_contract = effective_output_contract
953
966
  if 'tool_type' in tool_data:
954
967
  tool.tool_type = tool_data['tool_type']
955
968
  if 'is_active' in tool_data:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.20.0
3
+ Version: 2.20.1
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -147,6 +147,7 @@ src/iatoolkit/services/structured_output_service.py
147
147
  src/iatoolkit/services/system_prompt_catalog.py
148
148
  src/iatoolkit/services/system_tools.py
149
149
  src/iatoolkit/services/telemetry_service.py
150
+ src/iatoolkit/services/tool_output_contract.py
150
151
  src/iatoolkit/services/tool_service.py
151
152
  src/iatoolkit/services/user_feedback_service.py
152
153
  src/iatoolkit/services/user_session_context_service.py
File without changes
File without changes
File without changes
File without changes
File without changes