iatoolkit 2.14.0__tar.gz → 2.14.2__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.14.0/src/iatoolkit.egg-info → iatoolkit-2.14.2}/PKG-INFO +7 -5
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/requirements.txt +6 -4
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/util.py +10 -5
- iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +7 -0
- iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +7 -0
- iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/channel_response_style.prompt +7 -0
- iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +9 -0
- iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +12 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts_pack.yaml +44 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/database_manager.py +80 -6
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/context_builder_service.py +13 -1
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/prompt_service.py +6 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_service.py +28 -1
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_source_service.py +65 -34
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/system_prompt_catalog.py +30 -2
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/telemetry_service.py +2 -2
- {iatoolkit-2.14.0 → iatoolkit-2.14.2/src/iatoolkit.egg-info}/PKG-INFO +7 -5
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/SOURCES.txt +5 -1
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/requires.txt +6 -4
- iatoolkit-2.14.0/src/iatoolkit/system_prompts/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/LICENSE +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/pyproject.toml +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/readme.md +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/setup.cfg +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/locales/en.yaml +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/locales/es.yaml +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/mcp_personal_access_token_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/mcp_personal_access_token_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iatoolkit
|
|
3
|
-
Version: 2.14.
|
|
3
|
+
Version: 2.14.2
|
|
4
4
|
Summary: IAToolkit
|
|
5
5
|
Author: Fernando Libedinsky
|
|
6
6
|
License-Expression: MIT
|
|
@@ -10,8 +10,8 @@ License-File: LICENSE
|
|
|
10
10
|
License-File: LICENSE_COMMUNITY.md
|
|
11
11
|
Requires-Dist: bcrypt==4.2.1
|
|
12
12
|
Requires-Dist: anthropic>=0.83.0
|
|
13
|
-
Requires-Dist: boto3==1.
|
|
14
|
-
Requires-Dist: botocore==1.
|
|
13
|
+
Requires-Dist: boto3==1.43.10
|
|
14
|
+
Requires-Dist: botocore==1.43.10
|
|
15
15
|
Requires-Dist: braintrust>=0.17.0
|
|
16
16
|
Requires-Dist: build==1.2.2.post1
|
|
17
17
|
Requires-Dist: click==8.1.8
|
|
@@ -74,9 +74,11 @@ Requires-Dist: regex==2024.11.6
|
|
|
74
74
|
Requires-Dist: requests==2.32.3
|
|
75
75
|
Requires-Dist: requests-oauthlib==2.0.0
|
|
76
76
|
Requires-Dist: requests-toolbelt==1.0.0
|
|
77
|
-
Requires-Dist: s3transfer==0.
|
|
77
|
+
Requires-Dist: s3transfer==0.17.0
|
|
78
78
|
Requires-Dist: sib-api-v3-sdk==7.6.0
|
|
79
|
-
Requires-Dist: SQLAlchemy==2.0.
|
|
79
|
+
Requires-Dist: SQLAlchemy==2.0.49
|
|
80
|
+
Requires-Dist: sqlalchemy-redshift==1.0.0
|
|
81
|
+
Requires-Dist: redshift_connector==2.1.14
|
|
80
82
|
Requires-Dist: tiktoken==0.8.0
|
|
81
83
|
Requires-Dist: tokenizers>=0.22.0
|
|
82
84
|
Requires-Dist: websocket-client==1.8.0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
bcrypt==4.2.1
|
|
2
2
|
anthropic>=0.83.0
|
|
3
|
-
boto3==1.
|
|
4
|
-
botocore==1.
|
|
3
|
+
boto3==1.43.10
|
|
4
|
+
botocore==1.43.10
|
|
5
5
|
braintrust>=0.17.0
|
|
6
6
|
build==1.2.2.post1
|
|
7
7
|
click==8.1.8
|
|
@@ -64,9 +64,11 @@ regex==2024.11.6
|
|
|
64
64
|
requests==2.32.3
|
|
65
65
|
requests-oauthlib==2.0.0
|
|
66
66
|
requests-toolbelt==1.0.0
|
|
67
|
-
s3transfer==0.
|
|
67
|
+
s3transfer==0.17.0
|
|
68
68
|
sib-api-v3-sdk==7.6.0
|
|
69
|
-
SQLAlchemy==2.0.
|
|
69
|
+
SQLAlchemy==2.0.49
|
|
70
|
+
sqlalchemy-redshift==1.0.0
|
|
71
|
+
redshift_connector==2.1.14
|
|
70
72
|
tiktoken==0.8.0
|
|
71
73
|
tokenizers>=0.22.0
|
|
72
74
|
websocket-client==1.8.0
|
|
@@ -36,11 +36,13 @@ class Utility:
|
|
|
36
36
|
env = Environment(loader=FileSystemLoader(template_dir))
|
|
37
37
|
template = env.get_template(template_file)
|
|
38
38
|
|
|
39
|
-
#
|
|
40
|
-
|
|
39
|
+
# Explicit kwargs should win over client_data to preserve rich objects
|
|
40
|
+
# such as `company` passed by the caller.
|
|
41
|
+
render_context = dict(client_data)
|
|
42
|
+
render_context.update(kwargs)
|
|
41
43
|
|
|
42
44
|
# render my dynamic prompt
|
|
43
|
-
prompt = template.render(**
|
|
45
|
+
prompt = template.render(**render_context)
|
|
44
46
|
return prompt
|
|
45
47
|
except Exception as e:
|
|
46
48
|
logging.exception(e)
|
|
@@ -72,9 +74,12 @@ class Utility:
|
|
|
72
74
|
env = Environment(loader=loader)
|
|
73
75
|
template = env.from_string(template_string)
|
|
74
76
|
|
|
75
|
-
kwargs
|
|
77
|
+
# Explicit kwargs should win over client_data to preserve rich objects
|
|
78
|
+
# such as `company` passed by the caller.
|
|
79
|
+
render_context = dict(client_data)
|
|
80
|
+
render_context.update(kwargs)
|
|
76
81
|
|
|
77
|
-
prompt = template.render(**
|
|
82
|
+
prompt = template.render(**render_context)
|
|
78
83
|
return prompt
|
|
79
84
|
except Exception as e:
|
|
80
85
|
logging.exception(e)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
### Identidad comercial del canal
|
|
2
|
+
|
|
3
|
+
- Estas conversando con un cliente externo a nombre de {{ company }}.
|
|
4
|
+
- Si el cliente pregunta de que empresa eres, quien le escribe o de parte de quien hablas,
|
|
5
|
+
responde usando el nombre de la empresa: {{ company }}.
|
|
6
|
+
- Presentate como asistente o representante de {{ company }}, no como un sistema generico sin afiliacion.
|
|
7
|
+
- Si el cliente pregunta por el motivo del contacto, explica el proposito comercial o operativo con claridad usando el contexto disponible.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
### Continuidad conversacional del canal
|
|
2
|
+
|
|
3
|
+
- Si estas respondiendo en un canal conversacional como WhatsApp, asume continuidad con los mensajes previos del mismo hilo.
|
|
4
|
+
- No digas que esta es la primera interaccion ni que no tienes contexto previo si ya existe un intercambio en la conversacion.
|
|
5
|
+
- Si el cliente confirma un dato solicitado por la empresa, reconocelo explicitamente y continua desde ese punto.
|
|
6
|
+
- No vuelvas a pedir un dato que el cliente acaba de confirmar, salvo que haga falta aclararlo o corregirlo.
|
|
7
|
+
- Cuando el cliente haga una pregunta sobre el mensaje anterior, interpretala como continuidad del contacto ya iniciado por la empresa.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
### Estilo de respuesta en canal
|
|
2
|
+
|
|
3
|
+
- En canales como WhatsApp, responde de forma breve, natural y util.
|
|
4
|
+
- Prioriza una respuesta directa antes que una explicacion larga.
|
|
5
|
+
- Si necesitas hacer seguimiento, formula una sola pregunta clara por turno.
|
|
6
|
+
- Evita listas extensas o bloques largos salvo que el usuario lo pida o el caso realmente lo requiera.
|
|
7
|
+
- Manten un tono cercano, profesional y orientado a resolver la necesidad del cliente.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
### SQL Redshift: reglas base
|
|
2
|
+
|
|
3
|
+
- Si el contexto marca `dialect=redshift`, escribe SQL compatible con Amazon Redshift.
|
|
4
|
+
- Prefiere SQL analitico clasico: `SELECT`, `JOIN`, `CTE`, agregaciones y funciones de ventana.
|
|
5
|
+
- No asumas compatibilidad completa con PostgreSQL aunque la sintaxis se parezca.
|
|
6
|
+
- No uses `DISTINCT ON`, `RETURNING`, `ON CONFLICT`, `ILIKE ANY` ni otras extensiones
|
|
7
|
+
de PostgreSQL que no sean necesarias para una consulta analitica.
|
|
8
|
+
- Si el schema muestra tablas en un schema especifico, respeta ese schema o los alias
|
|
9
|
+
provistos por el contexto.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
### SQL Redshift: tipos, casting y JSON
|
|
2
|
+
|
|
3
|
+
- Usa `CAST(... AS INTEGER)`, `CAST(... AS DECIMAL(18, 4))`, `CAST(... AS DATE)` o el tipo
|
|
4
|
+
explicito que corresponda. Evita casts estilo PostgreSQL como `::NUMERIC`, `::INTEGER`
|
|
5
|
+
o `::DATE`.
|
|
6
|
+
- No uses tipos ni operadores `jsonb` de PostgreSQL como `->`, `->>`, `jsonb_each`
|
|
7
|
+
o `jsonb_array_elements`.
|
|
8
|
+
- Si hay columnas semiestructuradas, apóyate solo en las funciones o expresiones que el
|
|
9
|
+
schema y el contexto hagan evidentes. Si no aparecen detalles suficientes, prioriza
|
|
10
|
+
columnas relacionales normales antes que inventar acceso a JSON.
|
|
11
|
+
- Para fechas y timestamps, usa funciones compatibles con Redshift y evita asumir helpers
|
|
12
|
+
exclusivos de PostgreSQL si no son necesarios.
|
|
@@ -19,6 +19,14 @@ prompts:
|
|
|
19
19
|
include:
|
|
20
20
|
execution_modes:
|
|
21
21
|
- chat
|
|
22
|
+
- key: channel_business_identity
|
|
23
|
+
filename: channel_business_identity.prompt
|
|
24
|
+
section: business_context
|
|
25
|
+
include:
|
|
26
|
+
execution_modes:
|
|
27
|
+
- agent
|
|
28
|
+
agent_roles:
|
|
29
|
+
- channels
|
|
22
30
|
- key: links_documents
|
|
23
31
|
filename: links_documents.prompt
|
|
24
32
|
section: conversation_rules
|
|
@@ -26,6 +34,14 @@ prompts:
|
|
|
26
34
|
execution_modes:
|
|
27
35
|
- chat
|
|
28
36
|
- agent
|
|
37
|
+
- key: channel_conversation_continuity
|
|
38
|
+
filename: channel_conversation_continuity.prompt
|
|
39
|
+
section: conversation_rules
|
|
40
|
+
include:
|
|
41
|
+
execution_modes:
|
|
42
|
+
- agent
|
|
43
|
+
agent_roles:
|
|
44
|
+
- channels
|
|
29
45
|
- key: memory_usage
|
|
30
46
|
filename: memory_usage.prompt
|
|
31
47
|
section: conversation_rules
|
|
@@ -49,6 +65,16 @@ prompts:
|
|
|
49
65
|
- agent
|
|
50
66
|
response_modes:
|
|
51
67
|
- chat_compatible
|
|
68
|
+
- key: channel_response_style
|
|
69
|
+
filename: channel_response_style.prompt
|
|
70
|
+
section: output_contract
|
|
71
|
+
include:
|
|
72
|
+
execution_modes:
|
|
73
|
+
- agent
|
|
74
|
+
agent_roles:
|
|
75
|
+
- channels
|
|
76
|
+
response_modes:
|
|
77
|
+
- chat_compatible
|
|
52
78
|
- key: presentation_formatting
|
|
53
79
|
filename: presentation_formatting.prompt
|
|
54
80
|
section: output_contract
|
|
@@ -125,6 +151,24 @@ prompts:
|
|
|
125
151
|
- agent
|
|
126
152
|
all_capabilities:
|
|
127
153
|
- can_query_sql
|
|
154
|
+
- key: sql_redshift_basics
|
|
155
|
+
filename: sql_redshift_basics.prompt
|
|
156
|
+
section: data_access_rules
|
|
157
|
+
include:
|
|
158
|
+
execution_modes:
|
|
159
|
+
- chat
|
|
160
|
+
- agent
|
|
161
|
+
all_capabilities:
|
|
162
|
+
- can_query_sql_redshift
|
|
163
|
+
- key: sql_redshift_types
|
|
164
|
+
filename: sql_redshift_types.prompt
|
|
165
|
+
section: data_access_rules
|
|
166
|
+
include:
|
|
167
|
+
execution_modes:
|
|
168
|
+
- chat
|
|
169
|
+
- agent
|
|
170
|
+
all_capabilities:
|
|
171
|
+
- can_query_sql_redshift
|
|
128
172
|
- key: sql_mysql_json
|
|
129
173
|
filename: sql_mysql_json.prompt
|
|
130
174
|
section: data_access_rules
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
# database_manager.py
|
|
7
7
|
from sqlalchemy import create_engine, event, inspect, text
|
|
8
|
+
from sqlalchemy.dialects import registry
|
|
8
9
|
from sqlalchemy.orm import sessionmaker, scoped_session
|
|
9
10
|
from sqlalchemy.engine.url import make_url
|
|
10
11
|
from iatoolkit.repositories.models import Base, ORM_SCHEMA
|
|
@@ -17,12 +18,14 @@ import logging
|
|
|
17
18
|
class DatabaseManager(DatabaseProvider):
|
|
18
19
|
_POSTGRES_BOOTSTRAP_PATCHES = (
|
|
19
20
|
)
|
|
21
|
+
_DEFAULT_CONNECT_TIMEOUT = 10
|
|
20
22
|
|
|
21
23
|
@inject
|
|
22
24
|
def __init__(self,
|
|
23
25
|
database_url: str,
|
|
24
26
|
schema: str = 'public',
|
|
25
|
-
register_pgvector: bool = True
|
|
27
|
+
register_pgvector: bool = True,
|
|
28
|
+
timeout: int | None = None):
|
|
26
29
|
"""
|
|
27
30
|
Inicializa el gestor de la base de datos.
|
|
28
31
|
:param database_url: URL de la base de datos.
|
|
@@ -31,6 +34,7 @@ class DatabaseManager(DatabaseProvider):
|
|
|
31
34
|
"""
|
|
32
35
|
|
|
33
36
|
self.schema = schema
|
|
37
|
+
self.timeout = self._normalize_timeout(timeout)
|
|
34
38
|
|
|
35
39
|
# FIX HEROKU: replace postgres:// by postgresql:// for compatibility with SQLAlchemy 1.4+
|
|
36
40
|
if database_url and database_url.startswith("postgres://"):
|
|
@@ -38,12 +42,15 @@ class DatabaseManager(DatabaseProvider):
|
|
|
38
42
|
|
|
39
43
|
self.url = make_url(database_url)
|
|
40
44
|
self.backend = self.url.get_backend_name()
|
|
45
|
+
if self._is_redshift():
|
|
46
|
+
self._ensure_redshift_dialect_registered()
|
|
47
|
+
self.engine_url = self._build_engine_url()
|
|
41
48
|
|
|
42
49
|
if self.backend == 'sqlite':
|
|
43
|
-
raw_engine = create_engine(
|
|
50
|
+
raw_engine = create_engine(self.engine_url, echo=False)
|
|
44
51
|
else:
|
|
45
52
|
raw_engine = create_engine(
|
|
46
|
-
|
|
53
|
+
self.engine_url,
|
|
47
54
|
echo=False,
|
|
48
55
|
pool_size=10, # per worker
|
|
49
56
|
max_overflow=20,
|
|
@@ -58,6 +65,7 @@ class DatabaseManager(DatabaseProvider):
|
|
|
58
65
|
self._engine = raw_engine.execution_options(
|
|
59
66
|
schema_translate_map={ORM_SCHEMA: translated_schema}
|
|
60
67
|
)
|
|
68
|
+
self.engine = self._engine
|
|
61
69
|
self.SessionFactory = sessionmaker(bind=self._engine,
|
|
62
70
|
autoflush=False,
|
|
63
71
|
autocommit=False,
|
|
@@ -76,24 +84,82 @@ class DatabaseManager(DatabaseProvider):
|
|
|
76
84
|
def _is_postgres(self) -> bool:
|
|
77
85
|
return self.backend in ('postgresql', 'postgres')
|
|
78
86
|
|
|
87
|
+
def _is_redshift(self) -> bool:
|
|
88
|
+
return self.backend == 'redshift'
|
|
89
|
+
|
|
79
90
|
def _is_mysql(self) -> bool:
|
|
80
91
|
return self.backend == 'mysql'
|
|
81
92
|
|
|
93
|
+
@classmethod
|
|
94
|
+
def _normalize_timeout(cls, timeout: int | str | None) -> int:
|
|
95
|
+
if timeout is None:
|
|
96
|
+
return cls._DEFAULT_CONNECT_TIMEOUT
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
normalized = int(timeout)
|
|
100
|
+
except (TypeError, ValueError):
|
|
101
|
+
return cls._DEFAULT_CONNECT_TIMEOUT
|
|
102
|
+
|
|
103
|
+
return normalized if normalized > 0 else cls._DEFAULT_CONNECT_TIMEOUT
|
|
104
|
+
|
|
105
|
+
def _resolve_timeout(self) -> int:
|
|
106
|
+
if self.timeout != self._DEFAULT_CONNECT_TIMEOUT:
|
|
107
|
+
return self.timeout
|
|
108
|
+
|
|
109
|
+
for query_key in ("timeout", "connect_timeout"):
|
|
110
|
+
value = self.url.query.get(query_key)
|
|
111
|
+
if value is None:
|
|
112
|
+
continue
|
|
113
|
+
return self._normalize_timeout(value)
|
|
114
|
+
|
|
115
|
+
return self.timeout
|
|
116
|
+
|
|
117
|
+
def _build_engine_url(self):
|
|
118
|
+
normalized_url = self.url
|
|
119
|
+
if self._is_redshift():
|
|
120
|
+
normalized_url = self.url.difference_update_query(["timeout", "connect_timeout"])
|
|
121
|
+
|
|
122
|
+
return normalized_url.render_as_string(hide_password=False)
|
|
123
|
+
|
|
124
|
+
@staticmethod
|
|
125
|
+
def _ensure_redshift_dialect_registered():
|
|
126
|
+
try:
|
|
127
|
+
# Avoid relying solely on SQLAlchemy entrypoint discovery. In long-lived
|
|
128
|
+
# processes, the plugin registry may not notice a dialect installed later.
|
|
129
|
+
registry.register(
|
|
130
|
+
"redshift",
|
|
131
|
+
"sqlalchemy_redshift.dialect",
|
|
132
|
+
"RedshiftDialect_psycopg2",
|
|
133
|
+
)
|
|
134
|
+
registry.register(
|
|
135
|
+
"redshift.redshift_connector",
|
|
136
|
+
"sqlalchemy_redshift.dialect",
|
|
137
|
+
"RedshiftDialect_redshift_connector",
|
|
138
|
+
)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
logging.debug("Unable to pre-register Redshift SQLAlchemy dialects: %s", e)
|
|
141
|
+
|
|
82
142
|
def _build_connect_args(self) -> dict:
|
|
143
|
+
resolved_timeout = self._resolve_timeout()
|
|
144
|
+
|
|
83
145
|
if self._is_postgres():
|
|
84
146
|
return {
|
|
85
147
|
"keepalives": 1,
|
|
86
148
|
"keepalives_idle": 30,
|
|
87
149
|
"keepalives_interval": 10,
|
|
88
150
|
"keepalives_count": 5,
|
|
89
|
-
"connect_timeout":
|
|
151
|
+
"connect_timeout": resolved_timeout,
|
|
152
|
+
}
|
|
153
|
+
if self._is_redshift():
|
|
154
|
+
return {
|
|
155
|
+
"timeout": resolved_timeout,
|
|
90
156
|
}
|
|
91
157
|
if self._is_mysql():
|
|
92
158
|
return {
|
|
93
|
-
"connect_timeout":
|
|
159
|
+
"connect_timeout": resolved_timeout,
|
|
94
160
|
}
|
|
95
161
|
return {
|
|
96
|
-
"connect_timeout":
|
|
162
|
+
"connect_timeout": resolved_timeout,
|
|
97
163
|
}
|
|
98
164
|
|
|
99
165
|
def _effective_schema(self) -> str | None:
|
|
@@ -103,6 +169,10 @@ class DatabaseManager(DatabaseProvider):
|
|
|
103
169
|
if self._is_postgres():
|
|
104
170
|
return self.schema
|
|
105
171
|
|
|
172
|
+
if self._is_redshift():
|
|
173
|
+
normalized = str(self.schema or "").strip()
|
|
174
|
+
return normalized or "public"
|
|
175
|
+
|
|
106
176
|
if self._is_mysql():
|
|
107
177
|
normalized = str(self.schema or "").strip()
|
|
108
178
|
if normalized and normalized.lower() != "public":
|
|
@@ -190,6 +260,10 @@ class DatabaseManager(DatabaseProvider):
|
|
|
190
260
|
session = self.get_session()
|
|
191
261
|
if self._is_postgres() and self.schema:
|
|
192
262
|
session.execute(text(f"SET search_path TO {self.schema}"))
|
|
263
|
+
elif self._is_redshift():
|
|
264
|
+
normalized_schema = str(self.schema or "").strip()
|
|
265
|
+
if normalized_schema and normalized_schema.lower() != "public":
|
|
266
|
+
session.execute(text(f"SET search_path TO {normalized_schema}, public"))
|
|
193
267
|
|
|
194
268
|
result = session.execute(text(query))
|
|
195
269
|
if commit:
|
|
@@ -207,6 +207,7 @@ class ContextBuilderService:
|
|
|
207
207
|
|
|
208
208
|
final_system_context = self._join_context_sections(
|
|
209
209
|
rendered_sections.get("identity"),
|
|
210
|
+
rendered_sections.get("business_context"),
|
|
210
211
|
company_context_blocks.get("markdown_context"),
|
|
211
212
|
rendered_sections.get("conversation_rules"),
|
|
212
213
|
rendered_sections.get("retrieval_guidance"),
|
|
@@ -294,6 +295,7 @@ class ContextBuilderService:
|
|
|
294
295
|
if self.SQL_TOOL_NAME in enabled_tool_names and not sql_sources:
|
|
295
296
|
prompt_capabilities.discard("can_query_sql")
|
|
296
297
|
prompt_capabilities.discard("can_query_sql_postgres")
|
|
298
|
+
prompt_capabilities.discard("can_query_sql_redshift")
|
|
297
299
|
prompt_capabilities.discard("can_query_sql_mysql")
|
|
298
300
|
prompt_capabilities = self.prompt_service.resolve_system_prompt_capabilities(
|
|
299
301
|
company.short_name,
|
|
@@ -308,6 +310,7 @@ class ContextBuilderService:
|
|
|
308
310
|
capabilities_override=prompt_capabilities,
|
|
309
311
|
execution_mode="agent",
|
|
310
312
|
response_mode=str(resolved_contract.get("response_mode") or "chat_compatible").strip().lower() or "chat_compatible",
|
|
313
|
+
agent_role=str(resolved_contract.get("agent_role") or "").strip().lower() or None,
|
|
311
314
|
)
|
|
312
315
|
selected_system_prompt_keys = system_prompt_payload.get("selected_keys")
|
|
313
316
|
if not isinstance(selected_system_prompt_keys, list):
|
|
@@ -334,9 +337,9 @@ class ContextBuilderService:
|
|
|
334
337
|
)
|
|
335
338
|
|
|
336
339
|
company_context_blocks = self.company_context_service.get_company_context_blocks(company_short_name)
|
|
337
|
-
|
|
338
340
|
final_system_context = self._join_context_sections(
|
|
339
341
|
rendered_sections.get("identity"),
|
|
342
|
+
rendered_sections.get("business_context"),
|
|
340
343
|
company_context_blocks.get("markdown_context"),
|
|
341
344
|
rendered_sections.get("conversation_rules"),
|
|
342
345
|
rendered_sections.get("retrieval_guidance"),
|
|
@@ -467,6 +470,15 @@ class ContextBuilderService:
|
|
|
467
470
|
|
|
468
471
|
final_client_data = (user_profile or {}).copy()
|
|
469
472
|
final_client_data.update(client_data)
|
|
473
|
+
if company is not None:
|
|
474
|
+
company_name = str(getattr(company, "name", "") or "").strip()
|
|
475
|
+
company_short_name = str(getattr(company, "short_name", "") or "").strip()
|
|
476
|
+
if company_name and not str(final_client_data.get("company_name") or "").strip():
|
|
477
|
+
final_client_data["company_name"] = company_name
|
|
478
|
+
if company_name and not str(final_client_data.get("company") or "").strip():
|
|
479
|
+
final_client_data["company"] = company_name
|
|
480
|
+
if company_short_name and not str(final_client_data.get("company_short_name") or "").strip():
|
|
481
|
+
final_client_data["company_short_name"] = company_short_name
|
|
470
482
|
|
|
471
483
|
# Process attached files: extract text content and separate images
|
|
472
484
|
files_context, images = self._process_attachments(files)
|
|
@@ -729,6 +729,8 @@ class PromptService:
|
|
|
729
729
|
only_dialect = next(iter(dialects))
|
|
730
730
|
if only_dialect in {"postgresql", "postgres"}:
|
|
731
731
|
capabilities.add("can_query_sql_postgres")
|
|
732
|
+
elif only_dialect == "redshift":
|
|
733
|
+
capabilities.add("can_query_sql_redshift")
|
|
732
734
|
elif only_dialect == "mysql":
|
|
733
735
|
capabilities.add("can_query_sql_mysql")
|
|
734
736
|
except Exception as e:
|
|
@@ -760,6 +762,7 @@ class PromptService:
|
|
|
760
762
|
capabilities.update(sql_capabilities)
|
|
761
763
|
else:
|
|
762
764
|
capabilities.discard("can_query_sql_postgres")
|
|
765
|
+
capabilities.discard("can_query_sql_redshift")
|
|
763
766
|
capabilities.discard("can_query_sql_mysql")
|
|
764
767
|
|
|
765
768
|
return capabilities
|
|
@@ -772,6 +775,7 @@ class PromptService:
|
|
|
772
775
|
capabilities_override: set[str] | None = None,
|
|
773
776
|
execution_mode: str | None = None,
|
|
774
777
|
response_mode: str | None = None,
|
|
778
|
+
agent_role: str | None = None,
|
|
775
779
|
) -> dict:
|
|
776
780
|
try:
|
|
777
781
|
resolved_short_name = (company_short_name or "").strip()
|
|
@@ -796,11 +800,13 @@ class PromptService:
|
|
|
796
800
|
normalized_response_mode = (
|
|
797
801
|
str(response_mode or "chat_compatible").strip().lower() or "chat_compatible"
|
|
798
802
|
)
|
|
803
|
+
normalized_agent_role = str(agent_role or "").strip().lower() or None
|
|
799
804
|
payload = build_system_prompt_payload(
|
|
800
805
|
capabilities,
|
|
801
806
|
query_text=query_text,
|
|
802
807
|
execution_mode=normalized_execution_mode,
|
|
803
808
|
response_mode=normalized_response_mode,
|
|
809
|
+
agent_role=normalized_agent_role,
|
|
804
810
|
)
|
|
805
811
|
selected_keys = payload.get("selected_keys")
|
|
806
812
|
if not isinstance(selected_keys, list):
|
|
@@ -52,10 +52,11 @@ class SqlService:
|
|
|
52
52
|
"""Default factory for standard SQLAlchemy connections."""
|
|
53
53
|
uri = config.get('db_uri') or config.get('DATABASE_URI')
|
|
54
54
|
schema = config.get('schema')
|
|
55
|
+
timeout = config.get('timeout')
|
|
55
56
|
if not uri:
|
|
56
57
|
raise IAToolkitException(IAToolkitException.ErrorType.DATABASE_ERROR,
|
|
57
58
|
"Missing db_uri for direct connection")
|
|
58
|
-
return DatabaseManager(uri, schema=schema, register_pgvector=False)
|
|
59
|
+
return DatabaseManager(uri, schema=schema, register_pgvector=False, timeout=timeout)
|
|
59
60
|
|
|
60
61
|
def register_database(self, company_short_name: str, db_name: str, config: dict):
|
|
61
62
|
"""
|
|
@@ -111,12 +112,38 @@ class SqlService:
|
|
|
111
112
|
return value.strip().lower()
|
|
112
113
|
return ""
|
|
113
114
|
|
|
115
|
+
def _hydrate_database_from_catalog(self, company_short_name: str, db_name: str) -> bool:
|
|
116
|
+
try:
|
|
117
|
+
from iatoolkit.core import current_iatoolkit
|
|
118
|
+
from iatoolkit.services.sql_source_service import SqlSourceService
|
|
119
|
+
|
|
120
|
+
injector = current_iatoolkit().get_injector()
|
|
121
|
+
sql_source_service = injector.get(SqlSourceService)
|
|
122
|
+
return bool(sql_source_service.ensure_runtime_registration(company_short_name, db_name))
|
|
123
|
+
except Exception as e:
|
|
124
|
+
logging.debug(
|
|
125
|
+
"Unable to hydrate SQL source '%s' for '%s' from catalog: %s",
|
|
126
|
+
db_name,
|
|
127
|
+
company_short_name,
|
|
128
|
+
e,
|
|
129
|
+
)
|
|
130
|
+
return False
|
|
131
|
+
|
|
114
132
|
def get_database_provider(self, company_short_name: str, db_name: str) -> DatabaseProvider:
|
|
115
133
|
"""
|
|
116
134
|
Retrieves a registered DatabaseProvider instance using the composite key.
|
|
117
135
|
Replaces the old 'get_database_manager'.
|
|
118
136
|
"""
|
|
119
137
|
key = (company_short_name, db_name)
|
|
138
|
+
provider = self._db_connections.get(key)
|
|
139
|
+
if provider is not None:
|
|
140
|
+
return provider
|
|
141
|
+
|
|
142
|
+
if self._hydrate_database_from_catalog(company_short_name, db_name):
|
|
143
|
+
provider = self._db_connections.get(key)
|
|
144
|
+
if provider is not None:
|
|
145
|
+
return provider
|
|
146
|
+
|
|
120
147
|
try:
|
|
121
148
|
return self._db_connections[key]
|
|
122
149
|
except KeyError:
|
|
@@ -329,6 +329,67 @@ class SqlSourceService:
|
|
|
329
329
|
"skipped": skipped,
|
|
330
330
|
}
|
|
331
331
|
|
|
332
|
+
def _build_runtime_config(self, company_short_name: str, src: SqlSource) -> dict | None:
|
|
333
|
+
db_name = self._normalize_database(src.database)
|
|
334
|
+
connection_type = self._normalize_connection_type(src.connection_type)
|
|
335
|
+
schema_name = self._normalize_schema(src.schema)
|
|
336
|
+
|
|
337
|
+
db_config = {
|
|
338
|
+
"database": db_name,
|
|
339
|
+
"schema": schema_name,
|
|
340
|
+
"connection_type": connection_type,
|
|
341
|
+
"bridge_id": self._normalize_optional_text(src.bridge_id),
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if connection_type == SqlSource.CONNECTION_DIRECT:
|
|
345
|
+
secret_ref = normalize_secret_ref(src.connection_string_env)
|
|
346
|
+
db_uri = resolve_secret(self.secret_provider, company_short_name, secret_ref)
|
|
347
|
+
if not db_uri:
|
|
348
|
+
logging.error(
|
|
349
|
+
"Skipping SQL source '%s' for '%s': missing secret '%s'.",
|
|
350
|
+
db_name,
|
|
351
|
+
company_short_name,
|
|
352
|
+
secret_ref,
|
|
353
|
+
)
|
|
354
|
+
return None
|
|
355
|
+
db_config["db_uri"] = db_uri
|
|
356
|
+
return db_config
|
|
357
|
+
|
|
358
|
+
if connection_type == SqlSource.CONNECTION_BRIDGE:
|
|
359
|
+
if not db_config.get("bridge_id"):
|
|
360
|
+
logging.error(
|
|
361
|
+
"Skipping SQL source '%s' for '%s': missing bridge_id.",
|
|
362
|
+
db_name,
|
|
363
|
+
company_short_name,
|
|
364
|
+
)
|
|
365
|
+
return None
|
|
366
|
+
return db_config
|
|
367
|
+
|
|
368
|
+
logging.error(
|
|
369
|
+
"Skipping SQL source '%s' for '%s': unsupported connection_type '%s'.",
|
|
370
|
+
db_name,
|
|
371
|
+
company_short_name,
|
|
372
|
+
connection_type,
|
|
373
|
+
)
|
|
374
|
+
return None
|
|
375
|
+
|
|
376
|
+
def ensure_runtime_registration(self, company_short_name: str, db_name: str) -> bool:
|
|
377
|
+
company = self._get_company(company_short_name)
|
|
378
|
+
normalized_db_name = self._normalize_database(db_name)
|
|
379
|
+
if not normalized_db_name:
|
|
380
|
+
return False
|
|
381
|
+
|
|
382
|
+
source = self.sql_source_repo.get_by_database(company.id, normalized_db_name)
|
|
383
|
+
if not source or not bool(getattr(source, "is_active", False)):
|
|
384
|
+
return False
|
|
385
|
+
|
|
386
|
+
db_config = self._build_runtime_config(company_short_name, source)
|
|
387
|
+
if not db_config:
|
|
388
|
+
return False
|
|
389
|
+
|
|
390
|
+
self.sql_service.register_database(company_short_name, normalized_db_name, db_config)
|
|
391
|
+
return normalized_db_name in self.sql_service.get_db_names(company_short_name)
|
|
392
|
+
|
|
332
393
|
def refresh_runtime(self, company_short_name: str) -> dict:
|
|
333
394
|
company = self._get_company(company_short_name)
|
|
334
395
|
self.sql_service.clear_company_connections(company_short_name)
|
|
@@ -339,40 +400,10 @@ class SqlSourceService:
|
|
|
339
400
|
|
|
340
401
|
for src in active_sources:
|
|
341
402
|
db_name = self._normalize_database(src.database)
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
"database": db_name,
|
|
347
|
-
"schema": schema_name,
|
|
348
|
-
"connection_type": connection_type,
|
|
349
|
-
"bridge_id": self._normalize_optional_text(src.bridge_id),
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
if connection_type == SqlSource.CONNECTION_DIRECT:
|
|
353
|
-
secret_ref = normalize_secret_ref(src.connection_string_env)
|
|
354
|
-
db_uri = resolve_secret(self.secret_provider, company_short_name, secret_ref)
|
|
355
|
-
if not db_uri:
|
|
356
|
-
skipped += 1
|
|
357
|
-
logging.error(
|
|
358
|
-
"Skipping SQL source '%s' for '%s': missing secret '%s'.",
|
|
359
|
-
db_name,
|
|
360
|
-
company_short_name,
|
|
361
|
-
secret_ref,
|
|
362
|
-
)
|
|
363
|
-
continue
|
|
364
|
-
db_config["db_uri"] = db_uri
|
|
365
|
-
|
|
366
|
-
elif connection_type == SqlSource.CONNECTION_BRIDGE:
|
|
367
|
-
if not db_config.get("bridge_id"):
|
|
368
|
-
skipped += 1
|
|
369
|
-
logging.error(
|
|
370
|
-
"Skipping SQL source '%s' for '%s': missing bridge_id.",
|
|
371
|
-
db_name,
|
|
372
|
-
company_short_name,
|
|
373
|
-
)
|
|
374
|
-
continue
|
|
375
|
-
|
|
403
|
+
db_config = self._build_runtime_config(company_short_name, src)
|
|
404
|
+
if not db_config:
|
|
405
|
+
skipped += 1
|
|
406
|
+
continue
|
|
376
407
|
self.sql_service.register_database(company_short_name, db_name, db_config)
|
|
377
408
|
registered += 1
|
|
378
409
|
|