agent-framework-lib 0.8.9.post2__tar.gz → 0.8.9.post3__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.
- {agent_framework_lib-0.8.9.post2/agent_framework_lib.egg-info → agent_framework_lib-0.8.9.post3}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_clients.py +172 -2
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/scratchpad_compressor.py +57 -9
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/modern_ui.html +110 -1
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/chat_completion.py +14 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/LICENSE +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/README.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/audit.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/crypto.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/git_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/herdr_client.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/orchestrator.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/store.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/tools.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/base_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/authz.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/file_view_token.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/input_guard.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/openshell_policy.yaml +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/pii_redactor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/sandbox.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/sandbox_provider.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/secret_redactor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/shell_env.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/security/upload_token.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_gen/create_image.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/vendor_mermaid.umd.min.js +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/shell_tool.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/server.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/skills_router.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/builder.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/context.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/decorators.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/engine.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/errors.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/monitoring.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/runner.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/state.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/types.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/implementations/langgraph_engine.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/router.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/schemas.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/SOURCES.txt +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/SECRETS_MANAGEMENT.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/SECURITY_HARDENING.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/index.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/README.md +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/workflow_engine_example.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/setup.cfg +0 -0
- {agent_framework_lib-0.8.9.post2 → agent_framework_lib-0.8.9.post3}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.8.9.
|
|
3
|
+
Version: 0.8.9.post3
|
|
4
4
|
Summary: A comprehensive Python framework for building and serving conversational AI agents with FastAPI
|
|
5
5
|
Author-email: Sebastian Pavel <sebastian@cinco.ai>, Elliott Girard <elliott.girard@icloud.com>
|
|
6
6
|
Maintainer-email: Sebastian Pavel <sebastian@cinco.ai>
|
|
@@ -1243,6 +1243,7 @@ async def execute_chat_completion(
|
|
|
1243
1243
|
stream: bool = False,
|
|
1244
1244
|
max_tokens: int | None = None,
|
|
1245
1245
|
temperature: float | None = None,
|
|
1246
|
+
response_format: dict[str, Any] | None = None,
|
|
1246
1247
|
) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
|
|
1247
1248
|
"""Execute a chat completion against a raw provider client and normalize it.
|
|
1248
1249
|
|
|
@@ -1262,6 +1263,15 @@ async def execute_chat_completion(
|
|
|
1262
1263
|
stream: When ``True``, returns an async iterator of ``ChatExecutionChunk``.
|
|
1263
1264
|
max_tokens: Optional max output tokens (overrides ``model_params``).
|
|
1264
1265
|
temperature: Optional sampling temperature (overrides ``model_params``).
|
|
1266
|
+
response_format: Optional, provider-agnostic structured-output request in
|
|
1267
|
+
the OpenAI shape — ``{"type": "json_object"}``,
|
|
1268
|
+
``{"type": "json_schema", "json_schema": {"name", "schema", ...}}`` or
|
|
1269
|
+
``{"type": "text"}``. Each provider helper translates it to that
|
|
1270
|
+
provider's native mechanism (OpenAI: pass-through; Anthropic: a
|
|
1271
|
+
system-prompt JSON directive since the Messages API has no
|
|
1272
|
+
``response_format``; Gemini: ``response_mime_type`` /
|
|
1273
|
+
``response_schema`` in ``generation_config``). ``None`` or
|
|
1274
|
+
``{"type": "text"}`` is a no-op.
|
|
1265
1275
|
|
|
1266
1276
|
Returns:
|
|
1267
1277
|
A ``ChatExecutionResult`` for non-streaming calls, or an
|
|
@@ -1280,6 +1290,7 @@ async def execute_chat_completion(
|
|
|
1280
1290
|
stream=stream,
|
|
1281
1291
|
max_tokens=max_tokens,
|
|
1282
1292
|
temperature=temperature,
|
|
1293
|
+
response_format=response_format,
|
|
1283
1294
|
)
|
|
1284
1295
|
if ANTHROPIC_AVAILABLE and isinstance(client, AsyncAnthropic):
|
|
1285
1296
|
return await _execute_anthropic(
|
|
@@ -1289,6 +1300,7 @@ async def execute_chat_completion(
|
|
|
1289
1300
|
stream=stream,
|
|
1290
1301
|
max_tokens=max_tokens,
|
|
1291
1302
|
temperature=temperature,
|
|
1303
|
+
response_format=response_format,
|
|
1292
1304
|
)
|
|
1293
1305
|
if GEMINI_AVAILABLE and isinstance(client, genai.GenerativeModel):
|
|
1294
1306
|
return await _execute_gemini(
|
|
@@ -1298,6 +1310,7 @@ async def execute_chat_completion(
|
|
|
1298
1310
|
stream=stream,
|
|
1299
1311
|
max_tokens=max_tokens,
|
|
1300
1312
|
temperature=temperature,
|
|
1313
|
+
response_format=response_format,
|
|
1301
1314
|
)
|
|
1302
1315
|
# Fallback: dispatch by duck-typing on the SDK surface when isinstance fails
|
|
1303
1316
|
# (e.g., a subclass or a test double). This keeps dispatch robust without
|
|
@@ -1310,6 +1323,7 @@ async def execute_chat_completion(
|
|
|
1310
1323
|
stream=stream,
|
|
1311
1324
|
max_tokens=max_tokens,
|
|
1312
1325
|
temperature=temperature,
|
|
1326
|
+
response_format=response_format,
|
|
1313
1327
|
)
|
|
1314
1328
|
if hasattr(client, "messages") and hasattr(client.messages, "create"):
|
|
1315
1329
|
return await _execute_anthropic(
|
|
@@ -1319,6 +1333,7 @@ async def execute_chat_completion(
|
|
|
1319
1333
|
stream=stream,
|
|
1320
1334
|
max_tokens=max_tokens,
|
|
1321
1335
|
temperature=temperature,
|
|
1336
|
+
response_format=response_format,
|
|
1322
1337
|
)
|
|
1323
1338
|
if hasattr(client, "generate_content_async"):
|
|
1324
1339
|
return await _execute_gemini(
|
|
@@ -1328,6 +1343,7 @@ async def execute_chat_completion(
|
|
|
1328
1343
|
stream=stream,
|
|
1329
1344
|
max_tokens=max_tokens,
|
|
1330
1345
|
temperature=temperature,
|
|
1346
|
+
response_format=response_format,
|
|
1331
1347
|
)
|
|
1332
1348
|
raise TypeError(
|
|
1333
1349
|
f"execute_chat_completion: unrecognized client type {type(client).__name__!r}; "
|
|
@@ -1335,6 +1351,93 @@ async def execute_chat_completion(
|
|
|
1335
1351
|
)
|
|
1336
1352
|
|
|
1337
1353
|
|
|
1354
|
+
# ---------------------------------------------------------------------------
|
|
1355
|
+
# Provider-agnostic response_format translation (multi-provider support)
|
|
1356
|
+
# ---------------------------------------------------------------------------
|
|
1357
|
+
|
|
1358
|
+
|
|
1359
|
+
def _wants_json(response_format: dict[str, Any] | None) -> bool:
|
|
1360
|
+
"""Return ``True`` when ``response_format`` requests structured JSON output."""
|
|
1361
|
+
if not response_format:
|
|
1362
|
+
return False
|
|
1363
|
+
return (response_format.get("type") or "").lower() in ("json_object", "json_schema")
|
|
1364
|
+
|
|
1365
|
+
|
|
1366
|
+
def _extract_json_schema(response_format: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
1367
|
+
"""Extract the JSON schema dict from an OpenAI-shaped ``response_format``.
|
|
1368
|
+
|
|
1369
|
+
Supports ``{"type": "json_schema", "json_schema": {"schema": {...}}}`` and the
|
|
1370
|
+
flatter ``{"type": "json_schema", "schema": {...}}``. Returns ``None`` when no
|
|
1371
|
+
schema is present (e.g. plain ``{"type": "json_object"}``).
|
|
1372
|
+
"""
|
|
1373
|
+
if not response_format:
|
|
1374
|
+
return None
|
|
1375
|
+
js = response_format.get("json_schema")
|
|
1376
|
+
if isinstance(js, dict):
|
|
1377
|
+
schema = js.get("schema")
|
|
1378
|
+
if isinstance(schema, dict):
|
|
1379
|
+
return schema
|
|
1380
|
+
return js or None
|
|
1381
|
+
schema = response_format.get("schema")
|
|
1382
|
+
return schema if isinstance(schema, dict) else None
|
|
1383
|
+
|
|
1384
|
+
|
|
1385
|
+
def _openai_response_format(response_format: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
1386
|
+
"""Normalize a provider-agnostic ``response_format`` to OpenAI's exact envelope.
|
|
1387
|
+
|
|
1388
|
+
OpenAI's Structured Outputs require ``{"type": "json_schema", "json_schema":
|
|
1389
|
+
{"name": ..., "schema": ...}}``. We also accept the flatter
|
|
1390
|
+
``{"type": "json_schema", "schema": {...}}`` (used uniformly by the Anthropic/
|
|
1391
|
+
Gemini helpers) and wrap it so the same ``response_format`` works across every
|
|
1392
|
+
provider. ``json_object`` / ``text`` and an already-wrapped envelope pass
|
|
1393
|
+
through unchanged.
|
|
1394
|
+
"""
|
|
1395
|
+
if not response_format:
|
|
1396
|
+
return response_format
|
|
1397
|
+
if (response_format.get("type") or "").lower() != "json_schema":
|
|
1398
|
+
return response_format
|
|
1399
|
+
# Already in OpenAI's nested shape -> pass through.
|
|
1400
|
+
if isinstance(response_format.get("json_schema"), dict):
|
|
1401
|
+
return response_format
|
|
1402
|
+
# Flat ``schema`` form -> wrap into the OpenAI envelope (a ``name`` is required
|
|
1403
|
+
# by the API; default it when the caller did not supply one).
|
|
1404
|
+
schema = response_format.get("schema")
|
|
1405
|
+
if isinstance(schema, dict):
|
|
1406
|
+
return {
|
|
1407
|
+
"type": "json_schema",
|
|
1408
|
+
"json_schema": {
|
|
1409
|
+
"name": response_format.get("name", "response"),
|
|
1410
|
+
"schema": schema,
|
|
1411
|
+
},
|
|
1412
|
+
}
|
|
1413
|
+
return response_format
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
def _ensure_openai_json_keyword(
|
|
1417
|
+
messages: list[dict[str, Any]], response_format: dict[str, Any] | None
|
|
1418
|
+
) -> list[dict[str, Any]]:
|
|
1419
|
+
"""Guarantee the ``"json"`` keyword is present when OpenAI ``json_object`` is used.
|
|
1420
|
+
|
|
1421
|
+
OpenAI's JSON mode (``response_format={"type": "json_object"}``) returns a 400
|
|
1422
|
+
(``'messages' must contain the word 'json'``) unless some message mentions
|
|
1423
|
+
JSON. Structured Outputs (``json_schema``) has no such rule. When the keyword
|
|
1424
|
+
is missing for a ``json_object`` request, append a trailing system instruction
|
|
1425
|
+
(without mutating the caller's list).
|
|
1426
|
+
"""
|
|
1427
|
+
if not response_format:
|
|
1428
|
+
return messages
|
|
1429
|
+
if (response_format.get("type") or "").lower() != "json_object":
|
|
1430
|
+
return messages
|
|
1431
|
+
for msg in messages:
|
|
1432
|
+
content = msg.get("content")
|
|
1433
|
+
text = content if isinstance(content, str) else (str(content) if content is not None else "")
|
|
1434
|
+
if "json" in text.lower():
|
|
1435
|
+
return messages
|
|
1436
|
+
return list(messages) + [
|
|
1437
|
+
{"role": "system", "content": "Respond with a single valid JSON object."}
|
|
1438
|
+
]
|
|
1439
|
+
|
|
1440
|
+
|
|
1338
1441
|
async def _execute_openai(
|
|
1339
1442
|
client: Any,
|
|
1340
1443
|
model_params: dict[str, Any],
|
|
@@ -1343,25 +1446,36 @@ async def _execute_openai(
|
|
|
1343
1446
|
stream: bool = False,
|
|
1344
1447
|
max_tokens: int | None = None,
|
|
1345
1448
|
temperature: float | None = None,
|
|
1449
|
+
response_format: dict[str, Any] | None = None,
|
|
1346
1450
|
) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
|
|
1347
1451
|
"""Execute via ``client.chat.completions.create``.
|
|
1348
1452
|
|
|
1349
1453
|
OpenAI accepts the system role INSIDE the messages list, so the messages are
|
|
1350
1454
|
passed through unchanged (Req 2.11). Token usage is read from
|
|
1351
1455
|
``usage.prompt_tokens``/``usage.completion_tokens`` with reasoning tokens (if
|
|
1352
|
-
reported) mapped to ``thinking_tokens``.
|
|
1456
|
+
reported) mapped to ``thinking_tokens``. ``response_format`` is forwarded
|
|
1457
|
+
natively (OpenAI supports ``json_object`` / ``json_schema``).
|
|
1353
1458
|
"""
|
|
1354
1459
|
model, effective_temperature, effective_max_tokens = _resolve_call_params(
|
|
1355
1460
|
model_params, max_tokens, temperature
|
|
1356
1461
|
)
|
|
1357
1462
|
|
|
1463
|
+
# Normalize response_format to OpenAI's exact envelope and ensure the "json"
|
|
1464
|
+
# keyword exists for json_object mode (otherwise the API rejects the call).
|
|
1465
|
+
normalized_rf = _openai_response_format(response_format)
|
|
1466
|
+
effective_messages = _ensure_openai_json_keyword(messages, normalized_rf)
|
|
1467
|
+
|
|
1358
1468
|
create_kwargs: dict[str, Any] = {
|
|
1359
1469
|
"model": model,
|
|
1360
|
-
"messages":
|
|
1470
|
+
"messages": effective_messages,
|
|
1361
1471
|
"temperature": effective_temperature,
|
|
1362
1472
|
}
|
|
1363
1473
|
if effective_max_tokens is not None:
|
|
1364
1474
|
create_kwargs["max_tokens"] = effective_max_tokens
|
|
1475
|
+
# OpenAI natively supports response_format; forward the normalized value (a
|
|
1476
|
+
# plain ``{"type": "text"}`` is harmless, so only skip the no-op ``None``).
|
|
1477
|
+
if normalized_rf is not None:
|
|
1478
|
+
create_kwargs["response_format"] = normalized_rf
|
|
1365
1479
|
|
|
1366
1480
|
if stream:
|
|
1367
1481
|
# Ask OpenAI to include the usage chunk at the end of the stream so token
|
|
@@ -1441,6 +1555,40 @@ def _normalize_openai_usage(
|
|
|
1441
1555
|
return input_tokens, output_tokens, 0, True
|
|
1442
1556
|
|
|
1443
1557
|
|
|
1558
|
+
def _anthropic_output_config(response_format: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
1559
|
+
"""Translate a provider-agnostic ``response_format`` to Anthropic's native shape.
|
|
1560
|
+
|
|
1561
|
+
Anthropic's Messages API supports structured outputs via the ``output_config``
|
|
1562
|
+
parameter: ``{"format": {"type": "json_schema", "schema": {...}}}``. The schema
|
|
1563
|
+
is REQUIRED (there is no schema-less "json object" mode), so a plain
|
|
1564
|
+
``json_object`` request maps to a permissive object schema. Returns the
|
|
1565
|
+
``output_config`` dict when JSON is requested, else ``None``.
|
|
1566
|
+
|
|
1567
|
+
Structured outputs accept only a subset of JSON Schema (e.g. ``minimum`` /
|
|
1568
|
+
``maxLength`` / ``pattern`` are unsupported and would 400). We run the caller's
|
|
1569
|
+
schema through the SDK's ``transform_schema`` — exactly what ``messages.parse``
|
|
1570
|
+
does internally — which strips unsupported keywords (folding them into field
|
|
1571
|
+
descriptions) and adds ``additionalProperties: false``. If the helper is
|
|
1572
|
+
unavailable or fails, the raw schema is sent as-is.
|
|
1573
|
+
|
|
1574
|
+
With ``output_config`` the model emits the validated JSON as normal text, so
|
|
1575
|
+
extraction and streaming use the standard text path (real incremental deltas).
|
|
1576
|
+
"""
|
|
1577
|
+
if not _wants_json(response_format):
|
|
1578
|
+
return None
|
|
1579
|
+
schema = _extract_json_schema(response_format)
|
|
1580
|
+
if not isinstance(schema, dict):
|
|
1581
|
+
schema = {"type": "object"}
|
|
1582
|
+
else:
|
|
1583
|
+
try: # Align the schema with Anthropic's supported JSON Schema subset.
|
|
1584
|
+
from anthropic import transform_schema
|
|
1585
|
+
|
|
1586
|
+
schema = transform_schema(schema)
|
|
1587
|
+
except Exception as exc: # pragma: no cover - defensive: never block the call
|
|
1588
|
+
logger.debug("[execute_chat_completion] anthropic transform_schema skipped: %s", exc)
|
|
1589
|
+
return {"format": {"type": "json_schema", "schema": schema}}
|
|
1590
|
+
|
|
1591
|
+
|
|
1444
1592
|
async def _execute_anthropic(
|
|
1445
1593
|
client: Any,
|
|
1446
1594
|
model_params: dict[str, Any],
|
|
@@ -1449,6 +1597,7 @@ async def _execute_anthropic(
|
|
|
1449
1597
|
stream: bool = False,
|
|
1450
1598
|
max_tokens: int | None = None,
|
|
1451
1599
|
temperature: float | None = None,
|
|
1600
|
+
response_format: dict[str, Any] | None = None,
|
|
1452
1601
|
) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
|
|
1453
1602
|
"""Execute via ``client.messages.create``.
|
|
1454
1603
|
|
|
@@ -1456,6 +1605,12 @@ async def _execute_anthropic(
|
|
|
1456
1605
|
top-level ``system`` parameter, so the system-role message is lifted out of
|
|
1457
1606
|
the messages list into ``system`` (Req 2.11). Token usage is read from
|
|
1458
1607
|
``usage.input_tokens``/``usage.output_tokens``.
|
|
1608
|
+
|
|
1609
|
+
The Anthropic Messages API supports structured outputs natively via the
|
|
1610
|
+
``output_config`` parameter (``{"format": {"type": "json_schema", "schema":
|
|
1611
|
+
{...}}}``), so a JSON ``response_format`` is mapped to it and the model returns
|
|
1612
|
+
validated JSON as normal text. Extraction and streaming therefore use the
|
|
1613
|
+
standard text path — real incremental deltas, unlike a tool-use workaround.
|
|
1459
1614
|
"""
|
|
1460
1615
|
model, effective_temperature, effective_max_tokens = _resolve_call_params(
|
|
1461
1616
|
model_params, max_tokens, temperature
|
|
@@ -1466,6 +1621,9 @@ async def _execute_anthropic(
|
|
|
1466
1621
|
|
|
1467
1622
|
system_text, non_system_messages = _split_system_messages(messages)
|
|
1468
1623
|
|
|
1624
|
+
# Translate response_format → Anthropic's native structured-output config.
|
|
1625
|
+
output_config = _anthropic_output_config(response_format)
|
|
1626
|
+
|
|
1469
1627
|
create_kwargs: dict[str, Any] = {
|
|
1470
1628
|
"model": model,
|
|
1471
1629
|
"messages": non_system_messages,
|
|
@@ -1474,6 +1632,8 @@ async def _execute_anthropic(
|
|
|
1474
1632
|
}
|
|
1475
1633
|
if system_text is not None:
|
|
1476
1634
|
create_kwargs["system"] = system_text
|
|
1635
|
+
if output_config is not None:
|
|
1636
|
+
create_kwargs["output_config"] = output_config
|
|
1477
1637
|
|
|
1478
1638
|
if stream:
|
|
1479
1639
|
|
|
@@ -1585,12 +1745,17 @@ async def _execute_gemini(
|
|
|
1585
1745
|
stream: bool = False,
|
|
1586
1746
|
max_tokens: int | None = None,
|
|
1587
1747
|
temperature: float | None = None,
|
|
1748
|
+
response_format: dict[str, Any] | None = None,
|
|
1588
1749
|
) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
|
|
1589
1750
|
"""Execute via Gemini ``GenerativeModel.generate_content_async``.
|
|
1590
1751
|
|
|
1591
1752
|
Gemini keeps the system role inside the prompt / system instruction (Req 2.11).
|
|
1592
1753
|
Token usage is read from ``usage_metadata`` (``prompt_token_count`` /
|
|
1593
1754
|
``candidates_token_count`` / ``thoughts_token_count``).
|
|
1755
|
+
|
|
1756
|
+
Gemini has no ``response_format`` parameter either: a JSON request is mapped to
|
|
1757
|
+
``generation_config.response_mime_type = "application/json"`` and, when a JSON
|
|
1758
|
+
schema is supplied, ``generation_config.response_schema``.
|
|
1594
1759
|
"""
|
|
1595
1760
|
model, effective_temperature, effective_max_tokens = _resolve_call_params(
|
|
1596
1761
|
model_params, max_tokens, temperature
|
|
@@ -1600,6 +1765,11 @@ async def _execute_gemini(
|
|
|
1600
1765
|
generation_config: dict[str, Any] = {"temperature": effective_temperature}
|
|
1601
1766
|
if effective_max_tokens is not None:
|
|
1602
1767
|
generation_config["max_output_tokens"] = effective_max_tokens
|
|
1768
|
+
if _wants_json(response_format):
|
|
1769
|
+
generation_config["response_mime_type"] = "application/json"
|
|
1770
|
+
schema = _extract_json_schema(response_format)
|
|
1771
|
+
if schema is not None:
|
|
1772
|
+
generation_config["response_schema"] = schema
|
|
1603
1773
|
|
|
1604
1774
|
if stream:
|
|
1605
1775
|
|
|
@@ -30,6 +30,18 @@ logger = logging.getLogger(__name__)
|
|
|
30
30
|
|
|
31
31
|
TRUNCATION_MARKER = "\n\n[... contenu tronqué ...]\n\n"
|
|
32
32
|
|
|
33
|
+
# Bandeau injecté en tête d'un tool_result tronqué de force parce qu'il dépassait
|
|
34
|
+
# à lui seul le budget de contexte. Rend l'agent conscient que les données brutes
|
|
35
|
+
# sont incomplètes et l'oriente vers des appels plus ciblés (pagination/morceaux).
|
|
36
|
+
OVERSIZE_RESULT_NOTICE = (
|
|
37
|
+
"⚠️ RÉSULTAT TRONQUÉ AUTOMATIQUEMENT — l'appel outil a renvoyé un volume trop "
|
|
38
|
+
"grand pour la fenêtre de contexte. Les données brutes ci-dessous sont INCOMPLÈTES : "
|
|
39
|
+
"ne te fie pas aux valeurs partielles ni aux totaux/agrégats qui en dépendent. "
|
|
40
|
+
"Si tu as besoin des données complètes, refais des appels plus ciblés "
|
|
41
|
+
"(filtres précis, LIMIT/pagination, colonnes restreintes) pour traiter le résultat "
|
|
42
|
+
"par morceaux.\n---\n"
|
|
43
|
+
)
|
|
44
|
+
|
|
33
45
|
# OpenAI enforces a 10 485 760 character limit per message content.
|
|
34
46
|
# We use a conservative 8M limit to leave headroom for JSON serialization
|
|
35
47
|
# overhead, tool_call metadata, and other wrapper text added by the SDK.
|
|
@@ -163,7 +175,12 @@ class ScratchpadCompressor:
|
|
|
163
175
|
|
|
164
176
|
return "\n".join(parts)
|
|
165
177
|
|
|
166
|
-
def _truncate_single_result(
|
|
178
|
+
def _truncate_single_result(
|
|
179
|
+
self,
|
|
180
|
+
message: ChatMessage,
|
|
181
|
+
target_tokens: int,
|
|
182
|
+
oversize_notice: bool = False,
|
|
183
|
+
) -> ChatMessage:
|
|
167
184
|
"""Tronque le contenu d'un tool_result en gardant début + marqueur + fin.
|
|
168
185
|
|
|
169
186
|
Aplatit d'abord tous les blocks en texte brut pour que la troncature
|
|
@@ -176,6 +193,10 @@ class ScratchpadCompressor:
|
|
|
176
193
|
Args:
|
|
177
194
|
message: Message tool_result à tronquer.
|
|
178
195
|
target_tokens: Nombre cible de tokens pour le message tronqué.
|
|
196
|
+
oversize_notice: Si True et qu'une troncature a réellement lieu,
|
|
197
|
+
préfixe le contenu avec OVERSIZE_RESULT_NOTICE pour avertir
|
|
198
|
+
l'agent que les données brutes sont incomplètes. Les tokens du
|
|
199
|
+
bandeau sont réservés dans la cible pour ne pas la dépasser.
|
|
179
200
|
|
|
180
201
|
Returns:
|
|
181
202
|
Nouveau ChatMessage avec le contenu tronqué (blocks nettoyés).
|
|
@@ -195,7 +216,14 @@ class ScratchpadCompressor:
|
|
|
195
216
|
k: v for k, v in (message.additional_kwargs or {}).items() if k not in ("tool_calls",)
|
|
196
217
|
}
|
|
197
218
|
|
|
198
|
-
|
|
219
|
+
# Réserver les tokens du bandeau d'avertissement dans la cible pour que
|
|
220
|
+
# (bandeau + contenu tronqué) reste sous target_tokens.
|
|
221
|
+
notice = OVERSIZE_RESULT_NOTICE if oversize_notice else ""
|
|
222
|
+
notice_tokens = self._token_counter.count_tokens(notice).count if notice else 0
|
|
223
|
+
effective_target = max(0, target_tokens - notice_tokens)
|
|
224
|
+
|
|
225
|
+
if current_tokens <= effective_target or target_tokens <= 0:
|
|
226
|
+
# Aucune troncature nécessaire → pas de bandeau (rien n'est perdu).
|
|
199
227
|
if content != (message.content or ""):
|
|
200
228
|
return ChatMessage(
|
|
201
229
|
role=message.role,
|
|
@@ -206,7 +234,7 @@ class ScratchpadCompressor:
|
|
|
206
234
|
|
|
207
235
|
# Réserver des tokens pour le marqueur de troncature
|
|
208
236
|
marker_tokens = self._token_counter.count_tokens(TRUNCATION_MARKER).count
|
|
209
|
-
available_tokens = max(0,
|
|
237
|
+
available_tokens = max(0, effective_target - marker_tokens)
|
|
210
238
|
|
|
211
239
|
# Répartir entre début et fin (60% début, 40% fin)
|
|
212
240
|
begin_tokens = int(available_tokens * 0.6)
|
|
@@ -219,17 +247,18 @@ class ScratchpadCompressor:
|
|
|
219
247
|
end_chars = max(0, int(end_tokens * chars_per_token))
|
|
220
248
|
|
|
221
249
|
if begin_chars + end_chars >= len(content):
|
|
222
|
-
|
|
250
|
+
final_content = notice + content if notice else content
|
|
251
|
+
if final_content != (message.content or ""):
|
|
223
252
|
return ChatMessage(
|
|
224
253
|
role=message.role,
|
|
225
|
-
content=
|
|
254
|
+
content=final_content,
|
|
226
255
|
additional_kwargs=clean_kwargs,
|
|
227
256
|
)
|
|
228
257
|
return message
|
|
229
258
|
|
|
230
259
|
begin_part = content[:begin_chars]
|
|
231
260
|
end_part = content[-end_chars:] if end_chars > 0 else ""
|
|
232
|
-
truncated_content = begin_part + TRUNCATION_MARKER + end_part
|
|
261
|
+
truncated_content = notice + begin_part + TRUNCATION_MARKER + end_part
|
|
233
262
|
|
|
234
263
|
return ChatMessage(
|
|
235
264
|
role=message.role,
|
|
@@ -324,8 +353,11 @@ class ScratchpadCompressor:
|
|
|
324
353
|
if not old_entries:
|
|
325
354
|
last_pair_tokens = self._count_tokens(last_pair)
|
|
326
355
|
if last_pair_tokens > available_for_scratchpad:
|
|
327
|
-
# Tronquer le tool_result de la dernière paire
|
|
328
|
-
|
|
356
|
+
# Tronquer le tool_result de la dernière paire + avertir l'agent
|
|
357
|
+
# (le résultat unique dépasse à lui seul le budget).
|
|
358
|
+
compressed_pair = self._truncate_last_pair(
|
|
359
|
+
last_pair, available_for_scratchpad, oversize_notice=True
|
|
360
|
+
)
|
|
329
361
|
tokens_after = self._count_tokens(compressed_pair)
|
|
330
362
|
self._log_compression(
|
|
331
363
|
entries_before,
|
|
@@ -343,6 +375,17 @@ class ScratchpadCompressor:
|
|
|
343
375
|
|
|
344
376
|
# Cas 2 : il y a des anciennes entrées à compresser
|
|
345
377
|
last_pair_tokens = self._count_tokens(last_pair)
|
|
378
|
+
|
|
379
|
+
# Garde-fou : si la dernière paire dépasse à elle seule le budget, la
|
|
380
|
+
# préserver verbatim est impossible (sinon résumer les anciennes entrées
|
|
381
|
+
# ne sert à rien — c'est le bug du blob unique géant). On la tronque
|
|
382
|
+
# aussi, avec bandeau d'avertissement pour l'agent.
|
|
383
|
+
if last_pair_tokens > available_for_scratchpad:
|
|
384
|
+
last_pair = self._truncate_last_pair(
|
|
385
|
+
last_pair, available_for_scratchpad, oversize_notice=True
|
|
386
|
+
)
|
|
387
|
+
last_pair_tokens = self._count_tokens(last_pair)
|
|
388
|
+
|
|
346
389
|
target_old_tokens = max(0, available_for_scratchpad - last_pair_tokens)
|
|
347
390
|
|
|
348
391
|
# Tenter le résumé LLM
|
|
@@ -443,6 +486,7 @@ class ScratchpadCompressor:
|
|
|
443
486
|
self,
|
|
444
487
|
last_pair: list[ChatMessage],
|
|
445
488
|
available_tokens: int,
|
|
489
|
+
oversize_notice: bool = False,
|
|
446
490
|
) -> list[ChatMessage]:
|
|
447
491
|
"""Tronque le tool_result dans la dernière paire pour respecter le budget.
|
|
448
492
|
|
|
@@ -452,6 +496,8 @@ class ScratchpadCompressor:
|
|
|
452
496
|
Args:
|
|
453
497
|
last_pair: Dernière paire de messages (tool_call + tool_result).
|
|
454
498
|
available_tokens: Tokens disponibles pour toute la paire.
|
|
499
|
+
oversize_notice: Propagé à _truncate_single_result pour préfixer le
|
|
500
|
+
bandeau d'avertissement quand le tool_result est tronqué.
|
|
455
501
|
|
|
456
502
|
Returns:
|
|
457
503
|
Paire avec le tool_result tronqué si nécessaire.
|
|
@@ -462,7 +508,9 @@ class ScratchpadCompressor:
|
|
|
462
508
|
for msg in last_pair:
|
|
463
509
|
if msg.role == MessageRole.TOOL:
|
|
464
510
|
remaining = max(0, available_tokens - tokens_used)
|
|
465
|
-
result.append(
|
|
511
|
+
result.append(
|
|
512
|
+
self._truncate_single_result(msg, remaining, oversize_notice=oversize_notice)
|
|
513
|
+
)
|
|
466
514
|
else:
|
|
467
515
|
tokens_used += self._count_tokens([msg])
|
|
468
516
|
result.append(msg)
|
|
@@ -1181,7 +1181,7 @@
|
|
|
1181
1181
|
Admin Panel
|
|
1182
1182
|
</button>
|
|
1183
1183
|
<button
|
|
1184
|
-
@click="
|
|
1184
|
+
@click="openSkillsPanel()"
|
|
1185
1185
|
class="w-full text-sm text-purple-600 hover:text-purple-800 transition-colors py-2 px-4 rounded-md hover:bg-purple-50 flex items-center justify-center mt-2"
|
|
1186
1186
|
>
|
|
1187
1187
|
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
@@ -2136,6 +2136,56 @@
|
|
|
2136
2136
|
</div>
|
|
2137
2137
|
</div>
|
|
2138
2138
|
|
|
2139
|
+
<!-- Skills Admin Authentication Modal -->
|
|
2140
|
+
<div
|
|
2141
|
+
x-show="showSkillsAuthModal"
|
|
2142
|
+
x-cloak
|
|
2143
|
+
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50"
|
|
2144
|
+
@click.self="showSkillsAuthModal = false; skillsAuthPassword = ''; skillsAuthError = null"
|
|
2145
|
+
>
|
|
2146
|
+
<div class="bg-white rounded-lg max-w-md w-full">
|
|
2147
|
+
<div class="p-6">
|
|
2148
|
+
<h3 class="text-lg font-semibold text-gray-900 mb-4">Skills — Authentification admin</h3>
|
|
2149
|
+
<p class="text-sm text-gray-600 mb-4">La gestion des skills nécessite le mot de passe admin.</p>
|
|
2150
|
+
|
|
2151
|
+
<form @submit.prevent="authenticateSkillsAdmin()">
|
|
2152
|
+
<div class="mb-4">
|
|
2153
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Password</label>
|
|
2154
|
+
<input
|
|
2155
|
+
type="password"
|
|
2156
|
+
x-model="skillsAuthPassword"
|
|
2157
|
+
class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:ring-purple-500 focus:border-purple-500"
|
|
2158
|
+
placeholder="Enter admin password"
|
|
2159
|
+
required
|
|
2160
|
+
>
|
|
2161
|
+
<p x-show="skillsAuthError" x-cloak class="text-sm text-red-600 mt-2" x-text="skillsAuthError"></p>
|
|
2162
|
+
</div>
|
|
2163
|
+
|
|
2164
|
+
<div class="flex items-center justify-end space-x-3">
|
|
2165
|
+
<button
|
|
2166
|
+
type="button"
|
|
2167
|
+
@click="showSkillsAuthModal = false; skillsAuthPassword = ''; skillsAuthError = null"
|
|
2168
|
+
class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50"
|
|
2169
|
+
>
|
|
2170
|
+
Cancel
|
|
2171
|
+
</button>
|
|
2172
|
+
<button
|
|
2173
|
+
type="submit"
|
|
2174
|
+
:disabled="skillsAuthLoading"
|
|
2175
|
+
class="px-4 py-2 text-sm font-medium text-white bg-purple-600 border border-transparent rounded-md hover:bg-purple-700 disabled:opacity-50"
|
|
2176
|
+
>
|
|
2177
|
+
<span x-show="!skillsAuthLoading">Authenticate</span>
|
|
2178
|
+
<span x-show="skillsAuthLoading" x-cloak class="flex items-center">
|
|
2179
|
+
<div class="loading-spinner mr-2"></div>
|
|
2180
|
+
Authenticating...
|
|
2181
|
+
</span>
|
|
2182
|
+
</button>
|
|
2183
|
+
</div>
|
|
2184
|
+
</form>
|
|
2185
|
+
</div>
|
|
2186
|
+
</div>
|
|
2187
|
+
</div>
|
|
2188
|
+
|
|
2139
2189
|
<!-- Admin Panel Full Screen Overlay -->
|
|
2140
2190
|
<div
|
|
2141
2191
|
x-show="showAdminPanel"
|
|
@@ -3482,6 +3532,12 @@
|
|
|
3482
3532
|
adminPanelLoading: false,
|
|
3483
3533
|
adminPanelError: null,
|
|
3484
3534
|
|
|
3535
|
+
// Skills admin auth (popup gating skill management; reuses adminPanelToken)
|
|
3536
|
+
showSkillsAuthModal: false,
|
|
3537
|
+
skillsAuthPassword: '',
|
|
3538
|
+
skillsAuthLoading: false,
|
|
3539
|
+
skillsAuthError: null,
|
|
3540
|
+
|
|
3485
3541
|
// Skills Panel
|
|
3486
3542
|
showSkillsPanel: false,
|
|
3487
3543
|
skillsList: [],
|
|
@@ -3753,6 +3809,59 @@
|
|
|
3753
3809
|
this.adminPanelError = null;
|
|
3754
3810
|
},
|
|
3755
3811
|
|
|
3812
|
+
openSkillsPanel() {
|
|
3813
|
+
// Skills management is admin-gated. Reuse a valid admin token if present
|
|
3814
|
+
// (shared with the admin panel); otherwise prompt for the admin password.
|
|
3815
|
+
const storedToken = sessionStorage.getItem('adminPanelToken');
|
|
3816
|
+
const storedExpiry = sessionStorage.getItem('adminPanelTokenExpiry');
|
|
3817
|
+
if (storedToken && storedExpiry && new Date(storedExpiry) > new Date()) {
|
|
3818
|
+
this.adminPanelToken = storedToken;
|
|
3819
|
+
this.showSkillsPanel = true;
|
|
3820
|
+
this.loadSkills();
|
|
3821
|
+
return;
|
|
3822
|
+
}
|
|
3823
|
+
this.skillsAuthError = null;
|
|
3824
|
+
this.skillsAuthPassword = '';
|
|
3825
|
+
this.showSkillsAuthModal = true;
|
|
3826
|
+
},
|
|
3827
|
+
|
|
3828
|
+
async authenticateSkillsAdmin() {
|
|
3829
|
+
try {
|
|
3830
|
+
this.skillsAuthLoading = true;
|
|
3831
|
+
this.skillsAuthError = null;
|
|
3832
|
+
const response = await fetch(BASE_PATH + '/api/admin/auth/verify', {
|
|
3833
|
+
method: 'POST',
|
|
3834
|
+
headers: { 'Content-Type': 'application/json' },
|
|
3835
|
+
body: JSON.stringify({ password: this.skillsAuthPassword }),
|
|
3836
|
+
});
|
|
3837
|
+
if (response.ok) {
|
|
3838
|
+
const data = await response.json();
|
|
3839
|
+
if (data.success && data.token) {
|
|
3840
|
+
// Reuse the same admin token as the admin panel; skill
|
|
3841
|
+
// mutations pick it up via adminAuthHeader() (Bearer).
|
|
3842
|
+
this.adminPanelToken = data.token;
|
|
3843
|
+
sessionStorage.setItem('adminPanelToken', data.token);
|
|
3844
|
+
sessionStorage.setItem('adminPanelTokenExpiry', data.expires_at);
|
|
3845
|
+
this.showSkillsAuthModal = false;
|
|
3846
|
+
this.skillsAuthPassword = '';
|
|
3847
|
+
this.showSkillsPanel = true;
|
|
3848
|
+
await this.loadSkills();
|
|
3849
|
+
} else {
|
|
3850
|
+
this.skillsAuthError = 'Mot de passe admin invalide';
|
|
3851
|
+
}
|
|
3852
|
+
} else if (response.status === 503) {
|
|
3853
|
+
this.skillsAuthError = "L'authentification admin requiert Elasticsearch";
|
|
3854
|
+
} else {
|
|
3855
|
+
this.skillsAuthError = "Échec de l'authentification";
|
|
3856
|
+
}
|
|
3857
|
+
} catch (error) {
|
|
3858
|
+
console.error('[Skills] Admin auth error:', error);
|
|
3859
|
+
this.skillsAuthError = 'Erreur réseau';
|
|
3860
|
+
} finally {
|
|
3861
|
+
this.skillsAuthLoading = false;
|
|
3862
|
+
}
|
|
3863
|
+
},
|
|
3864
|
+
|
|
3756
3865
|
logoutAdminPanel() {
|
|
3757
3866
|
sessionStorage.removeItem('adminPanelToken');
|
|
3758
3867
|
sessionStorage.removeItem('adminPanelTokenExpiry');
|
|
@@ -68,6 +68,7 @@ async def workflow_chat_completion(
|
|
|
68
68
|
temperature: float = 0.7,
|
|
69
69
|
max_tokens: int | None = None,
|
|
70
70
|
stream: bool = False,
|
|
71
|
+
response_format: dict[str, Any] | None = None,
|
|
71
72
|
) -> Union[ChatCompletionResult, AsyncIterator[ChatCompletionChunk]]:
|
|
72
73
|
"""Execute a unified, monitored LLM call from inside a workflow node.
|
|
73
74
|
|
|
@@ -87,6 +88,13 @@ async def workflow_chat_completion(
|
|
|
87
88
|
stream: When ``True``, returns an async iterator of
|
|
88
89
|
:class:`ChatCompletionChunk` yielding chunks in arrival order; otherwise
|
|
89
90
|
returns a single :class:`ChatCompletionResult` (Requirement 2.8).
|
|
91
|
+
response_format: Optional, provider-agnostic structured-output request in
|
|
92
|
+
the OpenAI shape (``{"type": "json_object"}`` or
|
|
93
|
+
``{"type": "json_schema", "json_schema": {...}}``). The execution layer
|
|
94
|
+
translates it to each provider's native mechanism (OpenAI native
|
|
95
|
+
param; Anthropic system-prompt directive; Gemini ``response_mime_type``
|
|
96
|
+
/ ``response_schema``), so the same call works across all providers
|
|
97
|
+
behind the router.
|
|
90
98
|
|
|
91
99
|
Returns:
|
|
92
100
|
A :class:`ChatCompletionResult` for non-streaming calls, or an
|
|
@@ -116,6 +124,7 @@ async def workflow_chat_completion(
|
|
|
116
124
|
selected_model=selected_model,
|
|
117
125
|
max_tokens=max_tokens,
|
|
118
126
|
temperature=temperature,
|
|
127
|
+
response_format=response_format,
|
|
119
128
|
)
|
|
120
129
|
|
|
121
130
|
return await _complete_chat_completion(
|
|
@@ -126,6 +135,7 @@ async def workflow_chat_completion(
|
|
|
126
135
|
selected_model=selected_model,
|
|
127
136
|
max_tokens=max_tokens,
|
|
128
137
|
temperature=temperature,
|
|
138
|
+
response_format=response_format,
|
|
129
139
|
)
|
|
130
140
|
|
|
131
141
|
|
|
@@ -198,6 +208,7 @@ async def _complete_chat_completion(
|
|
|
198
208
|
selected_model: str,
|
|
199
209
|
max_tokens: int | None,
|
|
200
210
|
temperature: float | None,
|
|
211
|
+
response_format: dict[str, Any] | None = None,
|
|
201
212
|
) -> ChatCompletionResult:
|
|
202
213
|
"""Perform a non-streaming call, record per-call metrics, and accumulate them."""
|
|
203
214
|
start_dt = datetime.now(timezone.utc)
|
|
@@ -210,6 +221,7 @@ async def _complete_chat_completion(
|
|
|
210
221
|
stream=False,
|
|
211
222
|
max_tokens=max_tokens,
|
|
212
223
|
temperature=temperature,
|
|
224
|
+
response_format=response_format,
|
|
213
225
|
)
|
|
214
226
|
except Exception as exc:
|
|
215
227
|
duration_ms = (time.perf_counter() - started) * 1000
|
|
@@ -257,6 +269,7 @@ async def _stream_chat_completion(
|
|
|
257
269
|
selected_model: str,
|
|
258
270
|
max_tokens: int | None,
|
|
259
271
|
temperature: float | None,
|
|
272
|
+
response_format: dict[str, Any] | None = None,
|
|
260
273
|
) -> AsyncIterator[ChatCompletionChunk]:
|
|
261
274
|
"""Yield provider chunks in order, measuring TTFT and recording metrics at end.
|
|
262
275
|
|
|
@@ -295,6 +308,7 @@ async def _stream_chat_completion(
|
|
|
295
308
|
stream=True,
|
|
296
309
|
max_tokens=max_tokens,
|
|
297
310
|
temperature=temperature,
|
|
311
|
+
response_format=response_format,
|
|
298
312
|
)
|
|
299
313
|
|
|
300
314
|
async for chunk in stream_iter: # type: ignore[union-attr]
|