iatoolkit 2.5.1__tar.gz → 2.6.3__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.5.1/src/iatoolkit.egg-info → iatoolkit-2.6.3}/PKG-INFO +1 -1
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/__init__.py +1 -1
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/model_registry.py +41 -2
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/routes.py +2 -2
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/html_structures.prompt +1 -1
- iatoolkit-2.6.3/src/iatoolkit/config/system_prompts/sql_casting.prompt +23 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/core.py +12 -1
- iatoolkit-2.6.3/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +75 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +68 -6
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -4
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +236 -18
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +3 -3
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_proxy.py +63 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/redis_session_manager.py +30 -4
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/locales/en.yaml +17 -3
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/locales/es.yaml +17 -3
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/llm_query_repo.py +4 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/attachment_policy_service.py +25 -2
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/configuration_service.py +55 -4
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/context_builder_service.py +30 -4
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/history_manager_service.py +5 -2
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/knowledge_base_service.py +67 -41
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/llm_client_service.py +74 -1
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/prompt_service.py +7 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/query_service.py +54 -12
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/user_session_context_service.py +6 -1
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_main.js +2 -1
- iatoolkit-2.6.3/src/iatoolkit/static/js/chat_model_selector.js +500 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/chat.html +17 -3
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/base_login_view.py +5 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/categories_api_view.py +4 -2
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/chat_view.py +5 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/home_view.py +4 -1
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/llmquery_api_view.py +3 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/login_view.py +5 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/rag_api_view.py +59 -16
- {iatoolkit-2.5.1 → iatoolkit-2.6.3/src/iatoolkit.egg-info}/PKG-INFO +1 -1
- iatoolkit-2.5.1/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -14
- iatoolkit-2.5.1/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -13
- iatoolkit-2.5.1/src/iatoolkit/static/js/chat_model_selector.js +0 -240
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/LICENSE +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/LICENSE_COMMUNITY.md +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/pyproject.toml +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/readme.md +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/requirements.txt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/setup.cfg +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/secret_resolver.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/google_auth_client.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/inference_handler.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/api_key_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/memory_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/api_key_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/auth_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/company_context_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/embedding_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/http_tool_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/i18n_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/inference_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/language_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/license_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/memory_compiler_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/memory_lint_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/memory_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/memory_wiki_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/contracts.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/parsers/validator.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/pdf_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/prompt_resource_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/sql_dataset_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/sql_source_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/storage_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/structured_output_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/system_tools.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/telemetry_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/tool_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/visual_kb_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/visual_tool_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/warmup_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/web_search/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/services/web_search_service.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/images/fernando.jpeg +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_help_content.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_history_button.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/chat_public.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/documents.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/landing_page.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/static/styles/onboarding.css +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/system_prompts/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/_company_header.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/_login_widget.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/change_password.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/home_hosted_default.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/pdf/base.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/pdf/letter.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/pdf/report.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/pdf/simple.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/api_key_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/change_password_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/configuration_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/connectors_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/embedding_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/forgot_password_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/help_content_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/history_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/init_context_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/load_document_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/logout_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/memory_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/profile_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/prompt_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/root_redirect_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/static_page_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/tool_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/users_api_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/views/verify_user_view.py +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -16,7 +16,7 @@ from typing import Literal
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
HistoryType = Literal["server_side", "client_side"]
|
|
19
|
-
ProviderType = Literal["openai", "gemini", "deepseek", "xai", "anthropic", "unknown"]
|
|
19
|
+
ProviderType = Literal["openai", "gemini", "deepseek", "xai", "anthropic", "openrouter", "openai_compatible", "unknown"]
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
@dataclass(frozen=True)
|
|
@@ -47,7 +47,10 @@ class ModelRegistry:
|
|
|
47
47
|
"deepseek": ("deepseek",),
|
|
48
48
|
"xai": ("grok", "grok-1", "grok-beta"),
|
|
49
49
|
"anthropic": ("claude", "claude-3", "claude-2"),
|
|
50
|
+
"openrouter": ("openrouter/",),
|
|
50
51
|
}
|
|
52
|
+
self._reasoning_effort_options = ("minimal", "low", "medium", "high", "xhigh")
|
|
53
|
+
self._text_verbosity_options = ("low", "medium", "high")
|
|
51
54
|
|
|
52
55
|
# ------------------------------------------------------------------
|
|
53
56
|
# Public API
|
|
@@ -60,7 +63,7 @@ class ModelRegistry:
|
|
|
60
63
|
Examples:
|
|
61
64
|
"gpt-4o" -> "openai"
|
|
62
65
|
"gemini-pro" -> "gemini"
|
|
63
|
-
"deepseek-
|
|
66
|
+
"deepseek-v4-pro" -> "deepseek"
|
|
64
67
|
"""
|
|
65
68
|
if not model:
|
|
66
69
|
return "unknown"
|
|
@@ -72,6 +75,42 @@ class ModelRegistry:
|
|
|
72
75
|
|
|
73
76
|
return "unknown"
|
|
74
77
|
|
|
78
|
+
def normalize_provider(self, provider: str | None = None, model: str | None = None) -> ProviderType:
|
|
79
|
+
candidate = str(provider or "").strip().lower()
|
|
80
|
+
if candidate in {
|
|
81
|
+
"openai",
|
|
82
|
+
"gemini",
|
|
83
|
+
"deepseek",
|
|
84
|
+
"xai",
|
|
85
|
+
"anthropic",
|
|
86
|
+
"openrouter",
|
|
87
|
+
"openai_compatible",
|
|
88
|
+
}:
|
|
89
|
+
return candidate # type: ignore[return-value]
|
|
90
|
+
return self.get_provider(model or "")
|
|
91
|
+
|
|
92
|
+
def get_capabilities(self, model: str, provider: str | None = None) -> dict:
|
|
93
|
+
normalized_provider = self.normalize_provider(provider=provider, model=model)
|
|
94
|
+
supports_reasoning_effort = normalized_provider in {
|
|
95
|
+
"openai",
|
|
96
|
+
"xai",
|
|
97
|
+
"openrouter",
|
|
98
|
+
"deepseek",
|
|
99
|
+
"openai_compatible",
|
|
100
|
+
}
|
|
101
|
+
supports_text_verbosity = normalized_provider in {"openai", "xai", "openrouter"}
|
|
102
|
+
supports_store = normalized_provider in {"openai", "xai"}
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
"provider": normalized_provider,
|
|
106
|
+
"history_type": self.get_history_type(model),
|
|
107
|
+
"supports_reasoning_effort": supports_reasoning_effort,
|
|
108
|
+
"allowed_reasoning_efforts": list(self._reasoning_effort_options) if supports_reasoning_effort else [],
|
|
109
|
+
"supports_text_verbosity": supports_text_verbosity,
|
|
110
|
+
"allowed_text_verbosity": list(self._text_verbosity_options) if supports_text_verbosity else [],
|
|
111
|
+
"supports_store": supports_store,
|
|
112
|
+
}
|
|
113
|
+
|
|
75
114
|
def get_request_defaults(self, model: str) -> dict:
|
|
76
115
|
"""
|
|
77
116
|
Return per-model request defaults to keep model-specific policy centralized.
|
|
@@ -184,10 +184,10 @@ def register_views(app):
|
|
|
184
184
|
# --- RAG API Routes ---
|
|
185
185
|
rag_view = RagApiView.as_view('rag_api')
|
|
186
186
|
|
|
187
|
-
# 1. List Files (POST for filters)
|
|
187
|
+
# 1. List Files (GET/POST for filters + pagination)
|
|
188
188
|
app.add_url_rule('/api/rag/<company_short_name>/files',
|
|
189
189
|
view_func=rag_view,
|
|
190
|
-
methods=['POST'],
|
|
190
|
+
methods=['GET', 'POST'],
|
|
191
191
|
defaults={'action': 'list_files'})
|
|
192
192
|
|
|
193
193
|
# 2. Delete File
|
{iatoolkit-2.5.1 → iatoolkit-2.6.3}/src/iatoolkit/config/system_prompts/html_structures.prompt
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
### HTML estructurado
|
|
2
2
|
|
|
3
3
|
#### Tablas
|
|
4
|
-
-
|
|
4
|
+
- Siempre utiliza tablas con estilos de bootstrap, ejemplo: `table table-striped table-hover`.
|
|
5
5
|
- Si una columna contiene RUT, fecha, id certificado o valores similares, usa
|
|
6
6
|
clase `nowrap` en el `<th>` y en el `<td>` correspondiente cuando aplique.
|
|
7
7
|
- Si una columna debe ir centrada o alineada a la derecha, agrega
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
### SQL: casting y tipos
|
|
2
|
+
|
|
3
|
+
- Si un numero puede venir con decimales, usa `NUMERIC`, no `INTEGER`.
|
|
4
|
+
- Para numeros extraidos desde JSONB que pueden venir vacios, usa
|
|
5
|
+
`COALESCE(NULLIF(jsonb_col->>'campo', '')::NUMERIC, 0)`.
|
|
6
|
+
- Si agregas numeros extraidos desde JSONB, aplica ese cast dentro de la
|
|
7
|
+
agregacion, no despues.
|
|
8
|
+
- No uses `NULLIF(..., '')` sobre resultados ya agregados ni sobre columnas que
|
|
9
|
+
ya son numericas.
|
|
10
|
+
- Usa `TO_DATE(...)` solo cuando la fecha viene como texto o desde `jsonb->>'campo'`.
|
|
11
|
+
No lo uses sobre columnas que ya son `DATE` o `TIMESTAMP`.
|
|
12
|
+
- Antes de comparar fechas de texto con `CURRENT_DATE`, castealas explicitamente.
|
|
13
|
+
- Los booleanos dentro de JSONB llegan como texto: evalualos con cast explicito,
|
|
14
|
+
por ejemplo `(jsonb_col->>'flag')::BOOLEAN IS TRUE`.
|
|
15
|
+
- La función ROUND(double precision, integer) NO EXISTE en PostgreSQL.
|
|
16
|
+
Todo ROUND() que lleve segundo argumento (cantidad de decimales) debe aplicarsesobre NUMERIC, no sobre DOUBLE PRECISION.
|
|
17
|
+
|
|
18
|
+
Si la expresión a redondear viene de AVG(), MIN(), MAX(), SUM() sobre unacolumna de tipo float/double precision, casteala siempre antes del ROUND:
|
|
19
|
+
ROUND(AVG(columna)::NUMERIC, decimales)ROUND(MIN(columna)::NUMERIC, decimales)ROUND(MAX(columna)::NUMERIC, decimales)ROUND(SUM(columna)::NUMERIC, decimales)
|
|
20
|
+
Esto aplica incluso si la subexpresión ya fue casteada antes: el cast debeestar dentro del ROUND, no afuera.
|
|
21
|
+
Si usás ROUND sin segundo argumento, no hace falta el cast:
|
|
22
|
+
ROUND(AVG(columna)) -- esto sí funciona, devuelve double precision redondeado a entero
|
|
23
|
+
Antes de entregar la consulta SQL final, revisá cada ocurrencia de ROUND(..., N)y verificá que su primer argumento sea NUMERIC. Si no lo es, agregale ::NUMERIC.```
|
|
@@ -152,6 +152,16 @@ class IAToolkit:
|
|
|
152
152
|
# get a value from the config dict or the environment variable
|
|
153
153
|
return self.config.get(key, os.getenv(key, default))
|
|
154
154
|
|
|
155
|
+
def _get_redis_max_connections(self) -> int:
|
|
156
|
+
raw_value = self._get_config_value("REDIS_MAX_CONNECTIONS", "30")
|
|
157
|
+
try:
|
|
158
|
+
parsed = int(raw_value)
|
|
159
|
+
if parsed > 0:
|
|
160
|
+
return parsed
|
|
161
|
+
except (TypeError, ValueError):
|
|
162
|
+
pass
|
|
163
|
+
return 30
|
|
164
|
+
|
|
155
165
|
def _setup_request_globals(self):
|
|
156
166
|
"""
|
|
157
167
|
Configures functions to run before each request to set up
|
|
@@ -271,7 +281,8 @@ class IAToolkit:
|
|
|
271
281
|
port=url.port,
|
|
272
282
|
password=url.password,
|
|
273
283
|
ssl=(url.scheme == "rediss"),
|
|
274
|
-
ssl_cert_reqs=None
|
|
284
|
+
ssl_cert_reqs=None,
|
|
285
|
+
max_connections=self._get_redis_max_connections(),
|
|
275
286
|
)
|
|
276
287
|
|
|
277
288
|
self.app.config.update({
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Copyright (c) 2024 Fernando Libedinsky
|
|
2
|
+
# Product: IAToolkit
|
|
3
|
+
#
|
|
4
|
+
# IAToolkit is open source software.
|
|
5
|
+
|
|
6
|
+
from iatoolkit.common.exceptions import IAToolkitException
|
|
7
|
+
from iatoolkit.infra.llm_providers.openai_compatible_chat_adapter import OpenAICompatibleChatAdapter
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DeepseekAdapter(OpenAICompatibleChatAdapter):
|
|
11
|
+
"""DeepSeek V4 adapter."""
|
|
12
|
+
|
|
13
|
+
supports_reasoning = False
|
|
14
|
+
supports_reasoning_effort = True
|
|
15
|
+
supports_reasoning_content_messages = True
|
|
16
|
+
supports_thinking = True
|
|
17
|
+
model_capabilities = {
|
|
18
|
+
"deepseek-v4-flash": {
|
|
19
|
+
"supports_thinking": True,
|
|
20
|
+
"supports_tool_choice_required": True,
|
|
21
|
+
},
|
|
22
|
+
"deepseek-v4-pro": {
|
|
23
|
+
"supports_thinking": True,
|
|
24
|
+
"supports_tool_choice_required": True,
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
supported_models = frozenset(model_capabilities)
|
|
28
|
+
|
|
29
|
+
def __init__(self, deepseek_client):
|
|
30
|
+
super().__init__(openai_compatible_client=deepseek_client, provider_label="DeepSeek")
|
|
31
|
+
|
|
32
|
+
def create_response(self, model: str, input: list[dict], **kwargs):
|
|
33
|
+
self._validate_model(model)
|
|
34
|
+
return super().create_response(model=model, input=input, **kwargs)
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def _validate_model(cls, model: str) -> None:
|
|
38
|
+
normalized_model = str(model or "").strip().lower()
|
|
39
|
+
if normalized_model in cls.supported_models:
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
raise IAToolkitException(
|
|
43
|
+
IAToolkitException.ErrorType.MODEL,
|
|
44
|
+
(
|
|
45
|
+
f"Unsupported DeepSeek model '{model}'. "
|
|
46
|
+
f"Supported models: {sorted(cls.supported_models)}"
|
|
47
|
+
),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def _map_reasoning_effort(self, model: str, effort: str, kwargs: dict) -> str | None:
|
|
51
|
+
_ = model
|
|
52
|
+
_ = kwargs
|
|
53
|
+
|
|
54
|
+
candidate = str(effort or "").strip().lower()
|
|
55
|
+
if candidate in {"low", "medium", "high"}:
|
|
56
|
+
return "high"
|
|
57
|
+
if candidate in {"xhigh", "max"}:
|
|
58
|
+
return "max"
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
def _build_thinking_payload(self, model: str, reasoning: dict | None, kwargs: dict) -> dict | None:
|
|
62
|
+
explicit_thinking = self._normalize_thinking_payload(kwargs.get("thinking"))
|
|
63
|
+
if explicit_thinking is not None:
|
|
64
|
+
return explicit_thinking
|
|
65
|
+
|
|
66
|
+
reasoning_effort = self._extract_reasoning_effort(reasoning, kwargs)
|
|
67
|
+
|
|
68
|
+
if reasoning_effort == "minimal":
|
|
69
|
+
return {"type": "disabled"}
|
|
70
|
+
if reasoning_effort:
|
|
71
|
+
return {"type": "enabled"}
|
|
72
|
+
|
|
73
|
+
# Keep the default deterministic: unless a prompt explicitly asks for
|
|
74
|
+
# reasoning, use non-thinking mode.
|
|
75
|
+
return {"type": "disabled"}
|
|
@@ -82,6 +82,10 @@ class GeminiAdapter:
|
|
|
82
82
|
# "response_modalities": ['TEXT', 'IMAGE']
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
tool_config = self._prepare_gemini_tool_config(tool_choice, tools)
|
|
86
|
+
if tool_config is not None:
|
|
87
|
+
config_kwargs["tool_config"] = tool_config
|
|
88
|
+
|
|
85
89
|
if isinstance(text, dict):
|
|
86
90
|
response_schema = text.get("response_schema")
|
|
87
91
|
if response_schema is not None:
|
|
@@ -94,9 +98,12 @@ class GeminiAdapter:
|
|
|
94
98
|
config = types.GenerateContentConfig(**config_kwargs)
|
|
95
99
|
except TypeError as e:
|
|
96
100
|
# Backward compatibility with older google-genai SDK versions.
|
|
97
|
-
if
|
|
101
|
+
if (
|
|
102
|
+
"response_schema" in config_kwargs
|
|
103
|
+
or "response_mime_type" in config_kwargs
|
|
104
|
+
):
|
|
98
105
|
logging.warning(
|
|
99
|
-
"Gemini SDK doesn't support
|
|
106
|
+
"Gemini SDK doesn't support one or more advanced GenerateContentConfig fields. "
|
|
100
107
|
"Falling back to prompt-instruction-only mode: %s",
|
|
101
108
|
e
|
|
102
109
|
)
|
|
@@ -235,10 +242,10 @@ class GeminiAdapter:
|
|
|
235
242
|
# Reconstruir llamadas a herramientas si existen
|
|
236
243
|
if "tool_calls" in message:
|
|
237
244
|
for tc in message["tool_calls"]:
|
|
238
|
-
args = tc
|
|
239
|
-
if
|
|
240
|
-
|
|
241
|
-
parts.append(types.Part.from_function_call(name=
|
|
245
|
+
function_name, args = self._extract_history_tool_call(tc)
|
|
246
|
+
if not function_name:
|
|
247
|
+
continue
|
|
248
|
+
parts.append(types.Part.from_function_call(name=function_name, args=args))
|
|
242
249
|
|
|
243
250
|
content = message.get("context") or message.get("content", "")
|
|
244
251
|
if content:
|
|
@@ -310,6 +317,34 @@ class GeminiAdapter:
|
|
|
310
317
|
|
|
311
318
|
return None
|
|
312
319
|
|
|
320
|
+
def _prepare_gemini_tool_config(self, tool_choice: str, tools: List[Dict] | None) -> Optional[Any]:
|
|
321
|
+
tool_names = [
|
|
322
|
+
str(tool.get("name") or "").strip()
|
|
323
|
+
for tool in (tools or [])
|
|
324
|
+
if isinstance(tool, dict) and str(tool.get("name") or "").strip()
|
|
325
|
+
]
|
|
326
|
+
if not tool_names:
|
|
327
|
+
return None
|
|
328
|
+
|
|
329
|
+
normalized_choice = str(tool_choice or "auto").strip().lower() or "auto"
|
|
330
|
+
function_calling_kwargs: Dict[str, Any] = {}
|
|
331
|
+
|
|
332
|
+
if normalized_choice == "auto":
|
|
333
|
+
function_calling_kwargs["mode"] = "AUTO"
|
|
334
|
+
elif normalized_choice == "none":
|
|
335
|
+
function_calling_kwargs["mode"] = "NONE"
|
|
336
|
+
elif normalized_choice == "required":
|
|
337
|
+
function_calling_kwargs["mode"] = "ANY"
|
|
338
|
+
elif normalized_choice in set(tool_names):
|
|
339
|
+
function_calling_kwargs["mode"] = "ANY"
|
|
340
|
+
function_calling_kwargs["allowed_function_names"] = [normalized_choice]
|
|
341
|
+
else:
|
|
342
|
+
function_calling_kwargs["mode"] = "AUTO"
|
|
343
|
+
|
|
344
|
+
return types.ToolConfig(
|
|
345
|
+
function_calling_config=types.FunctionCallingConfig(**function_calling_kwargs)
|
|
346
|
+
)
|
|
347
|
+
|
|
313
348
|
def _prepare_response_schema(self, schema: Any) -> Any:
|
|
314
349
|
"""Normalize OpenAI-style JSON schema into a Gemini-compatible schema subset."""
|
|
315
350
|
if isinstance(schema, dict):
|
|
@@ -696,3 +731,30 @@ class GeminiAdapter:
|
|
|
696
731
|
output_tokens=output_tokens,
|
|
697
732
|
total_tokens=total_tokens
|
|
698
733
|
)
|
|
734
|
+
|
|
735
|
+
@staticmethod
|
|
736
|
+
def _extract_history_tool_call(tool_call: Dict[str, Any]) -> tuple[str, Dict[str, Any]]:
|
|
737
|
+
if not isinstance(tool_call, dict):
|
|
738
|
+
return "", {}
|
|
739
|
+
|
|
740
|
+
function_payload = tool_call.get("function")
|
|
741
|
+
if isinstance(function_payload, dict):
|
|
742
|
+
function_name = str(function_payload.get("name") or "").strip()
|
|
743
|
+
arguments = function_payload.get("arguments", {})
|
|
744
|
+
else:
|
|
745
|
+
function_name = str(tool_call.get("name") or "").strip()
|
|
746
|
+
arguments = tool_call.get("arguments", {})
|
|
747
|
+
|
|
748
|
+
if isinstance(arguments, str):
|
|
749
|
+
try:
|
|
750
|
+
parsed_arguments = json.loads(arguments)
|
|
751
|
+
if isinstance(parsed_arguments, dict):
|
|
752
|
+
arguments = parsed_arguments
|
|
753
|
+
else:
|
|
754
|
+
arguments = {"value": parsed_arguments}
|
|
755
|
+
except Exception:
|
|
756
|
+
arguments = {"value": arguments}
|
|
757
|
+
elif not isinstance(arguments, dict):
|
|
758
|
+
arguments = {}
|
|
759
|
+
|
|
760
|
+
return function_name, arguments
|