iatoolkit 2.21.2__tar.gz → 2.21.3__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.21.3}/PKG-INFO +1 -1
  2. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/call_service.py +55 -40
  4. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/locales/en.yaml +4 -4
  5. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/locales/es.yaml +4 -4
  6. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/http_tool_service.py +113 -22
  7. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/tool_service.py +41 -31
  8. {iatoolkit-2.21.2 → iatoolkit-2.21.3/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  9. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/LICENSE +0 -0
  10. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/LICENSE_COMMUNITY.md +0 -0
  11. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/pyproject.toml +0 -0
  12. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/readme.md +0 -0
  13. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/requirements.txt +0 -0
  14. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/setup.cfg +0 -0
  15. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/base_company.py +0 -0
  16. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/cli_commands.py +0 -0
  17. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/__init__.py +0 -0
  18. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/exceptions.py +0 -0
  19. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  20. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  21. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  22. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  23. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  24. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  25. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  26. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  27. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/model_registry.py +0 -0
  28. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/routes.py +0 -0
  29. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/secret_resolver.py +0 -0
  30. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/session_manager.py +0 -0
  31. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/common/util.py +0 -0
  32. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/company_registry.py +0 -0
  33. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/__init__.py +0 -0
  34. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  35. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  36. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  37. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  38. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  39. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  40. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  41. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  42. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  43. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  44. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  45. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  46. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  47. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  48. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  49. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  50. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  51. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  52. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  53. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  54. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  55. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  56. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  57. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  58. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  59. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  60. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  61. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  62. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  63. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/core.py +0 -0
  64. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/__init__.py +0 -0
  65. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  66. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  67. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  68. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  69. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  70. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  71. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  72. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  73. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/google_auth_client.py +0 -0
  74. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/google_chat_app.py +0 -0
  75. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  76. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/inference_handler.py +0 -0
  77. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  78. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  79. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  80. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  81. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  82. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  83. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  84. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  85. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  86. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_proxy.py +0 -0
  87. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/llm_response.py +0 -0
  88. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  89. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/__init__.py +0 -0
  90. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  91. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/database_manager.py +0 -0
  92. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/document_repo.py +0 -0
  93. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  94. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  95. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  96. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  97. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/memory_repo.py +0 -0
  98. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/models.py +0 -0
  99. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/profile_repo.py +0 -0
  100. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  101. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  102. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  103. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/repositories/vs_repo.py +0 -0
  104. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/runtime_logging.py +0 -0
  105. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/__init__.py +0 -0
  106. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/api_key_service.py +0 -0
  107. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  108. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/auth_service.py +0 -0
  109. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/benchmark_service.py +0 -0
  110. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/branding_service.py +0 -0
  111. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/company_context_service.py +0 -0
  112. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/configuration_service.py +0 -0
  113. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/context_builder_service.py +0 -0
  114. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/dispatcher_service.py +0 -0
  115. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/embedding_service.py +0 -0
  116. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/excel_service.py +0 -0
  117. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/file_processor_service.py +0 -0
  118. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/history_manager_service.py +0 -0
  119. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/i18n_service.py +0 -0
  120. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/inference_service.py +0 -0
  121. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/jwt_service.py +0 -0
  122. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  123. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/language_service.py +0 -0
  124. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/license_service.py +0 -0
  125. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/llm_client_service.py +0 -0
  126. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/mail_service.py +0 -0
  127. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/mcp_token_service.py +0 -0
  128. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  129. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/memory_lint_service.py +0 -0
  130. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  131. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/memory_service.py +0 -0
  132. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  133. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  134. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  135. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/__init__.py +0 -0
  136. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/contracts.py +0 -0
  137. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  138. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  139. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  140. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  141. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  142. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  143. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  144. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  145. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/parsers/validator.py +0 -0
  146. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/pdf_service.py +0 -0
  147. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/profile_service.py +0 -0
  148. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  149. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/prompt_service.py +0 -0
  150. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/query_service.py +0 -0
  151. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  152. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  153. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/sql_service.py +0 -0
  154. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/sql_source_service.py +0 -0
  155. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/storage_service.py +0 -0
  156. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/structured_output_service.py +0 -0
  157. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  158. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/system_tools.py +0 -0
  159. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/telemetry_service.py +0 -0
  160. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/tool_output_contract.py +0 -0
  161. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/user_feedback_service.py +0 -0
  162. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/user_session_context_service.py +0 -0
  163. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/visual_kb_service.py +0 -0
  164. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/visual_tool_service.py +0 -0
  165. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/warmup_service.py +0 -0
  166. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/web_search/__init__.py +0 -0
  167. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  168. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  169. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  170. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/services/web_search_service.py +0 -0
  171. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  172. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  173. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  174. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  175. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  176. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  177. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  178. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  179. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_main.js +0 -0
  180. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  181. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  182. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  183. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  184. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  185. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  186. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  187. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/chat_public.css +0 -0
  188. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/documents.css +0 -0
  189. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/landing_page.css +0 -0
  190. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/llm_output.css +0 -0
  191. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/static/styles/onboarding.css +0 -0
  192. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/_company_header.html +0 -0
  193. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/_login_widget.html +0 -0
  194. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/account.html +0 -0
  195. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/base.html +0 -0
  196. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/change_password.html +0 -0
  197. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/chat.html +0 -0
  198. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  199. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/chat_modals.html +0 -0
  200. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/error.html +0 -0
  201. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/forgot_password.html +0 -0
  202. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  203. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  204. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  205. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/pdf/base.html +0 -0
  206. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/pdf/letter.html +0 -0
  207. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/pdf/report.html +0 -0
  208. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/pdf/simple.html +0 -0
  209. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/templates/signup.html +0 -0
  210. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/__init__.py +0 -0
  211. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/account_view.py +0 -0
  212. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/api_key_api_view.py +0 -0
  213. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/base_login_view.py +0 -0
  214. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/categories_api_view.py +0 -0
  215. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/change_password_view.py +0 -0
  216. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  217. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/chat_view.py +0 -0
  218. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/configuration_api_view.py +0 -0
  219. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/connectors_api_view.py +0 -0
  220. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/embedding_api_view.py +0 -0
  221. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/forgot_password_view.py +0 -0
  222. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/help_content_api_view.py +0 -0
  223. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/history_api_view.py +0 -0
  224. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/home_view.py +0 -0
  225. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/init_context_api_view.py +0 -0
  226. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  227. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/load_document_api_view.py +0 -0
  228. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/login_view.py +0 -0
  229. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/logout_api_view.py +0 -0
  230. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/memory_api_view.py +0 -0
  231. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/profile_api_view.py +0 -0
  232. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/prompt_api_view.py +0 -0
  233. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  234. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  235. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/rag_api_view.py +0 -0
  236. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/root_redirect_view.py +0 -0
  237. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/signup_view.py +0 -0
  238. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/static_page_view.py +0 -0
  239. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/tool_api_view.py +0 -0
  240. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  241. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/users_api_view.py +0 -0
  242. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit/views/verify_user_view.py +0 -0
  243. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  244. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  245. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/src/iatoolkit.egg-info/requires.txt +0 -0
  246. {iatoolkit-2.21.2 → iatoolkit-2.21.3}/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.21.3
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.21.3"
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)
@@ -1613,15 +1613,15 @@ 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"
@@ -2591,7 +2591,7 @@ js_messages:
2591
2591
  tool_http_execution_config_version: "execution_config.version must be 1"
2592
2592
  tool_http_execution_config_request_required: "execution_config.request is required"
2593
2593
  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"
2594
+ tool_http_request_url_invalid: "request.url must be an absolute HTTPS URL unless private-network access is explicitly enabled"
2595
2595
  tool_http_request_timeout_invalid: "request.timeout_ms must be an integer between 1 and 120000"
2596
2596
  tool_http_request_field_object: "request.{field} must be an object"
2597
2597
  tool_http_request_body_object: "request.body must be an object"
@@ -1617,15 +1617,15 @@ 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"
@@ -2594,7 +2594,7 @@ js_messages:
2594
2594
  tool_http_execution_config_version: "execution_config.version debe ser 1"
2595
2595
  tool_http_execution_config_request_required: "execution_config.request es obligatorio"
2596
2596
  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"
2597
+ 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
2598
  tool_http_request_timeout_invalid: "request.timeout_ms debe ser un entero entre 1 y 120000"
2599
2599
  tool_http_request_field_object: "request.{field} debe ser un objeto"
2600
2600
  tool_http_request_body_object: "request.body debe ser un objeto"
@@ -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
239
+ )
240
+
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"
191
245
  )
192
246
 
193
- if host == "localhost" or host.endswith(".local"):
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")
@@ -431,11 +431,50 @@ class ToolService:
431
431
  "execution_config.request.url is required and must be a non-empty string"
432
432
  )
433
433
 
434
+ security_cfg = execution_config.get("security")
435
+ allow_private_network = False
436
+ if security_cfg is not None:
437
+ if not isinstance(security_cfg, dict):
438
+ raise IAToolkitException(
439
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
440
+ "execution_config.security must be a JSON object"
441
+ )
442
+
443
+ allowed_hosts = security_cfg.get("allowed_hosts")
444
+ if allowed_hosts is not None:
445
+ if not isinstance(allowed_hosts, list):
446
+ raise IAToolkitException(
447
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
448
+ "execution_config.security.allowed_hosts must be a list"
449
+ )
450
+ for host in allowed_hosts:
451
+ if not isinstance(host, str) or not host.strip():
452
+ raise IAToolkitException(
453
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
454
+ "execution_config.security.allowed_hosts must contain non-empty strings"
455
+ )
456
+
457
+ allow_private_network_value = security_cfg.get("allow_private_network", False)
458
+ if not isinstance(allow_private_network_value, bool):
459
+ raise IAToolkitException(
460
+ IAToolkitException.ErrorType.INVALID_PARAMETER,
461
+ "execution_config.security.allow_private_network must be a boolean"
462
+ )
463
+ allow_private_network = allow_private_network_value
464
+
434
465
  parsed = urlparse(url)
435
- if parsed.scheme.lower() != "https" or not parsed.netloc:
466
+ scheme = parsed.scheme.lower()
467
+ allowed_schemes = {"https", "http"} if allow_private_network else {"https"}
468
+ if scheme not in allowed_schemes or not parsed.netloc:
469
+ message = "execution_config.request.url must be an absolute HTTPS URL"
470
+ if allow_private_network:
471
+ message = (
472
+ "execution_config.request.url must be an absolute HTTP or HTTPS URL "
473
+ "when allow_private_network=true"
474
+ )
436
475
  raise IAToolkitException(
437
476
  IAToolkitException.ErrorType.INVALID_PARAMETER,
438
- "execution_config.request.url must be an absolute HTTPS URL"
477
+ message
439
478
  )
440
479
 
441
480
  timeout_ms = request_cfg.get("timeout_ms")
@@ -545,35 +584,6 @@ class ToolService:
545
584
  "execution_config.response.max_response_bytes must be a positive integer"
546
585
  )
547
586
 
548
- security_cfg = execution_config.get("security")
549
- if security_cfg is not None:
550
- if not isinstance(security_cfg, dict):
551
- raise IAToolkitException(
552
- IAToolkitException.ErrorType.INVALID_PARAMETER,
553
- "execution_config.security must be a JSON object"
554
- )
555
-
556
- allowed_hosts = security_cfg.get("allowed_hosts")
557
- if allowed_hosts is not None:
558
- if not isinstance(allowed_hosts, list):
559
- raise IAToolkitException(
560
- IAToolkitException.ErrorType.INVALID_PARAMETER,
561
- "execution_config.security.allowed_hosts must be a list"
562
- )
563
- for host in allowed_hosts:
564
- if not isinstance(host, str) or not host.strip():
565
- raise IAToolkitException(
566
- IAToolkitException.ErrorType.INVALID_PARAMETER,
567
- "execution_config.security.allowed_hosts must contain non-empty strings"
568
- )
569
-
570
- allow_private_network = security_cfg.get("allow_private_network")
571
- if allow_private_network is True:
572
- raise IAToolkitException(
573
- IAToolkitException.ErrorType.INVALID_PARAMETER,
574
- "execution_config.security.allow_private_network=true is not supported"
575
- )
576
-
577
587
  @staticmethod
578
588
  def _build_tool_snapshot(tool_obj) -> dict:
579
589
  if tool_obj is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.21.2
3
+ Version: 2.21.3
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes