iatoolkit 2.36.2__tar.gz → 2.40.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.36.2/src/iatoolkit.egg-info → iatoolkit-2.40.0}/PKG-INFO +1 -1
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/__init__.py +1 -1
- iatoolkit-2.40.0/src/iatoolkit/common/bridge_validation.py +39 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/locales/en.yaml +129 -1
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/locales/es.yaml +134 -1
- iatoolkit-2.40.0/src/iatoolkit/repositories/bridge_repo.py +77 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/models.py +76 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/auth_service.py +4 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/llm_client_service.py +29 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/profile_service.py +80 -1
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/sql_service.py +7 -2
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/sql_source_service.py +10 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/tool_service.py +24 -11
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/_login_widget.html +5 -1
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/account.html +13 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/login_view.py +26 -1
- {iatoolkit-2.36.2 → iatoolkit-2.40.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit.egg-info/SOURCES.txt +2 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/LICENSE +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/pyproject.toml +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/readme.md +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/requirements.txt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/setup.cfg +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.36.2 → iatoolkit-2.40.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Copyright (c) 2024 Fernando Libedinsky
|
|
2
|
+
# Product: IAToolkit
|
|
3
|
+
#
|
|
4
|
+
# Shared validation for the `bridge_id` that SQL sources and HTTP tools point
|
|
5
|
+
# at. Lives here rather than in either service because both reference the same
|
|
6
|
+
# registry and must reject the same way — a check that drifts between the two
|
|
7
|
+
# is worse than no check, since the GUI would accept in one screen what it
|
|
8
|
+
# refuses in the other.
|
|
9
|
+
|
|
10
|
+
from iatoolkit.common.exceptions import IAToolkitException
|
|
11
|
+
from iatoolkit.repositories.bridge_repo import BridgeRepo
|
|
12
|
+
from iatoolkit.repositories.models import Company
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def validate_bridge_is_registered(bridge_repo: BridgeRepo, company: Company, bridge_id: str) -> None:
|
|
16
|
+
"""
|
|
17
|
+
Rejects a bridge_id with no registered bridge behind it.
|
|
18
|
+
|
|
19
|
+
Worth the extra check because the failure it prevents is genuinely
|
|
20
|
+
confusing: an unregistered bridge_id used to surface only at runtime, as
|
|
21
|
+
"Bridge '<id>' is not connected" — the exact same message as a bridge that
|
|
22
|
+
is simply down. Catching it at save time separates "you typed it wrong"
|
|
23
|
+
from "your agent is offline".
|
|
24
|
+
|
|
25
|
+
Skipped entirely for companies that have no bridges registered yet: those
|
|
26
|
+
still reference bridges by API key name (the pre-registry rule), and
|
|
27
|
+
refusing to save would break configurations that work today. The check
|
|
28
|
+
turns itself on once the company is backfilled.
|
|
29
|
+
"""
|
|
30
|
+
registered = bridge_repo.get_by_company(company)
|
|
31
|
+
if not registered:
|
|
32
|
+
return
|
|
33
|
+
|
|
34
|
+
if not any(b.bridge_id == bridge_id for b in registered):
|
|
35
|
+
known = ", ".join(sorted(b.bridge_id for b in registered))
|
|
36
|
+
raise IAToolkitException(
|
|
37
|
+
IAToolkitException.ErrorType.INVALID_PARAMETER,
|
|
38
|
+
f"Unknown bridge_id '{bridge_id}'. Registered bridges for this company: {known}",
|
|
39
|
+
)
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
# Language: English
|
|
2
|
+
emails:
|
|
3
|
+
google_welcome:
|
|
4
|
+
subject: "Welcome to IAToolkit"
|
|
5
|
+
title: "Your IAToolkit account is ready"
|
|
6
|
+
greeting: "Hello {name},"
|
|
7
|
+
intro: "We created your account successfully using your Google identity."
|
|
8
|
+
account: "Sign-in account: {email}"
|
|
9
|
+
password_note: "You do not need an IAToolkit password. To sign in again, choose Sign up or continue with Google."
|
|
10
|
+
cta: "Continue to IAToolkit"
|
|
11
|
+
security_note: "If you did not create this account, contact IAToolkit support."
|
|
12
|
+
|
|
2
13
|
ui:
|
|
3
14
|
common:
|
|
4
15
|
actions: "Actions"
|
|
@@ -318,6 +329,7 @@ ui:
|
|
|
318
329
|
account:
|
|
319
330
|
title: "My Account"
|
|
320
331
|
back_to_chat: "Back to chat"
|
|
332
|
+
menu_getting_started: "Getting Started"
|
|
321
333
|
menu_general: "General"
|
|
322
334
|
menu_mcp_tokens: "MCP Tokens"
|
|
323
335
|
general_title: "Personal settings"
|
|
@@ -566,6 +578,44 @@ ui:
|
|
|
566
578
|
last_message_label: "Last message: {value}"
|
|
567
579
|
first_reply_label: "First reply: {value}"
|
|
568
580
|
|
|
581
|
+
support:
|
|
582
|
+
title: "Support"
|
|
583
|
+
new_case: "Report an issue"
|
|
584
|
+
my_cases: "Your requests"
|
|
585
|
+
field_title: "Summary"
|
|
586
|
+
field_category: "Area"
|
|
587
|
+
field_impact: "What is happening?"
|
|
588
|
+
field_description: "What happened"
|
|
589
|
+
impact_question: "A question, nothing is broken"
|
|
590
|
+
impact_degraded: "Something fails, we can still work"
|
|
591
|
+
impact_blocked: "We cannot work"
|
|
592
|
+
category_general: "General"
|
|
593
|
+
category_connectivity: "Connectivity"
|
|
594
|
+
category_onboarding: "Setup"
|
|
595
|
+
category_billing: "Billing"
|
|
596
|
+
category_product: "Product"
|
|
597
|
+
credentials_warning: "Do not paste passwords, API keys or connection strings here."
|
|
598
|
+
submit: "Send request"
|
|
599
|
+
sending: "Sending…"
|
|
600
|
+
sent: "Request sent."
|
|
601
|
+
required: "Summary and description are required."
|
|
602
|
+
send_failed: "Could not send the request."
|
|
603
|
+
load_failed: "Could not load your requests."
|
|
604
|
+
loading: "Loading…"
|
|
605
|
+
empty: "You have not opened any requests yet."
|
|
606
|
+
col_case: "Request"
|
|
607
|
+
col_status: "Status"
|
|
608
|
+
col_opened: "Opened"
|
|
609
|
+
due: "Response by"
|
|
610
|
+
entitlement_committed_title: "Production Support active"
|
|
611
|
+
entitlement_committed_text: "Your requests carry a committed response time."
|
|
612
|
+
entitlement_standard_title: "Standard support"
|
|
613
|
+
entitlement_standard_text: "We work every request. Production Support adds a committed response time."
|
|
614
|
+
status_open: "Open"
|
|
615
|
+
status_in_progress: "In progress"
|
|
616
|
+
status_waiting_customer: "Waiting for you"
|
|
617
|
+
status_resolved: "Resolved"
|
|
618
|
+
status_closed: "Closed"
|
|
569
619
|
admin:
|
|
570
620
|
workspace: "Workspace"
|
|
571
621
|
configuration: "Configuration"
|
|
@@ -608,6 +658,7 @@ ui:
|
|
|
608
658
|
load_configuration_hint: "Applies configuration and refreshes runtime clients"
|
|
609
659
|
load_configuration_short: "Apply"
|
|
610
660
|
select_company: "Select company"
|
|
661
|
+
documentation: "Documentation"
|
|
611
662
|
goto_chat: "Go to chat"
|
|
612
663
|
logout: "Close session"
|
|
613
664
|
error_loading: "Error loading file content"
|
|
@@ -1429,6 +1480,25 @@ ui:
|
|
|
1429
1480
|
include_inactive: "Include Inactive"
|
|
1430
1481
|
new_contract: "New Contract"
|
|
1431
1482
|
col_cycle: "Cycle"
|
|
1483
|
+
included_amount: "Included"
|
|
1484
|
+
billable_amount: "Billable"
|
|
1485
|
+
plan_title: "Your plan"
|
|
1486
|
+
plan_platform: "Platform"
|
|
1487
|
+
plan_platform_note: "{seats} users included"
|
|
1488
|
+
plan_seats: "Users"
|
|
1489
|
+
plan_seats_note: "{active} active this period · {amount}"
|
|
1490
|
+
seat_alert_over_title: "{active} people are using {contracted} contracted seats"
|
|
1491
|
+
seat_alert_over_text: "Contact us to adjust your plan."
|
|
1492
|
+
seat_alert_near_title: "{remaining} seats left"
|
|
1493
|
+
seat_alert_near_text: "Contact us before your team outgrows the plan."
|
|
1494
|
+
plan_support: "Support"
|
|
1495
|
+
plan_support_standard: "Standard"
|
|
1496
|
+
plan_support_production: "Production support"
|
|
1497
|
+
plan_support_included: "Included in the plan"
|
|
1498
|
+
plan_credits: "Runtime credits this period"
|
|
1499
|
+
plan_credits_remaining: "{amount} of included execution left"
|
|
1500
|
+
plan_credits_exhausted: "Allowance used; further execution is billed"
|
|
1501
|
+
plan_recurring_total: "Monthly recurring"
|
|
1432
1502
|
col_included: "Included"
|
|
1433
1503
|
col_grace: "Grace"
|
|
1434
1504
|
col_markup_pct: "Markup %"
|
|
@@ -1472,6 +1542,7 @@ ui:
|
|
|
1472
1542
|
sql_sources_form_connection_type: "Connection Type"
|
|
1473
1543
|
sql_sources_form_connection_env: "Connection String Env"
|
|
1474
1544
|
sql_sources_form_bridge_id: "Bridge ID"
|
|
1545
|
+
sql_sources_form_bridge_none: "This company has no registered bridges yet. Create them in the Bridges section."
|
|
1475
1546
|
sql_sources_form_description: "Description"
|
|
1476
1547
|
sql_sources_form_active: "Active"
|
|
1477
1548
|
sql_context_scope_title: "SQL Context"
|
|
@@ -1856,6 +1927,64 @@ ui:
|
|
|
1856
1927
|
save_error: "Error saving API key."
|
|
1857
1928
|
delete_error: "Error deleting API key."
|
|
1858
1929
|
|
|
1930
|
+
bridges:
|
|
1931
|
+
menu_label: "Bridges"
|
|
1932
|
+
title: "Bridges"
|
|
1933
|
+
subtitle: "On-premise agents connecting the company's private databases and APIs."
|
|
1934
|
+
new_btn: "New Bridge"
|
|
1935
|
+
search_placeholder: "Filter bridges..."
|
|
1936
|
+
empty_state: "No bridges registered yet."
|
|
1937
|
+
bridge_id: "Bridge ID"
|
|
1938
|
+
bridge_id_placeholder: "e.g. docker-bridge"
|
|
1939
|
+
bridge_id_required: "Bridge ID is required."
|
|
1940
|
+
bridge_id_help: "Lowercase letters, digits and hyphens (3-64). Cannot be changed later: SQL sources and tools reference it."
|
|
1941
|
+
display_name: "Name"
|
|
1942
|
+
display_name_placeholder: "e.g. Production"
|
|
1943
|
+
description: "Description"
|
|
1944
|
+
api_key: "API Key"
|
|
1945
|
+
api_key_masked: "••••••••••••"
|
|
1946
|
+
api_key_help: "Set this value as IAT_BRIDGE_KEY in the bridge's .env file."
|
|
1947
|
+
copy_tooltip: "Copy API key"
|
|
1948
|
+
copy_success: "API key copied to clipboard."
|
|
1949
|
+
copy_error: "Could not copy the API key."
|
|
1950
|
+
status: "Status"
|
|
1951
|
+
status_connected: "Connected"
|
|
1952
|
+
status_disconnected: "Disconnected"
|
|
1953
|
+
diagnose_action: "Test"
|
|
1954
|
+
diagnose_title: "Connection test"
|
|
1955
|
+
diagnose_intro: "Verify that the Bridge connects, reaches its database and resolves HTTP calls. Each link is reported separately."
|
|
1956
|
+
diagnose_cta: "Test the connection"
|
|
1957
|
+
diagnose_running: "Testing…"
|
|
1958
|
+
diagnose_check_socket: "Bridge connected"
|
|
1959
|
+
diagnose_check_database: "Sample database reachable"
|
|
1960
|
+
diagnose_check_http: "HTTP channel working"
|
|
1961
|
+
diagnose_error: "Could not run the check."
|
|
1962
|
+
status_never_connected: "Never connected"
|
|
1963
|
+
active: "Active"
|
|
1964
|
+
inactive: "Inactive"
|
|
1965
|
+
last_seen_at: "Last seen"
|
|
1966
|
+
origin: "Origin"
|
|
1967
|
+
agent_version: "Version"
|
|
1968
|
+
capabilities: "Capabilities"
|
|
1969
|
+
resources: "Exposed resources"
|
|
1970
|
+
actions: "Actions"
|
|
1971
|
+
create_modal_title: "Create Bridge"
|
|
1972
|
+
edit_modal_title: "Edit Bridge"
|
|
1973
|
+
create_success: "Bridge created. Copy the API key and configure it on the bridge."
|
|
1974
|
+
update_success: "Bridge updated successfully."
|
|
1975
|
+
delete_confirmation: "Delete Bridge?"
|
|
1976
|
+
delete_message: "SQL sources and tools referencing it will stop working. Its API key is deleted too."
|
|
1977
|
+
delete_success: "Bridge deleted successfully."
|
|
1978
|
+
rotate_tooltip: "Rotate API key"
|
|
1979
|
+
rotate_confirmation: "Rotate the API key?"
|
|
1980
|
+
rotate_message: "A new key is issued and the old one is deleted. The bridge stays down until you update IAT_BRIDGE_KEY in its .env."
|
|
1981
|
+
rotate_action: "Rotate key"
|
|
1982
|
+
rotate_success: "API key rotated. Update IAT_BRIDGE_KEY on the bridge."
|
|
1983
|
+
load_error: "Error loading bridges."
|
|
1984
|
+
save_error: "Error saving the bridge."
|
|
1985
|
+
delete_error: "Error deleting the bridge."
|
|
1986
|
+
rotate_error: "Error rotating the API key."
|
|
1987
|
+
|
|
1859
1988
|
mcp_service_tokens:
|
|
1860
1989
|
menu_label: "MCP Tokens"
|
|
1861
1990
|
title: "MCP Tokens"
|
|
@@ -1911,7 +2040,6 @@ ui:
|
|
|
1911
2040
|
tab_settings: "Settings"
|
|
1912
2041
|
tab_access: "Access"
|
|
1913
2042
|
tab_observability: "Observability"
|
|
1914
|
-
tab_usage: "Usage"
|
|
1915
2043
|
save_success: "MCP configuration saved successfully."
|
|
1916
2044
|
save_error: "Could not save MCP configuration."
|
|
1917
2045
|
preview_error: "Could not build the MCP preview."
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
# locales/es.yaml
|
|
2
|
+
emails:
|
|
3
|
+
google_welcome:
|
|
4
|
+
subject: "Bienvenido a IAToolkit"
|
|
5
|
+
title: "Tu cuenta IAToolkit está lista"
|
|
6
|
+
greeting: "Hola {name},"
|
|
7
|
+
intro: "Creamos tu cuenta correctamente usando tu identidad de Google."
|
|
8
|
+
account: "Cuenta de acceso: {email}"
|
|
9
|
+
password_note: "No necesitas una contraseña de IAToolkit. Para volver a entrar, elige Registrarse o continuar con Google."
|
|
10
|
+
cta: "Continuar en IAToolkit"
|
|
11
|
+
security_note: "Si no realizaste este registro, contacta al soporte de IAToolkit."
|
|
12
|
+
|
|
2
13
|
ui:
|
|
3
14
|
common:
|
|
4
15
|
actions: "Acciones"
|
|
@@ -269,6 +280,7 @@ ui:
|
|
|
269
280
|
title: "Iniciar Sesión"
|
|
270
281
|
welcome_message: "Ingresa tus credenciales o registrate para acceder a la plataforma."
|
|
271
282
|
email_placeholder: "Correo electrónico"
|
|
283
|
+
password_placeholder: "Contraseña"
|
|
272
284
|
login_button: "Acceder"
|
|
273
285
|
google_button: "Continuar con Google"
|
|
274
286
|
continue_with_google_button: "Continuar con Google"
|
|
@@ -319,6 +331,7 @@ ui:
|
|
|
319
331
|
account:
|
|
320
332
|
title: "Mi cuenta"
|
|
321
333
|
back_to_chat: "Volver al chat"
|
|
334
|
+
menu_getting_started: "Primeros pasos"
|
|
322
335
|
menu_general: "General"
|
|
323
336
|
menu_mcp_tokens: "Tokens MCP"
|
|
324
337
|
general_title: "Configuración personal"
|
|
@@ -567,6 +580,44 @@ ui:
|
|
|
567
580
|
last_message_label: "Último mensaje: {value}"
|
|
568
581
|
first_reply_label: "Primera respuesta: {value}"
|
|
569
582
|
|
|
583
|
+
support:
|
|
584
|
+
title: "Soporte"
|
|
585
|
+
new_case: "Reportar un problema"
|
|
586
|
+
my_cases: "Tus solicitudes"
|
|
587
|
+
field_title: "Resumen"
|
|
588
|
+
field_category: "Área"
|
|
589
|
+
field_impact: "¿Qué está pasando?"
|
|
590
|
+
field_description: "Qué ocurrió"
|
|
591
|
+
impact_question: "Una consulta, no hay nada roto"
|
|
592
|
+
impact_degraded: "Algo falla, podemos seguir trabajando"
|
|
593
|
+
impact_blocked: "No podemos trabajar"
|
|
594
|
+
category_general: "General"
|
|
595
|
+
category_connectivity: "Conectividad"
|
|
596
|
+
category_onboarding: "Puesta en marcha"
|
|
597
|
+
category_billing: "Facturación"
|
|
598
|
+
category_product: "Producto"
|
|
599
|
+
credentials_warning: "No pegues contraseñas, API keys ni cadenas de conexión aquí."
|
|
600
|
+
submit: "Enviar solicitud"
|
|
601
|
+
sending: "Enviando…"
|
|
602
|
+
sent: "Solicitud enviada."
|
|
603
|
+
required: "El resumen y la descripción son obligatorios."
|
|
604
|
+
send_failed: "No se pudo enviar la solicitud."
|
|
605
|
+
load_failed: "No se pudieron cargar tus solicitudes."
|
|
606
|
+
loading: "Cargando…"
|
|
607
|
+
empty: "Todavía no abriste ninguna solicitud."
|
|
608
|
+
col_case: "Solicitud"
|
|
609
|
+
col_status: "Estado"
|
|
610
|
+
col_opened: "Abierta"
|
|
611
|
+
due: "Respuesta antes de"
|
|
612
|
+
entitlement_committed_title: "Soporte Producción activo"
|
|
613
|
+
entitlement_committed_text: "Tus solicitudes tienen tiempo de respuesta comprometido."
|
|
614
|
+
entitlement_standard_title: "Soporte estándar"
|
|
615
|
+
entitlement_standard_text: "Trabajamos todas las solicitudes. Soporte Producción agrega un tiempo de respuesta comprometido."
|
|
616
|
+
status_open: "Abierta"
|
|
617
|
+
status_in_progress: "En curso"
|
|
618
|
+
status_waiting_customer: "Esperando tu respuesta"
|
|
619
|
+
status_resolved: "Resuelta"
|
|
620
|
+
status_closed: "Cerrada"
|
|
570
621
|
admin:
|
|
571
622
|
workspace: "Recursos"
|
|
572
623
|
configuration: "Configuración"
|
|
@@ -609,8 +660,10 @@ ui:
|
|
|
609
660
|
load_configuration_hint: "Aplica configuración y refresca clientes en runtime"
|
|
610
661
|
load_configuration_short: "Aplicar"
|
|
611
662
|
select_company: "Seleccionar empresa"
|
|
663
|
+
documentation: "Documentación"
|
|
612
664
|
goto_chat: "Ir al chat"
|
|
613
665
|
logout: "Cerrar sesión"
|
|
666
|
+
error_loading: "Error al cargar el contenido del archivo"
|
|
614
667
|
add: "Agregar"
|
|
615
668
|
create: "Crear"
|
|
616
669
|
delete: "Borrar"
|
|
@@ -1430,6 +1483,25 @@ ui:
|
|
|
1430
1483
|
include_inactive: "Incluir Inactivos"
|
|
1431
1484
|
new_contract: "Nuevo Contrato"
|
|
1432
1485
|
col_cycle: "Ciclo"
|
|
1486
|
+
included_amount: "Incluido"
|
|
1487
|
+
billable_amount: "Facturable"
|
|
1488
|
+
plan_title: "Tu plan"
|
|
1489
|
+
plan_platform: "Plataforma"
|
|
1490
|
+
plan_platform_note: "{seats} usuarios incluidos"
|
|
1491
|
+
plan_seats: "Usuarios"
|
|
1492
|
+
plan_seats_note: "{active} activos en el período · {amount}"
|
|
1493
|
+
seat_alert_over_title: "{active} personas están usando {contracted} asientos contratados"
|
|
1494
|
+
seat_alert_over_text: "Escríbenos para ajustar tu plan."
|
|
1495
|
+
seat_alert_near_title: "Te quedan {remaining} asientos"
|
|
1496
|
+
seat_alert_near_text: "Escríbenos antes de que tu equipo supere el plan."
|
|
1497
|
+
plan_support: "Soporte"
|
|
1498
|
+
plan_support_standard: "Estándar"
|
|
1499
|
+
plan_support_production: "Soporte Producción"
|
|
1500
|
+
plan_support_included: "Incluido en el plan"
|
|
1501
|
+
plan_credits: "Créditos de Runtime del período"
|
|
1502
|
+
plan_credits_remaining: "Quedan {amount} de ejecución incluida"
|
|
1503
|
+
plan_credits_exhausted: "Cupo consumido; la ejecución adicional se factura"
|
|
1504
|
+
plan_recurring_total: "Recurrente mensual"
|
|
1433
1505
|
col_included: "Incluidos"
|
|
1434
1506
|
col_grace: "Gracia"
|
|
1435
1507
|
col_markup_pct: "Recargo %"
|
|
@@ -1474,6 +1546,7 @@ ui:
|
|
|
1474
1546
|
sql_sources_form_connection_type: "Tipo de conexión"
|
|
1475
1547
|
sql_sources_form_connection_env: "Variable de entorno de conexión"
|
|
1476
1548
|
sql_sources_form_bridge_id: "Bridge ID"
|
|
1549
|
+
sql_sources_form_bridge_none: "Esta empresa aún no tiene bridges registrados. Créalos en la sección Bridges."
|
|
1477
1550
|
sql_sources_form_description: "Descripción"
|
|
1478
1551
|
sql_sources_form_active: "Activa"
|
|
1479
1552
|
sql_context_scope_title: "Contexto SQL"
|
|
@@ -1860,6 +1933,64 @@ ui:
|
|
|
1860
1933
|
save_error: "Error al guardar la API key."
|
|
1861
1934
|
delete_error: "Error al eliminar la API key."
|
|
1862
1935
|
|
|
1936
|
+
bridges:
|
|
1937
|
+
menu_label: "Bridges"
|
|
1938
|
+
title: "Bridges"
|
|
1939
|
+
subtitle: "Agentes on-premise que conectan las bases de datos y APIs privadas de la empresa."
|
|
1940
|
+
new_btn: "Nuevo Bridge"
|
|
1941
|
+
search_placeholder: "Filtrar bridges..."
|
|
1942
|
+
empty_state: "Todavía no hay bridges registrados."
|
|
1943
|
+
bridge_id: "Bridge ID"
|
|
1944
|
+
bridge_id_placeholder: "ej. docker-bridge"
|
|
1945
|
+
bridge_id_required: "El Bridge ID es obligatorio."
|
|
1946
|
+
bridge_id_help: "Minúsculas, dígitos y guiones (3-64). No se puede cambiar después: las fuentes SQL y las tools lo referencian."
|
|
1947
|
+
display_name: "Nombre"
|
|
1948
|
+
display_name_placeholder: "ej. Producción"
|
|
1949
|
+
description: "Descripción"
|
|
1950
|
+
api_key: "API Key"
|
|
1951
|
+
api_key_masked: "••••••••••••"
|
|
1952
|
+
api_key_help: "Configura este valor como IAT_BRIDGE_KEY en el .env del bridge."
|
|
1953
|
+
copy_tooltip: "Copiar API key"
|
|
1954
|
+
copy_success: "API key copiada al portapapeles."
|
|
1955
|
+
copy_error: "No se pudo copiar la API key."
|
|
1956
|
+
status: "Estado"
|
|
1957
|
+
status_connected: "Conectado"
|
|
1958
|
+
status_disconnected: "Desconectado"
|
|
1959
|
+
diagnose_action: "Probar"
|
|
1960
|
+
diagnose_title: "Prueba de conexión"
|
|
1961
|
+
diagnose_intro: "Verifica que el Bridge conecta, alcanza su base y resuelve llamadas HTTP. Cada eslabón se reporta por separado."
|
|
1962
|
+
diagnose_cta: "Probar la conexión"
|
|
1963
|
+
diagnose_running: "Probando…"
|
|
1964
|
+
diagnose_check_socket: "Bridge conectado"
|
|
1965
|
+
diagnose_check_database: "Base de ejemplo alcanzable"
|
|
1966
|
+
diagnose_check_http: "Canal HTTP operativo"
|
|
1967
|
+
diagnose_error: "No se pudo ejecutar la prueba."
|
|
1968
|
+
status_never_connected: "Nunca conectó"
|
|
1969
|
+
active: "Activo"
|
|
1970
|
+
inactive: "Inactivo"
|
|
1971
|
+
last_seen_at: "Último contacto"
|
|
1972
|
+
origin: "Origen"
|
|
1973
|
+
agent_version: "Versión"
|
|
1974
|
+
capabilities: "Capacidades"
|
|
1975
|
+
resources: "Recursos expuestos"
|
|
1976
|
+
actions: "Acciones"
|
|
1977
|
+
create_modal_title: "Crear Bridge"
|
|
1978
|
+
edit_modal_title: "Editar Bridge"
|
|
1979
|
+
create_success: "Bridge creado. Copia la API key y configúrala en el bridge."
|
|
1980
|
+
update_success: "Bridge actualizado correctamente."
|
|
1981
|
+
delete_confirmation: "¿Eliminar Bridge?"
|
|
1982
|
+
delete_message: "Las fuentes SQL y tools que lo referencien dejarán de funcionar. Su API key también se elimina."
|
|
1983
|
+
delete_success: "Bridge eliminado correctamente."
|
|
1984
|
+
rotate_tooltip: "Rotar API key"
|
|
1985
|
+
rotate_confirmation: "¿Rotar la API key?"
|
|
1986
|
+
rotate_message: "Se emite una key nueva y la anterior se elimina. El bridge queda caído hasta que actualices IAT_BRIDGE_KEY en su .env."
|
|
1987
|
+
rotate_action: "Rotar key"
|
|
1988
|
+
rotate_success: "API key rotada. Actualiza IAT_BRIDGE_KEY en el bridge."
|
|
1989
|
+
load_error: "Error al cargar los bridges."
|
|
1990
|
+
save_error: "Error al guardar el bridge."
|
|
1991
|
+
delete_error: "Error al eliminar el bridge."
|
|
1992
|
+
rotate_error: "Error al rotar la API key."
|
|
1993
|
+
|
|
1863
1994
|
mcp_service_tokens:
|
|
1864
1995
|
menu_label: "Tokens MCP"
|
|
1865
1996
|
title: "Tokens MCP"
|
|
@@ -1915,7 +2046,6 @@ ui:
|
|
|
1915
2046
|
tab_settings: "Configuración"
|
|
1916
2047
|
tab_access: "Acceso"
|
|
1917
2048
|
tab_observability: "Observabilidad"
|
|
1918
|
-
tab_usage: "Uso"
|
|
1919
2049
|
save_success: "Configuración MCP guardada correctamente."
|
|
1920
2050
|
save_error: "No se pudo guardar la configuración MCP."
|
|
1921
2051
|
preview_error: "No se pudo generar la vista previa MCP."
|
|
@@ -2198,6 +2328,8 @@ ui:
|
|
|
2198
2328
|
use_prompt_assistant: "Usar Asistente de Prompts"
|
|
2199
2329
|
attach_files: "Adjuntar archivos"
|
|
2200
2330
|
view_attached_files: "Ver archivos adjuntos"
|
|
2331
|
+
send: "Enviar"
|
|
2332
|
+
stop: "Detener"
|
|
2201
2333
|
modals:
|
|
2202
2334
|
files_title: "Archivos Cargados"
|
|
2203
2335
|
feedback_title: "Tu Opinión es Importante"
|
|
@@ -2338,6 +2470,7 @@ rag:
|
|
|
2338
2470
|
|
|
2339
2471
|
flash_messages:
|
|
2340
2472
|
password_changed_success: "Tu contraseña ha sido restablecida exitosamente. Ahora puedes iniciar sesión."
|
|
2473
|
+
login_required: "Por favor, inicia sesión para continuar."
|
|
2341
2474
|
signup_success: "Registro exitoso. Por favor, revisa tu correo para verificar tu cuenta."
|
|
2342
2475
|
signup_success_no_verification: "Registro exitoso."
|
|
2343
2476
|
user_associated_success: "Usuario existente asociado exitosamente a la nueva empresa."
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Copyright (c) 2024 Fernando Libedinsky
|
|
2
|
+
# Product: IAToolkit
|
|
3
|
+
#
|
|
4
|
+
# IAToolkit is open source software.
|
|
5
|
+
|
|
6
|
+
from injector import inject
|
|
7
|
+
|
|
8
|
+
from iatoolkit.repositories.database_manager import DatabaseManager
|
|
9
|
+
from iatoolkit.repositories.models import Bridge, Company
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BridgeRepo:
|
|
13
|
+
@inject
|
|
14
|
+
def __init__(self, db_manager: DatabaseManager):
|
|
15
|
+
self.db_manager = db_manager
|
|
16
|
+
self.session = db_manager.get_session()
|
|
17
|
+
|
|
18
|
+
def create(self, bridge: Bridge) -> Bridge:
|
|
19
|
+
self.session.add(bridge)
|
|
20
|
+
self.session.commit()
|
|
21
|
+
return bridge
|
|
22
|
+
|
|
23
|
+
def update(self, bridge: Bridge) -> Bridge:
|
|
24
|
+
self.session.add(bridge)
|
|
25
|
+
self.session.commit()
|
|
26
|
+
return bridge
|
|
27
|
+
|
|
28
|
+
def delete(self, bridge: Bridge):
|
|
29
|
+
self.session.delete(bridge)
|
|
30
|
+
self.session.commit()
|
|
31
|
+
|
|
32
|
+
def get_by_company(self, company: Company) -> list[Bridge]:
|
|
33
|
+
return (
|
|
34
|
+
self.session.query(Bridge)
|
|
35
|
+
.filter(Bridge.company_id == company.id)
|
|
36
|
+
.order_by(Bridge.bridge_id.asc())
|
|
37
|
+
.all()
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def get_by_id(self, company: Company, bridge_pk: int) -> Bridge | None:
|
|
41
|
+
return (
|
|
42
|
+
self.session.query(Bridge)
|
|
43
|
+
.filter(Bridge.company_id == company.id, Bridge.id == bridge_pk)
|
|
44
|
+
.first()
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def get_by_bridge_id(self, company: Company, bridge_id: str) -> Bridge | None:
|
|
48
|
+
return (
|
|
49
|
+
self.session.query(Bridge)
|
|
50
|
+
.filter(Bridge.company_id == company.id, Bridge.bridge_id == bridge_id)
|
|
51
|
+
.first()
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def get_by_api_key_id(self, api_key_id: int) -> Bridge | None:
|
|
55
|
+
"""
|
|
56
|
+
Resolves the bridge a connecting agent belongs to from the API key it
|
|
57
|
+
authenticated with. This is what replaces deriving the bridge identity
|
|
58
|
+
from the key's name.
|
|
59
|
+
"""
|
|
60
|
+
return (
|
|
61
|
+
self.session.query(Bridge)
|
|
62
|
+
.filter(Bridge.api_key_id == api_key_id)
|
|
63
|
+
.first()
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def list_all(self) -> list[tuple[Bridge, Company]]:
|
|
67
|
+
"""
|
|
68
|
+
Every bridge across every company, joined with its company. Powers the
|
|
69
|
+
cross-tenant monitoring view in the hosting control center, which is
|
|
70
|
+
the one place that legitimately looks past a single company.
|
|
71
|
+
"""
|
|
72
|
+
return (
|
|
73
|
+
self.session.query(Bridge, Company)
|
|
74
|
+
.join(Company, Bridge.company_id == Company.id)
|
|
75
|
+
.order_by(Company.short_name.asc(), Bridge.bridge_id.asc())
|
|
76
|
+
.all()
|
|
77
|
+
)
|
|
@@ -174,6 +174,11 @@ class Company(Base):
|
|
|
174
174
|
back_populates="company",
|
|
175
175
|
cascade="all, delete-orphan",
|
|
176
176
|
)
|
|
177
|
+
bridges = relationship(
|
|
178
|
+
"Bridge",
|
|
179
|
+
back_populates="company",
|
|
180
|
+
cascade="all, delete-orphan",
|
|
181
|
+
)
|
|
177
182
|
sql_datasets = relationship(
|
|
178
183
|
"SqlDataset",
|
|
179
184
|
back_populates="company",
|
|
@@ -881,6 +886,77 @@ class SqlSource(Base):
|
|
|
881
886
|
return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
|
|
882
887
|
|
|
883
888
|
|
|
889
|
+
class Bridge(Base):
|
|
890
|
+
"""
|
|
891
|
+
An on-premise IAToolkit Bridge agent registered for a company.
|
|
892
|
+
|
|
893
|
+
Before this table, `bridge_id` was just the `key_name` of an API key,
|
|
894
|
+
referenced as free text from SQL sources and HTTP tools with nothing
|
|
895
|
+
linking the three. That had two costs worth remembering:
|
|
896
|
+
|
|
897
|
+
* `key_name` has no uniqueness constraint, so two companies could pick
|
|
898
|
+
the same bridge name and collide (see BridgeService's Redis key
|
|
899
|
+
helpers in iatoolkit-enterprise for how that is scoped now).
|
|
900
|
+
* A typo in a SQL source's `bridge_id` was indistinguishable at runtime
|
|
901
|
+
from a bridge that was simply down — both surfaced as
|
|
902
|
+
"Bridge '<id>' is not connected".
|
|
903
|
+
|
|
904
|
+
Identity now lives here, and the API key is a satellite pointed at by
|
|
905
|
+
`api_key_id`. That means the key can be rotated without touching
|
|
906
|
+
`bridge_id`, and renaming a key no longer breaks routing.
|
|
907
|
+
|
|
908
|
+
Columns below the identity block are runtime state, written by the
|
|
909
|
+
server as bridges connect and report in. They are denormalized here on
|
|
910
|
+
purpose: live status lives in Redis (cheap, high frequency) and is
|
|
911
|
+
flushed to this table on transitions and periodically, so that status
|
|
912
|
+
survives a worker restart and can be queried across companies for the
|
|
913
|
+
hosting control center.
|
|
914
|
+
"""
|
|
915
|
+
__tablename__ = "iat_bridges"
|
|
916
|
+
|
|
917
|
+
STATUS_CONNECTED = "connected"
|
|
918
|
+
STATUS_DISCONNECTED = "disconnected"
|
|
919
|
+
STATUS_NEVER_CONNECTED = "never_connected"
|
|
920
|
+
|
|
921
|
+
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
922
|
+
company_id = Column(Integer, ForeignKey(f"{ORM_SCHEMA}.iat_companies.id", ondelete="CASCADE"), nullable=False)
|
|
923
|
+
|
|
924
|
+
# Identity
|
|
925
|
+
bridge_id = Column(String, nullable=False)
|
|
926
|
+
display_name = Column(String, nullable=True)
|
|
927
|
+
description = Column(Text, nullable=True)
|
|
928
|
+
api_key_id = Column(Integer, ForeignKey(f"{ORM_SCHEMA}.iat_api_keys.id", ondelete="SET NULL"), nullable=True)
|
|
929
|
+
is_active = Column(Boolean, nullable=False, default=True)
|
|
930
|
+
|
|
931
|
+
# Runtime state
|
|
932
|
+
status = Column(String(32), nullable=False, default=STATUS_NEVER_CONNECTED)
|
|
933
|
+
last_connected_at = Column(DateTime, nullable=True)
|
|
934
|
+
last_seen_at = Column(DateTime, nullable=True)
|
|
935
|
+
last_disconnected_at = Column(DateTime, nullable=True)
|
|
936
|
+
last_disconnect_reason = Column(String, nullable=True)
|
|
937
|
+
|
|
938
|
+
# Telemetry reported by the agent
|
|
939
|
+
agent_version = Column(String, nullable=True)
|
|
940
|
+
capabilities = Column(JSON_NATIVE, nullable=False, default=list)
|
|
941
|
+
exposed_resources = Column(JSON_NATIVE, nullable=False, default=dict)
|
|
942
|
+
last_remote_addr = Column(String, nullable=True)
|
|
943
|
+
|
|
944
|
+
created_at = Column(DateTime, default=datetime.now)
|
|
945
|
+
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
|
|
946
|
+
|
|
947
|
+
__table_args__ = (
|
|
948
|
+
# bridge_id is chosen by the customer, so names like "prod" are
|
|
949
|
+
# expected — unique per company, not globally.
|
|
950
|
+
UniqueConstraint("company_id", "bridge_id", name="uix_company_bridge_id"),
|
|
951
|
+
)
|
|
952
|
+
|
|
953
|
+
company = relationship("Company", back_populates="bridges")
|
|
954
|
+
api_key = relationship("ApiKey")
|
|
955
|
+
|
|
956
|
+
def to_dict(self):
|
|
957
|
+
return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
|
|
958
|
+
|
|
959
|
+
|
|
884
960
|
class SqlDataset(Base):
|
|
885
961
|
"""
|
|
886
962
|
Reusable SQL dataset definitions for pipelines and other batch features.
|
|
@@ -107,6 +107,8 @@ class AuthService:
|
|
|
107
107
|
state: str,
|
|
108
108
|
nonce: str,
|
|
109
109
|
redirect_uri: str,
|
|
110
|
+
lang: str | None = None,
|
|
111
|
+
welcome_url: str | None = None,
|
|
110
112
|
) -> dict:
|
|
111
113
|
try:
|
|
112
114
|
google_identity = self.google_auth_client.exchange_code_for_identity(
|
|
@@ -156,6 +158,8 @@ class AuthService:
|
|
|
156
158
|
auth_response = self.profile_service.login_with_google(
|
|
157
159
|
company_short_name=company_short_name,
|
|
158
160
|
google_identity=google_identity,
|
|
161
|
+
lang=lang,
|
|
162
|
+
welcome_url=welcome_url,
|
|
159
163
|
)
|
|
160
164
|
|
|
161
165
|
if not auth_response.get('success'):
|
|
@@ -84,6 +84,33 @@ class llmClient:
|
|
|
84
84
|
return self._telemetry_service
|
|
85
85
|
|
|
86
86
|
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _assert_runtime_not_suspended(company: Company) -> None:
|
|
89
|
+
"""Refuse execution when a company's runtime spend guard is tripped.
|
|
90
|
+
|
|
91
|
+
The flag is written by whoever meters the company's consumption; this
|
|
92
|
+
layer only honours it, so nothing here knows about plans or invoices. A
|
|
93
|
+
suspended company keeps full read access — data queries and document
|
|
94
|
+
retrieval never reach a model and cost nothing — only execution stops.
|
|
95
|
+
|
|
96
|
+
This runs on the hot path of every execution, so it reads the company
|
|
97
|
+
object already in hand and never queries. It also fails open on purpose:
|
|
98
|
+
a problem reading the flag must never take a customer's operation down.
|
|
99
|
+
"""
|
|
100
|
+
try:
|
|
101
|
+
parameters = getattr(company, "parameters", None) or {}
|
|
102
|
+
guard = parameters.get("runtime_guard") or {}
|
|
103
|
+
if not guard.get("suspended"):
|
|
104
|
+
return
|
|
105
|
+
except Exception:
|
|
106
|
+
return
|
|
107
|
+
|
|
108
|
+
raise IAToolkitException(
|
|
109
|
+
IAToolkitException.ErrorType.INVALID_STATE,
|
|
110
|
+
"Runtime execution is paused for this company because the monthly "
|
|
111
|
+
"spend limit was reached. Data access is unaffected.",
|
|
112
|
+
)
|
|
113
|
+
|
|
87
114
|
def invoke(self,
|
|
88
115
|
company: Company,
|
|
89
116
|
user_identifier: str,
|
|
@@ -106,6 +133,8 @@ class llmClient:
|
|
|
106
133
|
response_contract: Optional[Dict[str, Any]] = None
|
|
107
134
|
) -> dict:
|
|
108
135
|
|
|
136
|
+
self._assert_runtime_not_suspended(company)
|
|
137
|
+
|
|
109
138
|
images = images or []
|
|
110
139
|
attachments = attachments or []
|
|
111
140
|
active_attachments = list(attachments)
|