iatoolkit 2.30.0__tar.gz → 2.32.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.30.0/src/iatoolkit.egg-info → iatoolkit-2.32.0}/PKG-INFO +1 -1
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/document_repo.py +12 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/llm_query_repo.py +3 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/models.py +1 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/vs_repo.py +83 -6
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/context_builder_service.py +17 -3
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/knowledge_base_service.py +93 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/prompt_service.py +52 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/query_service.py +9 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/tool_service.py +3 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/warmup_service.py +44 -6
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/rag_api_view.py +6 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/LICENSE +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/pyproject.toml +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/readme.md +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/requirements.txt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/setup.cfg +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/locales/en.yaml +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/locales/es.yaml +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -27,6 +27,18 @@ class DocumentRepo:
|
|
|
27
27
|
self.session.commit()
|
|
28
28
|
return document_image
|
|
29
29
|
|
|
30
|
+
def get_document_images(self, document_id: int, limit: int | None = None) -> list[DocumentImage]:
|
|
31
|
+
if not document_id:
|
|
32
|
+
return []
|
|
33
|
+
query = (
|
|
34
|
+
self.session.query(DocumentImage)
|
|
35
|
+
.filter(DocumentImage.document_id == document_id)
|
|
36
|
+
.order_by(DocumentImage.page.asc(), DocumentImage.image_index.asc(), DocumentImage.id.asc())
|
|
37
|
+
)
|
|
38
|
+
if limit is not None:
|
|
39
|
+
query = query.limit(max(int(limit), 0))
|
|
40
|
+
return list(query.all())
|
|
41
|
+
|
|
30
42
|
def get(self, company_id, filename: str ) -> Document:
|
|
31
43
|
if not company_id or not filename:
|
|
32
44
|
raise IAToolkitException(IAToolkitException.ErrorType.PARAM_NOT_FILLED,
|
|
@@ -194,6 +194,7 @@ class LLMQueryRepo:
|
|
|
194
194
|
prompt.queue_tier = getattr(new_prompt, "queue_tier", None) or prompt.queue_tier or "default"
|
|
195
195
|
prompt.llm_request_options = dict(new_prompt.llm_request_options or {})
|
|
196
196
|
prompt.tool_policy = dict(new_prompt.tool_policy or {})
|
|
197
|
+
prompt.context_policy = dict(getattr(new_prompt, "context_policy", None) or {})
|
|
197
198
|
else:
|
|
198
199
|
if new_prompt.active is None:
|
|
199
200
|
new_prompt.active = True
|
|
@@ -221,6 +222,8 @@ class LLMQueryRepo:
|
|
|
221
222
|
new_prompt.llm_request_options = {}
|
|
222
223
|
if new_prompt.tool_policy is None:
|
|
223
224
|
new_prompt.tool_policy = {}
|
|
225
|
+
if getattr(new_prompt, "context_policy", None) is None:
|
|
226
|
+
new_prompt.context_policy = {}
|
|
224
227
|
self.session.add(new_prompt)
|
|
225
228
|
prompt = new_prompt
|
|
226
229
|
|
|
@@ -740,6 +740,7 @@ class Prompt(Base):
|
|
|
740
740
|
queue_tier = Column(String, nullable=False, default="default")
|
|
741
741
|
llm_request_options = Column(JSON_NATIVE, nullable=False, default=dict)
|
|
742
742
|
tool_policy = Column(JSON_NATIVE, nullable=False, default=dict)
|
|
743
|
+
context_policy = Column(JSON_NATIVE, nullable=False, default=dict)
|
|
743
744
|
created_at = Column(DateTime, default=datetime.now)
|
|
744
745
|
|
|
745
746
|
def to_dict(self):
|
|
@@ -7,6 +7,7 @@ import ast
|
|
|
7
7
|
import json
|
|
8
8
|
import logging
|
|
9
9
|
import re
|
|
10
|
+
from time import perf_counter
|
|
10
11
|
from typing import Dict, List
|
|
11
12
|
|
|
12
13
|
from sqlalchemy import text
|
|
@@ -80,6 +81,21 @@ class VSRepo:
|
|
|
80
81
|
self.session.rollback()
|
|
81
82
|
raise e
|
|
82
83
|
|
|
84
|
+
def get_document_tables(self, document_id: int, limit: int | None = None) -> list[VSDoc]:
|
|
85
|
+
if not document_id:
|
|
86
|
+
return []
|
|
87
|
+
query = (
|
|
88
|
+
self.session.query(VSDoc)
|
|
89
|
+
.filter(
|
|
90
|
+
VSDoc.document_id == document_id,
|
|
91
|
+
VSDoc.meta["source_type"].as_string() == "table",
|
|
92
|
+
)
|
|
93
|
+
.order_by(VSDoc.id.asc())
|
|
94
|
+
)
|
|
95
|
+
if limit is not None:
|
|
96
|
+
query = query.limit(max(int(limit), 0))
|
|
97
|
+
return list(query.all())
|
|
98
|
+
|
|
83
99
|
def query(self,
|
|
84
100
|
company_short_name: str,
|
|
85
101
|
query_text: str,
|
|
@@ -101,36 +117,70 @@ class VSRepo:
|
|
|
101
117
|
Returns:
|
|
102
118
|
list of documents matching the query and filters
|
|
103
119
|
"""
|
|
120
|
+
query_started_at = perf_counter()
|
|
121
|
+
embedding_started_at = perf_counter()
|
|
104
122
|
# Generate the embedding with the query text for the specific company
|
|
105
123
|
try:
|
|
106
124
|
query_embedding = self.embedding_service.embed_text(company_short_name, query_text)
|
|
107
125
|
except Exception as e:
|
|
108
|
-
logging.error(
|
|
126
|
+
logging.error(
|
|
127
|
+
"RAG vector query embedding failed: company=%s duration_ms=%s error=%s",
|
|
128
|
+
company_short_name,
|
|
129
|
+
round((perf_counter() - embedding_started_at) * 1000),
|
|
130
|
+
str(e),
|
|
131
|
+
)
|
|
109
132
|
raise IAToolkitException(IAToolkitException.ErrorType.EMBEDDING_ERROR,
|
|
110
133
|
f"embedding error: {str(e)}")
|
|
134
|
+
embedding_duration_ms = round((perf_counter() - embedding_started_at) * 1000)
|
|
135
|
+
try:
|
|
136
|
+
embedding_dimensions = len(query_embedding)
|
|
137
|
+
except TypeError as exc:
|
|
138
|
+
raise IAToolkitException(
|
|
139
|
+
IAToolkitException.ErrorType.EMBEDDING_ERROR,
|
|
140
|
+
"embedding error: query embedding has no dimensions",
|
|
141
|
+
) from exc
|
|
142
|
+
if embedding_dimensions < 1 or embedding_dimensions > 2000:
|
|
143
|
+
raise IAToolkitException(
|
|
144
|
+
IAToolkitException.ErrorType.EMBEDDING_ERROR,
|
|
145
|
+
f"embedding error: unsupported query embedding dimensions ({embedding_dimensions})",
|
|
146
|
+
)
|
|
111
147
|
|
|
112
148
|
sql_query, params = None, None
|
|
113
149
|
try:
|
|
114
150
|
# Get company ID from its short name for the SQL query
|
|
151
|
+
company_lookup_started_at = perf_counter()
|
|
115
152
|
company = self.session.query(Company).filter(Company.short_name == company_short_name).one_or_none()
|
|
153
|
+
company_lookup_duration_ms = round((perf_counter() - company_lookup_started_at) * 1000)
|
|
116
154
|
if not company:
|
|
117
155
|
raise IAToolkitException(IAToolkitException.ErrorType.VECTOR_STORE_ERROR,
|
|
118
156
|
f"Company with short name '{company_short_name}' not found.")
|
|
119
157
|
|
|
158
|
+
distance_metric = "l2"
|
|
159
|
+
distance_expression = (
|
|
160
|
+
f"iat_vsdocs.embedding::vector({embedding_dimensions}) "
|
|
161
|
+
f"<-> CAST(:query_embedding AS vector({embedding_dimensions}))"
|
|
162
|
+
)
|
|
163
|
+
|
|
120
164
|
# build the SQL query
|
|
121
|
-
sql_query_parts = ["""
|
|
165
|
+
sql_query_parts = [f"""
|
|
122
166
|
SELECT iat_vsdocs.id, \
|
|
123
167
|
iat_documents.filename, \
|
|
124
168
|
iat_vsdocs.text, \
|
|
125
169
|
iat_documents.storage_key, \
|
|
126
170
|
iat_documents.meta,
|
|
127
171
|
iat_documents.id, \
|
|
128
|
-
iat_vsdocs.meta
|
|
172
|
+
iat_vsdocs.meta,
|
|
173
|
+
({distance_expression}) AS distance
|
|
129
174
|
FROM iat_vsdocs, \
|
|
130
175
|
iat_documents
|
|
131
176
|
WHERE iat_vsdocs.company_id = :company_id
|
|
132
177
|
AND iat_vsdocs.document_id = iat_documents.id \
|
|
133
178
|
"""]
|
|
179
|
+
# The literal dimension lets PostgreSQL prove that a matching partial
|
|
180
|
+
# pgvector expression index can satisfy the nearest-neighbor order.
|
|
181
|
+
sql_query_parts.append(
|
|
182
|
+
f" AND vector_dims(iat_vsdocs.embedding) = {embedding_dimensions}"
|
|
183
|
+
)
|
|
134
184
|
|
|
135
185
|
# query parameters
|
|
136
186
|
params = {
|
|
@@ -168,15 +218,18 @@ class VSRepo:
|
|
|
168
218
|
sql_query = "".join(sql_query_parts)
|
|
169
219
|
|
|
170
220
|
# add sorting and limit of results
|
|
171
|
-
sql_query += " ORDER BY
|
|
221
|
+
sql_query += " ORDER BY distance ASC LIMIT :n_results"
|
|
172
222
|
|
|
173
223
|
logging.debug(f"Executing SQL query: {sql_query}")
|
|
174
224
|
logging.debug(f"With parameters: {params}")
|
|
175
225
|
|
|
176
226
|
# execute the query
|
|
227
|
+
vector_sql_started_at = perf_counter()
|
|
228
|
+
self.session.execute(text("SET LOCAL hnsw.iterative_scan = strict_order"))
|
|
229
|
+
self.session.execute(text("SET LOCAL hnsw.ef_search = 100"))
|
|
177
230
|
result = self.session.execute(text(sql_query), params)
|
|
178
|
-
|
|
179
231
|
rows = result.fetchall()
|
|
232
|
+
vector_sql_duration_ms = round((perf_counter() - vector_sql_started_at) * 1000)
|
|
180
233
|
vs_documents = []
|
|
181
234
|
|
|
182
235
|
for row in rows:
|
|
@@ -184,6 +237,8 @@ class VSRepo:
|
|
|
184
237
|
doc_meta = row[4] if len(row) > 4 and row[4] is not None else {}
|
|
185
238
|
chunk_meta = row[6] if len(row) > 6 and row[6] is not None else {}
|
|
186
239
|
|
|
240
|
+
distance = float(row[7]) if len(row) > 7 and row[7] is not None else None
|
|
241
|
+
|
|
187
242
|
# get the url of the document
|
|
188
243
|
storage_key = row[3] if len(row) > 3 and row[3] is not None else None
|
|
189
244
|
url = None
|
|
@@ -198,10 +253,26 @@ class VSRepo:
|
|
|
198
253
|
'text': row[2],
|
|
199
254
|
'meta': doc_meta,
|
|
200
255
|
'chunk_meta': chunk_meta,
|
|
201
|
-
'url': url
|
|
256
|
+
'url': url,
|
|
257
|
+
'distance': distance,
|
|
258
|
+
'distance_metric': distance_metric,
|
|
259
|
+
'score': self._score_from_l2_distance(distance),
|
|
202
260
|
}
|
|
203
261
|
)
|
|
204
262
|
|
|
263
|
+
logging.info(
|
|
264
|
+
"RAG vector query completed: company=%s collection_ids=%s dimensions=%s n_results=%s rows=%s "
|
|
265
|
+
"embedding_ms=%s company_lookup_ms=%s vector_sql_ms=%s total_ms=%s",
|
|
266
|
+
company_short_name,
|
|
267
|
+
normalized_collection_ids,
|
|
268
|
+
embedding_dimensions,
|
|
269
|
+
n_results,
|
|
270
|
+
len(rows),
|
|
271
|
+
embedding_duration_ms,
|
|
272
|
+
company_lookup_duration_ms,
|
|
273
|
+
vector_sql_duration_ms,
|
|
274
|
+
round((perf_counter() - query_started_at) * 1000),
|
|
275
|
+
)
|
|
205
276
|
return vs_documents
|
|
206
277
|
|
|
207
278
|
except Exception as e:
|
|
@@ -388,6 +459,12 @@ class VSRepo:
|
|
|
388
459
|
|
|
389
460
|
return sql_parts, params
|
|
390
461
|
|
|
462
|
+
@staticmethod
|
|
463
|
+
def _score_from_l2_distance(distance: float | None) -> float | None:
|
|
464
|
+
if distance is None:
|
|
465
|
+
return None
|
|
466
|
+
return 1 / (1 + distance)
|
|
467
|
+
|
|
391
468
|
@staticmethod
|
|
392
469
|
def _normalize_metadata_filter_input(metadata_filter):
|
|
393
470
|
if metadata_filter is None:
|
|
@@ -163,6 +163,10 @@ class ContextBuilderService:
|
|
|
163
163
|
"prompt_name": prompt_obj.name,
|
|
164
164
|
"agent_role": agent_role,
|
|
165
165
|
"execution_mode": execution_mode,
|
|
166
|
+
"context_policy": self.prompt_service.normalize_context_policy(
|
|
167
|
+
getattr(prompt_obj, "context_policy", None),
|
|
168
|
+
agent_role,
|
|
169
|
+
),
|
|
166
170
|
"schema": schema,
|
|
167
171
|
"schema_yaml": prompt_obj.output_schema_yaml,
|
|
168
172
|
"schema_mode": prompt_obj.output_schema_mode or "best_effort",
|
|
@@ -354,15 +358,25 @@ class ContextBuilderService:
|
|
|
354
358
|
collection_names=rag_collections,
|
|
355
359
|
)
|
|
356
360
|
|
|
361
|
+
context_policy = self.prompt_service.normalize_context_policy(
|
|
362
|
+
resolved_contract.get("context_policy"),
|
|
363
|
+
resolved_contract.get("agent_role"),
|
|
364
|
+
)
|
|
365
|
+
company_context_policy = context_policy.get("company_context_blocks") or {}
|
|
357
366
|
company_context_blocks = self.company_context_service.get_company_context_blocks(
|
|
358
367
|
company_short_name,
|
|
359
|
-
include_sql_context=
|
|
360
|
-
include_yaml_context=
|
|
368
|
+
include_sql_context=bool(company_context_policy.get("sql_context")),
|
|
369
|
+
include_yaml_context=bool(company_context_policy.get("yaml_context")),
|
|
370
|
+
)
|
|
371
|
+
markdown_context = (
|
|
372
|
+
company_context_blocks.get("markdown_context")
|
|
373
|
+
if bool(company_context_policy.get("markdown_context"))
|
|
374
|
+
else ""
|
|
361
375
|
)
|
|
362
376
|
final_system_context = self._join_context_sections(
|
|
363
377
|
rendered_sections.get("identity"),
|
|
364
378
|
rendered_sections.get("business_context"),
|
|
365
|
-
|
|
379
|
+
markdown_context,
|
|
366
380
|
rendered_sections.get("conversation_rules"),
|
|
367
381
|
rendered_sections.get("retrieval_guidance"),
|
|
368
382
|
collection_context,
|
|
@@ -759,6 +759,99 @@ class KnowledgeBaseService:
|
|
|
759
759
|
raise IAToolkitException(IAToolkitException.ErrorType.FILE_FORMAT_ERROR,
|
|
760
760
|
f"Error reading file content: {e}")
|
|
761
761
|
|
|
762
|
+
def get_document_images(
|
|
763
|
+
self,
|
|
764
|
+
company_short_name: str,
|
|
765
|
+
document_id: int,
|
|
766
|
+
*,
|
|
767
|
+
limit: int | None = None,
|
|
768
|
+
) -> list[dict[str, Any]]:
|
|
769
|
+
document = self.document_repo.get_by_id(document_id)
|
|
770
|
+
if not document:
|
|
771
|
+
return []
|
|
772
|
+
document_company = str(getattr(getattr(document, "company", None), "short_name", "") or "").strip()
|
|
773
|
+
if document_company != str(company_short_name or "").strip():
|
|
774
|
+
raise IAToolkitException(
|
|
775
|
+
IAToolkitException.ErrorType.INVALID_OPERATION,
|
|
776
|
+
"Document does not belong to the requested company.",
|
|
777
|
+
)
|
|
778
|
+
|
|
779
|
+
images = self.document_repo.get_document_images(document_id, limit=limit)
|
|
780
|
+
payloads: list[dict[str, Any]] = []
|
|
781
|
+
for image in images:
|
|
782
|
+
storage_key = str(getattr(image, "storage_key", "") or "").strip()
|
|
783
|
+
if not storage_key:
|
|
784
|
+
continue
|
|
785
|
+
content = self.storage_service.get_document_content(document_company, storage_key)
|
|
786
|
+
if not content:
|
|
787
|
+
continue
|
|
788
|
+
metadata = dict(getattr(image, "meta", None) or {})
|
|
789
|
+
filename = os.path.basename(storage_key) or f"document-{document_id}-image-{image.id}.png"
|
|
790
|
+
mime_type, _ = mimetypes.guess_type(filename)
|
|
791
|
+
if not mime_type:
|
|
792
|
+
image_format = str(metadata.get("format") or "").strip().lower()
|
|
793
|
+
mime_type = {
|
|
794
|
+
"jpeg": "image/jpeg",
|
|
795
|
+
"jpg": "image/jpeg",
|
|
796
|
+
"png": "image/png",
|
|
797
|
+
"webp": "image/webp",
|
|
798
|
+
"gif": "image/gif",
|
|
799
|
+
}.get(image_format, "application/octet-stream")
|
|
800
|
+
payloads.append(
|
|
801
|
+
{
|
|
802
|
+
"image_id": image.id,
|
|
803
|
+
"document_id": document_id,
|
|
804
|
+
"page": image.page,
|
|
805
|
+
"image_index": image.image_index,
|
|
806
|
+
"filename": filename,
|
|
807
|
+
"mime_type": mime_type,
|
|
808
|
+
"width": metadata.get("width"),
|
|
809
|
+
"height": metadata.get("height"),
|
|
810
|
+
"metadata": metadata,
|
|
811
|
+
"content": content,
|
|
812
|
+
}
|
|
813
|
+
)
|
|
814
|
+
return payloads
|
|
815
|
+
|
|
816
|
+
def get_document_tables(
|
|
817
|
+
self,
|
|
818
|
+
company_short_name: str,
|
|
819
|
+
document_id: int,
|
|
820
|
+
*,
|
|
821
|
+
limit: int | None = None,
|
|
822
|
+
) -> list[dict[str, Any]]:
|
|
823
|
+
document = self.document_repo.get_by_id(document_id)
|
|
824
|
+
if not document:
|
|
825
|
+
return []
|
|
826
|
+
document_company = str(getattr(getattr(document, "company", None), "short_name", "") or "").strip()
|
|
827
|
+
if document_company != str(company_short_name or "").strip():
|
|
828
|
+
raise IAToolkitException(
|
|
829
|
+
IAToolkitException.ErrorType.INVALID_OPERATION,
|
|
830
|
+
"Document does not belong to the requested company.",
|
|
831
|
+
)
|
|
832
|
+
|
|
833
|
+
payloads: list[dict[str, Any]] = []
|
|
834
|
+
for table in self.vs_repo.get_document_tables(document_id, limit=limit):
|
|
835
|
+
metadata = dict(getattr(table, "meta", None) or {})
|
|
836
|
+
table_text = str(getattr(table, "text", "") or "").strip()
|
|
837
|
+
if not table_text:
|
|
838
|
+
continue
|
|
839
|
+
payloads.append(
|
|
840
|
+
{
|
|
841
|
+
"chunk_id": table.id,
|
|
842
|
+
"document_id": document_id,
|
|
843
|
+
"table_index": metadata.get("table_index"),
|
|
844
|
+
"block_index": metadata.get("block_index"),
|
|
845
|
+
"page": metadata.get("page"),
|
|
846
|
+
"page_start": metadata.get("page_start"),
|
|
847
|
+
"page_end": metadata.get("page_end"),
|
|
848
|
+
"title": metadata.get("title") or metadata.get("caption_text"),
|
|
849
|
+
"text": table_text,
|
|
850
|
+
"table_json": metadata.get("table_json"),
|
|
851
|
+
}
|
|
852
|
+
)
|
|
853
|
+
return payloads
|
|
854
|
+
|
|
762
855
|
def delete_document(self, document_id: int) -> bool:
|
|
763
856
|
"""
|
|
764
857
|
Deletes a document and its associated vectors.
|
|
@@ -56,6 +56,11 @@ class PromptService:
|
|
|
56
56
|
AGENT_ROLE_CHANNELS = PromptAgentRole.CHANNELS.value
|
|
57
57
|
AGENT_ROLE_OPERATIONS = PromptAgentRole.OPERATIONS.value
|
|
58
58
|
DEFAULT_CATEGORY_LABEL = "General"
|
|
59
|
+
COMPANY_CONTEXT_BLOCK_KEYS = {
|
|
60
|
+
"markdown_context",
|
|
61
|
+
"sql_context",
|
|
62
|
+
"yaml_context",
|
|
63
|
+
}
|
|
59
64
|
|
|
60
65
|
@inject
|
|
61
66
|
def __init__(self,
|
|
@@ -142,6 +147,41 @@ class PromptService:
|
|
|
142
147
|
cls.AGENT_ROLE_CHANNELS,
|
|
143
148
|
}
|
|
144
149
|
|
|
150
|
+
@classmethod
|
|
151
|
+
def default_context_policy_for_agent_role(cls, agent_role: str | None) -> dict:
|
|
152
|
+
normalized = str(agent_role or "").strip().lower()
|
|
153
|
+
if normalized == cls.AGENT_ROLE_WORKSPACE_CHAT:
|
|
154
|
+
blocks = {
|
|
155
|
+
"markdown_context": True,
|
|
156
|
+
"sql_context": True,
|
|
157
|
+
"yaml_context": True,
|
|
158
|
+
}
|
|
159
|
+
else:
|
|
160
|
+
blocks = {
|
|
161
|
+
"markdown_context": True,
|
|
162
|
+
"sql_context": False,
|
|
163
|
+
"yaml_context": False,
|
|
164
|
+
}
|
|
165
|
+
return {"company_context_blocks": blocks}
|
|
166
|
+
|
|
167
|
+
@classmethod
|
|
168
|
+
def normalize_context_policy(cls, context_policy: dict | None, agent_role: str | None = None) -> dict:
|
|
169
|
+
defaults = cls.default_context_policy_for_agent_role(agent_role)
|
|
170
|
+
if not isinstance(context_policy, dict):
|
|
171
|
+
return defaults
|
|
172
|
+
|
|
173
|
+
raw_blocks = context_policy.get("company_context_blocks")
|
|
174
|
+
if raw_blocks is None:
|
|
175
|
+
raw_blocks = context_policy.get("company_context")
|
|
176
|
+
if not isinstance(raw_blocks, dict):
|
|
177
|
+
return defaults
|
|
178
|
+
|
|
179
|
+
blocks = dict(defaults["company_context_blocks"])
|
|
180
|
+
for key in cls.COMPANY_CONTEXT_BLOCK_KEYS:
|
|
181
|
+
if key in raw_blocks:
|
|
182
|
+
blocks[key] = bool(raw_blocks.get(key))
|
|
183
|
+
return {"company_context_blocks": blocks}
|
|
184
|
+
|
|
145
185
|
def _normalize_output_schema_mode(self, output_schema_mode: str | None) -> str:
|
|
146
186
|
candidate = str(output_schema_mode or self.OUTPUT_SCHEMA_MODE_BEST_EFFORT).strip().lower()
|
|
147
187
|
allowed = {
|
|
@@ -557,6 +597,10 @@ class PromptService:
|
|
|
557
597
|
),
|
|
558
598
|
'llm_request_options': dict(getattr(p, 'llm_request_options', None) or {}),
|
|
559
599
|
'tool_policy': dict(getattr(p, 'tool_policy', None) or {}),
|
|
600
|
+
'context_policy': self.normalize_context_policy(
|
|
601
|
+
getattr(p, 'context_policy', None),
|
|
602
|
+
getattr(p, 'agent_role', None),
|
|
603
|
+
),
|
|
560
604
|
}
|
|
561
605
|
for p in prompts
|
|
562
606
|
]
|
|
@@ -687,6 +731,10 @@ class PromptService:
|
|
|
687
731
|
),
|
|
688
732
|
llm_request_options=llm_request_options,
|
|
689
733
|
tool_policy=tool_policy,
|
|
734
|
+
context_policy=self.normalize_context_policy(
|
|
735
|
+
data.get("context_policy"),
|
|
736
|
+
agent_role,
|
|
737
|
+
),
|
|
690
738
|
)
|
|
691
739
|
self.llm_query_repo.create_or_update_prompt(new_prompt)
|
|
692
740
|
|
|
@@ -963,6 +1011,10 @@ class PromptService:
|
|
|
963
1011
|
self._extract_llm_request_options_payload(prompt_data)
|
|
964
1012
|
),
|
|
965
1013
|
tool_policy=self._normalize_tool_policy(prompt_data.get("tool_policy")),
|
|
1014
|
+
context_policy=self.normalize_context_policy(
|
|
1015
|
+
prompt_data.get("context_policy"),
|
|
1016
|
+
agent_role,
|
|
1017
|
+
),
|
|
966
1018
|
)
|
|
967
1019
|
|
|
968
1020
|
self.llm_query_repo.create_or_update_prompt(new_prompt)
|
|
@@ -15,6 +15,7 @@ from iatoolkit.services.context_builder_service import ContextBuilderService
|
|
|
15
15
|
from iatoolkit.services.attachment_policy_service import AttachmentPolicyService
|
|
16
16
|
from iatoolkit.services.memory_lookup_policy_service import MemoryLookupPolicyService
|
|
17
17
|
from iatoolkit.services.telemetry_service import NoopTelemetryService
|
|
18
|
+
from iatoolkit.services.prompt_service import PromptService
|
|
18
19
|
from iatoolkit.common.model_registry import ModelRegistry
|
|
19
20
|
from injector import inject
|
|
20
21
|
import logging
|
|
@@ -341,6 +342,10 @@ class QueryService:
|
|
|
341
342
|
})
|
|
342
343
|
contract["resource_bindings"] = normalized_resource_bindings
|
|
343
344
|
contract["tool_policy"] = self._normalize_prompt_tool_policy(contract.get("tool_policy"))
|
|
345
|
+
contract["context_policy"] = PromptService.normalize_context_policy(
|
|
346
|
+
contract.get("context_policy"),
|
|
347
|
+
contract.get("agent_role"),
|
|
348
|
+
)
|
|
344
349
|
contract["provider"] = self._get_provider(company.short_name, contract.get("llm_model") or "")
|
|
345
350
|
return contract
|
|
346
351
|
except Exception as e:
|
|
@@ -1875,6 +1880,10 @@ class QueryService:
|
|
|
1875
1880
|
"provider": provider,
|
|
1876
1881
|
"effective_model": effective_model,
|
|
1877
1882
|
"tool_policy": self._normalize_prompt_tool_policy(prompt_output_contract.get("tool_policy")),
|
|
1883
|
+
"context_policy": PromptService.normalize_context_policy(
|
|
1884
|
+
prompt_output_contract.get("context_policy"),
|
|
1885
|
+
prompt_output_contract.get("agent_role"),
|
|
1886
|
+
),
|
|
1878
1887
|
"resource_bindings": list(prompt_output_contract.get("resource_bindings") or []),
|
|
1879
1888
|
"selected_system_prompt_keys": selected_system_prompt_keys,
|
|
1880
1889
|
"tool_names": self._get_tool_names(tools),
|
|
@@ -374,6 +374,9 @@ class ToolService:
|
|
|
374
374
|
"page": page,
|
|
375
375
|
"caption_text": caption,
|
|
376
376
|
"document_id": item.get("document_id"),
|
|
377
|
+
"distance": item.get("distance"),
|
|
378
|
+
"distance_metric": item.get("distance_metric"),
|
|
379
|
+
"score": item.get("score"),
|
|
377
380
|
}
|
|
378
381
|
lines.append(json.dumps(header, ensure_ascii=False))
|
|
379
382
|
text_content = (item.get("text") or "").strip()
|
|
@@ -59,14 +59,38 @@ class WarmupService:
|
|
|
59
59
|
def warmup_startup_configured_companies(self, trigger: str = "startup") -> list[str]:
|
|
60
60
|
warmed_companies: list[str] = []
|
|
61
61
|
for company_short_name in get_registered_companies().keys():
|
|
62
|
-
|
|
63
|
-
if not
|
|
64
|
-
logging.
|
|
62
|
+
profiles = self._get_remote_text_embedding_profiles(company_short_name, startup_only=True)
|
|
63
|
+
if not profiles:
|
|
64
|
+
logging.info(
|
|
65
65
|
"Startup warm-up skipped for company='%s': no embedding provider enabled warmup_on_startup.",
|
|
66
66
|
company_short_name,
|
|
67
67
|
)
|
|
68
68
|
continue
|
|
69
69
|
|
|
70
|
+
logging.info(
|
|
71
|
+
"Startup warm-up starting for company='%s' profiles=%s trigger='%s'.",
|
|
72
|
+
company_short_name,
|
|
73
|
+
self._format_profile_labels(profiles),
|
|
74
|
+
trigger,
|
|
75
|
+
)
|
|
76
|
+
warmed_profiles = self._warmup_remote_text_embeddings(
|
|
77
|
+
company_short_name,
|
|
78
|
+
startup_only=True,
|
|
79
|
+
profiles=profiles,
|
|
80
|
+
)
|
|
81
|
+
if not warmed_profiles:
|
|
82
|
+
logging.warning(
|
|
83
|
+
"Startup warm-up attempted but no embedding profiles warmed for company='%s' profiles=%s.",
|
|
84
|
+
company_short_name,
|
|
85
|
+
self._format_profile_labels(profiles),
|
|
86
|
+
)
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
logging.info(
|
|
90
|
+
"Startup warm-up warmed company='%s' profiles=%s.",
|
|
91
|
+
company_short_name,
|
|
92
|
+
self._format_profile_labels(warmed_profiles),
|
|
93
|
+
)
|
|
70
94
|
warmed_companies.append(company_short_name)
|
|
71
95
|
|
|
72
96
|
return warmed_companies
|
|
@@ -74,8 +98,14 @@ class WarmupService:
|
|
|
74
98
|
def is_startup_warmup_enabled(self, company_short_name: str) -> bool:
|
|
75
99
|
return bool(self._get_remote_text_embedding_profiles(company_short_name, startup_only=True))
|
|
76
100
|
|
|
77
|
-
def _warmup_remote_text_embeddings(
|
|
78
|
-
|
|
101
|
+
def _warmup_remote_text_embeddings(
|
|
102
|
+
self,
|
|
103
|
+
company_short_name: str,
|
|
104
|
+
startup_only: bool = False,
|
|
105
|
+
profiles: list[tuple[str, str, str]] | None = None,
|
|
106
|
+
) -> list[tuple[str, str, str]]:
|
|
107
|
+
if profiles is None:
|
|
108
|
+
profiles = self._get_remote_text_embedding_profiles(company_short_name, startup_only=startup_only)
|
|
79
109
|
if not profiles:
|
|
80
110
|
logging.debug(
|
|
81
111
|
"Warm-up skipped for company='%s': no remote embedding inference configured.",
|
|
@@ -102,7 +132,8 @@ class WarmupService:
|
|
|
102
132
|
)
|
|
103
133
|
warmed_profiles.append((model_type, config_section, tool_name))
|
|
104
134
|
except Exception as e:
|
|
105
|
-
logging.debug
|
|
135
|
+
log_fn = logging.warning if startup_only else logging.debug
|
|
136
|
+
log_fn(
|
|
106
137
|
"Warm-up failed for remote embedding profile company='%s' section='%s' model_type='%s' tool='%s': %s",
|
|
107
138
|
company_short_name,
|
|
108
139
|
config_section,
|
|
@@ -113,6 +144,13 @@ class WarmupService:
|
|
|
113
144
|
|
|
114
145
|
return warmed_profiles
|
|
115
146
|
|
|
147
|
+
@staticmethod
|
|
148
|
+
def _format_profile_labels(profiles: list[tuple[str, str, str]]) -> list[str]:
|
|
149
|
+
return [
|
|
150
|
+
f"{config_section}:{model_type}:{tool_name}"
|
|
151
|
+
for model_type, config_section, tool_name in profiles
|
|
152
|
+
]
|
|
153
|
+
|
|
116
154
|
def _uses_remote_text_inference(self, company_short_name: str) -> bool:
|
|
117
155
|
return bool(self._get_remote_text_embedding_profiles(company_short_name))
|
|
118
156
|
|
|
@@ -499,6 +499,9 @@ class RagApiView(MethodView):
|
|
|
499
499
|
"text": item.get("text"),
|
|
500
500
|
"chunk_meta": item.get("chunk_meta") or {},
|
|
501
501
|
"document_meta": item.get("meta") or {},
|
|
502
|
+
"distance": item.get("distance"),
|
|
503
|
+
"distance_metric": item.get("distance_metric"),
|
|
504
|
+
"score": item.get("score"),
|
|
502
505
|
})
|
|
503
506
|
return normalized
|
|
504
507
|
|
|
@@ -537,6 +540,9 @@ class RagApiView(MethodView):
|
|
|
537
540
|
"chunk_id": item.get("chunk_id"),
|
|
538
541
|
"source_type": (item.get("chunk_meta") or {}).get("source_type"),
|
|
539
542
|
"page": (item.get("chunk_meta") or {}).get("page") or (item.get("chunk_meta") or {}).get("page_start"),
|
|
543
|
+
"distance": item.get("distance"),
|
|
544
|
+
"distance_metric": item.get("distance_metric"),
|
|
545
|
+
"score": item.get("score"),
|
|
540
546
|
}
|
|
541
547
|
lines.append(json.dumps(header, ensure_ascii=False))
|
|
542
548
|
if item.get("text"):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py
RENAMED
|
File without changes
|
{iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py
RENAMED
|
File without changes
|
|
File without changes
|
{iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py
RENAMED
|
File without changes
|