iatoolkit 2.4.1__tar.gz → 2.5.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.4.1/src/iatoolkit.egg-info → iatoolkit-2.5.0}/PKG-INFO +2 -1
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/pyproject.toml +1 -1
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/requirements.txt +1 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/core.py +2 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/locales/en.yaml +7 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/locales/es.yaml +7 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/configuration_service.py +66 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/llm_client_service.py +51 -1
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/prompt_service.py +10 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/query_service.py +54 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/system_prompt_catalog.py +6 -2
- iatoolkit-2.5.0/src/iatoolkit/services/telemetry_service.py +418 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0/src/iatoolkit.egg-info}/PKG-INFO +2 -1
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit.egg-info/SOURCES.txt +20 -19
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit.egg-info/requires.txt +1 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/LICENSE +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/readme.md +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/setup.cfg +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.4.1/src/iatoolkit → iatoolkit-2.5.0/src/iatoolkit/config}/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/system_prompts/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.4.1 → iatoolkit-2.5.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.5.0
|
|
4
4
|
Summary: IAToolkit
|
|
5
5
|
Author: Fernando Libedinsky
|
|
6
6
|
License-Expression: MIT
|
|
@@ -12,6 +12,7 @@ Requires-Dist: bcrypt==4.2.1
|
|
|
12
12
|
Requires-Dist: anthropic>=0.83.0
|
|
13
13
|
Requires-Dist: boto3==1.36.22
|
|
14
14
|
Requires-Dist: botocore==1.36.22
|
|
15
|
+
Requires-Dist: braintrust>=0.17.0
|
|
15
16
|
Requires-Dist: build==1.2.2.post1
|
|
16
17
|
Requires-Dist: click==8.1.8
|
|
17
18
|
Requires-Dist: cryptography==44.0.3
|
|
@@ -29,4 +29,4 @@ version = { attr = "iatoolkit.__version__" }
|
|
|
29
29
|
dependencies = { file = ["requirements.txt"] }
|
|
30
30
|
|
|
31
31
|
[tool.setuptools.package-data]
|
|
32
|
-
iatoolkit = ["
|
|
32
|
+
iatoolkit = ["templates/**/*", "static/**/*", "locales/*.yaml", "config/*.yaml", "config/system_prompts/*.prompt"]
|
|
@@ -402,6 +402,7 @@ class IAToolkit:
|
|
|
402
402
|
from iatoolkit.services.i18n_service import I18nService
|
|
403
403
|
from iatoolkit.services.language_service import LanguageService
|
|
404
404
|
from iatoolkit.services.configuration_service import ConfigurationService
|
|
405
|
+
from iatoolkit.services.telemetry_service import TelemetryService
|
|
405
406
|
from iatoolkit.services.embedding_service import EmbeddingService
|
|
406
407
|
from iatoolkit.services.history_manager_service import HistoryManagerService
|
|
407
408
|
from iatoolkit.services.tool_service import ToolService
|
|
@@ -443,6 +444,7 @@ class IAToolkit:
|
|
|
443
444
|
binder.bind(I18nService, to=I18nService)
|
|
444
445
|
binder.bind(LanguageService, to=LanguageService)
|
|
445
446
|
binder.bind(ConfigurationService, to=ConfigurationService)
|
|
447
|
+
binder.bind(TelemetryService, to=TelemetryService)
|
|
446
448
|
binder.bind(EmbeddingService, to=EmbeddingService)
|
|
447
449
|
binder.bind(HistoryManagerService, to=HistoryManagerService)
|
|
448
450
|
binder.bind(ToolService, to=ToolService)
|
|
@@ -69,6 +69,11 @@ ui:
|
|
|
69
69
|
primary_input: "Primary Input"
|
|
70
70
|
prompt_args: "Prompt Arguments (Client Data)"
|
|
71
71
|
llm_output: "LLM Output (Raw JSON)"
|
|
72
|
+
telemetry_label: "Telemetry"
|
|
73
|
+
telemetry_open_trace: "Open Trace"
|
|
74
|
+
telemetry_not_recorded: "Not recorded"
|
|
75
|
+
telemetry_disabled: "Disabled"
|
|
76
|
+
telemetry_unknown_provider: "unknown provider"
|
|
72
77
|
|
|
73
78
|
login_widget:
|
|
74
79
|
title: "Sign In"
|
|
@@ -1041,6 +1046,8 @@ ui:
|
|
|
1041
1046
|
store_response_default: "Provider default"
|
|
1042
1047
|
store_response_true: "Yes"
|
|
1043
1048
|
store_response_false: "No"
|
|
1049
|
+
telemetry_enabled_label: "LLM Telemetry"
|
|
1050
|
+
telemetry_enabled_help: "Send this agent's LLM runs to the company telemetry backend when telemetry is enabled in company configuration."
|
|
1044
1051
|
tools_title: "Tool Selection"
|
|
1045
1052
|
tools_mode_label: "Tools Mode"
|
|
1046
1053
|
tools_mode_inherit: "Automatic"
|
|
@@ -70,6 +70,11 @@ ui:
|
|
|
70
70
|
primary_input: "Entrada Principal"
|
|
71
71
|
prompt_args: "Argumentos del Prompt (Client Data)"
|
|
72
72
|
llm_output: "Salida LLM (JSON Crudo)"
|
|
73
|
+
telemetry_label: "Telemetría"
|
|
74
|
+
telemetry_open_trace: "Abrir traza"
|
|
75
|
+
telemetry_not_recorded: "No registrada"
|
|
76
|
+
telemetry_disabled: "Deshabilitada"
|
|
77
|
+
telemetry_unknown_provider: "provider desconocido"
|
|
73
78
|
|
|
74
79
|
|
|
75
80
|
login_widget:
|
|
@@ -1044,6 +1049,8 @@ ui:
|
|
|
1044
1049
|
store_response_default: "Por defecto del provider"
|
|
1045
1050
|
store_response_true: "Sí"
|
|
1046
1051
|
store_response_false: "No"
|
|
1052
|
+
telemetry_enabled_label: "Telemetría LLM"
|
|
1053
|
+
telemetry_enabled_help: "Envía las ejecuciones LLM de este agente al backend de telemetría de la empresa cuando la telemetría esté habilitada en la configuración de la compañía."
|
|
1047
1054
|
tools_title: "Selección de Tools"
|
|
1048
1055
|
tools_mode_label: "Modo de Tools"
|
|
1049
1056
|
tools_mode_inherit: "Automático"
|
|
@@ -521,6 +521,56 @@ class ConfigurationService:
|
|
|
521
521
|
if raw_x_title is not None and (not isinstance(raw_x_title, str) or not raw_x_title.strip()):
|
|
522
522
|
add_error("llm.openrouter.x_title", "Must be a non-empty string.")
|
|
523
523
|
|
|
524
|
+
telemetry_cfg = config.get("llm", {}).get("telemetry")
|
|
525
|
+
if telemetry_cfg is not None:
|
|
526
|
+
if not isinstance(telemetry_cfg, dict):
|
|
527
|
+
add_error("llm.telemetry", "Must be a dictionary.")
|
|
528
|
+
else:
|
|
529
|
+
telemetry_enabled = telemetry_cfg.get("enabled", False)
|
|
530
|
+
if not isinstance(telemetry_enabled, bool):
|
|
531
|
+
add_error("llm.telemetry.enabled", "Must be a boolean.")
|
|
532
|
+
|
|
533
|
+
telemetry_provider = telemetry_cfg.get("provider")
|
|
534
|
+
normalized_telemetry_provider = ""
|
|
535
|
+
if telemetry_provider is not None:
|
|
536
|
+
if not isinstance(telemetry_provider, str) or not telemetry_provider.strip():
|
|
537
|
+
add_error("llm.telemetry.provider", "Must be a non-empty string.")
|
|
538
|
+
else:
|
|
539
|
+
normalized_telemetry_provider = telemetry_provider.strip().lower()
|
|
540
|
+
if normalized_telemetry_provider not in {"braintrust"}:
|
|
541
|
+
add_error(
|
|
542
|
+
"llm.telemetry.provider",
|
|
543
|
+
"Unsupported provider. Must be 'braintrust'.",
|
|
544
|
+
)
|
|
545
|
+
elif telemetry_enabled:
|
|
546
|
+
add_error("llm.telemetry.provider", "Missing required key: 'provider'.")
|
|
547
|
+
|
|
548
|
+
if normalized_telemetry_provider == "braintrust":
|
|
549
|
+
braintrust_cfg = telemetry_cfg.get("braintrust")
|
|
550
|
+
if not isinstance(braintrust_cfg, dict):
|
|
551
|
+
add_error("llm.telemetry.braintrust", "Must be a dictionary.")
|
|
552
|
+
else:
|
|
553
|
+
if telemetry_enabled:
|
|
554
|
+
project = braintrust_cfg.get("project")
|
|
555
|
+
if not isinstance(project, str) or not project.strip():
|
|
556
|
+
add_error("llm.telemetry.braintrust.project", "Must be a non-empty string.")
|
|
557
|
+
|
|
558
|
+
api_key = braintrust_cfg.get("api_key")
|
|
559
|
+
if not isinstance(api_key, str) or not api_key.strip():
|
|
560
|
+
add_error("llm.telemetry.braintrust.api_key", "Must be a non-empty string.")
|
|
561
|
+
|
|
562
|
+
api_url = braintrust_cfg.get("api_url")
|
|
563
|
+
if api_url is not None:
|
|
564
|
+
if not isinstance(api_url, str) or not api_url.strip():
|
|
565
|
+
add_error("llm.telemetry.braintrust.api_url", "Must be a non-empty string.")
|
|
566
|
+
else:
|
|
567
|
+
parsed = urlparse(api_url.strip())
|
|
568
|
+
if parsed.scheme.lower() not in {"http", "https"} or not parsed.netloc:
|
|
569
|
+
add_error(
|
|
570
|
+
"llm.telemetry.braintrust.api_url",
|
|
571
|
+
"Must be an absolute HTTP or HTTPS URL.",
|
|
572
|
+
)
|
|
573
|
+
|
|
524
574
|
# 3. Embedding Provider
|
|
525
575
|
if isinstance(config.get("embedding_provider"), dict):
|
|
526
576
|
if not config.get("embedding_provider", {}).get("provider"):
|
|
@@ -678,6 +728,7 @@ class ConfigurationService:
|
|
|
678
728
|
"text_verbosity",
|
|
679
729
|
"prompt_version",
|
|
680
730
|
"prompt_variant",
|
|
731
|
+
"telemetry_enabled",
|
|
681
732
|
}
|
|
682
733
|
unknown_option_keys = sorted(
|
|
683
734
|
key for key in llm_request_options.keys() if key not in allowed_option_keys
|
|
@@ -724,6 +775,15 @@ class ConfigurationService:
|
|
|
724
775
|
"Must be a non-empty string.",
|
|
725
776
|
)
|
|
726
777
|
|
|
778
|
+
if "telemetry_enabled" in llm_request_options and not isinstance(
|
|
779
|
+
llm_request_options.get("telemetry_enabled"),
|
|
780
|
+
bool,
|
|
781
|
+
):
|
|
782
|
+
add_error(
|
|
783
|
+
f"prompts[{i}].llm_request_options.telemetry_enabled",
|
|
784
|
+
"Must be a boolean.",
|
|
785
|
+
)
|
|
786
|
+
|
|
727
787
|
tool_policy = prompt.get("tool_policy")
|
|
728
788
|
if tool_policy is not None:
|
|
729
789
|
if not isinstance(tool_policy, dict):
|
|
@@ -1110,6 +1170,12 @@ class ConfigurationService:
|
|
|
1110
1170
|
provider_cfg = providers_cfg.get(candidate)
|
|
1111
1171
|
return dict(provider_cfg) if isinstance(provider_cfg, dict) else {}
|
|
1112
1172
|
|
|
1173
|
+
def get_llm_telemetry_config(self, company_short_name: str) -> dict:
|
|
1174
|
+
self._ensure_config_loaded(company_short_name)
|
|
1175
|
+
llm_config = self._loaded_configs[company_short_name].get("llm") or {}
|
|
1176
|
+
telemetry_cfg = llm_config.get("telemetry")
|
|
1177
|
+
return dict(telemetry_cfg) if isinstance(telemetry_cfg, dict) else {}
|
|
1178
|
+
|
|
1113
1179
|
|
|
1114
1180
|
def _load_and_merge_configs(self, company_short_name: str) -> dict:
|
|
1115
1181
|
"""
|
|
@@ -23,6 +23,7 @@ from typing import Dict, Optional, List, Any
|
|
|
23
23
|
from iatoolkit.services.dispatcher_service import Dispatcher
|
|
24
24
|
from iatoolkit.services.storage_service import StorageService
|
|
25
25
|
from iatoolkit.services.structured_output_service import StructuredOutputService
|
|
26
|
+
from iatoolkit.services.telemetry_service import NoopTelemetryService
|
|
26
27
|
|
|
27
28
|
CONTEXT_ERROR_MESSAGE = 'Tu consulta supera el límite de contexto, utiliza el boton de recarga de contexto.'
|
|
28
29
|
|
|
@@ -36,7 +37,8 @@ class llmClient:
|
|
|
36
37
|
llm_proxy: LLMProxy,
|
|
37
38
|
model_registry: ModelRegistry,
|
|
38
39
|
storage_service: StorageService,
|
|
39
|
-
util: Utility
|
|
40
|
+
util: Utility,
|
|
41
|
+
telemetry_service=None,
|
|
40
42
|
):
|
|
41
43
|
self.llmquery_repo = llmquery_repo
|
|
42
44
|
self.llm_proxy = llm_proxy
|
|
@@ -44,6 +46,7 @@ class llmClient:
|
|
|
44
46
|
self.storage_service = storage_service
|
|
45
47
|
self.util = util
|
|
46
48
|
self._dispatcher = None # Cache for the lazy-loaded dispatcher
|
|
49
|
+
self._telemetry_service = telemetry_service
|
|
47
50
|
|
|
48
51
|
# Lazy init to avoid network/bootstrap failures during app startup.
|
|
49
52
|
self.encoding = None
|
|
@@ -62,6 +65,18 @@ class llmClient:
|
|
|
62
65
|
self._dispatcher = current_iatoolkit().get_injector().get(Dispatcher)
|
|
63
66
|
return self._dispatcher
|
|
64
67
|
|
|
68
|
+
@property
|
|
69
|
+
def telemetry_service(self):
|
|
70
|
+
if self._telemetry_service is None:
|
|
71
|
+
try:
|
|
72
|
+
from iatoolkit import current_iatoolkit
|
|
73
|
+
from iatoolkit.services.telemetry_service import TelemetryService
|
|
74
|
+
|
|
75
|
+
self._telemetry_service = current_iatoolkit().get_injector().get(TelemetryService)
|
|
76
|
+
except Exception:
|
|
77
|
+
self._telemetry_service = NoopTelemetryService()
|
|
78
|
+
return self._telemetry_service
|
|
79
|
+
|
|
65
80
|
|
|
66
81
|
def invoke(self,
|
|
67
82
|
company: Company,
|
|
@@ -81,6 +96,7 @@ class llmClient:
|
|
|
81
96
|
task_id: Optional[int] = None,
|
|
82
97
|
execution_metadata: Optional[Dict[str, Any]] = None,
|
|
83
98
|
request_metadata: Optional[Dict[str, str]] = None,
|
|
99
|
+
telemetry_request: Optional[Dict[str, Any]] = None,
|
|
84
100
|
response_contract: Optional[Dict[str, Any]] = None
|
|
85
101
|
) -> dict:
|
|
86
102
|
|
|
@@ -102,6 +118,7 @@ class llmClient:
|
|
|
102
118
|
)
|
|
103
119
|
text_payload = request_params["text"]
|
|
104
120
|
reasoning_payload = request_params["reasoning"]
|
|
121
|
+
telemetry_execution = self.telemetry_service.start_execution(telemetry_request)
|
|
105
122
|
|
|
106
123
|
try:
|
|
107
124
|
start_time = time.time()
|
|
@@ -285,6 +302,22 @@ class llmClient:
|
|
|
285
302
|
answer_time=stats['response_time']
|
|
286
303
|
)
|
|
287
304
|
self.llmquery_repo.add_query(query)
|
|
305
|
+
telemetry_execution.finalize(
|
|
306
|
+
query_id=query.id,
|
|
307
|
+
success=decoded_response.get('status', False),
|
|
308
|
+
answer_preview=decoded_response.get('answer', ''),
|
|
309
|
+
metrics={
|
|
310
|
+
"total_tokens": combined_stats.get("total_tokens"),
|
|
311
|
+
"response_time": combined_stats.get("response_time"),
|
|
312
|
+
"sql_retry_count": combined_stats.get("sql_retry_count"),
|
|
313
|
+
},
|
|
314
|
+
)
|
|
315
|
+
telemetry_stats = telemetry_execution.build_stats()
|
|
316
|
+
if telemetry_stats:
|
|
317
|
+
query.stats = dict(query.stats or {})
|
|
318
|
+
query.stats["telemetry"] = telemetry_stats
|
|
319
|
+
self.llmquery_repo.commit()
|
|
320
|
+
combined_stats = dict(query.stats or {})
|
|
288
321
|
logging.info(f"finish llm call in {int(time.time() - start_time)} secs..")
|
|
289
322
|
if function_calls:
|
|
290
323
|
logging.info(f"time within the function calls {f_call_time:.1f} secs.")
|
|
@@ -312,9 +345,17 @@ class llmClient:
|
|
|
312
345
|
except SQLAlchemyError as db_error:
|
|
313
346
|
# rollback
|
|
314
347
|
self.llmquery_repo.session.rollback()
|
|
348
|
+
telemetry_execution.finalize(
|
|
349
|
+
success=False,
|
|
350
|
+
error_message=str(db_error),
|
|
351
|
+
)
|
|
315
352
|
logging.error(f"Error de base de datos: {str(db_error)}")
|
|
316
353
|
raise db_error
|
|
317
354
|
except OperationalError as e:
|
|
355
|
+
telemetry_execution.finalize(
|
|
356
|
+
success=False,
|
|
357
|
+
error_message=str(e),
|
|
358
|
+
)
|
|
318
359
|
logging.error(f"Operational error: {str(e)}")
|
|
319
360
|
raise e
|
|
320
361
|
except Exception as e:
|
|
@@ -331,6 +372,15 @@ class llmClient:
|
|
|
331
372
|
function_calls=f_calls,
|
|
332
373
|
)
|
|
333
374
|
self.llmquery_repo.add_query(query)
|
|
375
|
+
telemetry_execution.finalize(
|
|
376
|
+
query_id=query.id,
|
|
377
|
+
success=False,
|
|
378
|
+
error_message=error_message,
|
|
379
|
+
)
|
|
380
|
+
telemetry_stats = telemetry_execution.build_stats()
|
|
381
|
+
if telemetry_stats:
|
|
382
|
+
query.stats = {"telemetry": telemetry_stats}
|
|
383
|
+
self.llmquery_repo.commit()
|
|
334
384
|
|
|
335
385
|
# in case of context error
|
|
336
386
|
if "context_length_exceeded" in str(e):
|
|
@@ -345,6 +345,7 @@ class PromptService:
|
|
|
345
345
|
"text_verbosity",
|
|
346
346
|
"prompt_version",
|
|
347
347
|
"prompt_variant",
|
|
348
|
+
"telemetry_enabled",
|
|
348
349
|
}
|
|
349
350
|
unknown_keys = sorted(
|
|
350
351
|
key for key in llm_request_options.keys() if key not in allowed_keys
|
|
@@ -422,6 +423,15 @@ class PromptService:
|
|
|
422
423
|
)
|
|
423
424
|
normalized_options["prompt_variant"] = candidate_prompt_variant
|
|
424
425
|
|
|
426
|
+
raw_telemetry_enabled = llm_request_options.get("telemetry_enabled")
|
|
427
|
+
if raw_telemetry_enabled is not None:
|
|
428
|
+
if not isinstance(raw_telemetry_enabled, bool):
|
|
429
|
+
raise IAToolkitException(
|
|
430
|
+
IAToolkitException.ErrorType.INVALID_PARAMETER,
|
|
431
|
+
"llm_request_options.telemetry_enabled must be a boolean.",
|
|
432
|
+
)
|
|
433
|
+
normalized_options["telemetry_enabled"] = raw_telemetry_enabled
|
|
434
|
+
|
|
425
435
|
return normalized_options
|
|
426
436
|
|
|
427
437
|
def get_prompts(self, company_short_name: str, include_all: bool = False) -> dict:
|
|
@@ -14,6 +14,7 @@ from iatoolkit.services.history_manager_service import HistoryManagerService
|
|
|
14
14
|
from iatoolkit.services.context_builder_service import ContextBuilderService
|
|
15
15
|
from iatoolkit.services.attachment_policy_service import AttachmentPolicyService
|
|
16
16
|
from iatoolkit.services.memory_lookup_policy_service import MemoryLookupPolicyService
|
|
17
|
+
from iatoolkit.services.telemetry_service import NoopTelemetryService
|
|
17
18
|
from iatoolkit.common.model_registry import ModelRegistry
|
|
18
19
|
from injector import inject
|
|
19
20
|
import logging
|
|
@@ -58,6 +59,7 @@ class QueryService:
|
|
|
58
59
|
context_builder: ContextBuilderService,
|
|
59
60
|
attachment_policy_service: AttachmentPolicyService | None = None,
|
|
60
61
|
memory_lookup_policy_service: MemoryLookupPolicyService | None = None,
|
|
62
|
+
telemetry_service=None,
|
|
61
63
|
):
|
|
62
64
|
self.profile_repo = profile_repo
|
|
63
65
|
self.tool_service = tool_service
|
|
@@ -71,6 +73,19 @@ class QueryService:
|
|
|
71
73
|
self.context_builder = context_builder
|
|
72
74
|
self.attachment_policy_service = attachment_policy_service
|
|
73
75
|
self.memory_lookup_policy_service = memory_lookup_policy_service or MemoryLookupPolicyService()
|
|
76
|
+
self._telemetry_service = telemetry_service
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def telemetry_service(self):
|
|
80
|
+
if self._telemetry_service is None:
|
|
81
|
+
try:
|
|
82
|
+
from iatoolkit import current_iatoolkit
|
|
83
|
+
from iatoolkit.services.telemetry_service import TelemetryService
|
|
84
|
+
|
|
85
|
+
self._telemetry_service = current_iatoolkit().get_injector().get(TelemetryService)
|
|
86
|
+
except Exception:
|
|
87
|
+
self._telemetry_service = NoopTelemetryService()
|
|
88
|
+
return self._telemetry_service
|
|
74
89
|
|
|
75
90
|
@classmethod
|
|
76
91
|
def register_tool_selector_hook(cls, hook: Callable | None):
|
|
@@ -294,6 +309,8 @@ class QueryService:
|
|
|
294
309
|
prompt_variant = str(raw_llm_request_options.get("prompt_variant") or "").strip()
|
|
295
310
|
if prompt_variant:
|
|
296
311
|
normalized_llm_request_options["prompt_variant"] = prompt_variant
|
|
312
|
+
if isinstance(raw_llm_request_options.get("telemetry_enabled"), bool):
|
|
313
|
+
normalized_llm_request_options["telemetry_enabled"] = raw_llm_request_options["telemetry_enabled"]
|
|
297
314
|
contract["llm_request_options"] = normalized_llm_request_options
|
|
298
315
|
raw_resource_bindings = contract.get("resource_bindings")
|
|
299
316
|
normalized_resource_bindings = []
|
|
@@ -583,6 +600,29 @@ class QueryService:
|
|
|
583
600
|
"prompt_variant": prompt_variant[:512],
|
|
584
601
|
}
|
|
585
602
|
|
|
603
|
+
def _resolve_telemetry_request(
|
|
604
|
+
self,
|
|
605
|
+
*,
|
|
606
|
+
company_short_name: str,
|
|
607
|
+
user_identifier: str,
|
|
608
|
+
effective_model: str,
|
|
609
|
+
provider: str,
|
|
610
|
+
task_id: int | None,
|
|
611
|
+
prompt_output_contract: dict | None,
|
|
612
|
+
execution_metadata: dict | None = None,
|
|
613
|
+
request_metadata: dict | None = None,
|
|
614
|
+
) -> dict:
|
|
615
|
+
return self.telemetry_service.resolve_execution_request(
|
|
616
|
+
company_short_name=company_short_name,
|
|
617
|
+
prompt_output_contract=prompt_output_contract,
|
|
618
|
+
model=effective_model,
|
|
619
|
+
provider=provider,
|
|
620
|
+
task_id=task_id,
|
|
621
|
+
user_identifier=user_identifier,
|
|
622
|
+
execution_metadata=execution_metadata,
|
|
623
|
+
request_metadata=request_metadata,
|
|
624
|
+
)
|
|
625
|
+
|
|
586
626
|
@staticmethod
|
|
587
627
|
def _append_memory_search_instruction(prompt: str, should_suggest_memory_search: bool) -> str:
|
|
588
628
|
if not should_suggest_memory_search:
|
|
@@ -825,6 +865,7 @@ class QueryService:
|
|
|
825
865
|
attachment_plan: dict,
|
|
826
866
|
execution_metadata: dict,
|
|
827
867
|
request_metadata: dict | None,
|
|
868
|
+
telemetry_request: dict | None,
|
|
828
869
|
prompt_output_contract: dict,
|
|
829
870
|
history_handle: HistoryHandle,
|
|
830
871
|
ignore_history: bool) -> tuple[dict, HistoryHandle]:
|
|
@@ -850,6 +891,7 @@ class QueryService:
|
|
|
850
891
|
store=store,
|
|
851
892
|
execution_metadata=execution_metadata,
|
|
852
893
|
request_metadata=request_metadata,
|
|
894
|
+
telemetry_request=telemetry_request,
|
|
853
895
|
response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
|
|
854
896
|
)
|
|
855
897
|
return response, history_handle
|
|
@@ -907,6 +949,7 @@ class QueryService:
|
|
|
907
949
|
store=store,
|
|
908
950
|
execution_metadata=execution_metadata,
|
|
909
951
|
request_metadata=request_metadata,
|
|
952
|
+
telemetry_request=telemetry_request,
|
|
910
953
|
response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
|
|
911
954
|
)
|
|
912
955
|
return response, retry_history_handle
|
|
@@ -1340,6 +1383,16 @@ class QueryService:
|
|
|
1340
1383
|
"provider": provider,
|
|
1341
1384
|
"company_defaults": self._resolve_company_attachment_defaults(company_short_name, prompt_name=prompt_name),
|
|
1342
1385
|
}
|
|
1386
|
+
telemetry_request = self._resolve_telemetry_request(
|
|
1387
|
+
company_short_name=company_short_name,
|
|
1388
|
+
user_identifier=user_identifier,
|
|
1389
|
+
effective_model=effective_model,
|
|
1390
|
+
provider=provider,
|
|
1391
|
+
task_id=task_id,
|
|
1392
|
+
prompt_output_contract=prompt_output_contract,
|
|
1393
|
+
execution_metadata=execution_metadata,
|
|
1394
|
+
request_metadata=request_metadata,
|
|
1395
|
+
)
|
|
1343
1396
|
|
|
1344
1397
|
response, history_handle = self._invoke_with_history_recovery(
|
|
1345
1398
|
company=company,
|
|
@@ -1358,6 +1411,7 @@ class QueryService:
|
|
|
1358
1411
|
attachment_plan=attachment_plan,
|
|
1359
1412
|
execution_metadata=execution_metadata,
|
|
1360
1413
|
request_metadata=request_metadata,
|
|
1414
|
+
telemetry_request=telemetry_request,
|
|
1361
1415
|
prompt_output_contract=prompt_output_contract,
|
|
1362
1416
|
history_handle=history_handle,
|
|
1363
1417
|
ignore_history=ignore_history,
|
|
@@ -10,7 +10,7 @@ import yaml
|
|
|
10
10
|
|
|
11
11
|
SYSTEM_PROMPTS_CONFIG_PACKAGE = "iatoolkit.config"
|
|
12
12
|
SYSTEM_PROMPTS_CONFIG_FILENAME = "system_prompts_pack.yaml"
|
|
13
|
-
|
|
13
|
+
SYSTEM_PROMPTS_DIRNAME = "system_prompts"
|
|
14
14
|
SYSTEM_PROMPT_SECTION_ORDER = (
|
|
15
15
|
"identity",
|
|
16
16
|
"business_context",
|
|
@@ -209,7 +209,11 @@ def _load_catalog() -> tuple[dict, ...]:
|
|
|
209
209
|
|
|
210
210
|
@lru_cache(maxsize=64)
|
|
211
211
|
def _read_prompt_text(filename: str) -> str:
|
|
212
|
-
return
|
|
212
|
+
return (
|
|
213
|
+
importlib.resources.files(SYSTEM_PROMPTS_CONFIG_PACKAGE)
|
|
214
|
+
.joinpath(SYSTEM_PROMPTS_DIRNAME, filename)
|
|
215
|
+
.read_text(encoding="utf-8")
|
|
216
|
+
)
|
|
213
217
|
|
|
214
218
|
|
|
215
219
|
def get_system_prompt_entries() -> list[dict]:
|