iatoolkit 2.21.2__tar.gz → 2.22.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.21.2/src/iatoolkit.egg-info → iatoolkit-2.22.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/call_service.py +55 -40
  4. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/locales/en.yaml +20 -5
  5. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/locales/es.yaml +20 -5
  6. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/http_tool_service.py +206 -22
  7. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/tool_service.py +124 -16
  8. {iatoolkit-2.21.2 → iatoolkit-2.22.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  9. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/LICENSE +0 -0
  10. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/LICENSE_COMMUNITY.md +0 -0
  11. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/pyproject.toml +0 -0
  12. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/readme.md +0 -0
  13. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/requirements.txt +0 -0
  14. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/setup.cfg +0 -0
  15. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/base_company.py +0 -0
  16. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/cli_commands.py +0 -0
  17. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/__init__.py +0 -0
  18. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/exceptions.py +0 -0
  19. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  20. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  21. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  22. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  23. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  24. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  25. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  26. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  27. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/model_registry.py +0 -0
  28. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/routes.py +0 -0
  29. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  30. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/session_manager.py +0 -0
  31. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/util.py +0 -0
  32. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/company_registry.py +0 -0
  33. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/__init__.py +0 -0
  34. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  35. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  36. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  37. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  38. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  39. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  40. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  41. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  42. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  43. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  44. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  45. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  46. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  47. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  48. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  49. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  50. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  51. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  52. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  53. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  54. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  55. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  56. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  57. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  58. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  59. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  60. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  61. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  62. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  63. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/core.py +0 -0
  64. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/__init__.py +0 -0
  65. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  66. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  67. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  68. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  69. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  70. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  71. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  72. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  73. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  74. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  75. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  76. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  77. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  78. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  79. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  80. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  81. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  82. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  83. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  84. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  85. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  86. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  87. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_response.py +0 -0
  88. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  89. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/__init__.py +0 -0
  90. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  91. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  92. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  93. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  94. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  95. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  96. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  97. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  98. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/models.py +0 -0
  99. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  100. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  101. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  102. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  103. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  104. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/runtime_logging.py +0 -0
  105. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/__init__.py +0 -0
  106. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/api_key_service.py +0 -0
  107. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  108. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/auth_service.py +0 -0
  109. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  110. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/branding_service.py +0 -0
  111. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/company_context_service.py +0 -0
  112. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/configuration_service.py +0 -0
  113. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  114. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  115. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/embedding_service.py +0 -0
  116. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/excel_service.py +0 -0
  117. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  118. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  119. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/i18n_service.py +0 -0
  120. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/inference_service.py +0 -0
  121. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/jwt_service.py +0 -0
  122. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  123. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/language_service.py +0 -0
  124. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/license_service.py +0 -0
  125. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  126. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/mail_service.py +0 -0
  127. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  128. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  129. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  130. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  131. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_service.py +0 -0
  132. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  133. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  134. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  135. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  136. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  137. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  138. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  139. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  140. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  141. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  142. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  143. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  144. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  145. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  146. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/pdf_service.py +0 -0
  147. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/profile_service.py +0 -0
  148. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  149. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/prompt_service.py +0 -0
  150. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/query_service.py +0 -0
  151. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  152. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  153. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/sql_service.py +0 -0
  154. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  155. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/storage_service.py +0 -0
  156. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  157. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  158. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/system_tools.py +0 -0
  159. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  160. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  161. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  162. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  163. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  164. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  165. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/warmup_service.py +0 -0
  166. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  167. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  168. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  169. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  170. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search_service.py +0 -0
  171. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  172. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  173. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  174. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  175. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  176. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  177. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  178. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  179. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  180. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  181. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  182. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  183. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  184. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  185. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  186. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  187. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  188. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/documents.css +0 -0
  189. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  190. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  191. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  192. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/_company_header.html +0 -0
  193. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  194. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/account.html +0 -0
  195. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/base.html +0 -0
  196. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/change_password.html +0 -0
  197. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/chat.html +0 -0
  198. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  199. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  200. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/error.html +0 -0
  201. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  202. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  203. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  204. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  205. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  206. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  207. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  208. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  209. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/signup.html +0 -0
  210. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/__init__.py +0 -0
  211. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/account_view.py +0 -0
  212. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  213. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/base_login_view.py +0 -0
  214. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  215. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/change_password_view.py +0 -0
  216. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  217. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/chat_view.py +0 -0
  218. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  219. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  220. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  221. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  222. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  223. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/history_api_view.py +0 -0
  224. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/home_view.py +0 -0
  225. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  226. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  227. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  228. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/login_view.py +0 -0
  229. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  230. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  231. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  232. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  233. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  234. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  235. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  236. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  237. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/signup_view.py +0 -0
  238. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/static_page_view.py +0 -0
  239. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  240. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  241. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/users_api_view.py +0 -0
  242. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  243. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  244. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  245. {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  246. {iatoolkit-2.21.2 → iatoolkit-2.22.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.21.2
3
+ Version: 2.22.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.21.2"
6
+ __version__ = "2.22.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -40,15 +40,18 @@ class CallServiceClient:
40
40
  endpoint: str,
41
41
  params: Optional[Dict[str, Any]] = None,
42
42
  headers: Optional[Dict[str, str]] = None,
43
- timeout: Union[int, float, Tuple[int, int]] = 10
43
+ timeout: Union[int, float, Tuple[int, int]] = 10,
44
+ allow_redirects: Optional[bool] = None,
44
45
  ):
45
46
  try:
46
- response = requests.get(
47
- endpoint,
48
- params=params,
49
- headers=self._merge_headers(headers),
50
- timeout=self._normalize_timeout(timeout)
51
- )
47
+ request_kwargs = {
48
+ "params": params,
49
+ "headers": self._merge_headers(headers),
50
+ "timeout": self._normalize_timeout(timeout),
51
+ }
52
+ if allow_redirects is not None:
53
+ request_kwargs["allow_redirects"] = allow_redirects
54
+ response = requests.get(endpoint, **request_kwargs)
52
55
  except RequestException as e:
53
56
  raise IAToolkitException(IAToolkitException.ErrorType.REQUEST_ERROR, str(e))
54
57
  return self._deserialize_response(response)
@@ -60,17 +63,20 @@ class CallServiceClient:
60
63
  data: Any = None, # Nuevo argumento para datos crudos/binarios
61
64
  params: Optional[Dict[str, Any]] = None,
62
65
  headers: Optional[Dict[str, str]] = None,
63
- timeout: Union[int, float, Tuple[int, int]] = 10
66
+ timeout: Union[int, float, Tuple[int, int]] = 10,
67
+ allow_redirects: Optional[bool] = None,
64
68
  ):
65
69
  try:
66
- response = requests.post(
67
- endpoint,
68
- params=params,
69
- json=json_dict,
70
- data=data, # Pasamos data a requests
71
- headers=self._merge_headers(headers),
72
- timeout=self._normalize_timeout(timeout)
73
- )
70
+ request_kwargs = {
71
+ "params": params,
72
+ "json": json_dict,
73
+ "data": data, # Pasamos data a requests
74
+ "headers": self._merge_headers(headers),
75
+ "timeout": self._normalize_timeout(timeout),
76
+ }
77
+ if allow_redirects is not None:
78
+ request_kwargs["allow_redirects"] = allow_redirects
79
+ response = requests.post(endpoint, **request_kwargs)
74
80
  except RequestException as e:
75
81
  raise IAToolkitException(IAToolkitException.ErrorType.REQUEST_ERROR, str(e))
76
82
 
@@ -82,16 +88,19 @@ class CallServiceClient:
82
88
  json_dict: Optional[Dict[str, Any]] = None,
83
89
  params: Optional[Dict[str, Any]] = None,
84
90
  headers: Optional[Dict[str, str]] = None,
85
- timeout: Union[int, float, Tuple[int, int]] = 10
91
+ timeout: Union[int, float, Tuple[int, int]] = 10,
92
+ allow_redirects: Optional[bool] = None,
86
93
  ):
87
94
  try:
88
- response = requests.put(
89
- endpoint,
90
- params=params,
91
- json=json_dict,
92
- headers=self._merge_headers(headers),
93
- timeout=self._normalize_timeout(timeout)
94
- )
95
+ request_kwargs = {
96
+ "params": params,
97
+ "json": json_dict,
98
+ "headers": self._merge_headers(headers),
99
+ "timeout": self._normalize_timeout(timeout),
100
+ }
101
+ if allow_redirects is not None:
102
+ request_kwargs["allow_redirects"] = allow_redirects
103
+ response = requests.put(endpoint, **request_kwargs)
95
104
  except RequestException as e:
96
105
  raise IAToolkitException(IAToolkitException.ErrorType.REQUEST_ERROR, str(e))
97
106
  return self._deserialize_response(response)
@@ -102,16 +111,19 @@ class CallServiceClient:
102
111
  json_dict: Optional[Dict[str, Any]] = None,
103
112
  params: Optional[Dict[str, Any]] = None,
104
113
  headers: Optional[Dict[str, str]] = None,
105
- timeout: Union[int, float, Tuple[int, int]] = 10
114
+ timeout: Union[int, float, Tuple[int, int]] = 10,
115
+ allow_redirects: Optional[bool] = None,
106
116
  ):
107
117
  try:
108
- response = requests.delete(
109
- endpoint,
110
- params=params,
111
- json=json_dict,
112
- headers=self._merge_headers(headers),
113
- timeout=self._normalize_timeout(timeout)
114
- )
118
+ request_kwargs = {
119
+ "params": params,
120
+ "json": json_dict,
121
+ "headers": self._merge_headers(headers),
122
+ "timeout": self._normalize_timeout(timeout),
123
+ }
124
+ if allow_redirects is not None:
125
+ request_kwargs["allow_redirects"] = allow_redirects
126
+ response = requests.delete(endpoint, **request_kwargs)
115
127
  except RequestException as e:
116
128
  raise IAToolkitException(IAToolkitException.ErrorType.REQUEST_ERROR, str(e))
117
129
  return self._deserialize_response(response)
@@ -122,16 +134,19 @@ class CallServiceClient:
122
134
  json_dict: Optional[Dict[str, Any]] = None,
123
135
  params: Optional[Dict[str, Any]] = None,
124
136
  headers: Optional[Dict[str, str]] = None,
125
- timeout: Union[int, float, Tuple[int, int]] = 10
137
+ timeout: Union[int, float, Tuple[int, int]] = 10,
138
+ allow_redirects: Optional[bool] = None,
126
139
  ):
127
140
  try:
128
- response = requests.patch(
129
- endpoint,
130
- params=params,
131
- json=json_dict,
132
- headers=self._merge_headers(headers),
133
- timeout=self._normalize_timeout(timeout)
134
- )
141
+ request_kwargs = {
142
+ "params": params,
143
+ "json": json_dict,
144
+ "headers": self._merge_headers(headers),
145
+ "timeout": self._normalize_timeout(timeout),
146
+ }
147
+ if allow_redirects is not None:
148
+ request_kwargs["allow_redirects"] = allow_redirects
149
+ response = requests.patch(endpoint, **request_kwargs)
135
150
  except RequestException as e:
136
151
  raise IAToolkitException(IAToolkitException.ErrorType.REQUEST_ERROR, str(e))
137
152
  return self._deserialize_response(response)
@@ -1594,7 +1594,7 @@ ui:
1594
1594
  execution_hint_native: "Native tools execute through toolkit runtime code, so there is no editable execution_config here."
1595
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
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."
1597
+ raw_hint: "Edit the full tool definition as YAML. This advanced mode includes parameters, execution_config, execution_config.response.model_output, output_contract, and routing_profile."
1598
1598
  raw_footer_hint: "Saving from Raw uses this document as the source of truth for the tool definition."
1599
1599
 
1600
1600
  # Modal
@@ -1613,19 +1613,21 @@ ui:
1613
1613
  parameters_help_btn_title: "Show parameters YAML format"
1614
1614
  http_config_title: "HTTP execution_config"
1615
1615
  http_config_help_btn_title: "Show HTTP execution_config YAML format"
1616
- http_config_hint: "Required for HTTP tools. Minimum: version: 1, request.method, request.url (HTTPS)."
1616
+ http_config_hint: "Required for HTTP tools. Minimum: version: 1, request.method, request.url (HTTPS by default; HTTP only with private-network opt-in)."
1617
1617
  modal_name_placeholder: "e.g. calculate_tax"
1618
1618
  modal_http_method_label: "HTTP method"
1619
- modal_http_url_label: "HTTPS URL"
1619
+ modal_http_url_label: "HTTP/HTTPS URL"
1620
1620
  modal_http_url_placeholder: "https://api.example.com/resource"
1621
1621
  parameters_help_title: "Parameters YAML format"
1622
1622
  parameters_help_description: "Define tool input parameters as a JSON Schema object serialized in YAML."
1623
1623
  http_config_help_title: "HTTP execution_config YAML format"
1624
- http_config_help_description: "Use version: 1 and define request/auth/response. Keep URLs as absolute HTTPS."
1624
+ http_config_help_description: "Use version: 1 and define request/auth/response. Keep URLs as absolute HTTPS unless private-network access is explicitly enabled."
1625
1625
  http_config_help_get_example: "GET example"
1626
1626
  http_config_help_post_example: "POST example (Bearer from secrets_manager)"
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
+ 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."
1629
1631
  modal_output_contract_label: "Initial output_contract"
1630
1632
  modal_output_contract_placeholder: "kind: image\nmime_type: image/png\ntransport: signed_url\nurl_field: image_url"
1631
1633
  routing_profile_title: "Routing Profile"
@@ -2591,7 +2593,7 @@ js_messages:
2591
2593
  tool_http_execution_config_version: "execution_config.version must be 1"
2592
2594
  tool_http_execution_config_request_required: "execution_config.request is required"
2593
2595
  tool_http_request_method_invalid: "request.method must be one of GET, POST, PUT, PATCH, DELETE"
2594
- tool_http_request_url_invalid: "request.url must be an absolute HTTPS URL"
2596
+ tool_http_request_url_invalid: "request.url must be an absolute HTTPS URL unless private-network access is explicitly enabled"
2595
2597
  tool_http_request_timeout_invalid: "request.timeout_ms must be an integer between 1 and 120000"
2596
2598
  tool_http_request_field_object: "request.{field} must be an object"
2597
2599
  tool_http_request_body_object: "request.body must be an object"
@@ -2608,6 +2610,19 @@ js_messages:
2608
2610
  tool_http_response_codes_required: "response.success_status_codes must be a non-empty list"
2609
2611
  tool_http_response_codes_invalid: "response.success_status_codes must contain valid HTTP status codes (100..599)"
2610
2612
  tool_http_response_bytes_invalid: "response.max_response_bytes must be a positive integer"
2613
+ tool_http_model_output_label: "model_output"
2614
+ tool_http_model_output_object: "model_output must be an object"
2615
+ tool_http_model_output_unknown_keys: "model_output has unsupported keys: {keys}"
2616
+ tool_http_model_output_mode_invalid: "model_output.mode must be one of raw, extract, map"
2617
+ tool_http_model_output_path_required: "model_output.path is required when mode=extract"
2618
+ tool_http_model_output_root_invalid: "model_output.root must be a non-empty string"
2619
+ tool_http_model_output_fields_required: "model_output.fields must be a non-empty object when mode=map"
2620
+ tool_http_model_output_field_name_invalid: "model_output.fields must use non-empty field names"
2621
+ tool_http_model_output_field_path_required: "model_output.fields.{field} must define a path"
2622
+ tool_http_model_output_field_description_invalid: "model_output.fields.{field}.description must be a string"
2623
+ tool_http_model_output_field_invalid: "model_output.fields.{field} must be a path string or object"
2624
+ tool_http_model_output_exclude_nulls_invalid: "model_output.exclude_nulls must be a boolean"
2625
+ tool_http_model_output_max_items_invalid: "model_output.max_items must be a positive integer"
2611
2626
  tool_error_loading_tools: "Error loading tools"
2612
2627
  tool_no_tools_found: "No tools found."
2613
2628
  tool_pack_read_only: "PACK tools are read-only. Use Clone to USER."
@@ -1598,7 +1598,7 @@ ui:
1598
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
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
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."
1601
+ raw_hint: "Edita la definición completa de la tool como YAML. Este modo avanzado incluye parameters, execution_config, execution_config.response.model_output, output_contract y routing_profile."
1602
1602
  raw_footer_hint: "Guardar desde Raw usa este documento como source of truth de la definición de la tool."
1603
1603
 
1604
1604
  # Modal
@@ -1617,19 +1617,21 @@ ui:
1617
1617
  parameters_help_btn_title: "Mostrar formato YAML de parámetros"
1618
1618
  http_config_title: "execution_config HTTP"
1619
1619
  http_config_help_btn_title: "Mostrar formato YAML de execution_config HTTP"
1620
- http_config_hint: "Requerido para herramientas HTTP. Mínimo: version: 1, request.method, request.url (HTTPS)."
1620
+ http_config_hint: "Requerido para herramientas HTTP. Mínimo: version: 1, request.method, request.url (HTTPS por defecto; HTTP solo con opt-in de red privada)."
1621
1621
  modal_name_placeholder: "ej. calcular_impuestos"
1622
1622
  modal_http_method_label: "Método HTTP"
1623
- modal_http_url_label: "URL HTTPS"
1623
+ modal_http_url_label: "URL HTTP/HTTPS"
1624
1624
  modal_http_url_placeholder: "https://api.ejemplo.com/recurso"
1625
1625
  parameters_help_title: "Formato YAML de parámetros"
1626
1626
  parameters_help_description: "Define parámetros de entrada de la herramienta como un objeto JSON Schema serializado en YAML."
1627
1627
  http_config_help_title: "Formato YAML de execution_config HTTP"
1628
- http_config_help_description: "Usa version: 1 y define request/auth/response. Mantén URLs HTTPS absolutas."
1628
+ http_config_help_description: "Usa version: 1 y define request/auth/response. Mantén URLs HTTPS absolutas salvo que habilites acceso a red privada explícitamente."
1629
1629
  http_config_help_get_example: "Ejemplo GET"
1630
1630
  http_config_help_post_example: "Ejemplo POST (Bearer desde secrets_manager)"
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
+ 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."
1633
1635
  modal_output_contract_label: "output_contract inicial"
1634
1636
  modal_output_contract_placeholder: "kind: image\nmime_type: image/png\ntransport: signed_url\nurl_field: image_url"
1635
1637
  routing_profile_title: "Routing Profile"
@@ -2594,7 +2596,7 @@ js_messages:
2594
2596
  tool_http_execution_config_version: "execution_config.version debe ser 1"
2595
2597
  tool_http_execution_config_request_required: "execution_config.request es obligatorio"
2596
2598
  tool_http_request_method_invalid: "request.method debe ser uno de GET, POST, PUT, PATCH, DELETE"
2597
- tool_http_request_url_invalid: "request.url debe ser una URL HTTPS absoluta"
2599
+ tool_http_request_url_invalid: "request.url debe ser una URL HTTPS absoluta salvo que el acceso a red privada esté habilitado explícitamente"
2598
2600
  tool_http_request_timeout_invalid: "request.timeout_ms debe ser un entero entre 1 y 120000"
2599
2601
  tool_http_request_field_object: "request.{field} debe ser un objeto"
2600
2602
  tool_http_request_body_object: "request.body debe ser un objeto"
@@ -2611,6 +2613,19 @@ js_messages:
2611
2613
  tool_http_response_codes_required: "response.success_status_codes debe ser una lista no vacía"
2612
2614
  tool_http_response_codes_invalid: "response.success_status_codes debe contener códigos HTTP válidos (100..599)"
2613
2615
  tool_http_response_bytes_invalid: "response.max_response_bytes debe ser un entero positivo"
2616
+ tool_http_model_output_label: "model_output"
2617
+ tool_http_model_output_object: "model_output debe ser un objeto"
2618
+ tool_http_model_output_unknown_keys: "model_output tiene claves no soportadas: {keys}"
2619
+ tool_http_model_output_mode_invalid: "model_output.mode debe ser uno de raw, extract, map"
2620
+ tool_http_model_output_path_required: "model_output.path es obligatorio cuando mode=extract"
2621
+ tool_http_model_output_root_invalid: "model_output.root debe ser un string no vacío"
2622
+ tool_http_model_output_fields_required: "model_output.fields debe ser un objeto no vacío cuando mode=map"
2623
+ tool_http_model_output_field_name_invalid: "model_output.fields debe usar nombres de campo no vacíos"
2624
+ tool_http_model_output_field_path_required: "model_output.fields.{field} debe definir un path"
2625
+ tool_http_model_output_field_description_invalid: "model_output.fields.{field}.description debe ser un string"
2626
+ tool_http_model_output_field_invalid: "model_output.fields.{field} debe ser un path string u objeto"
2627
+ tool_http_model_output_exclude_nulls_invalid: "model_output.exclude_nulls debe ser booleano"
2628
+ tool_http_model_output_max_items_invalid: "model_output.max_items debe ser un entero positivo"
2614
2629
  tool_error_loading_tools: "Error cargando herramientas"
2615
2630
  tool_no_tools_found: "No se encontraron herramientas."
2616
2631
  tool_pack_read_only: "Las herramientas PACK son de solo lectura. Usa Clonar a USER."
@@ -78,15 +78,49 @@ class HttpToolService:
78
78
  json_payload: dict | None,
79
79
  timeout):
80
80
  if method == "GET":
81
- return self.call_service.get(url, params=params, headers=headers, timeout=timeout)
81
+ return self.call_service.get(
82
+ url,
83
+ params=params,
84
+ headers=headers,
85
+ timeout=timeout,
86
+ allow_redirects=False,
87
+ )
82
88
  if method == "POST":
83
- return self.call_service.post(url, json_dict=json_payload, params=params, headers=headers, timeout=timeout)
89
+ return self.call_service.post(
90
+ url,
91
+ json_dict=json_payload,
92
+ params=params,
93
+ headers=headers,
94
+ timeout=timeout,
95
+ allow_redirects=False,
96
+ )
84
97
  if method == "PUT":
85
- return self.call_service.put(url, json_dict=json_payload, params=params, headers=headers, timeout=timeout)
98
+ return self.call_service.put(
99
+ url,
100
+ json_dict=json_payload,
101
+ params=params,
102
+ headers=headers,
103
+ timeout=timeout,
104
+ allow_redirects=False,
105
+ )
86
106
  if method == "PATCH":
87
- return self.call_service.patch(url, json_dict=json_payload, params=params, headers=headers, timeout=timeout)
107
+ return self.call_service.patch(
108
+ url,
109
+ json_dict=json_payload,
110
+ params=params,
111
+ headers=headers,
112
+ timeout=timeout,
113
+ allow_redirects=False,
114
+ )
88
115
  if method == "DELETE":
89
- return self.call_service.delete(url, json_dict=json_payload, params=params, headers=headers, timeout=timeout)
116
+ return self.call_service.delete(
117
+ url,
118
+ json_dict=json_payload,
119
+ params=params,
120
+ headers=headers,
121
+ timeout=timeout,
122
+ allow_redirects=False,
123
+ )
90
124
 
91
125
  raise IAToolkitException(
92
126
  IAToolkitException.ErrorType.INVALID_PARAMETER,
@@ -182,15 +216,35 @@ class HttpToolService:
182
216
 
183
217
  def _validate_target_url(self, company_short_name: str, execution_config: dict, url: str):
184
218
  parsed = urlparse(url)
219
+ scheme = parsed.scheme.lower()
185
220
  host = (parsed.hostname or "").strip().lower()
221
+ allow_private_network = self._private_network_enabled(execution_config)
222
+ allowed_hosts = self._resolve_allowed_hosts(
223
+ company_short_name,
224
+ execution_config,
225
+ include_company_defaults=not allow_private_network,
226
+ )
186
227
 
187
- if parsed.scheme.lower() != "https" or not host:
228
+ allowed_schemes = {"https", "http"} if allow_private_network else {"https"}
229
+ if scheme not in allowed_schemes or not host:
230
+ message = "HTTP tools require an absolute HTTPS URL"
231
+ if allow_private_network:
232
+ message = (
233
+ "HTTP tools require an absolute HTTP or HTTPS URL "
234
+ "when allow_private_network=true"
235
+ )
188
236
  raise IAToolkitException(
189
237
  IAToolkitException.ErrorType.INVALID_PARAMETER,
190
- "HTTP tools require an absolute HTTPS URL"
238
+ message
191
239
  )
192
240
 
193
- if host == "localhost" or host.endswith(".local"):
241
+ if allowed_hosts and not self._host_in_allowlist(host, allowed_hosts):
242
+ raise IAToolkitException(
243
+ IAToolkitException.ErrorType.REQUEST_ERROR,
244
+ f"HTTP tool target host '{host}' is not in allowed_hosts"
245
+ )
246
+
247
+ if host == "localhost" or (host.endswith(".local") and not allow_private_network):
194
248
  raise IAToolkitException(
195
249
  IAToolkitException.ErrorType.REQUEST_ERROR,
196
250
  f"HTTP tool target host '{host}' is not allowed"
@@ -198,16 +252,35 @@ class HttpToolService:
198
252
 
199
253
  ip_value = self._to_ip_or_none(host)
200
254
  if ip_value:
201
- self._assert_public_ip(ip_value)
255
+ classification = self._assert_allowed_ip(ip_value, allow_private_network)
256
+ if scheme == "http" and classification != "private":
257
+ raise IAToolkitException(
258
+ IAToolkitException.ErrorType.REQUEST_ERROR,
259
+ "HTTP scheme is only allowed for private-network HTTP tools"
260
+ )
202
261
  else:
203
- self._assert_public_dns_target(host)
262
+ dns_result = self._assert_dns_target_allowed(host, allow_private_network)
263
+ if scheme == "http":
264
+ if not dns_result["resolved"]:
265
+ raise IAToolkitException(
266
+ IAToolkitException.ErrorType.REQUEST_ERROR,
267
+ "HTTP private-network targets must resolve before request"
268
+ )
269
+ if not dns_result["has_private"] or dns_result["has_public"]:
270
+ raise IAToolkitException(
271
+ IAToolkitException.ErrorType.REQUEST_ERROR,
272
+ "HTTP scheme is only allowed for private-network targets"
273
+ )
204
274
 
205
- allowed_hosts = self._resolve_allowed_hosts(company_short_name, execution_config)
206
- if allowed_hosts and not self._host_in_allowlist(host, allowed_hosts):
275
+ @staticmethod
276
+ def _private_network_enabled(execution_config: dict) -> bool:
277
+ security_cfg = execution_config.get("security") or {}
278
+ if not isinstance(security_cfg, dict):
207
279
  raise IAToolkitException(
208
- IAToolkitException.ErrorType.REQUEST_ERROR,
209
- f"HTTP tool target host '{host}' is not in allowed_hosts"
280
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
281
+ "execution_config.security must be a JSON object"
210
282
  )
283
+ return security_cfg.get("allow_private_network") is True
211
284
 
212
285
  @staticmethod
213
286
  def _to_ip_or_none(host: str):
@@ -216,14 +289,15 @@ class HttpToolService:
216
289
  except ValueError:
217
290
  return None
218
291
 
219
- def _assert_public_dns_target(self, hostname: str):
292
+ def _assert_dns_target_allowed(self, hostname: str, allow_private_network: bool) -> dict:
220
293
  # Best effort DNS check to reduce SSRF risk when DNS resolves to private ranges.
221
294
  try:
222
295
  entries = socket.getaddrinfo(hostname, None)
223
296
  except Exception:
224
297
  # If DNS cannot be resolved here, let the outbound request fail naturally.
225
- return
298
+ return {"resolved": False, "has_private": False, "has_public": False}
226
299
 
300
+ result = {"resolved": False, "has_private": False, "has_public": False}
227
301
  for entry in entries:
228
302
  sockaddr = entry[4]
229
303
  if not sockaddr:
@@ -231,12 +305,18 @@ class HttpToolService:
231
305
  ip_text = sockaddr[0]
232
306
  ip_value = self._to_ip_or_none(ip_text)
233
307
  if ip_value:
234
- self._assert_public_ip(ip_value)
308
+ result["resolved"] = True
309
+ classification = self._assert_allowed_ip(ip_value, allow_private_network)
310
+ if classification == "private":
311
+ result["has_private"] = True
312
+ else:
313
+ result["has_public"] = True
314
+
315
+ return result
235
316
 
236
317
  @staticmethod
237
- def _assert_public_ip(ip_value):
238
- if (ip_value.is_private or
239
- ip_value.is_loopback or
318
+ def _assert_allowed_ip(ip_value, allow_private_network: bool) -> str:
319
+ if (ip_value.is_loopback or
240
320
  ip_value.is_link_local or
241
321
  ip_value.is_reserved or
242
322
  ip_value.is_multicast or
@@ -245,12 +325,23 @@ class HttpToolService:
245
325
  IAToolkitException.ErrorType.REQUEST_ERROR,
246
326
  f"HTTP tool target IP '{ip_value}' is not allowed"
247
327
  )
328
+ if ip_value.is_private:
329
+ if allow_private_network:
330
+ return "private"
331
+ raise IAToolkitException(
332
+ IAToolkitException.ErrorType.REQUEST_ERROR,
333
+ f"HTTP tool target IP '{ip_value}' is not allowed"
334
+ )
335
+ return "public"
248
336
 
249
- def _resolve_allowed_hosts(self, company_short_name: str, execution_config: dict) -> list[str]:
337
+ def _resolve_allowed_hosts(self,
338
+ company_short_name: str,
339
+ execution_config: dict,
340
+ include_company_defaults: bool = True) -> list[str]:
250
341
  security_cfg = execution_config.get("security") or {}
251
342
  allowed_hosts = security_cfg.get("allowed_hosts")
252
343
 
253
- if allowed_hosts is None:
344
+ if allowed_hosts is None and include_company_defaults:
254
345
  company_params = self.config_service.get_configuration(company_short_name, "parameters") or {}
255
346
  http_tools_cfg = company_params.get("http_tools") or {}
256
347
  allowed_hosts = http_tools_cfg.get("allowed_hosts")
@@ -421,6 +512,8 @@ class HttpToolService:
421
512
  if extract_path:
422
513
  value = self._extract_path(response_data, str(extract_path))
423
514
 
515
+ value = self._apply_model_output(value, response_cfg.get("model_output"))
516
+
424
517
  if mode == "text" and not isinstance(value, str):
425
518
  value = json.dumps(value, ensure_ascii=False, default=str)
426
519
 
@@ -462,3 +555,94 @@ class HttpToolService:
462
555
  )
463
556
 
464
557
  return current
558
+
559
+ def _apply_model_output(self, value, model_output):
560
+ if model_output in (None, {}, ""):
561
+ return value
562
+ if not isinstance(model_output, dict):
563
+ raise IAToolkitException(
564
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
565
+ "execution_config.response.model_output must be a JSON object"
566
+ )
567
+
568
+ mode = str(model_output.get("mode", "raw")).strip().lower()
569
+ if mode == "raw":
570
+ return value
571
+ if mode == "extract":
572
+ path = str(model_output.get("path") or "").strip()
573
+ if not path:
574
+ raise IAToolkitException(
575
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
576
+ "execution_config.response.model_output.path is required when mode is 'extract'"
577
+ )
578
+ return self._extract_path(value, path)
579
+ if mode == "map":
580
+ return self._apply_mapped_model_output(value, model_output)
581
+
582
+ raise IAToolkitException(
583
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
584
+ f"Unsupported execution_config.response.model_output.mode '{mode}'"
585
+ )
586
+
587
+ def _apply_mapped_model_output(self, value, model_output: dict):
588
+ root_path = str(model_output.get("root") or "").strip()
589
+ source = self._extract_path(value, root_path) if root_path else value
590
+ fields = model_output.get("fields") or {}
591
+ if not isinstance(fields, dict) or not fields:
592
+ raise IAToolkitException(
593
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
594
+ "execution_config.response.model_output.fields must be a non-empty object when mode is 'map'"
595
+ )
596
+
597
+ exclude_nulls = model_output.get("exclude_nulls") is True
598
+ max_items = model_output.get("max_items")
599
+
600
+ if isinstance(source, list):
601
+ items = (
602
+ source[:max_items]
603
+ if isinstance(max_items, int) and not isinstance(max_items, bool) and max_items > 0
604
+ else source
605
+ )
606
+ return [
607
+ self._map_model_output_item(item, fields, exclude_nulls)
608
+ for item in items
609
+ ]
610
+ if isinstance(source, dict):
611
+ return self._map_model_output_item(source, fields, exclude_nulls)
612
+
613
+ raise IAToolkitException(
614
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
615
+ f"Cannot map model_output over type '{type(source).__name__}'"
616
+ )
617
+
618
+ def _map_model_output_item(self, source: dict, fields: dict, exclude_nulls: bool) -> dict:
619
+ mapped = {}
620
+ for output_name, field_config in fields.items():
621
+ path = self._resolve_model_output_field_path(output_name, field_config)
622
+ found, field_value = self._try_extract_path(source, path)
623
+ if (not found or field_value is None) and exclude_nulls:
624
+ continue
625
+ mapped[output_name] = field_value if found else None
626
+ return mapped
627
+
628
+ @staticmethod
629
+ def _resolve_model_output_field_path(output_name: str, field_config) -> str:
630
+ if isinstance(field_config, str):
631
+ path = field_config.strip()
632
+ elif isinstance(field_config, dict):
633
+ path = str(field_config.get("path") or "").strip()
634
+ else:
635
+ path = ""
636
+
637
+ if not path:
638
+ raise IAToolkitException(
639
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
640
+ f"execution_config.response.model_output.fields.{output_name} must define a path"
641
+ )
642
+ return path
643
+
644
+ def _try_extract_path(self, data, extract_path: str):
645
+ try:
646
+ return True, self._extract_path(data, extract_path)
647
+ except IAToolkitException:
648
+ return False, None