iatoolkit 2.16.3__tar.gz → 2.17.1__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.16.3/src/iatoolkit.egg-info → iatoolkit-2.17.1}/PKG-INFO +1 -1
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/__init__.py +1 -1
- iatoolkit-2.17.1/src/iatoolkit/infra/llm_gateway_resolver.py +167 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_proxy.py +66 -13
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/configuration_service.py +166 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit.egg-info/SOURCES.txt +1 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/LICENSE +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/pyproject.toml +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/readme.md +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/requirements.txt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/setup.cfg +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/model_registry.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/routes.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/core.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/locales/en.yaml +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/locales/es.yaml +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/context_builder_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/history_manager_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/llm_client_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/prompt_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/account.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/account_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/base_login_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/categories_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/chat_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/login_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/rag_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from injector import inject
|
|
6
|
+
|
|
7
|
+
from iatoolkit.common.exceptions import IAToolkitException
|
|
8
|
+
from iatoolkit.common.interfaces.secret_provider import SecretProvider
|
|
9
|
+
from iatoolkit.common.secret_resolver import resolve_secret
|
|
10
|
+
from iatoolkit.services.configuration_service import ConfigurationService
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LLMGatewayResolver:
|
|
14
|
+
"""Resolves optional outbound LLM gateway transport settings."""
|
|
15
|
+
|
|
16
|
+
PROVIDER_SLUGS = {
|
|
17
|
+
"openai": "openai",
|
|
18
|
+
"deepseek": "deepseek",
|
|
19
|
+
"anthropic": "anthropic",
|
|
20
|
+
"gemini": "google-ai-studio",
|
|
21
|
+
}
|
|
22
|
+
SUPPORTED_PROVIDERS = frozenset(PROVIDER_SLUGS)
|
|
23
|
+
CREDENTIAL_MODE_PROVIDER_KEY = "provider_key_in_request"
|
|
24
|
+
CREDENTIAL_MODE_CLOUDFLARE_MANAGED = "cloudflare_managed"
|
|
25
|
+
|
|
26
|
+
@inject
|
|
27
|
+
def __init__(self, configuration_service: ConfigurationService, secret_provider: SecretProvider):
|
|
28
|
+
self.configuration_service = configuration_service
|
|
29
|
+
self.secret_provider = secret_provider
|
|
30
|
+
|
|
31
|
+
def resolve(self, company_short_name: str, provider: str, provider_api_key: str | None) -> Dict[str, Any]:
|
|
32
|
+
normalized_provider = str(provider or "").strip().lower()
|
|
33
|
+
gateway_cfg = self.configuration_service.get_llm_gateway_config(company_short_name, normalized_provider) or {}
|
|
34
|
+
if not isinstance(gateway_cfg, dict) or gateway_cfg.get("enabled") is not True:
|
|
35
|
+
return {
|
|
36
|
+
"enabled": False,
|
|
37
|
+
"api_key": provider_api_key or "",
|
|
38
|
+
"base_url": "",
|
|
39
|
+
"default_headers": {},
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
vendor = str(gateway_cfg.get("vendor") or "").strip().lower()
|
|
43
|
+
if vendor != "cloudflare":
|
|
44
|
+
raise IAToolkitException(
|
|
45
|
+
IAToolkitException.ErrorType.CONFIG_ERROR,
|
|
46
|
+
f"Unsupported llm.gateway vendor '{vendor}'.",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
mode = str(gateway_cfg.get("mode") or "").strip().lower()
|
|
50
|
+
if mode != "provider_native":
|
|
51
|
+
raise IAToolkitException(
|
|
52
|
+
IAToolkitException.ErrorType.CONFIG_ERROR,
|
|
53
|
+
f"Unsupported llm.gateway mode '{mode}'.",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
provider_slug = self.PROVIDER_SLUGS.get(normalized_provider)
|
|
57
|
+
if not provider_slug:
|
|
58
|
+
return {
|
|
59
|
+
"enabled": False,
|
|
60
|
+
"api_key": provider_api_key or "",
|
|
61
|
+
"base_url": "",
|
|
62
|
+
"default_headers": {},
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
account_id = self._resolve_gateway_value(
|
|
66
|
+
company_short_name,
|
|
67
|
+
gateway_cfg,
|
|
68
|
+
direct_key="account_id",
|
|
69
|
+
secret_ref_key="account_id_secret_ref",
|
|
70
|
+
env_key="account_id_env",
|
|
71
|
+
)
|
|
72
|
+
gateway_id = str(gateway_cfg.get("gateway_id") or "").strip()
|
|
73
|
+
if not account_id or not gateway_id:
|
|
74
|
+
raise IAToolkitException(
|
|
75
|
+
IAToolkitException.ErrorType.CONFIG_ERROR,
|
|
76
|
+
"Cloudflare gateway requires resolved account_id and gateway_id.",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
credential_mode = str(
|
|
80
|
+
gateway_cfg.get("credential_mode") or self.CREDENTIAL_MODE_PROVIDER_KEY
|
|
81
|
+
).strip().lower()
|
|
82
|
+
authenticated_gateway = gateway_cfg.get("authenticated_gateway") is True
|
|
83
|
+
default_headers: dict[str, str] = {}
|
|
84
|
+
|
|
85
|
+
cloudflare_api_token = self._resolve_gateway_value(
|
|
86
|
+
company_short_name,
|
|
87
|
+
gateway_cfg,
|
|
88
|
+
direct_key="cloudflare_api_token",
|
|
89
|
+
secret_ref_key="cloudflare_api_token_secret_ref",
|
|
90
|
+
env_key="cloudflare_api_token_env",
|
|
91
|
+
)
|
|
92
|
+
if authenticated_gateway:
|
|
93
|
+
if not cloudflare_api_token:
|
|
94
|
+
raise IAToolkitException(
|
|
95
|
+
IAToolkitException.ErrorType.CONFIG_ERROR,
|
|
96
|
+
"Authenticated Cloudflare gateway requires a resolved cloudflare_api_token.",
|
|
97
|
+
)
|
|
98
|
+
default_headers["cf-aig-authorization"] = f"Bearer {cloudflare_api_token}"
|
|
99
|
+
|
|
100
|
+
if credential_mode == self.CREDENTIAL_MODE_PROVIDER_KEY:
|
|
101
|
+
if not provider_api_key:
|
|
102
|
+
raise IAToolkitException(
|
|
103
|
+
IAToolkitException.ErrorType.API_KEY,
|
|
104
|
+
(
|
|
105
|
+
f"Cloudflare gateway for provider '{normalized_provider}' requires the provider API key "
|
|
106
|
+
"when credential_mode is 'provider_key_in_request'."
|
|
107
|
+
),
|
|
108
|
+
)
|
|
109
|
+
resolved_api_key = provider_api_key
|
|
110
|
+
elif credential_mode == self.CREDENTIAL_MODE_CLOUDFLARE_MANAGED:
|
|
111
|
+
if not authenticated_gateway:
|
|
112
|
+
raise IAToolkitException(
|
|
113
|
+
IAToolkitException.ErrorType.CONFIG_ERROR,
|
|
114
|
+
(
|
|
115
|
+
"credential_mode 'cloudflare_managed' requires "
|
|
116
|
+
"'authenticated_gateway: true' so requests can be authorized with Cloudflare."
|
|
117
|
+
),
|
|
118
|
+
)
|
|
119
|
+
# Some SDKs insist on a non-null api_key even when upstream credentials are injected by Cloudflare.
|
|
120
|
+
resolved_api_key = "" if normalized_provider in {"openai", "deepseek", "gemini"} else None
|
|
121
|
+
else:
|
|
122
|
+
raise IAToolkitException(
|
|
123
|
+
IAToolkitException.ErrorType.CONFIG_ERROR,
|
|
124
|
+
f"Unsupported llm.gateway credential_mode '{credential_mode}'.",
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
byok_alias = str(gateway_cfg.get("byok_alias") or "").strip()
|
|
128
|
+
if byok_alias:
|
|
129
|
+
default_headers["cf-aig-byok-alias"] = byok_alias
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
"enabled": True,
|
|
133
|
+
"api_key": resolved_api_key,
|
|
134
|
+
"base_url": f"https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/{provider_slug}",
|
|
135
|
+
"default_headers": default_headers,
|
|
136
|
+
"vendor": vendor,
|
|
137
|
+
"mode": mode,
|
|
138
|
+
"credential_mode": credential_mode,
|
|
139
|
+
"authenticated_gateway": authenticated_gateway,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
def _resolve_gateway_value(
|
|
143
|
+
self,
|
|
144
|
+
company_short_name: str,
|
|
145
|
+
gateway_cfg: Dict[str, Any],
|
|
146
|
+
*,
|
|
147
|
+
direct_key: str,
|
|
148
|
+
secret_ref_key: str,
|
|
149
|
+
env_key: str,
|
|
150
|
+
) -> str:
|
|
151
|
+
direct_value = str(gateway_cfg.get(direct_key) or "").strip()
|
|
152
|
+
if direct_value:
|
|
153
|
+
return direct_value
|
|
154
|
+
|
|
155
|
+
secret_ref = str(gateway_cfg.get(secret_ref_key) or "").strip()
|
|
156
|
+
if secret_ref:
|
|
157
|
+
return str(
|
|
158
|
+
resolve_secret(self.secret_provider, company_short_name, secret_ref, default="") or ""
|
|
159
|
+
).strip()
|
|
160
|
+
|
|
161
|
+
env_ref = str(gateway_cfg.get(env_key) or "").strip()
|
|
162
|
+
if env_ref:
|
|
163
|
+
return str(
|
|
164
|
+
resolve_secret(self.secret_provider, company_short_name, env_ref, default="") or ""
|
|
165
|
+
).strip()
|
|
166
|
+
|
|
167
|
+
return ""
|
|
@@ -17,6 +17,7 @@ from iatoolkit.infra.llm_response import LLMResponse
|
|
|
17
17
|
from iatoolkit.common.model_registry import ModelRegistry
|
|
18
18
|
from iatoolkit.common.interfaces.secret_provider import SecretProvider
|
|
19
19
|
from iatoolkit.common.secret_resolver import resolve_secret
|
|
20
|
+
from iatoolkit.infra.llm_gateway_resolver import LLMGatewayResolver
|
|
20
21
|
from iatoolkit.services.telemetry_service import NoopTelemetryService
|
|
21
22
|
|
|
22
23
|
from openai import OpenAI, Timeout # For OpenAI and xAI (OpenAI-compatible)
|
|
@@ -54,6 +55,7 @@ class LLMProxy:
|
|
|
54
55
|
configuration_service: ConfigurationService,
|
|
55
56
|
model_registry: ModelRegistry,
|
|
56
57
|
secret_provider: SecretProvider,
|
|
58
|
+
gateway_resolver: LLMGatewayResolver | None = None,
|
|
57
59
|
telemetry_service=None,
|
|
58
60
|
):
|
|
59
61
|
"""
|
|
@@ -64,6 +66,10 @@ class LLMProxy:
|
|
|
64
66
|
self.configuration_service = configuration_service
|
|
65
67
|
self.model_registry = model_registry
|
|
66
68
|
self.secret_provider = secret_provider
|
|
69
|
+
self.gateway_resolver = gateway_resolver or LLMGatewayResolver(
|
|
70
|
+
configuration_service=configuration_service,
|
|
71
|
+
secret_provider=secret_provider,
|
|
72
|
+
)
|
|
67
73
|
self._telemetry_service = telemetry_service
|
|
68
74
|
|
|
69
75
|
# adapter cache by (provider, api_key, base_url)
|
|
@@ -356,7 +362,7 @@ class LLMProxy:
|
|
|
356
362
|
def _get_or_create_client(
|
|
357
363
|
self,
|
|
358
364
|
provider: str,
|
|
359
|
-
api_key: str,
|
|
365
|
+
api_key: str | None,
|
|
360
366
|
base_url: str = "",
|
|
361
367
|
default_headers: Dict[str, str] | None = None,
|
|
362
368
|
*,
|
|
@@ -409,7 +415,7 @@ class LLMProxy:
|
|
|
409
415
|
def _create_client_for_provider(
|
|
410
416
|
self,
|
|
411
417
|
provider: str,
|
|
412
|
-
api_key: str,
|
|
418
|
+
api_key: str | None,
|
|
413
419
|
base_url: str = "",
|
|
414
420
|
default_headers: Dict[str, str] | None = None,
|
|
415
421
|
*,
|
|
@@ -432,15 +438,22 @@ class LLMProxy:
|
|
|
432
438
|
|
|
433
439
|
if provider == self.PROVIDER_OPENAI:
|
|
434
440
|
# Standard OpenAI client for GPT models
|
|
435
|
-
return OpenAI(
|
|
441
|
+
return OpenAI(
|
|
442
|
+
api_key=api_key or "",
|
|
443
|
+
base_url=base_url or None,
|
|
444
|
+
timeout=timeout,
|
|
445
|
+
max_retries=max_retries,
|
|
446
|
+
default_headers=default_headers or None,
|
|
447
|
+
)
|
|
436
448
|
|
|
437
449
|
if provider == self.PROVIDER_XAI:
|
|
438
450
|
# xAI Grok is OpenAI-compatible; we can use the OpenAI client with a different base_url.
|
|
439
451
|
return OpenAI(
|
|
440
|
-
api_key=api_key,
|
|
452
|
+
api_key=api_key or "",
|
|
441
453
|
base_url="https://api.x.ai/v1",
|
|
442
454
|
timeout=timeout,
|
|
443
455
|
max_retries=max_retries,
|
|
456
|
+
default_headers=default_headers or None,
|
|
444
457
|
)
|
|
445
458
|
|
|
446
459
|
if provider == self.PROVIDER_DEEPSEEK:
|
|
@@ -449,10 +462,11 @@ class LLMProxy:
|
|
|
449
462
|
|
|
450
463
|
# We use OpenAI client with a DeepSeek base_url:
|
|
451
464
|
return OpenAI(
|
|
452
|
-
api_key=api_key,
|
|
453
|
-
base_url="https://api.deepseek.com",
|
|
465
|
+
api_key=api_key or "",
|
|
466
|
+
base_url=base_url or "https://api.deepseek.com",
|
|
454
467
|
timeout=timeout,
|
|
455
468
|
max_retries=max_retries,
|
|
469
|
+
default_headers=default_headers or None,
|
|
456
470
|
)
|
|
457
471
|
|
|
458
472
|
if provider == self.PROVIDER_OPENAI_COMPATIBLE:
|
|
@@ -462,10 +476,11 @@ class LLMProxy:
|
|
|
462
476
|
"Provider 'openai_compatible' requires a configured base_url."
|
|
463
477
|
)
|
|
464
478
|
return OpenAI(
|
|
465
|
-
api_key=api_key,
|
|
479
|
+
api_key=api_key or "",
|
|
466
480
|
base_url=base_url,
|
|
467
481
|
timeout=timeout,
|
|
468
482
|
max_retries=max_retries,
|
|
483
|
+
default_headers=default_headers or None,
|
|
469
484
|
)
|
|
470
485
|
|
|
471
486
|
if provider == self.PROVIDER_OPENROUTER:
|
|
@@ -488,7 +503,14 @@ class LLMProxy:
|
|
|
488
503
|
#
|
|
489
504
|
from google.genai import Client
|
|
490
505
|
|
|
491
|
-
|
|
506
|
+
gemini_http_options = {"api_version": "v1alpha"}
|
|
507
|
+
if base_url:
|
|
508
|
+
gemini_http_options["base_url"] = base_url
|
|
509
|
+
gemini_http_options["api_version"] = "v1"
|
|
510
|
+
if default_headers:
|
|
511
|
+
gemini_http_options["headers"] = dict(default_headers)
|
|
512
|
+
|
|
513
|
+
return Client(api_key=api_key, http_options=gemini_http_options)
|
|
492
514
|
if provider == self.PROVIDER_ANTHROPIC:
|
|
493
515
|
try:
|
|
494
516
|
from anthropic import Anthropic
|
|
@@ -498,7 +520,13 @@ class LLMProxy:
|
|
|
498
520
|
"Anthropic SDK is not installed. Add 'anthropic' to requirements."
|
|
499
521
|
) from ex
|
|
500
522
|
|
|
501
|
-
return Anthropic(
|
|
523
|
+
return Anthropic(
|
|
524
|
+
api_key=api_key,
|
|
525
|
+
base_url=base_url or None,
|
|
526
|
+
timeout=timeout,
|
|
527
|
+
max_retries=max_retries,
|
|
528
|
+
default_headers=default_headers or None,
|
|
529
|
+
)
|
|
502
530
|
|
|
503
531
|
raise IAToolkitException(
|
|
504
532
|
IAToolkitException.ErrorType.MODEL,
|
|
@@ -507,10 +535,31 @@ class LLMProxy:
|
|
|
507
535
|
|
|
508
536
|
def _get_client_config(self, company_short_name: str, provider: str) -> dict:
|
|
509
537
|
provider_config = self.configuration_service.get_llm_provider_config(company_short_name, provider) or {}
|
|
538
|
+
provider_api_key = self._get_api_key_from_config(
|
|
539
|
+
company_short_name,
|
|
540
|
+
provider,
|
|
541
|
+
required=False,
|
|
542
|
+
)
|
|
543
|
+
gateway_transport = self.gateway_resolver.resolve(
|
|
544
|
+
company_short_name=company_short_name,
|
|
545
|
+
provider=provider,
|
|
546
|
+
provider_api_key=provider_api_key,
|
|
547
|
+
)
|
|
548
|
+
if not gateway_transport.get("enabled"):
|
|
549
|
+
provider_api_key = provider_api_key or self._get_api_key_from_config(
|
|
550
|
+
company_short_name,
|
|
551
|
+
provider,
|
|
552
|
+
required=True,
|
|
553
|
+
)
|
|
554
|
+
configured_base_url = self._get_base_url_from_config(company_short_name, provider)
|
|
555
|
+
configured_headers = self._get_default_headers_from_config(company_short_name, provider)
|
|
556
|
+
effective_base_url = gateway_transport.get("base_url") or configured_base_url
|
|
557
|
+
effective_headers = dict(configured_headers)
|
|
558
|
+
effective_headers.update(gateway_transport.get("default_headers") or {})
|
|
510
559
|
return {
|
|
511
|
-
"api_key":
|
|
512
|
-
"base_url":
|
|
513
|
-
"default_headers":
|
|
560
|
+
"api_key": gateway_transport.get("api_key", provider_api_key) if gateway_transport.get("enabled") else provider_api_key,
|
|
561
|
+
"base_url": effective_base_url,
|
|
562
|
+
"default_headers": effective_headers,
|
|
514
563
|
"connect_timeout_seconds": self._resolve_provider_float(
|
|
515
564
|
provider_config,
|
|
516
565
|
("connect_timeout_seconds",),
|
|
@@ -604,7 +653,7 @@ class LLMProxy:
|
|
|
604
653
|
# -------------------------------------------------------------------------
|
|
605
654
|
# Configuration helpers
|
|
606
655
|
# -------------------------------------------------------------------------
|
|
607
|
-
def _get_api_key_from_config(self, company_short_name: str, provider: str) -> str:
|
|
656
|
+
def _get_api_key_from_config(self, company_short_name: str, provider: str, *, required: bool = True) -> str:
|
|
608
657
|
"""
|
|
609
658
|
Read the LLM API key from company configuration and environment variables.
|
|
610
659
|
|
|
@@ -634,6 +683,8 @@ class LLMProxy:
|
|
|
634
683
|
env_var_name = llm_config["api-key"]
|
|
635
684
|
|
|
636
685
|
if not env_var_name:
|
|
686
|
+
if not required:
|
|
687
|
+
return ""
|
|
637
688
|
raise IAToolkitException(
|
|
638
689
|
IAToolkitException.ErrorType.API_KEY,
|
|
639
690
|
f"Company '{company_short_name}' doesn't have an API key configured "
|
|
@@ -648,6 +699,8 @@ class LLMProxy:
|
|
|
648
699
|
)
|
|
649
700
|
|
|
650
701
|
if not api_key_value:
|
|
702
|
+
if not required:
|
|
703
|
+
return ""
|
|
651
704
|
raise IAToolkitException(
|
|
652
705
|
IAToolkitException.ErrorType.API_KEY,
|
|
653
706
|
f"Environment variable '{env_var_name}' for company '{company_short_name}' "
|
|
@@ -98,6 +98,133 @@ class ConfigurationService:
|
|
|
98
98
|
"Must be one of: ['latency', 'price', 'throughput'], or a dictionary."
|
|
99
99
|
)
|
|
100
100
|
|
|
101
|
+
@staticmethod
|
|
102
|
+
def _validate_llm_gateway_entry(
|
|
103
|
+
add_error,
|
|
104
|
+
section: str,
|
|
105
|
+
gateway_cfg,
|
|
106
|
+
*,
|
|
107
|
+
allow_providers: bool,
|
|
108
|
+
require_complete_config: bool,
|
|
109
|
+
) -> None:
|
|
110
|
+
if not isinstance(gateway_cfg, dict):
|
|
111
|
+
add_error(section, "Must be a dictionary.")
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
allowed_gateway_providers = {"openai", "deepseek", "anthropic", "gemini"}
|
|
115
|
+
allowed_gateway_modes = {"provider_native"}
|
|
116
|
+
allowed_gateway_vendors = {"cloudflare"}
|
|
117
|
+
allowed_credential_modes = {"provider_key_in_request", "cloudflare_managed"}
|
|
118
|
+
secret_ref_keys = (
|
|
119
|
+
"account_id",
|
|
120
|
+
"account_id_secret_ref",
|
|
121
|
+
"account_id_env",
|
|
122
|
+
"cloudflare_api_token_secret_ref",
|
|
123
|
+
"cloudflare_api_token_env",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
enabled = gateway_cfg.get("enabled")
|
|
127
|
+
if enabled is not None and not isinstance(enabled, bool):
|
|
128
|
+
add_error(f"{section}.enabled", "Must be a boolean.")
|
|
129
|
+
|
|
130
|
+
vendor = gateway_cfg.get("vendor")
|
|
131
|
+
normalized_vendor = ""
|
|
132
|
+
if vendor is not None:
|
|
133
|
+
if not isinstance(vendor, str) or not vendor.strip():
|
|
134
|
+
add_error(f"{section}.vendor", "Must be a non-empty string.")
|
|
135
|
+
else:
|
|
136
|
+
normalized_vendor = vendor.strip().lower()
|
|
137
|
+
if normalized_vendor not in allowed_gateway_vendors:
|
|
138
|
+
add_error(
|
|
139
|
+
f"{section}.vendor",
|
|
140
|
+
f"Unsupported vendor '{normalized_vendor}'. Must be one of: {sorted(allowed_gateway_vendors)}.",
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
mode = gateway_cfg.get("mode")
|
|
144
|
+
normalized_mode = ""
|
|
145
|
+
if mode is not None:
|
|
146
|
+
if not isinstance(mode, str) or not mode.strip():
|
|
147
|
+
add_error(f"{section}.mode", "Must be a non-empty string.")
|
|
148
|
+
else:
|
|
149
|
+
normalized_mode = mode.strip().lower()
|
|
150
|
+
if normalized_mode not in allowed_gateway_modes:
|
|
151
|
+
add_error(
|
|
152
|
+
f"{section}.mode",
|
|
153
|
+
f"Unsupported value '{normalized_mode}'. Must be one of: {sorted(allowed_gateway_modes)}.",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
gateway_id = gateway_cfg.get("gateway_id")
|
|
157
|
+
if gateway_id is not None and (not isinstance(gateway_id, str) or not gateway_id.strip()):
|
|
158
|
+
add_error(f"{section}.gateway_id", "Must be a non-empty string.")
|
|
159
|
+
|
|
160
|
+
byok_alias = gateway_cfg.get("byok_alias")
|
|
161
|
+
if byok_alias is not None and (not isinstance(byok_alias, str) or not byok_alias.strip()):
|
|
162
|
+
add_error(f"{section}.byok_alias", "Must be a non-empty string.")
|
|
163
|
+
|
|
164
|
+
authenticated_gateway = gateway_cfg.get("authenticated_gateway")
|
|
165
|
+
if authenticated_gateway is not None and not isinstance(authenticated_gateway, bool):
|
|
166
|
+
add_error(f"{section}.authenticated_gateway", "Must be a boolean.")
|
|
167
|
+
|
|
168
|
+
credential_mode = gateway_cfg.get("credential_mode")
|
|
169
|
+
if credential_mode is not None:
|
|
170
|
+
if not isinstance(credential_mode, str) or not credential_mode.strip():
|
|
171
|
+
add_error(f"{section}.credential_mode", "Must be a non-empty string.")
|
|
172
|
+
elif credential_mode.strip().lower() not in allowed_credential_modes:
|
|
173
|
+
add_error(
|
|
174
|
+
f"{section}.credential_mode",
|
|
175
|
+
"Unsupported value. Must be 'provider_key_in_request' or 'cloudflare_managed'.",
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
if allow_providers:
|
|
179
|
+
providers_cfg = gateway_cfg.get("providers")
|
|
180
|
+
if providers_cfg is not None and not isinstance(providers_cfg, dict):
|
|
181
|
+
add_error(f"{section}.providers", "Must be a dictionary.")
|
|
182
|
+
elif isinstance(providers_cfg, dict):
|
|
183
|
+
for provider_name, provider_gateway_cfg in providers_cfg.items():
|
|
184
|
+
normalized_provider_name = str(provider_name or "").strip().lower()
|
|
185
|
+
if normalized_provider_name not in allowed_gateway_providers:
|
|
186
|
+
add_error(
|
|
187
|
+
f"{section}.providers.{provider_name}",
|
|
188
|
+
(
|
|
189
|
+
f"Unsupported provider '{normalized_provider_name}'. "
|
|
190
|
+
f"Must be one of: {sorted(allowed_gateway_providers)}."
|
|
191
|
+
),
|
|
192
|
+
)
|
|
193
|
+
continue
|
|
194
|
+
ConfigurationService._validate_llm_gateway_entry(
|
|
195
|
+
add_error,
|
|
196
|
+
f"{section}.providers.{normalized_provider_name}",
|
|
197
|
+
provider_gateway_cfg,
|
|
198
|
+
allow_providers=False,
|
|
199
|
+
require_complete_config=False,
|
|
200
|
+
)
|
|
201
|
+
elif "providers" in gateway_cfg:
|
|
202
|
+
add_error(f"{section}.providers", "Nested provider overrides are not supported here.")
|
|
203
|
+
|
|
204
|
+
is_enabled = gateway_cfg.get("enabled") is True
|
|
205
|
+
if require_complete_config and is_enabled and not normalized_vendor:
|
|
206
|
+
add_error(f"{section}.vendor", "Missing required key: 'vendor'.")
|
|
207
|
+
if require_complete_config and is_enabled and not normalized_mode:
|
|
208
|
+
add_error(f"{section}.mode", "Missing required key: 'mode'.")
|
|
209
|
+
if require_complete_config and is_enabled and not str(gateway_cfg.get("gateway_id") or "").strip():
|
|
210
|
+
add_error(f"{section}.gateway_id", "Missing required key: 'gateway_id'.")
|
|
211
|
+
if require_complete_config and is_enabled and not any(
|
|
212
|
+
str(gateway_cfg.get(key) or "").strip() for key in secret_ref_keys[:3]
|
|
213
|
+
):
|
|
214
|
+
add_error(
|
|
215
|
+
f"{section}.account_id",
|
|
216
|
+
"One of 'account_id', 'account_id_secret_ref', or 'account_id_env' is required when enabled.",
|
|
217
|
+
)
|
|
218
|
+
if is_enabled and gateway_cfg.get("authenticated_gateway") is True:
|
|
219
|
+
if not any(str(gateway_cfg.get(key) or "").strip() for key in secret_ref_keys[3:]):
|
|
220
|
+
add_error(
|
|
221
|
+
f"{section}.cloudflare_api_token_secret_ref",
|
|
222
|
+
(
|
|
223
|
+
"One of 'cloudflare_api_token_secret_ref' or 'cloudflare_api_token_env' "
|
|
224
|
+
"is required when 'authenticated_gateway' is true."
|
|
225
|
+
),
|
|
226
|
+
)
|
|
227
|
+
|
|
101
228
|
def load_configuration(self, company_short_name: str):
|
|
102
229
|
"""
|
|
103
230
|
Main entry point for configuring a company instance.
|
|
@@ -582,6 +709,16 @@ class ConfigurationService:
|
|
|
582
709
|
"Must be an absolute HTTP or HTTPS URL.",
|
|
583
710
|
)
|
|
584
711
|
|
|
712
|
+
gateway_cfg = config.get("llm", {}).get("gateway")
|
|
713
|
+
if gateway_cfg is not None:
|
|
714
|
+
self._validate_llm_gateway_entry(
|
|
715
|
+
add_error,
|
|
716
|
+
"llm.gateway",
|
|
717
|
+
gateway_cfg,
|
|
718
|
+
allow_providers=True,
|
|
719
|
+
require_complete_config=True,
|
|
720
|
+
)
|
|
721
|
+
|
|
585
722
|
# 3. Embedding Provider
|
|
586
723
|
if isinstance(config.get("embedding_provider"), dict):
|
|
587
724
|
if not config.get("embedding_provider", {}).get("provider"):
|
|
@@ -1219,6 +1356,35 @@ class ConfigurationService:
|
|
|
1219
1356
|
provider_cfg = providers_cfg.get(candidate)
|
|
1220
1357
|
return dict(provider_cfg) if isinstance(provider_cfg, dict) else {}
|
|
1221
1358
|
|
|
1359
|
+
def get_llm_gateway_config(self, company_short_name: str, provider: str | None = None) -> dict:
|
|
1360
|
+
self._ensure_config_loaded(company_short_name)
|
|
1361
|
+
llm_config = self._loaded_configs[company_short_name].get("llm") or {}
|
|
1362
|
+
gateway_cfg = llm_config.get("gateway")
|
|
1363
|
+
if not isinstance(gateway_cfg, dict):
|
|
1364
|
+
return {}
|
|
1365
|
+
|
|
1366
|
+
resolved_gateway_cfg = {
|
|
1367
|
+
key: value
|
|
1368
|
+
for key, value in gateway_cfg.items()
|
|
1369
|
+
if key != "providers"
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
candidate = str(provider or "").strip().lower()
|
|
1373
|
+
if not candidate:
|
|
1374
|
+
return dict(resolved_gateway_cfg)
|
|
1375
|
+
|
|
1376
|
+
provider_overrides = gateway_cfg.get("providers")
|
|
1377
|
+
if not isinstance(provider_overrides, dict):
|
|
1378
|
+
return dict(resolved_gateway_cfg)
|
|
1379
|
+
|
|
1380
|
+
provider_gateway_cfg = provider_overrides.get(candidate)
|
|
1381
|
+
if not isinstance(provider_gateway_cfg, dict):
|
|
1382
|
+
return dict(resolved_gateway_cfg)
|
|
1383
|
+
|
|
1384
|
+
merged_gateway_cfg = dict(resolved_gateway_cfg)
|
|
1385
|
+
merged_gateway_cfg.update(provider_gateway_cfg)
|
|
1386
|
+
return merged_gateway_cfg
|
|
1387
|
+
|
|
1222
1388
|
def get_llm_telemetry_config(self, company_short_name: str) -> dict:
|
|
1223
1389
|
self._ensure_config_loaded(company_short_name)
|
|
1224
1390
|
llm_config = self._loaded_configs[company_short_name].get("llm") or {}
|
|
@@ -66,6 +66,7 @@ src/iatoolkit/infra/google_chat_app.py
|
|
|
66
66
|
src/iatoolkit/infra/inference_embeddings_client.py
|
|
67
67
|
src/iatoolkit/infra/inference_handler.py
|
|
68
68
|
src/iatoolkit/infra/jina_embeddings_client.py
|
|
69
|
+
src/iatoolkit/infra/llm_gateway_resolver.py
|
|
69
70
|
src/iatoolkit/infra/llm_proxy.py
|
|
70
71
|
src/iatoolkit/infra/llm_response.py
|
|
71
72
|
src/iatoolkit/infra/redis_session_manager.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py
RENAMED
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py
RENAMED
|
File without changes
|
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py
RENAMED
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/common/interfaces/web_search_provider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt
RENAMED
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt
RENAMED
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/core_identity.prompt
RENAMED
|
File without changes
|
{iatoolkit-2.16.3 → iatoolkit-2.17.1}/src/iatoolkit/config/system_prompts/email_output.prompt
RENAMED
|
File without changes
|
|
File without changes
|