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.
- {iatoolkit-2.21.2/src/iatoolkit.egg-info → iatoolkit-2.22.0}/PKG-INFO +1 -1
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/call_service.py +55 -40
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/locales/en.yaml +20 -5
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/locales/es.yaml +20 -5
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/http_tool_service.py +206 -22
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/tool_service.py +124 -16
- {iatoolkit-2.21.2 → iatoolkit-2.22.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/LICENSE +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/pyproject.toml +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/readme.md +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/requirements.txt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/setup.cfg +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.21.2 → iatoolkit-2.22.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
238
|
+
message
|
|
191
239
|
)
|
|
192
240
|
|
|
193
|
-
if
|
|
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.
|
|
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.
|
|
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
|
-
|
|
206
|
-
|
|
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.
|
|
209
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
238
|
-
if (ip_value.
|
|
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,
|
|
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
|