iatoolkit 2.25.1__tar.gz → 2.26.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.25.1/src/iatoolkit.egg-info → iatoolkit-2.26.0}/PKG-INFO +1 -1
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_tools_pack.yaml +30 -20
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/file_connector.py +2 -2
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +3 -2
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +1 -1
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/local_file_connector.py +1 -1
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/s3_connector.py +46 -14
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/locales/en.yaml +51 -7
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/locales/es.yaml +51 -7
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +8 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/embedding_service.py +100 -9
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/markdown_wiki_service.py +66 -17
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/storage_service.py +12 -1
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/tenant_knowledge_wiki_service.py +161 -7
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/tool_service.py +20 -4
- {iatoolkit-2.25.1 → iatoolkit-2.26.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/LICENSE +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/pyproject.toml +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/readme.md +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/requirements.txt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/setup.cfg +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -276,8 +276,8 @@ tools:
|
|
|
276
276
|
description: "Opcional en la práctica. Usa null cuando no necesites filtrar por metadata. No inventes filtros ni envíes [] por defecto. Ejemplo: [{'key':'doc.type','value':'invoice'},{'key':'chunk.source_type','value':'table'}]."
|
|
277
277
|
required:
|
|
278
278
|
- query
|
|
279
|
-
- function_name:
|
|
280
|
-
description: Busca páginas publicadas dentro de las wikis de conocimiento compartidas por la empresa. Úsala
|
|
279
|
+
- function_name: iat_wiki_search
|
|
280
|
+
description: Busca páginas publicadas dentro de las wikis de conocimiento compartidas por la empresa. Úsala como acelerador cuando necesites encontrar rápidamente una página relevante, pero no como punto de entrada por defecto. Si no conoces un `path` válido, primero llama `iat_wiki_get_page` con `path="/"` para leer el índice raíz de la wiki y seguir sus links exactos. `wiki_key` es el identificador estable de una wiki publicada, por ejemplo `sales`, `ops` o `hr`; úsalo cuando ya sepas en qué wiki buscar y omítelo cuando quieras buscar en todas las wikis publicadas disponibles en esta conexión MCP. Esta tool devuelve candidatos; luego usa `iat_wiki_get_page` para leer la página completa antes de responder.
|
|
281
281
|
routing:
|
|
282
282
|
force_include_capability: has_knowledge_wikis
|
|
283
283
|
routing_profile:
|
|
@@ -292,15 +292,15 @@ tools:
|
|
|
292
292
|
- onboarding
|
|
293
293
|
- wiki
|
|
294
294
|
intents:
|
|
295
|
-
- Search curated company wiki pages
|
|
296
|
-
-
|
|
297
|
-
-
|
|
295
|
+
- Search curated company wiki pages when direct lookup is faster than browsing the root index.
|
|
296
|
+
- Find the relevant company wiki page after the user asks about internal procedures, policies, or runbooks.
|
|
297
|
+
- Narrow down which exact page to open with iat_wiki_get_page.
|
|
298
298
|
examples:
|
|
299
|
-
-
|
|
300
|
-
-
|
|
301
|
-
-
|
|
299
|
+
- iat_wiki_search(query="politica de descuentos enterprise", wiki_key="sales", limit=5)
|
|
300
|
+
- iat_wiki_search(query="como escalar incidentes sev1", wiki_key="ops", limit=3)
|
|
301
|
+
- iat_wiki_search(query="onboarding de nuevos ejecutivos", limit=5)
|
|
302
302
|
cost:
|
|
303
|
-
penalty: 0.
|
|
303
|
+
penalty: 0.09
|
|
304
304
|
latency_class: low
|
|
305
305
|
expensive: false
|
|
306
306
|
parameters:
|
|
@@ -308,22 +308,25 @@ tools:
|
|
|
308
308
|
properties:
|
|
309
309
|
query:
|
|
310
310
|
type: string
|
|
311
|
-
description:
|
|
311
|
+
description: Consulta en lenguaje natural sobre políticas, playbooks, procesos, runbooks o conocimiento curado publicado en las wikis del tenant.
|
|
312
312
|
wiki_key:
|
|
313
313
|
anyOf:
|
|
314
314
|
- type: string
|
|
315
315
|
- type: "null"
|
|
316
|
-
description: Clave
|
|
316
|
+
description: Clave estable de la wiki publicada, por ejemplo `sales`, `ops` o `hr`. Debe coincidir con el `wiki_key` expuesto por el catálogo/resource. Usa null para buscar en todas las wikis publicadas disponibles.
|
|
317
317
|
limit:
|
|
318
318
|
type: integer
|
|
319
|
-
description: Cantidad máxima de páginas a recuperar.
|
|
319
|
+
description: Cantidad máxima de páginas candidatas a recuperar antes de elegir una para leer completa.
|
|
320
320
|
minimum: 1
|
|
321
321
|
maximum: 25
|
|
322
322
|
required:
|
|
323
323
|
- query
|
|
324
324
|
- limit
|
|
325
|
-
- function_name:
|
|
326
|
-
description:
|
|
325
|
+
- function_name: iat_wiki_get_page
|
|
326
|
+
description: |-
|
|
327
|
+
Wiki entrypoint: llama `iat_wiki_get_page` con `path="/"` para cargar el índice raíz de una wiki de conocimiento publicada del tenant.
|
|
328
|
+
Lee UNA página de wiki y devuelve su contenido en Markdown. La wiki documenta contexto de negocio, áreas, sistemas internos, arquitectura, procesos, políticas, runbooks, onboarding, operaciones y glosarios. Es una wiki navegable por links: la página raíz `path="/"` es el punto de entrada y lista las páginas disponibles con sus paths exactos; después abre solo las páginas relevantes siguiendo esos links o los paths devueltos por `iat_wiki_search`.
|
|
329
|
+
`wiki_key` identifica la wiki publicada, por ejemplo `sales`, `ops` o `hr`. Los `path` son sensibles a mayúsculas y deben coincidir EXACTAMENTE con el link o path publicado; no los inventes ni los reconstruyas de memoria. Si no conoces un path válido, vuelve a llamar con `path="/"`. Esta tool es de solo lectura y es segura de usar siempre que la documentación interna de la empresa ayude a responder. Prefiere abrir pocas páginas puntuales antes de recorrer el corpus completo. Cuando respondas usando material de la wiki, cita la página usada.
|
|
327
330
|
routing:
|
|
328
331
|
force_include_capability: has_knowledge_wikis
|
|
329
332
|
routing_profile:
|
|
@@ -334,14 +337,21 @@ tools:
|
|
|
334
337
|
- page
|
|
335
338
|
- markdown
|
|
336
339
|
- wiki
|
|
340
|
+
- entrypoint
|
|
341
|
+
- index
|
|
342
|
+
- root
|
|
343
|
+
- internal_docs
|
|
337
344
|
intents:
|
|
338
|
-
-
|
|
345
|
+
- Load the root index of a tenant knowledge wiki with path="/".
|
|
346
|
+
- Open a published tenant wiki page by exact path or slug.
|
|
339
347
|
- Read the full markdown content of a company knowledge page before answering.
|
|
348
|
+
- Follow links from the root index or another wiki page to retrieve the exact page content.
|
|
340
349
|
examples:
|
|
341
|
-
-
|
|
342
|
-
-
|
|
350
|
+
- iat_wiki_get_page(wiki_key="sales", path="/")
|
|
351
|
+
- iat_wiki_get_page(wiki_key="sales", path="pricing.md")
|
|
352
|
+
- iat_wiki_get_page(wiki_key="ops", path="incident-response.md")
|
|
343
353
|
cost:
|
|
344
|
-
penalty: 0.
|
|
354
|
+
penalty: 0.01
|
|
345
355
|
latency_class: low
|
|
346
356
|
expensive: false
|
|
347
357
|
parameters:
|
|
@@ -349,10 +359,10 @@ tools:
|
|
|
349
359
|
properties:
|
|
350
360
|
wiki_key:
|
|
351
361
|
type: string
|
|
352
|
-
description: Clave de la wiki publicada
|
|
362
|
+
description: Clave estable de la wiki publicada, por ejemplo `sales`, `ops` o `hr`.
|
|
353
363
|
path:
|
|
354
364
|
type: string
|
|
355
|
-
description:
|
|
365
|
+
description: Usa `"/"` para leer el índice raíz de la wiki. En cualquier otro caso, envía el path o slug exacto de la página dentro de esa wiki, idealmente uno listado en el índice raíz o devuelto por `iat_wiki_search`.
|
|
356
366
|
required:
|
|
357
367
|
- wiki_key
|
|
358
368
|
- path
|
|
@@ -9,7 +9,7 @@ from typing import List, Optional
|
|
|
9
9
|
|
|
10
10
|
class FileConnector(ABC):
|
|
11
11
|
@abstractmethod
|
|
12
|
-
def list_files(self) -> List[str]:
|
|
12
|
+
def list_files(self, prefix: str | None = None) -> List[str]:
|
|
13
13
|
pass
|
|
14
14
|
|
|
15
15
|
@abstractmethod
|
|
@@ -25,4 +25,4 @@ class FileConnector(ABC):
|
|
|
25
25
|
pass
|
|
26
26
|
|
|
27
27
|
def generate_presigned_url(self, file_path: str, expiration: int = 3600) -> Optional[str]:
|
|
28
|
-
return None
|
|
28
|
+
return None
|
|
@@ -36,11 +36,12 @@ class GoogleCloudStorageConnector(FileConnector):
|
|
|
36
36
|
client = storage.Client.from_service_account_json(self.service_account_path)
|
|
37
37
|
return client
|
|
38
38
|
|
|
39
|
-
def list_files(self) -> List[dict]:
|
|
39
|
+
def list_files(self, prefix: str | None = None) -> List[dict]:
|
|
40
40
|
"""
|
|
41
41
|
Lista todos los archivos en el bucket de GCS como diccionarios con claves 'path', 'name' y 'metadata'.
|
|
42
42
|
"""
|
|
43
|
-
|
|
43
|
+
normalized_prefix = str(prefix or "").strip().strip("/") or None
|
|
44
|
+
blobs = self.bucket.list_blobs(prefix=normalized_prefix)
|
|
44
45
|
|
|
45
46
|
return [
|
|
46
47
|
{
|
{iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/google_drive_connector.py
RENAMED
|
@@ -52,7 +52,7 @@ class GoogleDriveConnector(FileConnector):
|
|
|
52
52
|
)
|
|
53
53
|
return service
|
|
54
54
|
|
|
55
|
-
def list_files(self) -> List[dict]:
|
|
55
|
+
def list_files(self, prefix: str | None = None) -> List[dict]:
|
|
56
56
|
"""
|
|
57
57
|
Estándar: Lista todos los archivos como diccionarios con claves 'path', 'name' y 'metadata'.
|
|
58
58
|
"""
|
{iatoolkit-2.25.1 → iatoolkit-2.26.0}/src/iatoolkit/infra/connectors/local_file_connector.py
RENAMED
|
@@ -14,7 +14,7 @@ class LocalFileConnector(FileConnector):
|
|
|
14
14
|
local_root = os.getenv("ROOT_DIR_LOCAL_FILES", '')
|
|
15
15
|
self.directory = os.path.join(local_root, directory)
|
|
16
16
|
|
|
17
|
-
def list_files(self) -> List[dict]:
|
|
17
|
+
def list_files(self, prefix: str | None = None) -> List[dict]:
|
|
18
18
|
"""
|
|
19
19
|
Estándar: Lista todos los archivos como diccionarios con claves 'path', 'name' y 'metadata'.
|
|
20
20
|
"""
|
|
@@ -15,21 +15,32 @@ class S3Connector(FileConnector):
|
|
|
15
15
|
self.folder = folder
|
|
16
16
|
self.s3 = boto3.client('s3', **auth)
|
|
17
17
|
|
|
18
|
-
def list_files(self) -> List[dict]:
|
|
18
|
+
def list_files(self, prefix: str | None = None) -> List[dict]:
|
|
19
19
|
# List only real S3 objects representing files, excluding folder placeholders.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
list_prefix = self._resolve_list_prefix(prefix)
|
|
21
|
+
files = []
|
|
22
|
+
continuation_token = None
|
|
23
|
+
|
|
24
|
+
while True:
|
|
25
|
+
params = {
|
|
26
|
+
"Bucket": self.bucket,
|
|
27
|
+
"Prefix": list_prefix,
|
|
28
|
+
}
|
|
29
|
+
if continuation_token:
|
|
30
|
+
params["ContinuationToken"] = continuation_token
|
|
31
|
+
|
|
32
|
+
response = self.s3.list_objects_v2(**params)
|
|
33
|
+
files.extend(
|
|
34
|
+
obj for obj in response.get('Contents', [])
|
|
35
|
+
if self._is_file_key(obj.get('Key'))
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
if not response.get("IsTruncated"):
|
|
39
|
+
break
|
|
40
|
+
|
|
41
|
+
continuation_token = response.get("NextContinuationToken")
|
|
42
|
+
if not continuation_token:
|
|
43
|
+
break
|
|
33
44
|
|
|
34
45
|
return [
|
|
35
46
|
{
|
|
@@ -44,6 +55,27 @@ class S3Connector(FileConnector):
|
|
|
44
55
|
for obj in files
|
|
45
56
|
]
|
|
46
57
|
|
|
58
|
+
def _resolve_list_prefix(self, requested_prefix: str | None) -> str:
|
|
59
|
+
base_prefix = "/".join(p.strip("/") for p in [self.prefix, self.folder] if p)
|
|
60
|
+
normalized_requested = str(requested_prefix or "").strip().strip("/")
|
|
61
|
+
|
|
62
|
+
if normalized_requested:
|
|
63
|
+
if base_prefix and (
|
|
64
|
+
normalized_requested == base_prefix
|
|
65
|
+
or normalized_requested.startswith(f"{base_prefix}/")
|
|
66
|
+
):
|
|
67
|
+
effective_prefix = normalized_requested
|
|
68
|
+
elif base_prefix:
|
|
69
|
+
effective_prefix = "/".join([base_prefix, normalized_requested])
|
|
70
|
+
else:
|
|
71
|
+
effective_prefix = normalized_requested
|
|
72
|
+
else:
|
|
73
|
+
effective_prefix = base_prefix
|
|
74
|
+
|
|
75
|
+
if effective_prefix:
|
|
76
|
+
return f"{effective_prefix.rstrip('/')}/"
|
|
77
|
+
return ""
|
|
78
|
+
|
|
47
79
|
def _is_file_key(self, key: str | None) -> bool:
|
|
48
80
|
return isinstance(key, str) and key != "" and not key.endswith("/")
|
|
49
81
|
|
|
@@ -626,10 +626,15 @@ ui:
|
|
|
626
626
|
title: "Knowledge wikis"
|
|
627
627
|
wikis: "Wikis"
|
|
628
628
|
new_wiki: "New wiki"
|
|
629
|
+
create_wiki: "Create wiki"
|
|
630
|
+
select_wiki: "Select a wiki"
|
|
631
|
+
workspace_placeholder: "Choose a wiki from the list or create a new one."
|
|
629
632
|
configure: "Configuration"
|
|
630
633
|
key: "Key"
|
|
631
634
|
name: "Name"
|
|
632
635
|
root: "Storage root"
|
|
636
|
+
edit_root: "Edit storage root"
|
|
637
|
+
lock_root: "Lock storage root editing"
|
|
633
638
|
status: "Status"
|
|
634
639
|
status_published: "Published"
|
|
635
640
|
status_draft: "Draft"
|
|
@@ -638,25 +643,64 @@ ui:
|
|
|
638
643
|
pages: "Pages"
|
|
639
644
|
index: "Index"
|
|
640
645
|
mcp: "MCP"
|
|
641
|
-
|
|
646
|
+
mcp_status: "MCP publication"
|
|
647
|
+
mcp_status_published: "Published"
|
|
648
|
+
mcp_status_unpublished: "Not published"
|
|
649
|
+
mcp_status_published_help: "This wiki index is already exposed as a resource in the tenant MCP catalog."
|
|
650
|
+
mcp_status_unpublished_help: "This wiki does not yet expose its index as an MCP resource."
|
|
651
|
+
mcp_wiki_key: "MCP wiki_key"
|
|
652
|
+
lint: "Validate"
|
|
653
|
+
validate: "Validate"
|
|
654
|
+
validation_results: "Validation results"
|
|
642
655
|
sync: "Sync"
|
|
643
656
|
issues: "issues"
|
|
644
|
-
index_resource: "
|
|
657
|
+
index_resource: "Resource URI"
|
|
658
|
+
mcp_publish_help: "This action publishes only this wiki's markdown index resource into MCP."
|
|
659
|
+
mcp_tools_help: "The tools iat_wiki_search and iat_wiki_get_page are enabled separately from the MCP manager."
|
|
660
|
+
mcp_step_publish_title: "1. Publish resource"
|
|
661
|
+
mcp_step_publish_text: "The Publish to MCP button adds or updates `iat://knowledge-wikis/{wiki_key}/index` in the tenant MCP resources."
|
|
662
|
+
mcp_step_tools_title: "2. Enable tools"
|
|
663
|
+
mcp_step_tools_text: "If you want tool-based search or page reads, enable `iat_wiki_search` and `iat_wiki_get_page` from the MCP manager."
|
|
664
|
+
mcp_step_usage_title: "3. Use wiki_key and path"
|
|
665
|
+
mcp_step_usage_text: "MCP clients can read this index first to discover pages, then use `wiki_key` and `path` with the tools."
|
|
645
666
|
copy_uri: "Copy URI"
|
|
646
667
|
publish_mcp: "Publish to MCP"
|
|
647
|
-
|
|
668
|
+
republish_mcp: "Update publication"
|
|
669
|
+
open_mcp: "Open MCP manager"
|
|
648
670
|
filter_pages: "Filter pages"
|
|
649
671
|
loading: "Loading..."
|
|
650
672
|
empty: "No wikis configured."
|
|
651
673
|
no_pages: "No pages."
|
|
652
|
-
no_issues: "No issues."
|
|
674
|
+
no_issues: "No issues found."
|
|
675
|
+
lint_summary_clean: "Checked {count} indexed pages. No issues found."
|
|
676
|
+
lint_summary_issues: "Checked {count} indexed pages. Found {issues} issues."
|
|
653
677
|
missing_key: "Wiki key is required."
|
|
654
678
|
save_ok: "Wiki saved."
|
|
655
679
|
save_error: "Could not save wiki."
|
|
656
|
-
|
|
680
|
+
delete_confirmation: "Delete wiki"
|
|
681
|
+
delete_message: "This removes the wiki configuration, generated index, and indexed pages. Source markdown files in storage are not deleted."
|
|
682
|
+
delete_ok: "Wiki deleted."
|
|
683
|
+
delete_error: "Could not delete wiki."
|
|
684
|
+
sync_ok: "Sync completed."
|
|
685
|
+
sync_partial_ok: "Sync completed with errors."
|
|
657
686
|
sync_error: "Could not sync wiki."
|
|
658
|
-
|
|
659
|
-
|
|
687
|
+
sync_running: "Syncing..."
|
|
688
|
+
sync_results: "Sync result"
|
|
689
|
+
sync_status_idle: "Not run"
|
|
690
|
+
sync_status_success: "Completed"
|
|
691
|
+
sync_status_partial: "Completed with errors"
|
|
692
|
+
sync_status_error: "Failed"
|
|
693
|
+
sync_seen: "Files seen"
|
|
694
|
+
sync_indexed: "Pages indexed"
|
|
695
|
+
sync_failed: "Failed"
|
|
696
|
+
sync_finished_at: "Finished"
|
|
697
|
+
sync_first_error: "First error"
|
|
698
|
+
sync_summary_success: "Reviewed {seen} markdown files and indexed {indexed} pages."
|
|
699
|
+
sync_summary_partial: "Reviewed {seen} markdown files, indexed {indexed} pages, and found {failed} failures."
|
|
700
|
+
sync_summary_error: "Sync failed after reviewing {seen} markdown files. {failed} files could not be indexed."
|
|
701
|
+
sync_summary_empty: "No markdown files were found under this storage root."
|
|
702
|
+
lint_ok: "Validation completed."
|
|
703
|
+
lint_error: "Could not validate wiki."
|
|
660
704
|
mcp_ok: "Wiki published to MCP."
|
|
661
705
|
mcp_error: "Could not publish to MCP."
|
|
662
706
|
copy_ok: "URI copied."
|
|
@@ -626,10 +626,15 @@ ui:
|
|
|
626
626
|
title: "Wikis de conocimiento"
|
|
627
627
|
wikis: "Wikis"
|
|
628
628
|
new_wiki: "Nueva wiki"
|
|
629
|
+
create_wiki: "Crear wiki"
|
|
630
|
+
select_wiki: "Selecciona una wiki"
|
|
631
|
+
workspace_placeholder: "Elige una wiki del listado o crea una nueva."
|
|
629
632
|
configure: "Configuración"
|
|
630
633
|
key: "Clave"
|
|
631
634
|
name: "Nombre"
|
|
632
635
|
root: "Raíz storage"
|
|
636
|
+
edit_root: "Editar raíz storage"
|
|
637
|
+
lock_root: "Bloquear edición de raíz storage"
|
|
633
638
|
status: "Estado"
|
|
634
639
|
status_published: "Publicada"
|
|
635
640
|
status_draft: "Borrador"
|
|
@@ -638,25 +643,64 @@ ui:
|
|
|
638
643
|
pages: "Páginas"
|
|
639
644
|
index: "Índice"
|
|
640
645
|
mcp: "MCP"
|
|
641
|
-
|
|
646
|
+
mcp_status: "Publicación MCP"
|
|
647
|
+
mcp_status_published: "Publicado"
|
|
648
|
+
mcp_status_unpublished: "No publicado"
|
|
649
|
+
mcp_status_published_help: "El índice de esta wiki ya está expuesto como resource en el catálogo MCP del tenant."
|
|
650
|
+
mcp_status_unpublished_help: "Esta wiki todavía no expone su índice como resource MCP."
|
|
651
|
+
mcp_wiki_key: "wiki_key MCP"
|
|
652
|
+
lint: "Validar"
|
|
653
|
+
validate: "Validar"
|
|
654
|
+
validation_results: "Resultados de validación"
|
|
642
655
|
sync: "Sincronizar"
|
|
643
656
|
issues: "hallazgos"
|
|
644
|
-
index_resource: "
|
|
657
|
+
index_resource: "URI del resource"
|
|
658
|
+
mcp_publish_help: "Esta acción publica en MCP solo el resource del índice markdown de esta wiki."
|
|
659
|
+
mcp_tools_help: "Las tools iat_wiki_search e iat_wiki_get_page se habilitan por separado desde el gestor MCP."
|
|
660
|
+
mcp_step_publish_title: "1. Publicar resource"
|
|
661
|
+
mcp_step_publish_text: "El botón Publicar en MCP agrega o actualiza `iat://knowledge-wikis/{wiki_key}/index` dentro de los resources MCP del tenant."
|
|
662
|
+
mcp_step_tools_title: "2. Habilitar tools"
|
|
663
|
+
mcp_step_tools_text: "Si quieres búsqueda o lectura por tool, habilita `iat_wiki_search` e `iat_wiki_get_page` desde el gestor MCP."
|
|
664
|
+
mcp_step_usage_title: "3. Usar wiki_key y path"
|
|
665
|
+
mcp_step_usage_text: "Los clientes MCP pueden leer primero este índice para descubrir páginas y luego usar `wiki_key` y `path` en las tools."
|
|
645
666
|
copy_uri: "Copiar URI"
|
|
646
667
|
publish_mcp: "Publicar en MCP"
|
|
647
|
-
|
|
668
|
+
republish_mcp: "Actualizar publicación"
|
|
669
|
+
open_mcp: "Abrir gestor MCP"
|
|
648
670
|
filter_pages: "Filtrar páginas"
|
|
649
671
|
loading: "Cargando..."
|
|
650
672
|
empty: "No hay wikis configuradas."
|
|
651
673
|
no_pages: "No hay páginas."
|
|
652
|
-
no_issues: "Sin
|
|
674
|
+
no_issues: "Sin hallazgos."
|
|
675
|
+
lint_summary_clean: "Se revisaron {count} páginas indexadas. No se encontraron hallazgos."
|
|
676
|
+
lint_summary_issues: "Se revisaron {count} páginas indexadas. Se encontraron {issues} hallazgos."
|
|
653
677
|
missing_key: "Debes ingresar una key de wiki."
|
|
654
678
|
save_ok: "Wiki guardada."
|
|
655
679
|
save_error: "No se pudo guardar la wiki."
|
|
656
|
-
|
|
680
|
+
delete_confirmation: "Eliminar wiki"
|
|
681
|
+
delete_message: "Se borrará la configuración de la wiki, el índice generado y las páginas indexadas. Los archivos markdown fuente del storage no se borran."
|
|
682
|
+
delete_ok: "Wiki eliminada."
|
|
683
|
+
delete_error: "No se pudo eliminar la wiki."
|
|
684
|
+
sync_ok: "Sincronización completada."
|
|
685
|
+
sync_partial_ok: "Sincronización completada con errores."
|
|
657
686
|
sync_error: "No se pudo sincronizar la wiki."
|
|
658
|
-
|
|
659
|
-
|
|
687
|
+
sync_running: "Sincronizando..."
|
|
688
|
+
sync_results: "Resultado de sincronización"
|
|
689
|
+
sync_status_idle: "Sin ejecutar"
|
|
690
|
+
sync_status_success: "Completada"
|
|
691
|
+
sync_status_partial: "Con errores"
|
|
692
|
+
sync_status_error: "Falló"
|
|
693
|
+
sync_seen: "Archivos vistos"
|
|
694
|
+
sync_indexed: "Páginas indexadas"
|
|
695
|
+
sync_failed: "Fallidas"
|
|
696
|
+
sync_finished_at: "Finalizó"
|
|
697
|
+
sync_first_error: "Primer error"
|
|
698
|
+
sync_summary_success: "Se revisaron {seen} archivos markdown y se indexaron {indexed} páginas."
|
|
699
|
+
sync_summary_partial: "Se revisaron {seen} archivos markdown, se indexaron {indexed} páginas y {failed} fallaron."
|
|
700
|
+
sync_summary_error: "La sincronización falló después de revisar {seen} archivos markdown. {failed} archivos no pudieron indexarse."
|
|
701
|
+
sync_summary_empty: "No se encontraron archivos markdown bajo esta raíz de storage."
|
|
702
|
+
lint_ok: "Validación completada."
|
|
703
|
+
lint_error: "No se pudo validar la wiki."
|
|
660
704
|
mcp_ok: "Wiki publicada en MCP."
|
|
661
705
|
mcp_error: "No se pudo publicar en MCP."
|
|
662
706
|
copy_ok: "URI copiada."
|
|
@@ -89,6 +89,14 @@ class KnowledgeWikiRepo:
|
|
|
89
89
|
self.session.commit()
|
|
90
90
|
return wiki
|
|
91
91
|
|
|
92
|
+
def delete_wiki(self, company_id: int, wiki_key: str) -> KnowledgeWiki | None:
|
|
93
|
+
wiki = self.get_wiki_by_key(company_id, wiki_key)
|
|
94
|
+
if wiki is None:
|
|
95
|
+
return None
|
|
96
|
+
self.session.delete(wiki)
|
|
97
|
+
self.session.commit()
|
|
98
|
+
return wiki
|
|
99
|
+
|
|
92
100
|
def get_page_by_path(self, wiki_id: int, path: str) -> KnowledgeWikiPage | None:
|
|
93
101
|
if not wiki_id or not path:
|
|
94
102
|
return None
|
|
@@ -181,16 +181,73 @@ class EmbeddingClientFactory:
|
|
|
181
181
|
)
|
|
182
182
|
self._clients = {} # Cache for storing initialized client wrappers
|
|
183
183
|
|
|
184
|
+
@staticmethod
|
|
185
|
+
def _freeze_value(value):
|
|
186
|
+
if isinstance(value, dict):
|
|
187
|
+
return tuple(
|
|
188
|
+
(str(key), EmbeddingClientFactory._freeze_value(item))
|
|
189
|
+
for key, item in sorted(value.items(), key=lambda pair: str(pair[0]))
|
|
190
|
+
)
|
|
191
|
+
if isinstance(value, list):
|
|
192
|
+
return tuple(EmbeddingClientFactory._freeze_value(item) for item in value)
|
|
193
|
+
return value
|
|
194
|
+
|
|
195
|
+
def _build_cache_key(
|
|
196
|
+
self,
|
|
197
|
+
company_short_name: str,
|
|
198
|
+
model_type: str,
|
|
199
|
+
config_section: str,
|
|
200
|
+
provider: str,
|
|
201
|
+
model: str | None,
|
|
202
|
+
dimensions: Optional[int],
|
|
203
|
+
embedding_config: dict,
|
|
204
|
+
openai_client_config: dict | None = None,
|
|
205
|
+
) -> tuple:
|
|
206
|
+
cache_payload = {"embedding_config": dict(embedding_config or {})}
|
|
207
|
+
if provider == "openai" and isinstance(openai_client_config, dict):
|
|
208
|
+
cache_payload["openai_client_config"] = {
|
|
209
|
+
"api_key": openai_client_config.get("api_key") or "",
|
|
210
|
+
"base_url": openai_client_config.get("base_url") or "",
|
|
211
|
+
"default_headers": dict(openai_client_config.get("default_headers") or {}),
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return (
|
|
215
|
+
company_short_name,
|
|
216
|
+
model_type,
|
|
217
|
+
config_section,
|
|
218
|
+
provider,
|
|
219
|
+
model or "",
|
|
220
|
+
dimensions,
|
|
221
|
+
self._freeze_value(cache_payload),
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def _drop_stale_cache_entries(self, company_short_name: str, model_type: str, active_cache_key: tuple) -> None:
|
|
225
|
+
stale_keys = [
|
|
226
|
+
key
|
|
227
|
+
for key in self._clients
|
|
228
|
+
if key[:2] == (company_short_name, model_type) and key != active_cache_key
|
|
229
|
+
]
|
|
230
|
+
for stale_key in stale_keys:
|
|
231
|
+
self._clients.pop(stale_key, None)
|
|
232
|
+
|
|
233
|
+
@staticmethod
|
|
234
|
+
def _describe_transport(provider: str, openai_client_config: dict | None = None) -> str:
|
|
235
|
+
if provider != "openai":
|
|
236
|
+
return provider
|
|
237
|
+
|
|
238
|
+
base_url = str((openai_client_config or {}).get("base_url") or "").strip().lower()
|
|
239
|
+
if "gateway.ai.cloudflare.com" in base_url:
|
|
240
|
+
return "cloudflare/provider_native"
|
|
241
|
+
if base_url:
|
|
242
|
+
return "custom"
|
|
243
|
+
return "direct"
|
|
244
|
+
|
|
184
245
|
def get_client(self, company_short_name: str, model_type: str = 'text') -> EmbeddingClientWrapper:
|
|
185
246
|
"""
|
|
186
247
|
Retrieves a configured embedding client wrapper for a specific company.
|
|
187
248
|
If the client is not in the cache, it creates and stores it.
|
|
188
249
|
model_type: 'text' or 'image'
|
|
189
250
|
"""
|
|
190
|
-
cache_key = (company_short_name, model_type)
|
|
191
|
-
if cache_key in self._clients:
|
|
192
|
-
return self._clients[cache_key]
|
|
193
|
-
|
|
194
251
|
# Determine config section based on model type
|
|
195
252
|
config_section = 'visual_embedding_provider' if model_type in ['image', 'image_query'] else 'embedding_provider'
|
|
196
253
|
|
|
@@ -213,6 +270,32 @@ class EmbeddingClientFactory:
|
|
|
213
270
|
# Extract class path if provider is custom
|
|
214
271
|
class_path = embedding_config.get('class_path')
|
|
215
272
|
|
|
273
|
+
openai_client_config = None
|
|
274
|
+
if provider == 'openai':
|
|
275
|
+
openai_client_config = self._get_openai_client_config(company_short_name, embedding_config)
|
|
276
|
+
|
|
277
|
+
cache_key = self._build_cache_key(
|
|
278
|
+
company_short_name=company_short_name,
|
|
279
|
+
model_type=model_type,
|
|
280
|
+
config_section=config_section,
|
|
281
|
+
provider=provider,
|
|
282
|
+
model=model,
|
|
283
|
+
dimensions=dimensions,
|
|
284
|
+
embedding_config=embedding_config,
|
|
285
|
+
openai_client_config=openai_client_config,
|
|
286
|
+
)
|
|
287
|
+
if cache_key in self._clients:
|
|
288
|
+
logging.debug(
|
|
289
|
+
"Reusing embedding client (%s) for '%s' from %s with model: %s provider=%s transport=%s",
|
|
290
|
+
model_type,
|
|
291
|
+
company_short_name,
|
|
292
|
+
config_section,
|
|
293
|
+
model,
|
|
294
|
+
provider,
|
|
295
|
+
self._describe_transport(provider, openai_client_config),
|
|
296
|
+
)
|
|
297
|
+
return self._clients[cache_key]
|
|
298
|
+
|
|
216
299
|
# Logic to handle multiple providers
|
|
217
300
|
wrapper = None
|
|
218
301
|
if provider == 'custom_class':
|
|
@@ -276,11 +359,10 @@ class EmbeddingClientFactory:
|
|
|
276
359
|
)
|
|
277
360
|
|
|
278
361
|
elif provider == 'openai':
|
|
279
|
-
client_config = self._get_openai_client_config(company_short_name, embedding_config)
|
|
280
362
|
client = OpenAI(
|
|
281
|
-
api_key=
|
|
282
|
-
base_url=
|
|
283
|
-
default_headers=
|
|
363
|
+
api_key=openai_client_config["api_key"],
|
|
364
|
+
base_url=openai_client_config["base_url"] or None,
|
|
365
|
+
default_headers=openai_client_config["default_headers"] or None,
|
|
284
366
|
)
|
|
285
367
|
if not model:
|
|
286
368
|
model='text-embedding-ada-002'
|
|
@@ -288,7 +370,16 @@ class EmbeddingClientFactory:
|
|
|
288
370
|
else:
|
|
289
371
|
raise NotImplementedError(f"Embedding provider '{provider}' is not implemented.")
|
|
290
372
|
|
|
291
|
-
|
|
373
|
+
self._drop_stale_cache_entries(company_short_name, model_type, cache_key)
|
|
374
|
+
logging.debug(
|
|
375
|
+
"Embedding client (%s) for '%s' created from %s with model: %s provider=%s transport=%s",
|
|
376
|
+
model_type,
|
|
377
|
+
company_short_name,
|
|
378
|
+
config_section,
|
|
379
|
+
model,
|
|
380
|
+
provider,
|
|
381
|
+
self._describe_transport(provider, openai_client_config),
|
|
382
|
+
)
|
|
292
383
|
self._clients[cache_key] = wrapper
|
|
293
384
|
return wrapper
|
|
294
385
|
|