iatoolkit 2.51.2__tar.gz → 2.52.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.51.2/src/iatoolkit.egg-info → iatoolkit-2.52.0}/PKG-INFO +1 -5
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/pyproject.toml +4 -4
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/__init__.py +1 -1
- iatoolkit-2.52.0/src/iatoolkit/common/text_splitter.py +170 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/core.py +0 -2
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/locales/en.yaml +1 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/locales/es.yaml +1 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/models.py +14 -1
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/knowledge_base_service.py +4 -3
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/llm_client_service.py +23 -2
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/query_service.py +36 -2
- {iatoolkit-2.51.2 → iatoolkit-2.52.0/src/iatoolkit.egg-info}/PKG-INFO +1 -5
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/SOURCES.txt +1 -1
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/requires.txt +0 -4
- iatoolkit-2.51.2/src/iatoolkit/services/benchmark_service.py +0 -139
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/LICENSE +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/readme.md +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/setup.cfg +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/bridge_validation.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/url_safety.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/runtime_logging.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/configuration_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.51.2 → iatoolkit-2.52.0}/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.
|
|
3
|
+
Version: 2.52.0
|
|
4
4
|
Summary: IAToolkit
|
|
5
5
|
Author: Fernando Libedinsky
|
|
6
6
|
License-Expression: MIT
|
|
@@ -47,9 +47,6 @@ Requires-Dist: humanfriendly==10.0
|
|
|
47
47
|
Requires-Dist: idna==3.10
|
|
48
48
|
Requires-Dist: injector==0.22.0
|
|
49
49
|
Requires-Dist: Jinja2==3.1.5
|
|
50
|
-
Requires-Dist: langchain==0.3.19
|
|
51
|
-
Requires-Dist: langchain-core==0.3.35
|
|
52
|
-
Requires-Dist: langchain-text-splitters==0.3.6
|
|
53
50
|
Requires-Dist: markdown2==2.5.3
|
|
54
51
|
Requires-Dist: nh3==0.3.7
|
|
55
52
|
Requires-Dist: openai==2.8.1
|
|
@@ -79,7 +76,6 @@ Requires-Dist: SQLAlchemy==2.0.49
|
|
|
79
76
|
Requires-Dist: sqlalchemy-redshift==1.0.0
|
|
80
77
|
Requires-Dist: redshift_connector==2.1.14
|
|
81
78
|
Requires-Dist: tiktoken==0.8.0
|
|
82
|
-
Requires-Dist: tokenizers>=0.22.0
|
|
83
79
|
Requires-Dist: websocket-client==1.8.0
|
|
84
80
|
Requires-Dist: websockets==14.1
|
|
85
81
|
Requires-Dist: Werkzeug==3.1.3
|
|
@@ -59,9 +59,6 @@ dependencies = [
|
|
|
59
59
|
"idna==3.10",
|
|
60
60
|
"injector==0.22.0",
|
|
61
61
|
"Jinja2==3.1.5",
|
|
62
|
-
"langchain==0.3.19",
|
|
63
|
-
"langchain-core==0.3.35",
|
|
64
|
-
"langchain-text-splitters==0.3.6",
|
|
65
62
|
"markdown2==2.5.3",
|
|
66
63
|
"nh3==0.3.7",
|
|
67
64
|
"openai==2.8.1",
|
|
@@ -91,7 +88,10 @@ dependencies = [
|
|
|
91
88
|
"sqlalchemy-redshift==1.0.0",
|
|
92
89
|
"redshift_connector==2.1.14",
|
|
93
90
|
"tiktoken==0.8.0",
|
|
94
|
-
|
|
91
|
+
# tokenizers is not declared: nothing here imports it, and the only
|
|
92
|
+
# package that needs it is transformers, which arrives through the
|
|
93
|
+
# docling and inference extras and pulls its own. Declaring it put 8MB
|
|
94
|
+
# of Rust bindings into every install that uses neither.
|
|
95
95
|
"websocket-client==1.8.0",
|
|
96
96
|
"websockets==14.1",
|
|
97
97
|
"Werkzeug==3.1.3",
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"""Recursive character text splitting for the RAG ingestion path.
|
|
2
|
+
|
|
3
|
+
A drop-in replacement for `langchain_text_splitters.RecursiveCharacterTextSplitter`,
|
|
4
|
+
written out here because that single class was the only langchain import in the
|
|
5
|
+
whole fleet and it dragged langchain-core, langsmith, zstandard and orjson into
|
|
6
|
+
every deployment.
|
|
7
|
+
|
|
8
|
+
The behaviour is reproduced exactly, not approximated: the chunk boundaries this
|
|
9
|
+
produces decide how documents are embedded, so a corpus ingested before the swap
|
|
10
|
+
and one ingested after have to agree. `src/tests/common/test_text_splitter.py`
|
|
11
|
+
pins that with golden fixtures captured from the original implementation.
|
|
12
|
+
|
|
13
|
+
Two details are easy to get wrong when reading the algorithm:
|
|
14
|
+
|
|
15
|
+
- Separators are matched as regular expressions, but the caller passes literals,
|
|
16
|
+
so each one is `re.escape`d before use. Without that, the "." separator this
|
|
17
|
+
codebase configures would match every character.
|
|
18
|
+
- `keep_separator` is True here (langchain's own default for the recursive
|
|
19
|
+
splitter, which overrides the False it inherits). The separator is attached to
|
|
20
|
+
the *start* of the following piece, and the pieces are then joined with "" -
|
|
21
|
+
not with the separator - when merging. Joining with the separator instead
|
|
22
|
+
duplicates it in every chunk.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import logging
|
|
26
|
+
import re
|
|
27
|
+
from typing import Callable, Iterable, List, Optional
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class RecursiveCharacterTextSplitter:
|
|
34
|
+
"""Splits text by trying each separator in turn, falling back to the next.
|
|
35
|
+
|
|
36
|
+
For every stretch of text the first separator that occurs in it is used. Any
|
|
37
|
+
piece still larger than `chunk_size` is split again with the remaining
|
|
38
|
+
separators, and the pieces that do fit are merged back up to `chunk_size`
|
|
39
|
+
with `chunk_overlap` characters carried between neighbours.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
separators: Optional[List[str]] = None,
|
|
45
|
+
chunk_size: int = 4000,
|
|
46
|
+
chunk_overlap: int = 200,
|
|
47
|
+
length_function: Callable[[str], int] = len,
|
|
48
|
+
keep_separator: bool = True,
|
|
49
|
+
strip_whitespace: bool = True,
|
|
50
|
+
) -> None:
|
|
51
|
+
if chunk_overlap > chunk_size:
|
|
52
|
+
raise ValueError(
|
|
53
|
+
f"Got a larger chunk overlap ({chunk_overlap}) than chunk size "
|
|
54
|
+
f"({chunk_size}), should be smaller."
|
|
55
|
+
)
|
|
56
|
+
self._separators = separators or ["\n\n", "\n", " ", ""]
|
|
57
|
+
self._chunk_size = chunk_size
|
|
58
|
+
self._chunk_overlap = chunk_overlap
|
|
59
|
+
self._length_function = length_function
|
|
60
|
+
self._keep_separator = keep_separator
|
|
61
|
+
self._strip_whitespace = strip_whitespace
|
|
62
|
+
|
|
63
|
+
def split_text(self, text: str) -> List[str]:
|
|
64
|
+
return self._split_text(text, self._separators)
|
|
65
|
+
|
|
66
|
+
def _split_text(self, text: str, separators: List[str]) -> List[str]:
|
|
67
|
+
final_chunks: List[str] = []
|
|
68
|
+
|
|
69
|
+
# The last separator is the fallback when none of the others occur.
|
|
70
|
+
separator = separators[-1]
|
|
71
|
+
new_separators: List[str] = []
|
|
72
|
+
for i, candidate in enumerate(separators):
|
|
73
|
+
if candidate == "":
|
|
74
|
+
separator = candidate
|
|
75
|
+
break
|
|
76
|
+
if re.search(re.escape(candidate), text):
|
|
77
|
+
separator = candidate
|
|
78
|
+
new_separators = separators[i + 1:]
|
|
79
|
+
break
|
|
80
|
+
|
|
81
|
+
splits = self._split_with_separator(text, separator)
|
|
82
|
+
|
|
83
|
+
# Pieces that already fit accumulate until one does not; that one is
|
|
84
|
+
# flushed first so the recursion cannot reorder the output.
|
|
85
|
+
good_splits: List[str] = []
|
|
86
|
+
merge_separator = "" if self._keep_separator else separator
|
|
87
|
+
for piece in splits:
|
|
88
|
+
if self._length_function(piece) < self._chunk_size:
|
|
89
|
+
good_splits.append(piece)
|
|
90
|
+
continue
|
|
91
|
+
if good_splits:
|
|
92
|
+
final_chunks.extend(self._merge_splits(good_splits, merge_separator))
|
|
93
|
+
good_splits = []
|
|
94
|
+
if not new_separators:
|
|
95
|
+
# No separator left to try: the piece goes out oversized rather
|
|
96
|
+
# than being cut mid-word.
|
|
97
|
+
final_chunks.append(piece)
|
|
98
|
+
else:
|
|
99
|
+
final_chunks.extend(self._split_text(piece, new_separators))
|
|
100
|
+
if good_splits:
|
|
101
|
+
final_chunks.extend(self._merge_splits(good_splits, merge_separator))
|
|
102
|
+
return final_chunks
|
|
103
|
+
|
|
104
|
+
def _split_with_separator(self, text: str, separator: str) -> List[str]:
|
|
105
|
+
"""Splits on `separator`, keeping it attached to the piece that follows."""
|
|
106
|
+
if not separator:
|
|
107
|
+
return [c for c in list(text) if c != ""]
|
|
108
|
+
|
|
109
|
+
parts = re.split(f"({re.escape(separator)})", text)
|
|
110
|
+
if self._keep_separator:
|
|
111
|
+
# re.split with a capturing group alternates text, separator, text...
|
|
112
|
+
# Pairing each separator with the following text is what puts the
|
|
113
|
+
# separator at the start of its piece.
|
|
114
|
+
splits = [parts[i] + parts[i + 1] for i in range(1, len(parts), 2)]
|
|
115
|
+
if len(parts) % 2 == 0:
|
|
116
|
+
splits += parts[-1:]
|
|
117
|
+
splits = [parts[0]] + splits
|
|
118
|
+
else:
|
|
119
|
+
splits = re.split(re.escape(separator), text)
|
|
120
|
+
return [s for s in splits if s != ""]
|
|
121
|
+
|
|
122
|
+
def _join_docs(self, docs: List[str], separator: str) -> Optional[str]:
|
|
123
|
+
text = separator.join(docs)
|
|
124
|
+
if self._strip_whitespace:
|
|
125
|
+
text = text.strip()
|
|
126
|
+
return text or None
|
|
127
|
+
|
|
128
|
+
def _merge_splits(self, splits: Iterable[str], separator: str) -> List[str]:
|
|
129
|
+
"""Packs consecutive pieces into chunks, carrying `chunk_overlap` over."""
|
|
130
|
+
separator_len = self._length_function(separator)
|
|
131
|
+
|
|
132
|
+
docs: List[str] = []
|
|
133
|
+
current_doc: List[str] = []
|
|
134
|
+
total = 0
|
|
135
|
+
for piece in splits:
|
|
136
|
+
piece_len = self._length_function(piece)
|
|
137
|
+
if (
|
|
138
|
+
total + piece_len + (separator_len if len(current_doc) > 0 else 0)
|
|
139
|
+
> self._chunk_size
|
|
140
|
+
):
|
|
141
|
+
if total > self._chunk_size:
|
|
142
|
+
logger.warning(
|
|
143
|
+
"Created a chunk of size %s, which is longer than the "
|
|
144
|
+
"specified %s",
|
|
145
|
+
total,
|
|
146
|
+
self._chunk_size,
|
|
147
|
+
)
|
|
148
|
+
if len(current_doc) > 0:
|
|
149
|
+
doc = self._join_docs(current_doc, separator)
|
|
150
|
+
if doc is not None:
|
|
151
|
+
docs.append(doc)
|
|
152
|
+
# Drop from the front until what is left is small enough to
|
|
153
|
+
# serve as the overlap for the next chunk.
|
|
154
|
+
while total > self._chunk_overlap or (
|
|
155
|
+
total
|
|
156
|
+
+ piece_len
|
|
157
|
+
+ (separator_len if len(current_doc) > 0 else 0)
|
|
158
|
+
> self._chunk_size
|
|
159
|
+
and total > 0
|
|
160
|
+
):
|
|
161
|
+
total -= self._length_function(current_doc[0]) + (
|
|
162
|
+
separator_len if len(current_doc) > 1 else 0
|
|
163
|
+
)
|
|
164
|
+
current_doc = current_doc[1:]
|
|
165
|
+
current_doc.append(piece)
|
|
166
|
+
total += piece_len + (separator_len if len(current_doc) > 1 else 0)
|
|
167
|
+
doc = self._join_docs(current_doc, separator)
|
|
168
|
+
if doc is not None:
|
|
169
|
+
docs.append(doc)
|
|
170
|
+
return docs
|
|
@@ -415,7 +415,6 @@ class IAToolkit:
|
|
|
415
415
|
def _bind_services(self, binder: Binder):
|
|
416
416
|
from iatoolkit.services.query_service import QueryService
|
|
417
417
|
from iatoolkit.services.api_key_service import ApiKeyService
|
|
418
|
-
from iatoolkit.services.benchmark_service import BenchmarkService
|
|
419
418
|
from iatoolkit.services.parsers.parsing_service import ParsingService
|
|
420
419
|
from iatoolkit.services.parsers.provider_factory import ParsingProviderFactory
|
|
421
420
|
from iatoolkit.services.parsers.provider_resolver import ParsingProviderResolver
|
|
@@ -458,7 +457,6 @@ class IAToolkit:
|
|
|
458
457
|
|
|
459
458
|
binder.bind(QueryService, to=QueryService)
|
|
460
459
|
binder.bind(ApiKeyService, to=ApiKeyService)
|
|
461
|
-
binder.bind(BenchmarkService, to=BenchmarkService)
|
|
462
460
|
binder.bind(ParsingService, to=ParsingService)
|
|
463
461
|
binder.bind(ParsingProviderFactory, to=ParsingProviderFactory)
|
|
464
462
|
binder.bind(ParsingProviderResolver, to=ParsingProviderResolver)
|
|
@@ -1425,6 +1425,7 @@ ui:
|
|
|
1425
1425
|
definitions_filter_summary: "Showing {visible} of {total} pipelines"
|
|
1426
1426
|
definition_last_run: "Last run"
|
|
1427
1427
|
definition_no_runs: "No runs"
|
|
1428
|
+
definition_column_id: "ID"
|
|
1428
1429
|
definition_column_pipeline: "Pipeline"
|
|
1429
1430
|
definition_column_input: "Input"
|
|
1430
1431
|
definition_column_steps: "Steps"
|
|
@@ -1440,6 +1440,7 @@ ui:
|
|
|
1440
1440
|
definitions_filter_summary: "Mostrando {visible} de {total} pipelines"
|
|
1441
1441
|
definition_last_run: "Última ejecución"
|
|
1442
1442
|
definition_no_runs: "Sin ejecuciones"
|
|
1443
|
+
definition_column_id: "ID"
|
|
1443
1444
|
definition_column_pipeline: "Pipeline"
|
|
1444
1445
|
definition_column_input: "Entrada"
|
|
1445
1446
|
definition_column_steps: "Pasos"
|
|
@@ -9,7 +9,7 @@ from sqlalchemy import Column, Integer, BigInteger, String, DateTime, Enum, Text
|
|
|
9
9
|
from sqlalchemy.orm import DeclarativeBase
|
|
10
10
|
from sqlalchemy.orm import relationship, class_mapper
|
|
11
11
|
from sqlalchemy.sql import func
|
|
12
|
-
from sqlalchemy import UniqueConstraint
|
|
12
|
+
from sqlalchemy import UniqueConstraint, Index
|
|
13
13
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
14
14
|
from datetime import datetime
|
|
15
15
|
from pgvector.sqlalchemy import Vector
|
|
@@ -598,6 +598,19 @@ class LLMQuery(Base):
|
|
|
598
598
|
created_at = Column(DateTime, default=datetime.now)
|
|
599
599
|
task_id = Column(Integer, default=None, nullable=True)
|
|
600
600
|
|
|
601
|
+
# Execution trace: enough to replay an agent execution later (model
|
|
602
|
+
# evaluations). prompt_inputs are the caller's raw inputs, before they are
|
|
603
|
+
# merged with the user profile; input_files hold storage references only,
|
|
604
|
+
# never file content.
|
|
605
|
+
prompt_name = Column(String, nullable=True)
|
|
606
|
+
prompt_inputs = Column(JSON, nullable=True)
|
|
607
|
+
input_files = Column(JSON, nullable=True)
|
|
608
|
+
input_files_purged_at = Column(DateTime, nullable=True)
|
|
609
|
+
|
|
610
|
+
__table_args__ = (
|
|
611
|
+
Index('ix_iat_queries_company_prompt_created', 'company_id', 'prompt_name', 'created_at'),
|
|
612
|
+
)
|
|
613
|
+
|
|
601
614
|
company = relationship("Company", back_populates="llm_queries")
|
|
602
615
|
|
|
603
616
|
def to_dict(self):
|
|
@@ -12,7 +12,7 @@ from iatoolkit.services.profile_service import ProfileService
|
|
|
12
12
|
from iatoolkit.services.i18n_service import I18nService
|
|
13
13
|
from iatoolkit.services.storage_service import StorageService
|
|
14
14
|
from iatoolkit.services.parsers.parsing_service import ParsingService
|
|
15
|
-
from
|
|
15
|
+
from iatoolkit.common.text_splitter import RecursiveCharacterTextSplitter
|
|
16
16
|
from iatoolkit.services.visual_kb_service import VisualKnowledgeBaseService
|
|
17
17
|
from sqlalchemy import desc, func
|
|
18
18
|
from typing import Any
|
|
@@ -50,7 +50,8 @@ class KnowledgeBaseService:
|
|
|
50
50
|
self.profile_service = profile_service
|
|
51
51
|
self.i18n_service = i18n_service
|
|
52
52
|
|
|
53
|
-
#
|
|
53
|
+
# Chunking for the RAG index. These numbers decide how the corpus is
|
|
54
|
+
# embedded, so changing them means re-ingesting what is already stored.
|
|
54
55
|
self.text_splitter = RecursiveCharacterTextSplitter(
|
|
55
56
|
chunk_size=1000,
|
|
56
57
|
chunk_overlap=100,
|
|
@@ -83,7 +84,7 @@ class KnowledgeBaseService:
|
|
|
83
84
|
Synchronously processes a document through the entire RAG pipeline:
|
|
84
85
|
1. Saves initial metadata and raw content reference to the SQL Document table.
|
|
85
86
|
2. Parses content via configured parsing provider (docling/basic/custom).
|
|
86
|
-
3. Splits the text into semantic chunks
|
|
87
|
+
3. Splits the text into semantic chunks.
|
|
87
88
|
4. Vectorizes and saves chunks to the Vector Store (VSRepo).
|
|
88
89
|
5. Updates the document status to ACTIVE or FAILED.
|
|
89
90
|
|
|
@@ -131,7 +131,8 @@ class llmClient:
|
|
|
131
131
|
execution_metadata: Optional[Dict[str, Any]] = None,
|
|
132
132
|
request_metadata: Optional[Dict[str, str]] = None,
|
|
133
133
|
telemetry_request: Optional[Dict[str, Any]] = None,
|
|
134
|
-
response_contract: Optional[Dict[str, Any]] = None
|
|
134
|
+
response_contract: Optional[Dict[str, Any]] = None,
|
|
135
|
+
execution_trace: Optional[Dict[str, Any]] = None
|
|
135
136
|
) -> dict:
|
|
136
137
|
|
|
137
138
|
self._assert_runtime_not_suspended(company)
|
|
@@ -426,7 +427,8 @@ class llmClient:
|
|
|
426
427
|
response=self.serialize_response(response, decoded_response),
|
|
427
428
|
function_calls=f_calls,
|
|
428
429
|
stats=combined_stats,
|
|
429
|
-
answer_time=stats['response_time']
|
|
430
|
+
answer_time=stats['response_time'],
|
|
431
|
+
**self._execution_trace_columns(execution_trace)
|
|
430
432
|
)
|
|
431
433
|
self.llmquery_repo.add_query(query)
|
|
432
434
|
telemetry_execution.finalize(
|
|
@@ -503,6 +505,7 @@ class llmClient:
|
|
|
503
505
|
response={},
|
|
504
506
|
valid_response=False,
|
|
505
507
|
function_calls=f_calls,
|
|
508
|
+
**self._execution_trace_columns(execution_trace)
|
|
506
509
|
)
|
|
507
510
|
self.llmquery_repo.add_query(query)
|
|
508
511
|
telemetry_execution.finalize(
|
|
@@ -1324,6 +1327,24 @@ class llmClient:
|
|
|
1324
1327
|
stats_dict["provider_calls"] = provider_calls
|
|
1325
1328
|
return stats_dict
|
|
1326
1329
|
|
|
1330
|
+
@staticmethod
|
|
1331
|
+
def _execution_trace_columns(execution_trace: Optional[Dict[str, Any]]) -> dict:
|
|
1332
|
+
"""Maps the caller's execution trace onto the LLMQuery trace columns."""
|
|
1333
|
+
if not isinstance(execution_trace, dict):
|
|
1334
|
+
return {}
|
|
1335
|
+
|
|
1336
|
+
columns = {}
|
|
1337
|
+
prompt_name = str(execution_trace.get("prompt_name") or "").strip()
|
|
1338
|
+
if prompt_name:
|
|
1339
|
+
columns["prompt_name"] = prompt_name
|
|
1340
|
+
prompt_inputs = execution_trace.get("prompt_inputs")
|
|
1341
|
+
if isinstance(prompt_inputs, dict):
|
|
1342
|
+
columns["prompt_inputs"] = prompt_inputs
|
|
1343
|
+
input_files = execution_trace.get("input_files")
|
|
1344
|
+
if isinstance(input_files, list) and input_files:
|
|
1345
|
+
columns["input_files"] = input_files
|
|
1346
|
+
return columns
|
|
1347
|
+
|
|
1327
1348
|
@classmethod
|
|
1328
1349
|
def _compact_execution_metadata_for_stats(cls, key: str, value):
|
|
1329
1350
|
if key == "tool_router":
|
|
@@ -963,6 +963,30 @@ class QueryService:
|
|
|
963
963
|
return False
|
|
964
964
|
return any(marker in error_text for marker in cls._PREVIOUS_RESPONSE_NOT_FOUND_MARKERS)
|
|
965
965
|
|
|
966
|
+
@staticmethod
|
|
967
|
+
def build_execution_trace(*,
|
|
968
|
+
prompt_name: str | None,
|
|
969
|
+
client_data: dict | None,
|
|
970
|
+
input_files: list | None) -> dict:
|
|
971
|
+
"""
|
|
972
|
+
What an agent execution needs to be replayed later. Inputs are taken
|
|
973
|
+
as the caller sent them, before build_user_turn_prompt merges them with
|
|
974
|
+
the user profile; keys starting with "_" are internal plumbing.
|
|
975
|
+
"""
|
|
976
|
+
trace = {}
|
|
977
|
+
normalized_prompt_name = str(prompt_name or "").strip()
|
|
978
|
+
if normalized_prompt_name:
|
|
979
|
+
trace["prompt_name"] = normalized_prompt_name
|
|
980
|
+
safe_client_data = client_data if isinstance(client_data, dict) else {}
|
|
981
|
+
trace["prompt_inputs"] = {
|
|
982
|
+
key: value
|
|
983
|
+
for key, value in safe_client_data.items()
|
|
984
|
+
if not str(key or "").startswith("_")
|
|
985
|
+
}
|
|
986
|
+
if isinstance(input_files, list) and input_files:
|
|
987
|
+
trace["input_files"] = [dict(item) for item in input_files if isinstance(item, dict)]
|
|
988
|
+
return trace
|
|
989
|
+
|
|
966
990
|
def _invoke_with_history_recovery(self,
|
|
967
991
|
*,
|
|
968
992
|
company,
|
|
@@ -984,7 +1008,8 @@ class QueryService:
|
|
|
984
1008
|
telemetry_request: dict | None,
|
|
985
1009
|
prompt_output_contract: dict,
|
|
986
1010
|
history_handle: HistoryHandle,
|
|
987
|
-
ignore_history: bool
|
|
1011
|
+
ignore_history: bool,
|
|
1012
|
+
execution_trace: dict | None = None) -> tuple[dict, HistoryHandle]:
|
|
988
1013
|
previous_response_id = history_handle.request_params.get('previous_response_id')
|
|
989
1014
|
context_history = history_handle.request_params.get('context_history')
|
|
990
1015
|
|
|
@@ -1009,6 +1034,7 @@ class QueryService:
|
|
|
1009
1034
|
request_metadata=request_metadata,
|
|
1010
1035
|
telemetry_request=telemetry_request,
|
|
1011
1036
|
response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
|
|
1037
|
+
execution_trace=execution_trace,
|
|
1012
1038
|
)
|
|
1013
1039
|
return response, history_handle
|
|
1014
1040
|
except Exception as invoke_error:
|
|
@@ -1067,6 +1093,7 @@ class QueryService:
|
|
|
1067
1093
|
request_metadata=request_metadata,
|
|
1068
1094
|
telemetry_request=telemetry_request,
|
|
1069
1095
|
response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
|
|
1096
|
+
execution_trace=execution_trace,
|
|
1070
1097
|
)
|
|
1071
1098
|
return response, retry_history_handle
|
|
1072
1099
|
|
|
@@ -1377,10 +1404,16 @@ class QueryService:
|
|
|
1377
1404
|
client_data: dict = {},
|
|
1378
1405
|
task_id: Optional[int] = None,
|
|
1379
1406
|
ignore_history: bool = False,
|
|
1380
|
-
files: list = []
|
|
1407
|
+
files: list = [],
|
|
1408
|
+
input_files: list | None = None
|
|
1381
1409
|
) -> dict:
|
|
1382
1410
|
try:
|
|
1383
1411
|
stage_started_at = time.time()
|
|
1412
|
+
execution_trace = self.build_execution_trace(
|
|
1413
|
+
prompt_name=prompt_name,
|
|
1414
|
+
client_data=client_data,
|
|
1415
|
+
input_files=input_files,
|
|
1416
|
+
)
|
|
1384
1417
|
request_source = None
|
|
1385
1418
|
|
|
1386
1419
|
logging.debug(
|
|
@@ -1742,6 +1775,7 @@ class QueryService:
|
|
|
1742
1775
|
prompt_output_contract=prompt_output_contract,
|
|
1743
1776
|
history_handle=history_handle,
|
|
1744
1777
|
ignore_history=ignore_history,
|
|
1778
|
+
execution_trace=execution_trace,
|
|
1745
1779
|
)
|
|
1746
1780
|
log_stage("invoke_with_history_recovery")
|
|
1747
1781
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iatoolkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.52.0
|
|
4
4
|
Summary: IAToolkit
|
|
5
5
|
Author: Fernando Libedinsky
|
|
6
6
|
License-Expression: MIT
|
|
@@ -47,9 +47,6 @@ Requires-Dist: humanfriendly==10.0
|
|
|
47
47
|
Requires-Dist: idna==3.10
|
|
48
48
|
Requires-Dist: injector==0.22.0
|
|
49
49
|
Requires-Dist: Jinja2==3.1.5
|
|
50
|
-
Requires-Dist: langchain==0.3.19
|
|
51
|
-
Requires-Dist: langchain-core==0.3.35
|
|
52
|
-
Requires-Dist: langchain-text-splitters==0.3.6
|
|
53
50
|
Requires-Dist: markdown2==2.5.3
|
|
54
51
|
Requires-Dist: nh3==0.3.7
|
|
55
52
|
Requires-Dist: openai==2.8.1
|
|
@@ -79,7 +76,6 @@ Requires-Dist: SQLAlchemy==2.0.49
|
|
|
79
76
|
Requires-Dist: sqlalchemy-redshift==1.0.0
|
|
80
77
|
Requires-Dist: redshift_connector==2.1.14
|
|
81
78
|
Requires-Dist: tiktoken==0.8.0
|
|
82
|
-
Requires-Dist: tokenizers>=0.22.0
|
|
83
79
|
Requires-Dist: websocket-client==1.8.0
|
|
84
80
|
Requires-Dist: websockets==14.1
|
|
85
81
|
Requires-Dist: Werkzeug==3.1.3
|
|
@@ -20,6 +20,7 @@ src/iatoolkit/common/model_registry.py
|
|
|
20
20
|
src/iatoolkit/common/routes.py
|
|
21
21
|
src/iatoolkit/common/secret_resolver.py
|
|
22
22
|
src/iatoolkit/common/session_manager.py
|
|
23
|
+
src/iatoolkit/common/text_splitter.py
|
|
23
24
|
src/iatoolkit/common/url_safety.py
|
|
24
25
|
src/iatoolkit/common/util.py
|
|
25
26
|
src/iatoolkit/common/interfaces/__init__.py
|
|
@@ -109,7 +110,6 @@ src/iatoolkit/services/__init__.py
|
|
|
109
110
|
src/iatoolkit/services/api_key_service.py
|
|
110
111
|
src/iatoolkit/services/attachment_policy_service.py
|
|
111
112
|
src/iatoolkit/services/auth_service.py
|
|
112
|
-
src/iatoolkit/services/benchmark_service.py
|
|
113
113
|
src/iatoolkit/services/branding_service.py
|
|
114
114
|
src/iatoolkit/services/company_context_service.py
|
|
115
115
|
src/iatoolkit/services/configuration_service.py
|
|
@@ -37,9 +37,6 @@ humanfriendly==10.0
|
|
|
37
37
|
idna==3.10
|
|
38
38
|
injector==0.22.0
|
|
39
39
|
Jinja2==3.1.5
|
|
40
|
-
langchain==0.3.19
|
|
41
|
-
langchain-core==0.3.35
|
|
42
|
-
langchain-text-splitters==0.3.6
|
|
43
40
|
markdown2==2.5.3
|
|
44
41
|
nh3==0.3.7
|
|
45
42
|
openai==2.8.1
|
|
@@ -69,7 +66,6 @@ SQLAlchemy==2.0.49
|
|
|
69
66
|
sqlalchemy-redshift==1.0.0
|
|
70
67
|
redshift_connector==2.1.14
|
|
71
68
|
tiktoken==0.8.0
|
|
72
|
-
tokenizers>=0.22.0
|
|
73
69
|
websocket-client==1.8.0
|
|
74
70
|
websockets==14.1
|
|
75
71
|
Werkzeug==3.1.3
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
# Copyright (c) 2024 Fernando Libedinsky
|
|
2
|
-
# Product: IAToolkit
|
|
3
|
-
#
|
|
4
|
-
# IAToolkit is open source software.
|
|
5
|
-
|
|
6
|
-
import pandas as pd
|
|
7
|
-
import time
|
|
8
|
-
import logging
|
|
9
|
-
from injector import inject
|
|
10
|
-
from iatoolkit.services.query_service import QueryService
|
|
11
|
-
from iatoolkit.repositories.profile_repo import ProfileRepo
|
|
12
|
-
from iatoolkit.common.exceptions import IAToolkitException
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class BenchmarkService:
|
|
16
|
-
@inject
|
|
17
|
-
def __init__(self, query_service: QueryService, profile_repo: ProfileRepo):
|
|
18
|
-
self.query_service = query_service
|
|
19
|
-
self.profile_repo = profile_repo
|
|
20
|
-
|
|
21
|
-
def _update_results_row(self, df: pd.DataFrame, index: int,
|
|
22
|
-
status: str,
|
|
23
|
-
context_time: float,
|
|
24
|
-
gpt_time: float,
|
|
25
|
-
answer: str,
|
|
26
|
-
error_msg: str,
|
|
27
|
-
query_id: int,
|
|
28
|
-
stats: dict):
|
|
29
|
-
df.at[index, 'status'] = status
|
|
30
|
-
df.at[index, 'context_time'] = round(context_time, 2)
|
|
31
|
-
df.at[index, 'gpt_time'] = round(gpt_time, 2)
|
|
32
|
-
df.at[index, 'answer'] = answer
|
|
33
|
-
df.at[index, 'error_message'] = error_msg[:512]
|
|
34
|
-
df.at[index, 'query_id'] = query_id
|
|
35
|
-
df.at[index, 'in_tokens'] = stats.get('input_tokens', 0)
|
|
36
|
-
df.at[index, 'out_tokens'] = stats.get('output_tokens', 0)
|
|
37
|
-
df.at[index, 'retry'] = stats.get('sql_retry_count', 0)
|
|
38
|
-
|
|
39
|
-
def run(self, company_short_name: str, file_path: str):
|
|
40
|
-
if not file_path.endswith('.xlsx'):
|
|
41
|
-
raise IAToolkitException(IAToolkitException.ErrorType.INVALID_PARAMETER,
|
|
42
|
-
f"solo se leer archivos .xlsx")
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
df = pd.read_excel(file_path, keep_default_na=False)
|
|
46
|
-
except FileNotFoundError:
|
|
47
|
-
raise IAToolkitException(IAToolkitException.ErrorType.INVALID_NAME,
|
|
48
|
-
f"El archivo no fue encontrado en: {file_path}")
|
|
49
|
-
|
|
50
|
-
required_columns = ['username', 'client_identity', 'prompt_name', 'question', 'model']
|
|
51
|
-
if not all(col in df.columns for col in required_columns):
|
|
52
|
-
raise IAToolkitException(IAToolkitException.ErrorType.INVALID_PARAMETER,
|
|
53
|
-
f"La planilla debe contener las columnas: {required_columns}")
|
|
54
|
-
|
|
55
|
-
# Añadir columnas para los resultados
|
|
56
|
-
df['status'] = 'pending'
|
|
57
|
-
df['context_time'] = 0.0
|
|
58
|
-
df['gpt_time'] = 0.0
|
|
59
|
-
df['answer'] = ''
|
|
60
|
-
df['error_message'] = ''
|
|
61
|
-
df['query_id'] = 0
|
|
62
|
-
df['in_tokens'] = 0
|
|
63
|
-
df['out_tokens'] = 0
|
|
64
|
-
df['retry'] = 0
|
|
65
|
-
|
|
66
|
-
company = self.profile_repo.get_company_by_short_name(company_short_name)
|
|
67
|
-
if not company:
|
|
68
|
-
raise IAToolkitException(IAToolkitException.ErrorType.CONFIG_ERROR, f"Compañía {company_short_name} no encontrada.")
|
|
69
|
-
|
|
70
|
-
total_rows = len(df)
|
|
71
|
-
logging.info(f"Iniciando benchmark para {total_rows} casos de prueba desde el archivo: {file_path}")
|
|
72
|
-
|
|
73
|
-
for index, row in df.iterrows():
|
|
74
|
-
status = 'OK'
|
|
75
|
-
error_msg = ''
|
|
76
|
-
answer = ''
|
|
77
|
-
stats = {}
|
|
78
|
-
|
|
79
|
-
try:
|
|
80
|
-
username = str(row['username'])
|
|
81
|
-
client_identity = str(row['client_identity'])
|
|
82
|
-
prompt_name = str(row['prompt_name'])
|
|
83
|
-
question = str(row['question'])
|
|
84
|
-
model = str(row['model'])
|
|
85
|
-
|
|
86
|
-
logging.info(
|
|
87
|
-
f"*** Procesando caso {index + 1}/{total_rows}: client_rut='{client_identity}', prompt='{prompt_name}'")
|
|
88
|
-
|
|
89
|
-
# 1. init context with user executing the test
|
|
90
|
-
start_time = time.time()
|
|
91
|
-
self.query_service.llm_init_context(company.short_name,
|
|
92
|
-
external_user_id=username,
|
|
93
|
-
model=model)
|
|
94
|
-
context_time = time.time() - start_time
|
|
95
|
-
|
|
96
|
-
# 2. prepare client data.
|
|
97
|
-
client_data = {'client_identity': client_identity}
|
|
98
|
-
|
|
99
|
-
# 3. execute the query
|
|
100
|
-
start_time = time.time()
|
|
101
|
-
response = self.query_service.llm_query(
|
|
102
|
-
company_short_name=company.short_name,
|
|
103
|
-
prompt_name=prompt_name,
|
|
104
|
-
question=question,
|
|
105
|
-
external_user_id=username,
|
|
106
|
-
client_data=client_data
|
|
107
|
-
)
|
|
108
|
-
gpt_time = time.time() - start_time
|
|
109
|
-
|
|
110
|
-
# 4. process the response
|
|
111
|
-
if response.get('error') or not response.get('valid_response'):
|
|
112
|
-
status = 'FAILED'
|
|
113
|
-
error_msg = response.get('error_message', 'Error desconocido en la respuesta.')
|
|
114
|
-
else:
|
|
115
|
-
answer = response.get('answer', '')
|
|
116
|
-
stats = response.get('stats', {})
|
|
117
|
-
|
|
118
|
-
query_id = response.get('query_id', 0)
|
|
119
|
-
|
|
120
|
-
except Exception as e:
|
|
121
|
-
status = 'FAILED'
|
|
122
|
-
error_msg = f"Excepción durante la ejecución: {type(e).__name__} - {str(e)}"
|
|
123
|
-
logging.error(f"Fallo en el caso {index + 1}: {error_msg}")
|
|
124
|
-
|
|
125
|
-
finally:
|
|
126
|
-
self._update_results_row(df, index,
|
|
127
|
-
status=status,
|
|
128
|
-
context_time=context_time,
|
|
129
|
-
gpt_time=gpt_time,
|
|
130
|
-
answer=answer,
|
|
131
|
-
error_msg=error_msg,
|
|
132
|
-
stats=stats,
|
|
133
|
-
query_id=query_id)
|
|
134
|
-
|
|
135
|
-
output_filename = file_path.replace('.xlsx', '_results.xlsx')
|
|
136
|
-
df.to_excel(output_filename, index=False)
|
|
137
|
-
logging.info(f"Benchmark finalizado. Resultados guardados en: {output_filename}")
|
|
138
|
-
|
|
139
|
-
return output_filename
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|