agent-framework-lib 0.8.9__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/agent_framework_lib.egg-info → agent_framework_lib-0.8.9.post3}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_clients.py +172 -2
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/scratchpad_compressor.py +57 -9
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/authz.py +27 -9
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/post_install.py +66 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_auth.py +70 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/modern_ui.html +136 -10
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/server.py +54 -18
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/skills_router.py +8 -5
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/chat_completion.py +14 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3/agent_framework_lib.egg-info}/PKG-INFO +1 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SECURITY_HARDENING.md +19 -2
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/pyproject.toml +1 -1
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/LICENSE +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/MANIFEST.in +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/README.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/audit.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/crypto.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/git_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/herdr_client.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/orchestrator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/store.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/code_delivery/tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/base_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/execution_controller.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/interruption_message.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/prompt_builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/scratchpad_serializer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/step_display_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/budget_aware_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/hypothesis_engine.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/implicit_feedback.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/response_lessons.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/memory/work_patterns.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_instrumentor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/token_counter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/hub.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/notifications/webhook_notifier.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/file_view_token.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/input_guard.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/openshell_policy.yaml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/pii_redactor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/sandbox.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/sandbox_provider.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/secret_redactor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/shell_env.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/upload_token.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/agent_mixin.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/custom_skill_manager.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/discovery_prompt.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/markdown_loader.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/executor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/message_injector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/message_queue.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/retrigger.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/shell_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/tools/web_search_tool.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/session_title_generator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/README.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.8.9 → 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 → 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 → 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 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/gitnexus_client.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/helper_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/builder.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/context.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/decorators.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/engine.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/errors.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/monitoring.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/runner.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/state.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/core/types.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/implementations/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/implementations/langgraph_engine.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workflow/server/schemas.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/__init__.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/artefacts.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/client.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/config.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/context.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/cursor.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/memory.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/models.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/poller.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/preferences.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/router.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/session.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/workspace/subscription.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/SOURCES.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/GETTING_STARTED.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/GITNEXUS_USER_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SCREENSHOTS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SECRETS_MANAGEMENT.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/WORKSPACE_INTEGRATION.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/configuration.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/framework_audit_remarques.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/helper_agent.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/index.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/README.md +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_context_budget_test.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_graphiti.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/test_work_patterns_live.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/workflow_engine_example.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/examples/workspace_test_agent.py +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/setup.cfg +0 -0
- {agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/setup.py +0 -0
{agent_framework_lib-0.8.9/agent_framework_lib.egg-info → agent_framework_lib-0.8.9.post3}/PKG-INFO
RENAMED
|
@@ -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>
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/core/model_clients.py
RENAMED
|
@@ -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)
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/security/authz.py
RENAMED
|
@@ -86,26 +86,44 @@ def resolve_effective_user_id(current_user: str, requested_user_id: str | None)
|
|
|
86
86
|
return current_user
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def is_owner(
|
|
90
|
-
|
|
89
|
+
def is_owner(
|
|
90
|
+
resource_user_id: str | None,
|
|
91
|
+
principal: str,
|
|
92
|
+
*,
|
|
93
|
+
is_admin: bool = False,
|
|
94
|
+
) -> bool:
|
|
95
|
+
"""Vérifie que ``principal`` possède la ressource (autorisation role-based).
|
|
96
|
+
|
|
97
|
+
Le ``principal`` passé DOIT être l'**utilisateur effectif** de la requête
|
|
98
|
+
(résolu via :func:`resolve_effective_user_id`), pas le pseudo-principal d'une
|
|
99
|
+
clé API partagée par un portail. L'accès cross-utilisateur n'est accordé que
|
|
100
|
+
via le **rôle admin** (``is_admin=True``), pas par la confiance accordée à
|
|
101
|
+
tout détenteur de clé.
|
|
102
|
+
|
|
103
|
+
Note (changement de modèle) : le court-circuit historique
|
|
104
|
+
``trust_client_user_id() -> True`` est **supprimé**. ``AUTH_TRUST_CLIENT_USER_ID``
|
|
105
|
+
ne sert plus qu'à *résoudre* l'utilisateur effectif (honorer le ``user_id``
|
|
106
|
+
fourni par un portail de confiance) dans :func:`resolve_effective_user_id` ;
|
|
107
|
+
il n'autorise plus, à lui seul, l'accès aux ressources d'autrui.
|
|
91
108
|
|
|
92
109
|
Args:
|
|
93
110
|
resource_user_id: Identifiant du propriétaire de la ressource
|
|
94
111
|
(``None`` si la ressource n'a pas de propriétaire connu).
|
|
95
|
-
principal: Identité
|
|
112
|
+
principal: Identité **effective** demandant l'accès.
|
|
113
|
+
is_admin: ``True`` si l'appelant est authentifié comme admin (rôle
|
|
114
|
+
privilégié QA/support) — court-circuite la vérification de propriété.
|
|
96
115
|
|
|
97
116
|
Returns:
|
|
98
|
-
``True`` si
|
|
99
|
-
est actif et que
|
|
100
|
-
|
|
101
|
-
de confiance peut accéder aux ressources de n'importe quel end-user).
|
|
117
|
+
``True`` si l'appelant est admin, si ``principal`` possède la ressource,
|
|
118
|
+
ou si le mode développement est actif et que ``principal`` est
|
|
119
|
+
``"anonymous"`` (compat mono-utilisateur). ``False`` sinon.
|
|
102
120
|
"""
|
|
121
|
+
if is_admin:
|
|
122
|
+
return True
|
|
103
123
|
if resource_user_id is not None and resource_user_id == principal:
|
|
104
124
|
return True
|
|
105
125
|
if dev_mode_enabled() and principal == ANONYMOUS_PRINCIPAL:
|
|
106
126
|
return True
|
|
107
|
-
if trust_client_user_id():
|
|
108
|
-
return True
|
|
109
127
|
return False
|
|
110
128
|
|
|
111
129
|
|
{agent_framework_lib-0.8.9 → agent_framework_lib-0.8.9.post3}/agent_framework/utils/post_install.py
RENAMED
|
@@ -1076,6 +1076,70 @@ def _find_local_wheel() -> Path | None:
|
|
|
1076
1076
|
return None
|
|
1077
1077
|
|
|
1078
1078
|
|
|
1079
|
+
_IMAGE_PIN_NAME = "sandbox-image-pin"
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
def _ensure_image_pin(tag: str) -> None:
|
|
1083
|
+
"""Keep a tiny container running off the CURRENT sandbox image so an external
|
|
1084
|
+
``docker image prune`` / ``docker system prune`` cannot remove it.
|
|
1085
|
+
|
|
1086
|
+
A running container's image — AND its tag — survive a prune. The pin is
|
|
1087
|
+
(re)created whenever it is missing OR points at a different image id, because
|
|
1088
|
+
``docker build -t <tag>`` moves the tag to a NEW image and leaves a stale pin
|
|
1089
|
+
on the old one (then the new, unpinned, tagged image gets pruned → the tag
|
|
1090
|
+
vanishes → ``ImagePullFailed`` on the next sandbox). Re-pinning the freshly
|
|
1091
|
+
built/current image right here closes that window on every boot and rebuild.
|
|
1092
|
+
Best-effort: never fatal, never blocks the agent.
|
|
1093
|
+
"""
|
|
1094
|
+
if not _docker_ok():
|
|
1095
|
+
return
|
|
1096
|
+
try:
|
|
1097
|
+
tag_inspect = subprocess.run(
|
|
1098
|
+
["docker", "image", "inspect", "-f", "{{.Id}}", tag],
|
|
1099
|
+
capture_output=True,
|
|
1100
|
+
text=True,
|
|
1101
|
+
timeout=30,
|
|
1102
|
+
)
|
|
1103
|
+
if tag_inspect.returncode != 0:
|
|
1104
|
+
return # tag not present locally — nothing to pin
|
|
1105
|
+
want = (tag_inspect.stdout or "").strip()
|
|
1106
|
+
pin = subprocess.run(
|
|
1107
|
+
["docker", "inspect", "-f", "{{.State.Running}} {{.Image}}", _IMAGE_PIN_NAME],
|
|
1108
|
+
capture_output=True,
|
|
1109
|
+
text=True,
|
|
1110
|
+
timeout=30,
|
|
1111
|
+
)
|
|
1112
|
+
if pin.returncode == 0:
|
|
1113
|
+
running, _, img = (pin.stdout or "").strip().partition(" ")
|
|
1114
|
+
if running == "true" and img == want:
|
|
1115
|
+
return # already pinned to the current image — nothing to do
|
|
1116
|
+
subprocess.run(["docker", "rm", "-f", _IMAGE_PIN_NAME], capture_output=True, timeout=30)
|
|
1117
|
+
r = subprocess.run(
|
|
1118
|
+
[
|
|
1119
|
+
"docker",
|
|
1120
|
+
"run",
|
|
1121
|
+
"-d",
|
|
1122
|
+
"--name",
|
|
1123
|
+
_IMAGE_PIN_NAME,
|
|
1124
|
+
"--restart",
|
|
1125
|
+
"always",
|
|
1126
|
+
"--entrypoint",
|
|
1127
|
+
"sleep",
|
|
1128
|
+
tag,
|
|
1129
|
+
"infinity",
|
|
1130
|
+
],
|
|
1131
|
+
capture_output=True,
|
|
1132
|
+
text=True,
|
|
1133
|
+
timeout=60,
|
|
1134
|
+
)
|
|
1135
|
+
if r.returncode == 0:
|
|
1136
|
+
logger.info("[sandbox] pinned image %s (prune-proof) via %s", tag, _IMAGE_PIN_NAME)
|
|
1137
|
+
else:
|
|
1138
|
+
logger.warning("[sandbox] image pin failed: %s", (r.stderr or "")[-200:])
|
|
1139
|
+
except Exception as exc: # noqa: BLE001 — pinning must never break startup
|
|
1140
|
+
logger.warning("[sandbox] image pin error: %s", exc)
|
|
1141
|
+
|
|
1142
|
+
|
|
1079
1143
|
def _render_sandbox_dockerfile(install_line: str, version: str = "") -> str:
|
|
1080
1144
|
"""Self-contained Dockerfile for the per-session sandbox image.
|
|
1081
1145
|
|
|
@@ -1131,6 +1195,7 @@ def ensure_sandbox_image(tag: str = _SANDBOX_IMAGE_TAG) -> tuple[bool, str | Non
|
|
|
1131
1195
|
if _sandbox_image_exists(tag) and not force:
|
|
1132
1196
|
built_version = _sandbox_image_version(tag)
|
|
1133
1197
|
if built_version == _afl_version:
|
|
1198
|
+
_ensure_image_pin(tag) # keep it prune-proof even when no rebuild is needed
|
|
1134
1199
|
return True, None
|
|
1135
1200
|
logger.info(
|
|
1136
1201
|
"[sandbox] image %s built for version %r != package %r — rebuilding",
|
|
@@ -1173,6 +1238,7 @@ def ensure_sandbox_image(tag: str = _SANDBOX_IMAGE_TAG) -> tuple[bool, str | Non
|
|
|
1173
1238
|
finally:
|
|
1174
1239
|
shutil.rmtree(build_dir, ignore_errors=True)
|
|
1175
1240
|
if r.returncode == 0:
|
|
1241
|
+
_ensure_image_pin(tag) # pin the freshly built image so a prune can't drop the tag
|
|
1176
1242
|
return True, None
|
|
1177
1243
|
return False, f"sandbox image build failed: {r.stderr[-400:]}"
|
|
1178
1244
|
|