iatoolkit 2.12.1__tar.gz → 2.14.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.12.1/src/iatoolkit.egg-info → iatoolkit-2.14.0}/PKG-INFO +1 -1
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/locales/en.yaml +68 -1
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/locales/es.yaml +68 -1
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/context_builder_service.py +4 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/llm_client_service.py +249 -43
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/prompt_service.py +42 -10
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/query_service.py +4 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/telemetry_service.py +46 -3
- {iatoolkit-2.12.1 → iatoolkit-2.14.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/LICENSE +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/pyproject.toml +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/readme.md +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/requirements.txt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/setup.cfg +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/mcp_personal_access_token_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/mcp_personal_access_token_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/system_prompts/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.12.1 → iatoolkit-2.14.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -220,6 +220,9 @@ ui:
|
|
|
220
220
|
contact_status:
|
|
221
221
|
active: "Active"
|
|
222
222
|
archived: "Archived"
|
|
223
|
+
contact_status_toggle_active: "Active"
|
|
224
|
+
contact_status_toggle_inactive: "Inactive"
|
|
225
|
+
contact_status_toggle_help: "Turn this off to mark this contact as inactive."
|
|
223
226
|
state:
|
|
224
227
|
new: "New"
|
|
225
228
|
processing: "Processing"
|
|
@@ -405,9 +408,28 @@ ui:
|
|
|
405
408
|
tab_settings: "Settings"
|
|
406
409
|
tab_audience: "Audience"
|
|
407
410
|
tab_executions: "Executions"
|
|
411
|
+
whatsapp_templates_title: "WhatsApp Templates"
|
|
412
|
+
whatsapp_templates_empty: "No WhatsApp templates have been synced yet."
|
|
413
|
+
whatsapp_templates_subtitle: "Templates available in Kapso for WhatsApp campaigns."
|
|
414
|
+
sync_templates: "Sync templates"
|
|
415
|
+
sync_templates_success: "Templates synced."
|
|
416
|
+
sync_templates_error: "Could not sync templates."
|
|
408
417
|
template_label: "Initial message"
|
|
409
418
|
template_help: "This template is rendered per contact when the campaign is activated. You can use variables such as {{ full_name }}, {{ company_name }}, or {{ source.product }}."
|
|
410
419
|
template_placeholder: "You can use variables like {{ full_name }}, {{ email }}, {{ phone_number }}, {{ government_id }}, {{ external_contact_key }}, {{ company_name }}, {{ company_short_name }}, {{ metadata.* }}, and {{ source.* }}"
|
|
420
|
+
initial_message_mode_label: "Start mode"
|
|
421
|
+
whatsapp_template_label: "WhatsApp template"
|
|
422
|
+
select_whatsapp_template: "Select a WhatsApp template"
|
|
423
|
+
whatsapp_template_preview_title: "Template preview"
|
|
424
|
+
whatsapp_template_variables_title: "Template variables"
|
|
425
|
+
whatsapp_template_variables_help: "Map each template variable using contact fields, metadata, source, or company values."
|
|
426
|
+
whatsapp_template_variable_mapping_placeholder: "Example: full_name or source.product"
|
|
427
|
+
whatsapp_template_variable_example: "Provider example: {value}"
|
|
428
|
+
whatsapp_template_no_preview: "Select a template to preview it and map its variables."
|
|
429
|
+
whatsapp_template_status: "Status"
|
|
430
|
+
whatsapp_template_language: "Language"
|
|
431
|
+
whatsapp_template_category: "Category"
|
|
432
|
+
whatsapp_template_last_synced: "Last sync"
|
|
411
433
|
audience_title: "Audience"
|
|
412
434
|
audience_help: "Upload a CSV, map the core columns, and turn those rows into contacts ready to activate over WhatsApp."
|
|
413
435
|
audience_empty: "No audience has been imported yet."
|
|
@@ -418,6 +440,8 @@ ui:
|
|
|
418
440
|
audience_col_email: "Email"
|
|
419
441
|
audience_col_status: "Status"
|
|
420
442
|
audience_col_delivery: "Activation"
|
|
443
|
+
audience_col_client: "Client"
|
|
444
|
+
audience_col_last_activity: "Last activity"
|
|
421
445
|
audience_col_error: "Error"
|
|
422
446
|
audience_col_actions: "Actions"
|
|
423
447
|
audience_total_label: "{count} contacts"
|
|
@@ -425,33 +449,52 @@ ui:
|
|
|
425
449
|
summary_ready: "Ready"
|
|
426
450
|
summary_pending: "Pending"
|
|
427
451
|
summary_activated: "Activated"
|
|
452
|
+
summary_not_replied: "No reply"
|
|
453
|
+
summary_replied: "Replied"
|
|
454
|
+
summary_agent_engaged: "Conversing"
|
|
428
455
|
summary_failed: "Failed"
|
|
429
456
|
summary_skipped: "Skipped"
|
|
430
457
|
executions_title: "Execution status"
|
|
431
458
|
executions_empty: "This campaign has not been launched yet."
|
|
432
459
|
executions_last_launch: "Last launch: {date}"
|
|
460
|
+
executions_summary_snapshot: "{replied} replied · {engaged} in conversation"
|
|
461
|
+
executions_load_error: "Could not load campaign executions."
|
|
462
|
+
executions_attempted: "Attempted"
|
|
463
|
+
executions_processed: "Processed"
|
|
464
|
+
executions_summary_status: "{status} · {date} · {progress}% progress"
|
|
465
|
+
executions_row_counts: "{processed}/{attempted} processed · {activated} activated · {failed} failed · {skipped} skipped"
|
|
466
|
+
executions_row_progress: "{progress}% progress"
|
|
433
467
|
select_campaign: "Select a campaign"
|
|
434
468
|
workspace_placeholder: "Create or select a campaign to edit its template, settings, and audience."
|
|
435
469
|
import_csv: "Import CSV"
|
|
436
470
|
csv_required: "Choose a CSV file first."
|
|
437
471
|
import_modal_title: "Import audience from CSV"
|
|
438
472
|
import_modal_subtitle: "Preview the file, map columns, and replace the campaign's current audience."
|
|
473
|
+
contacts_import_modal_title: "Import contacts from CSV"
|
|
474
|
+
contacts_import_modal_subtitle: "Preview the file, map columns, and create or update contacts in the shared contacts base."
|
|
439
475
|
csv_file_label: "CSV file"
|
|
476
|
+
sample_csv_help: "Need a reference?"
|
|
477
|
+
sample_csv_link: "Download sample CSV"
|
|
440
478
|
preview_csv: "Preview CSV"
|
|
441
479
|
preview_title: "Preview"
|
|
442
480
|
preview_empty: "The preview will appear here after you load a CSV."
|
|
443
481
|
preview_error: "Could not preview the CSV."
|
|
444
482
|
import_csv_confirm: "Import audience"
|
|
483
|
+
contacts_import_csv: "Import CSV"
|
|
484
|
+
contacts_import_confirm: "Import contacts"
|
|
445
485
|
import_error: "Could not import the audience from CSV."
|
|
446
486
|
import_success: "Audience imported."
|
|
487
|
+
contacts_import_error: "Could not import contacts from CSV."
|
|
488
|
+
contacts_import_success: "Contacts imported."
|
|
447
489
|
mapping_full_name: "Name column"
|
|
448
490
|
mapping_phone_number: "Phone column"
|
|
449
491
|
mapping_email: "Email column"
|
|
450
492
|
mapping_government_id: "Government ID column"
|
|
451
493
|
mapping_external_contact_key: "External key column"
|
|
452
494
|
mapping_ignore: "Ignore"
|
|
495
|
+
mapping_preview_first: "Load a preview first"
|
|
453
496
|
launch_campaign: "Launch campaign"
|
|
454
|
-
launch_success: "Campaign
|
|
497
|
+
launch_success: "Campaign launch queued."
|
|
455
498
|
launch_error: "Could not launch the campaign."
|
|
456
499
|
select_campaign_first: "Select a campaign first."
|
|
457
500
|
add_to_campaign: "Add to campaign"
|
|
@@ -477,6 +520,9 @@ ui:
|
|
|
477
520
|
completed: "Completed"
|
|
478
521
|
failed: "Failed"
|
|
479
522
|
paused: "Paused"
|
|
523
|
+
initial_message_mode:
|
|
524
|
+
free_text: "Free text"
|
|
525
|
+
whatsapp_template: "WhatsApp template"
|
|
480
526
|
audience_status:
|
|
481
527
|
ready: "Ready"
|
|
482
528
|
invalid: "Invalid"
|
|
@@ -486,6 +532,27 @@ ui:
|
|
|
486
532
|
activated: "Activated"
|
|
487
533
|
failed: "Failed"
|
|
488
534
|
skipped: "Skipped"
|
|
535
|
+
execution_status:
|
|
536
|
+
pending: "Queued"
|
|
537
|
+
running: "Running"
|
|
538
|
+
completed: "Completed"
|
|
539
|
+
failed: "Failed"
|
|
540
|
+
cancelled: "Cancelled"
|
|
541
|
+
engagement_status:
|
|
542
|
+
not_replied: "No reply"
|
|
543
|
+
replied: "Replied"
|
|
544
|
+
agent_engaged: "Conversing"
|
|
545
|
+
last_message_direction:
|
|
546
|
+
inbound: "Client"
|
|
547
|
+
outbound: "Agent"
|
|
548
|
+
reply_latency_label: "First reply in {value}"
|
|
549
|
+
reply_latency_seconds: "{count}s"
|
|
550
|
+
reply_latency_minutes: "{count}m"
|
|
551
|
+
reply_latency_hours: "{count}h"
|
|
552
|
+
reply_latency_days: "{count}d"
|
|
553
|
+
message_count_label: "Messages: {inbound} inbound / {outbound} outbound"
|
|
554
|
+
last_message_label: "Last message: {value}"
|
|
555
|
+
first_reply_label: "First reply: {value}"
|
|
489
556
|
|
|
490
557
|
admin:
|
|
491
558
|
workspace: "Workspace"
|
|
@@ -221,6 +221,9 @@ ui:
|
|
|
221
221
|
contact_status:
|
|
222
222
|
active: "Activo"
|
|
223
223
|
archived: "Archivado"
|
|
224
|
+
contact_status_toggle_active: "Activo"
|
|
225
|
+
contact_status_toggle_inactive: "Inactivo"
|
|
226
|
+
contact_status_toggle_help: "Desactívalo para marcar este contacto como inactivo."
|
|
224
227
|
state:
|
|
225
228
|
new: "Nuevo"
|
|
226
229
|
processing: "Procesando"
|
|
@@ -406,9 +409,28 @@ ui:
|
|
|
406
409
|
tab_settings: "Settings"
|
|
407
410
|
tab_audience: "Audience"
|
|
408
411
|
tab_executions: "Ejecuciones"
|
|
412
|
+
whatsapp_templates_title: "WhatsApp Templates"
|
|
413
|
+
whatsapp_templates_empty: "Todavía no hay templates de WhatsApp sincronizados."
|
|
414
|
+
whatsapp_templates_subtitle: "Templates disponibles en Kapso para campañas de WhatsApp."
|
|
415
|
+
sync_templates: "Sync templates"
|
|
416
|
+
sync_templates_success: "Templates sincronizados."
|
|
417
|
+
sync_templates_error: "No se pudieron sincronizar los templates."
|
|
409
418
|
template_label: "Mensaje inicial"
|
|
410
419
|
template_help: "Este template se renderiza por contacto al activar la campaña. Puedes usar variables como {{ full_name }}, {{ company_name }} o {{ source.producto }}."
|
|
411
420
|
template_placeholder: "Puedes usar variables como {{ full_name }}, {{ email }}, {{ phone_number }}, {{ government_id }}, {{ external_contact_key }}, {{ company_name }}, {{ company_short_name }}, {{ metadata.* }} y {{ source.* }}"
|
|
421
|
+
initial_message_mode_label: "Modo de inicio"
|
|
422
|
+
whatsapp_template_label: "WhatsApp template"
|
|
423
|
+
select_whatsapp_template: "Selecciona un WhatsApp template"
|
|
424
|
+
whatsapp_template_preview_title: "Preview del template"
|
|
425
|
+
whatsapp_template_variables_title: "Variables del template"
|
|
426
|
+
whatsapp_template_variables_help: "Mapea cada variable del template usando campos del contacto, metadata, source o company."
|
|
427
|
+
whatsapp_template_variable_mapping_placeholder: "Ejemplo: full_name o source.producto"
|
|
428
|
+
whatsapp_template_variable_example: "Ejemplo provider: {value}"
|
|
429
|
+
whatsapp_template_no_preview: "Selecciona un template para ver su preview y mapear variables."
|
|
430
|
+
whatsapp_template_status: "Status"
|
|
431
|
+
whatsapp_template_language: "Idioma"
|
|
432
|
+
whatsapp_template_category: "Categoría"
|
|
433
|
+
whatsapp_template_last_synced: "Última sync"
|
|
412
434
|
audience_title: "Audiencia"
|
|
413
435
|
audience_help: "Carga un CSV, mapea columnas básicas y convierte las filas en contactos listos para activar por WhatsApp."
|
|
414
436
|
audience_empty: "Todavía no hay audiencia cargada."
|
|
@@ -419,6 +441,8 @@ ui:
|
|
|
419
441
|
audience_col_email: "Email"
|
|
420
442
|
audience_col_status: "Estado"
|
|
421
443
|
audience_col_delivery: "Activación"
|
|
444
|
+
audience_col_client: "Cliente"
|
|
445
|
+
audience_col_last_activity: "Última actividad"
|
|
422
446
|
audience_col_error: "Error"
|
|
423
447
|
audience_col_actions: "Acciones"
|
|
424
448
|
audience_total_label: "{count} contactos"
|
|
@@ -426,33 +450,52 @@ ui:
|
|
|
426
450
|
summary_ready: "Listos"
|
|
427
451
|
summary_pending: "Pendientes"
|
|
428
452
|
summary_activated: "Activados"
|
|
453
|
+
summary_not_replied: "Sin respuesta"
|
|
454
|
+
summary_replied: "Respondieron"
|
|
455
|
+
summary_agent_engaged: "Conversando"
|
|
429
456
|
summary_failed: "Fallidos"
|
|
430
457
|
summary_skipped: "Omitidos"
|
|
431
458
|
executions_title: "Estado de ejecución"
|
|
432
459
|
executions_empty: "Esta campaña todavía no se ha lanzado."
|
|
433
460
|
executions_last_launch: "Último lanzamiento: {date}"
|
|
461
|
+
executions_summary_snapshot: "{replied} respondieron · {engaged} conversando"
|
|
462
|
+
executions_load_error: "No se pudieron cargar las ejecuciones de la campaña."
|
|
463
|
+
executions_attempted: "Intentados"
|
|
464
|
+
executions_processed: "Procesados"
|
|
465
|
+
executions_summary_status: "{status} · {date} · {progress}% de progreso"
|
|
466
|
+
executions_row_counts: "{processed}/{attempted} procesados · {activated} activados · {failed} fallidos · {skipped} omitidos"
|
|
467
|
+
executions_row_progress: "{progress}% de progreso"
|
|
434
468
|
select_campaign: "Selecciona una campaña"
|
|
435
469
|
workspace_placeholder: "Crea o selecciona una campaña para editar su template, settings y audiencia."
|
|
436
470
|
import_csv: "Importar CSV"
|
|
437
471
|
csv_required: "Primero debes elegir un archivo CSV."
|
|
438
472
|
import_modal_title: "Importar audiencia desde CSV"
|
|
439
473
|
import_modal_subtitle: "Previsualiza el archivo, mapea columnas y reemplaza la audiencia actual de la campaña."
|
|
474
|
+
contacts_import_modal_title: "Importar contactos desde CSV"
|
|
475
|
+
contacts_import_modal_subtitle: "Previsualiza el archivo, mapea columnas y crea o actualiza contactos en la base compartida."
|
|
440
476
|
csv_file_label: "Archivo CSV"
|
|
477
|
+
sample_csv_help: "¿Necesitas una referencia?"
|
|
478
|
+
sample_csv_link: "Descargar CSV de ejemplo"
|
|
441
479
|
preview_csv: "Previsualizar CSV"
|
|
442
480
|
preview_title: "Preview"
|
|
443
481
|
preview_empty: "La preview aparecerá aquí después de cargar un CSV."
|
|
444
482
|
preview_error: "No se pudo previsualizar el CSV."
|
|
445
483
|
import_csv_confirm: "Importar audiencia"
|
|
484
|
+
contacts_import_csv: "Importar CSV"
|
|
485
|
+
contacts_import_confirm: "Importar contactos"
|
|
446
486
|
import_error: "No se pudo importar la audiencia desde CSV."
|
|
447
487
|
import_success: "Audiencia importada."
|
|
488
|
+
contacts_import_error: "No se pudieron importar los contactos desde CSV."
|
|
489
|
+
contacts_import_success: "Contactos importados."
|
|
448
490
|
mapping_full_name: "Columna nombre"
|
|
449
491
|
mapping_phone_number: "Columna teléfono"
|
|
450
492
|
mapping_email: "Columna email"
|
|
451
493
|
mapping_government_id: "Columna RUT / documento"
|
|
452
494
|
mapping_external_contact_key: "Columna clave externa"
|
|
453
495
|
mapping_ignore: "Ignorar"
|
|
496
|
+
mapping_preview_first: "Primero carga una previsualización"
|
|
454
497
|
launch_campaign: "Lanzar campaña"
|
|
455
|
-
launch_success: "
|
|
498
|
+
launch_success: "Lanzamiento de campaña encolado."
|
|
456
499
|
launch_error: "No se pudo lanzar la campaña."
|
|
457
500
|
select_campaign_first: "Primero selecciona una campaña."
|
|
458
501
|
add_to_campaign: "Agregar a campaña"
|
|
@@ -478,6 +521,9 @@ ui:
|
|
|
478
521
|
completed: "Completada"
|
|
479
522
|
failed: "Fallida"
|
|
480
523
|
paused: "Pausada"
|
|
524
|
+
initial_message_mode:
|
|
525
|
+
free_text: "Texto libre"
|
|
526
|
+
whatsapp_template: "WhatsApp template"
|
|
481
527
|
audience_status:
|
|
482
528
|
ready: "Lista"
|
|
483
529
|
invalid: "Inválida"
|
|
@@ -487,6 +533,27 @@ ui:
|
|
|
487
533
|
activated: "Activada"
|
|
488
534
|
failed: "Fallida"
|
|
489
535
|
skipped: "Omitida"
|
|
536
|
+
execution_status:
|
|
537
|
+
pending: "En cola"
|
|
538
|
+
running: "En ejecución"
|
|
539
|
+
completed: "Completada"
|
|
540
|
+
failed: "Fallida"
|
|
541
|
+
cancelled: "Cancelada"
|
|
542
|
+
engagement_status:
|
|
543
|
+
not_replied: "Sin respuesta"
|
|
544
|
+
replied: "Respondió"
|
|
545
|
+
agent_engaged: "Conversando"
|
|
546
|
+
last_message_direction:
|
|
547
|
+
inbound: "Cliente"
|
|
548
|
+
outbound: "Agente"
|
|
549
|
+
reply_latency_label: "Primera respuesta en {value}"
|
|
550
|
+
reply_latency_seconds: "{count}s"
|
|
551
|
+
reply_latency_minutes: "{count}m"
|
|
552
|
+
reply_latency_hours: "{count}h"
|
|
553
|
+
reply_latency_days: "{count}d"
|
|
554
|
+
message_count_label: "Mensajes: {inbound} inbound / {outbound} outbound"
|
|
555
|
+
last_message_label: "Último mensaje: {value}"
|
|
556
|
+
first_reply_label: "Primera respuesta: {value}"
|
|
490
557
|
|
|
491
558
|
admin:
|
|
492
559
|
workspace: "Recursos"
|
|
@@ -333,13 +333,17 @@ class ContextBuilderService:
|
|
|
333
333
|
collection_names=rag_collections,
|
|
334
334
|
)
|
|
335
335
|
|
|
336
|
+
company_context_blocks = self.company_context_service.get_company_context_blocks(company_short_name)
|
|
337
|
+
|
|
336
338
|
final_system_context = self._join_context_sections(
|
|
337
339
|
rendered_sections.get("identity"),
|
|
340
|
+
company_context_blocks.get("markdown_context"),
|
|
338
341
|
rendered_sections.get("conversation_rules"),
|
|
339
342
|
rendered_sections.get("retrieval_guidance"),
|
|
340
343
|
collection_context,
|
|
341
344
|
rendered_sections.get("data_access_rules"),
|
|
342
345
|
sql_context,
|
|
346
|
+
company_context_blocks.get("yaml_context"),
|
|
343
347
|
rendered_sections.get("output_contract"),
|
|
344
348
|
)
|
|
345
349
|
|
|
@@ -27,6 +27,10 @@ from iatoolkit.services.structured_output_service import StructuredOutputService
|
|
|
27
27
|
from iatoolkit.services.telemetry_service import NoopTelemetryService
|
|
28
28
|
|
|
29
29
|
CONTEXT_ERROR_MESSAGE = 'Tu consulta supera el límite de contexto, utiliza el boton de recarga de contexto.'
|
|
30
|
+
TELEMETRY_MAX_STRING_LENGTH = 1000
|
|
31
|
+
TELEMETRY_MAX_COLLECTION_ITEMS = 20
|
|
32
|
+
TELEMETRY_MAX_DEPTH = 4
|
|
33
|
+
TELEMETRY_REDACTED_VALUE = "[REDACTED]"
|
|
30
34
|
|
|
31
35
|
class llmClient:
|
|
32
36
|
_llm_clients_cache = {} # class attribute, for the clients cache
|
|
@@ -121,6 +125,7 @@ class llmClient:
|
|
|
121
125
|
text_payload = request_params["text"]
|
|
122
126
|
reasoning_payload = request_params["reasoning"]
|
|
123
127
|
telemetry_execution = self.telemetry_service.start_execution(telemetry_request)
|
|
128
|
+
request_source = str((execution_metadata or {}).get("request_source") or "").strip().lower()
|
|
124
129
|
|
|
125
130
|
try:
|
|
126
131
|
start_time = time.time()
|
|
@@ -209,58 +214,105 @@ class llmClient:
|
|
|
209
214
|
raise
|
|
210
215
|
logging.debug(f"[Dispatcher] Parsed args = {args}")
|
|
211
216
|
|
|
217
|
+
tool_call_id = str(getattr(tool_call, "call_id", "") or "").strip()
|
|
218
|
+
tool_span = None
|
|
219
|
+
tool_status = None
|
|
220
|
+
tool_result_for_telemetry = None
|
|
221
|
+
tool_error_message = None
|
|
222
|
+
tool_output_type = None
|
|
223
|
+
tool_attachments_count = 0
|
|
224
|
+
tool_elapsed_seconds = 0.0
|
|
225
|
+
|
|
212
226
|
try:
|
|
213
227
|
call_kwargs = dict(args)
|
|
214
228
|
if images:
|
|
215
229
|
call_kwargs["request_images"] = images
|
|
216
230
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
231
|
+
tool_span = telemetry_execution.start_child_span(
|
|
232
|
+
name=f"tool.{function_name}",
|
|
233
|
+
span_type="tool",
|
|
234
|
+
event=self._build_tool_telemetry_start_event(
|
|
235
|
+
company_short_name=company.short_name,
|
|
236
|
+
function_name=function_name,
|
|
237
|
+
call_id=tool_call_id,
|
|
238
|
+
args=call_kwargs,
|
|
239
|
+
request_source=request_source,
|
|
240
|
+
),
|
|
222
241
|
)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
result = self.dispatcher.dispatch(
|
|
245
|
+
company_short_name=company.short_name,
|
|
246
|
+
function_name=function_name,
|
|
247
|
+
user_identifier=user_identifier,
|
|
248
|
+
**call_kwargs
|
|
249
|
+
)
|
|
250
|
+
force_tool_name = None
|
|
251
|
+
tool_status = "completed"
|
|
252
|
+
except IAToolkitException as e:
|
|
253
|
+
if (e.error_type == IAToolkitException.ErrorType.DATABASE_ERROR and
|
|
254
|
+
sql_retry_count < self.MAX_SQL_RETRIES):
|
|
255
|
+
sql_retry_count += 1
|
|
256
|
+
sql_query_with_error = args.get('query', 'No se pudo extraer la consulta.')
|
|
257
|
+
original_db_error = str(e.__cause__) if e.__cause__ else str(e)
|
|
258
|
+
|
|
259
|
+
logging.warning(
|
|
260
|
+
f"Error de SQL capturado, intentando corregir con el LLM (Intento {sql_retry_count}/{self.MAX_SQL_RETRIES}).")
|
|
261
|
+
result = self._create_sql_retry_prompt(function_name, sql_query_with_error, original_db_error)
|
|
262
|
+
|
|
263
|
+
# force the next call to be this function
|
|
264
|
+
force_tool_name = function_name
|
|
265
|
+
tool_status = "retry_generated"
|
|
266
|
+
else:
|
|
267
|
+
error_message = f"**LLM_DISPATCHER** error en dispatch para tool: '{function_name}': {str(e)}"
|
|
268
|
+
tool_status = "error"
|
|
269
|
+
tool_error_message = error_message
|
|
270
|
+
raise IAToolkitException(IAToolkitException.ErrorType.CALL_ERROR, error_message)
|
|
271
|
+
except Exception as e:
|
|
272
|
+
error_message = f"Dispatch error en tool {function_name} con args {args} -******- {str(e)}"
|
|
273
|
+
tool_status = "error"
|
|
274
|
+
tool_error_message = error_message
|
|
239
275
|
raise IAToolkitException(IAToolkitException.ErrorType.CALL_ERROR, error_message)
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
276
|
+
|
|
277
|
+
result, tool_native_attachments = self._split_tool_result_and_native_attachments(result)
|
|
278
|
+
active_attachments = self._merge_native_attachments(active_attachments, tool_native_attachments)
|
|
279
|
+
tool_result_for_telemetry = result
|
|
280
|
+
tool_output_type = type(result).__name__
|
|
281
|
+
tool_attachments_count = len(tool_native_attachments or [])
|
|
282
|
+
|
|
283
|
+
# add the return value into the list of messages
|
|
284
|
+
input_messages.append({
|
|
285
|
+
"type": "function_call_output",
|
|
286
|
+
"call_id": tool_call.call_id,
|
|
287
|
+
"status": "completed",
|
|
288
|
+
"output": self._serialize_tool_output(result)
|
|
289
|
+
})
|
|
290
|
+
history_messages.append({
|
|
291
|
+
"type": "function_call_output",
|
|
292
|
+
"call_id": tool_call.call_id,
|
|
293
|
+
"status": "completed",
|
|
294
|
+
"output": self._serialize_tool_output(result),
|
|
295
|
+
})
|
|
296
|
+
function_calls = True
|
|
297
|
+
finally:
|
|
298
|
+
tool_elapsed_seconds = time.time() - fcall_time
|
|
299
|
+
telemetry_execution.log_child_span(
|
|
300
|
+
tool_span,
|
|
301
|
+
self._build_tool_telemetry_finish_event(
|
|
302
|
+
function_name=function_name,
|
|
303
|
+
call_id=tool_call_id,
|
|
304
|
+
status=tool_status,
|
|
305
|
+
elapsed_seconds=tool_elapsed_seconds,
|
|
306
|
+
result=tool_result_for_telemetry,
|
|
307
|
+
error_message=tool_error_message,
|
|
308
|
+
output_type=tool_output_type,
|
|
309
|
+
attachments_count=tool_attachments_count,
|
|
310
|
+
),
|
|
311
|
+
)
|
|
312
|
+
telemetry_execution.end_child_span(tool_span)
|
|
261
313
|
|
|
262
314
|
# log the function call parameters and execution time in secs
|
|
263
|
-
elapsed =
|
|
315
|
+
elapsed = tool_elapsed_seconds
|
|
264
316
|
f_call_identity = {function_name:args, 'time': f'{elapsed:.1f}' }
|
|
265
317
|
f_calls.append(f_call_identity)
|
|
266
318
|
f_call_time += elapsed
|
|
@@ -305,6 +357,8 @@ class llmClient:
|
|
|
305
357
|
stats['model'] = model
|
|
306
358
|
|
|
307
359
|
combined_stats = self.add_stats(stats, stats_fcall)
|
|
360
|
+
combined_stats["tool_call_count"] = len(f_calls)
|
|
361
|
+
combined_stats["tool_time_ms_total"] = int(round(f_call_time * 1000))
|
|
308
362
|
if isinstance(execution_metadata, dict):
|
|
309
363
|
combined_stats = dict(combined_stats or {})
|
|
310
364
|
request_source = str(execution_metadata.get("request_source") or "").strip().lower()
|
|
@@ -344,6 +398,8 @@ class llmClient:
|
|
|
344
398
|
"total_tokens": combined_stats.get("total_tokens"),
|
|
345
399
|
"response_time": combined_stats.get("response_time"),
|
|
346
400
|
"sql_retry_count": combined_stats.get("sql_retry_count"),
|
|
401
|
+
"tool_call_count": combined_stats.get("tool_call_count"),
|
|
402
|
+
"tool_time_ms_total": combined_stats.get("tool_time_ms_total"),
|
|
347
403
|
},
|
|
348
404
|
)
|
|
349
405
|
telemetry_stats = telemetry_execution.build_stats()
|
|
@@ -479,6 +535,156 @@ class llmClient:
|
|
|
479
535
|
|
|
480
536
|
return merged
|
|
481
537
|
|
|
538
|
+
@staticmethod
|
|
539
|
+
def _build_tool_telemetry_start_event(
|
|
540
|
+
company_short_name: str,
|
|
541
|
+
function_name: str,
|
|
542
|
+
call_id: str,
|
|
543
|
+
args: dict[str, Any],
|
|
544
|
+
request_source: str = "",
|
|
545
|
+
) -> dict[str, Any]:
|
|
546
|
+
metadata = {
|
|
547
|
+
"company": company_short_name,
|
|
548
|
+
"tool_name": function_name,
|
|
549
|
+
}
|
|
550
|
+
if call_id:
|
|
551
|
+
metadata["call_id"] = call_id
|
|
552
|
+
if request_source:
|
|
553
|
+
metadata["request_source"] = request_source
|
|
554
|
+
|
|
555
|
+
return {
|
|
556
|
+
"metadata": metadata,
|
|
557
|
+
"input": {
|
|
558
|
+
"arguments": llmClient._sanitize_tool_payload_for_telemetry(args),
|
|
559
|
+
},
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
@staticmethod
|
|
563
|
+
def _build_tool_telemetry_finish_event(
|
|
564
|
+
function_name: str,
|
|
565
|
+
call_id: str,
|
|
566
|
+
status: Optional[str],
|
|
567
|
+
elapsed_seconds: float,
|
|
568
|
+
result: Any = None,
|
|
569
|
+
error_message: Optional[str] = None,
|
|
570
|
+
output_type: Optional[str] = None,
|
|
571
|
+
attachments_count: int = 0,
|
|
572
|
+
) -> dict[str, Any]:
|
|
573
|
+
metadata: dict[str, Any] = {
|
|
574
|
+
"tool_name": function_name,
|
|
575
|
+
"status": status or "unknown",
|
|
576
|
+
"elapsed_ms": int(round(max(elapsed_seconds, 0.0) * 1000)),
|
|
577
|
+
}
|
|
578
|
+
if call_id:
|
|
579
|
+
metadata["call_id"] = call_id
|
|
580
|
+
if output_type:
|
|
581
|
+
metadata["output_type"] = output_type
|
|
582
|
+
if attachments_count:
|
|
583
|
+
metadata["attachments_count"] = attachments_count
|
|
584
|
+
if error_message:
|
|
585
|
+
metadata["error_message"] = llmClient._truncate_telemetry_string(str(error_message))
|
|
586
|
+
|
|
587
|
+
event: dict[str, Any] = {"metadata": metadata}
|
|
588
|
+
if result is not None:
|
|
589
|
+
event["output"] = {
|
|
590
|
+
"preview": llmClient._sanitize_tool_payload_for_telemetry(result, parent_key="output"),
|
|
591
|
+
}
|
|
592
|
+
return event
|
|
593
|
+
|
|
594
|
+
@staticmethod
|
|
595
|
+
def _sanitize_tool_payload_for_telemetry(
|
|
596
|
+
value: Any,
|
|
597
|
+
*,
|
|
598
|
+
parent_key: str = "",
|
|
599
|
+
depth: int = 0,
|
|
600
|
+
) -> Any:
|
|
601
|
+
if depth >= TELEMETRY_MAX_DEPTH:
|
|
602
|
+
return "[TRUNCATED_DEPTH]"
|
|
603
|
+
|
|
604
|
+
if isinstance(value, dict):
|
|
605
|
+
sanitized: dict[str, Any] = {}
|
|
606
|
+
items = list(value.items())
|
|
607
|
+
for index, (key, item) in enumerate(items):
|
|
608
|
+
if index >= TELEMETRY_MAX_COLLECTION_ITEMS:
|
|
609
|
+
sanitized["__truncated_items__"] = len(items) - TELEMETRY_MAX_COLLECTION_ITEMS
|
|
610
|
+
break
|
|
611
|
+
|
|
612
|
+
key_str = str(key)
|
|
613
|
+
key_name = key_str.strip().lower()
|
|
614
|
+
if llmClient._is_sensitive_telemetry_key(key_name):
|
|
615
|
+
sanitized[key_str] = TELEMETRY_REDACTED_VALUE
|
|
616
|
+
continue
|
|
617
|
+
|
|
618
|
+
if key_name in {"request_images", "images"} and isinstance(item, list):
|
|
619
|
+
sanitized[key_str] = {"count": len(item), "content": "[OMITTED_IMAGES]"}
|
|
620
|
+
continue
|
|
621
|
+
|
|
622
|
+
if key_name in {"attachments", "native_attachments", "request_attachments"} and isinstance(item, list):
|
|
623
|
+
sanitized[key_str] = {"count": len(item), "content": "[OMITTED_ATTACHMENTS]"}
|
|
624
|
+
continue
|
|
625
|
+
|
|
626
|
+
sanitized[key_str] = llmClient._sanitize_tool_payload_for_telemetry(
|
|
627
|
+
item,
|
|
628
|
+
parent_key=key_name,
|
|
629
|
+
depth=depth + 1,
|
|
630
|
+
)
|
|
631
|
+
return sanitized
|
|
632
|
+
|
|
633
|
+
if isinstance(value, (list, tuple, set)):
|
|
634
|
+
items = list(value)
|
|
635
|
+
sanitized_items = [
|
|
636
|
+
llmClient._sanitize_tool_payload_for_telemetry(item, parent_key=parent_key, depth=depth + 1)
|
|
637
|
+
for item in items[:TELEMETRY_MAX_COLLECTION_ITEMS]
|
|
638
|
+
]
|
|
639
|
+
if len(items) > TELEMETRY_MAX_COLLECTION_ITEMS:
|
|
640
|
+
sanitized_items.append(f"[TRUNCATED_ITEMS:{len(items) - TELEMETRY_MAX_COLLECTION_ITEMS}]")
|
|
641
|
+
return sanitized_items
|
|
642
|
+
|
|
643
|
+
if isinstance(value, (bytes, bytearray)):
|
|
644
|
+
return f"[BINARY:{len(value)} bytes]"
|
|
645
|
+
|
|
646
|
+
if isinstance(value, str):
|
|
647
|
+
if llmClient._looks_like_base64(value) or parent_key in {"base64", "data"}:
|
|
648
|
+
return "[REDACTED_BINARY_TEXT]"
|
|
649
|
+
return llmClient._truncate_telemetry_string(value)
|
|
650
|
+
|
|
651
|
+
if isinstance(value, (int, float, bool)) or value is None:
|
|
652
|
+
return value
|
|
653
|
+
|
|
654
|
+
return llmClient._truncate_telemetry_string(str(value))
|
|
655
|
+
|
|
656
|
+
@staticmethod
|
|
657
|
+
def _is_sensitive_telemetry_key(key_name: str) -> bool:
|
|
658
|
+
if not key_name:
|
|
659
|
+
return False
|
|
660
|
+
|
|
661
|
+
return any(
|
|
662
|
+
marker in key_name
|
|
663
|
+
for marker in (
|
|
664
|
+
"api_key",
|
|
665
|
+
"apikey",
|
|
666
|
+
"secret",
|
|
667
|
+
"password",
|
|
668
|
+
"token",
|
|
669
|
+
"authorization",
|
|
670
|
+
"credential",
|
|
671
|
+
)
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
@staticmethod
|
|
675
|
+
def _looks_like_base64(value: str) -> bool:
|
|
676
|
+
candidate = str(value or "").strip()
|
|
677
|
+
if len(candidate) < 256 or len(candidate) % 4 != 0:
|
|
678
|
+
return False
|
|
679
|
+
return bool(re.fullmatch(r"[A-Za-z0-9+/=\s]+", candidate))
|
|
680
|
+
|
|
681
|
+
@staticmethod
|
|
682
|
+
def _truncate_telemetry_string(value: str, max_length: int = TELEMETRY_MAX_STRING_LENGTH) -> str:
|
|
683
|
+
text = str(value or "")
|
|
684
|
+
if len(text) <= max_length:
|
|
685
|
+
return text
|
|
686
|
+
return f"{text[:max_length]}...[truncated]"
|
|
687
|
+
|
|
482
688
|
@staticmethod
|
|
483
689
|
def _build_history_messages_from_response(response) -> list[dict]:
|
|
484
690
|
if response is None:
|