agent-framework-lib 0.6.3.post2__tar.gz → 0.6.3.post4__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.6.3.post2/agent_framework_lib.egg-info → agent_framework_lib-0.6.3.post4}/PKG-INFO +13 -13
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/README.md +12 -12
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/__init__.py +6 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/model_config.py +5 -5
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/scratchpad_compressor.py +128 -5
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/step_display_config.py +10 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/implementations/budget_aware_agent.py +61 -8
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/llm_metrics.py +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/llm_metrics_collector.py +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/otel_instrumentor.py +3 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/token_counter.py +3 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/agent_mixin.py +62 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/base.py +16 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/__init__.py +25 -9
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/scripts/__init__.py +1 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/scripts/create_and_register.py +189 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/scripts/register_to_storage.py +115 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/chart/SKILL.md +290 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/chart/chart_to_image.py +244 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/drawio/SKILL.md +109 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/drawio/create_drawio.py +85 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/excel/SKILL.md +111 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/excel/create_excel.py +110 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/file/SKILL.md +187 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/file/create_file.py +85 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/file/list_files.py +77 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/file/read_file.py +62 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/file_access/SKILL.md +96 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/file_access/get_file_path.py +75 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/form/SKILL.md +163 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/image_display/SKILL.md +206 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/mermaid/SKILL.md +267 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +246 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/multimodal/SKILL.md +124 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +258 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/table/SKILL.md +220 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/table/table_to_image.py +366 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +167 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +180 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/web_search/SKILL.md +141 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/web_search/web_news_search.py +77 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/builtin/skills/web_search/web_search.py +75 -0
- agent_framework_lib-0.6.3.post4/agent_framework/skills/custom_skill_manager.py +529 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/discovery_prompt.py +47 -18
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/markdown_loader.py +17 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/shell_tool.py +22 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/utils/session_title_generator.py +4 -4
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/GETTING_STARTED.md +3 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/README.md +12 -12
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4/agent_framework/web}/docs/TOOLS_AND_MCP_GUIDE.md +287 -14
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4/agent_framework/web}/docs/configuration.md +10 -10
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4/agent_framework/web/docs}/examples/agent_with_memory_graphiti.py +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/helper_agent.py +3 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/modern_ui.html +526 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/server.py +46 -2
- agent_framework_lib-0.6.3.post4/agent_framework/web/skills_router.py +389 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4/agent_framework_lib.egg-info}/PKG-INFO +13 -13
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework_lib.egg-info/SOURCES.txt +30 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/ARCHITECTURE_DIAGRAM.md +3 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/GETTING_STARTED.md +3 -3
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/HISTORY_MESSAGE_FORMAT.md +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/MULTIMODAL_TOOLS_GUIDE.md +2 -2
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/SKILLS_AND_SUBAGENTS_ANALYSIS.md +73 -51
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/STREAMING_EVENTS_FRONTEND.md +1 -1
- {agent_framework_lib-0.6.3.post2/agent_framework/web → agent_framework_lib-0.6.3.post4}/docs/TOOLS_AND_MCP_GUIDE.md +287 -14
- {agent_framework_lib-0.6.3.post2/agent_framework/web → agent_framework_lib-0.6.3.post4}/docs/configuration.md +10 -10
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/framework_audit_remarques.md +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_context_budget_test.py +1 -1
- {agent_framework_lib-0.6.3.post2/agent_framework/web/docs → agent_framework_lib-0.6.3.post4}/examples/agent_with_memory_graphiti.py +1 -1
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/pyproject.toml +13 -10
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/ARCHITECTURE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/LICENSE +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/MANIFEST.in +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/base.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/models.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/providers/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/a2a/providers/postgres_provider.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/capabilities/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/capabilities/resolver.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/chart_generation/llm_refinement_loop.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/activity_formatter.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/agent_interface.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/agent_provider.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/base_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/context_budget.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/context_summarizer.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/elasticsearch_config_provider.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/implementation_validator.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/knowledge_state.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/loop_detector.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/model_clients.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/model_router.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/models.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/provider_calibration.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/rich_content_prompt_unsused_to_be_deleted.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/state_manager.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/core/streaming_parts_accumulator.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/implementations/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/implementations/llamaindex_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/implementations/microsoft_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/agent_mixin.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/base.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/config.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/manager.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/personalization.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/providers/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/providers/graphiti_provider.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/providers/memori_provider.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/memory/tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/api_timing_tracker.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/error_handling.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/error_logging.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/metrics_aggregator.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/metrics_config.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/observability_manager.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/otel_logging_handler.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/otel_setup.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/performance_monitor.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/progress_tracker.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/resource_manager.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/timing_tracker.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/monitoring/tracing_context.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/processing/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/processing/ai_content_management.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/processing/markdown_converter.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/processing/multimodal_integration.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/processing/rich_content_validation.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/py.typed +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/session/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/session/elasticsearch_session_storage.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/session/session_storage.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/chart_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/drawio_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/excel_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/file_access_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/file_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/form_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/image_display_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/mermaid_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/multimodal_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/optionsblock_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/pdf_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/pdf_with_images_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/table_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/unified_pdf_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/builtin/web_search_skill.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/skills/tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/storage/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/storage/file_storages.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/storage/file_system_management.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/storage/storage_optimizer.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/subagents/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/subagents/spawn_tool.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/activity_callback.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/adaptive_pdf_css.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/base.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/chart_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/drawio_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/excel_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/file_access_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/file_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/html_content_analyzer.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/mermaid_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/multimodal_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/pdf_image_scaler.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/pdf_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/pdf_with_images_tool.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/sizing_config.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/tabledata_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/unified_pdf_tool.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/web_fetch_tool.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/tools/web_search_tools.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/utils/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/utils/path_utils.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/utils/post_install.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/utils/source_detector.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/utils/special_blocks.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/__init__.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/admin_auth.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/admin_models.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/admin_router.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/admin_services.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/api_timing_middleware.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/Dockerfile +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/api-reference.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/docker-compose.yml +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/documentation_generator.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/helper_ui.html +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/otel_tracing_middleware.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/web/test_app.html +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework_lib.egg-info/entry_points.txt +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework_lib.egg-info/requires.txt +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework_lib.egg-info/top_level.txt +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/A2A_GUIDE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/CREATING_AGENTS.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/DOCKER_SETUP.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/FILE_STORAGE_GUIDE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/MEMORY_INSTALLATION.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/OBSERVABILITY_GUIDE.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/PYPI_PUBLISHING.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/QA_STREAMING_LATENCY.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/api-reference.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/docs/installation-guide.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/README.md +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_example_multi_skills.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_exemple_test.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_training_with_apo.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_with_custom_tools_file_storage.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_with_file_storage.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_with_mcp.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_with_memory_hybrid.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_with_memory_simple.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/agent_with_personalization.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/biagenttest.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/custom_framework_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/dependencies/docker-compose.yaml +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/pyproject.toml +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/simple_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/examples/skills_demo_agent.py +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/setup.cfg +0 -0
- {agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-framework-lib
|
|
3
|
-
Version: 0.6.3.
|
|
3
|
+
Version: 0.6.3.post4
|
|
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>
|
|
@@ -373,13 +373,13 @@ ANTHROPIC_API_KEY=sk-ant-your-anthropic-key
|
|
|
373
373
|
GEMINI_API_KEY=your-gemini-key
|
|
374
374
|
|
|
375
375
|
# Model Configuration
|
|
376
|
-
DEFAULT_MODEL=gpt-5-mini
|
|
376
|
+
DEFAULT_MODEL=gpt-5.4-mini
|
|
377
377
|
|
|
378
378
|
# Multi-Model Routing (Auto Mode)
|
|
379
379
|
DEFAULT_MODEL_MODE=auto # "auto" or specific model name
|
|
380
|
-
AUTO_CLASSIFIER_MODEL=gpt-5-nano # Model for complexity classification
|
|
381
|
-
PREFERRED_LIGHT_MODELS=gpt-5-nano,claude-haiku-4-5-20251001
|
|
382
|
-
PREFERRED_STANDARD_MODELS=gpt-5-mini
|
|
380
|
+
AUTO_CLASSIFIER_MODEL=gpt-5.4-nano # Model for complexity classification
|
|
381
|
+
PREFERRED_LIGHT_MODELS=gpt-5.4-nano,claude-haiku-4-5-20251001
|
|
382
|
+
PREFERRED_STANDARD_MODELS=gpt-5.4-mini
|
|
383
383
|
PREFERRED_ADVANCED_MODELS=gpt-5.2,claude-opus-4-6
|
|
384
384
|
|
|
385
385
|
# Session Storage (optional)
|
|
@@ -446,8 +446,8 @@ When `DEFAULT_MODEL_MODE=auto`, the system analyzes each query and routes it to
|
|
|
446
446
|
|
|
447
447
|
| Tier | Icon | Use Case | Example Models |
|
|
448
448
|
|------|------|----------|----------------|
|
|
449
|
-
| **Light** | 💨 | Simple queries, greetings, basic info | gpt-5-nano, claude-haiku-4-5 |
|
|
450
|
-
| **Standard** | ⚖️ | Typical questions, explanations | gpt-5-mini, claude-sonnet-4-6 |
|
|
449
|
+
| **Light** | 💨 | Simple queries, greetings, basic info | gpt-5.4-nano, claude-haiku-4-5 |
|
|
450
|
+
| **Standard** | ⚖️ | Typical questions, explanations | gpt-5.4-mini, claude-sonnet-4-6 |
|
|
451
451
|
| **Advanced** | 🧠 | Complex analysis, creative tasks | gpt-5.2, claude-opus-4-6 |
|
|
452
452
|
|
|
453
453
|
**Benefits:**
|
|
@@ -469,11 +469,11 @@ Users can also select a specific model from the UI dropdown:
|
|
|
469
469
|
DEFAULT_MODEL_MODE=auto
|
|
470
470
|
|
|
471
471
|
# Model used for complexity classification (should be fast and cheap)
|
|
472
|
-
AUTO_CLASSIFIER_MODEL=gpt-5-nano
|
|
472
|
+
AUTO_CLASSIFIER_MODEL=gpt-5.4-nano
|
|
473
473
|
|
|
474
474
|
# Preferred models per tier (comma-separated, in order of preference)
|
|
475
|
-
PREFERRED_LIGHT_MODELS=gpt-5-nano,claude-haiku-4-5-20251001,gemini-2.5-flash-lite
|
|
476
|
-
PREFERRED_STANDARD_MODELS=gpt-5-mini,gemini-2.5-flash
|
|
475
|
+
PREFERRED_LIGHT_MODELS=gpt-5.4-nano,claude-haiku-4-5-20251001,gemini-2.5-flash-lite
|
|
476
|
+
PREFERRED_STANDARD_MODELS=gpt-5.4-mini,gemini-2.5-flash
|
|
477
477
|
PREFERRED_ADVANCED_MODELS=gpt-5.2,claude-opus-4-6,gemini-2.5-pro
|
|
478
478
|
```
|
|
479
479
|
|
|
@@ -486,12 +486,12 @@ curl http://localhost:8000/api/models
|
|
|
486
486
|
# Response
|
|
487
487
|
{
|
|
488
488
|
"models_by_tier": {
|
|
489
|
-
"light": [{"id": "gpt-5-nano", "provider": "openai", "available": true}, ...],
|
|
489
|
+
"light": [{"id": "gpt-5.4-nano", "provider": "openai", "available": true}, ...],
|
|
490
490
|
"standard": [...],
|
|
491
491
|
"advanced": [...]
|
|
492
492
|
},
|
|
493
493
|
"default_mode": "auto",
|
|
494
|
-
"classifier_model": "gpt-5-nano"
|
|
494
|
+
"classifier_model": "gpt-5.4-nano"
|
|
495
495
|
}
|
|
496
496
|
```
|
|
497
497
|
|
|
@@ -520,7 +520,7 @@ class MyAgent(LlamaIndexAgent):
|
|
|
520
520
|
)
|
|
521
521
|
# Default model config (can be overridden per session)
|
|
522
522
|
self.default_temperature = 0.7
|
|
523
|
-
self.default_model = "gpt-5-mini"
|
|
523
|
+
self.default_model = "gpt-5.4-mini"
|
|
524
524
|
```
|
|
525
525
|
|
|
526
526
|
**Runtime Configuration:**
|
|
@@ -227,13 +227,13 @@ ANTHROPIC_API_KEY=sk-ant-your-anthropic-key
|
|
|
227
227
|
GEMINI_API_KEY=your-gemini-key
|
|
228
228
|
|
|
229
229
|
# Model Configuration
|
|
230
|
-
DEFAULT_MODEL=gpt-5-mini
|
|
230
|
+
DEFAULT_MODEL=gpt-5.4-mini
|
|
231
231
|
|
|
232
232
|
# Multi-Model Routing (Auto Mode)
|
|
233
233
|
DEFAULT_MODEL_MODE=auto # "auto" or specific model name
|
|
234
|
-
AUTO_CLASSIFIER_MODEL=gpt-5-nano # Model for complexity classification
|
|
235
|
-
PREFERRED_LIGHT_MODELS=gpt-5-nano,claude-haiku-4-5-20251001
|
|
236
|
-
PREFERRED_STANDARD_MODELS=gpt-5-mini
|
|
234
|
+
AUTO_CLASSIFIER_MODEL=gpt-5.4-nano # Model for complexity classification
|
|
235
|
+
PREFERRED_LIGHT_MODELS=gpt-5.4-nano,claude-haiku-4-5-20251001
|
|
236
|
+
PREFERRED_STANDARD_MODELS=gpt-5.4-mini
|
|
237
237
|
PREFERRED_ADVANCED_MODELS=gpt-5.2,claude-opus-4-6
|
|
238
238
|
|
|
239
239
|
# Session Storage (optional)
|
|
@@ -300,8 +300,8 @@ When `DEFAULT_MODEL_MODE=auto`, the system analyzes each query and routes it to
|
|
|
300
300
|
|
|
301
301
|
| Tier | Icon | Use Case | Example Models |
|
|
302
302
|
|------|------|----------|----------------|
|
|
303
|
-
| **Light** | 💨 | Simple queries, greetings, basic info | gpt-5-nano, claude-haiku-4-5 |
|
|
304
|
-
| **Standard** | ⚖️ | Typical questions, explanations | gpt-5-mini, claude-sonnet-4-6 |
|
|
303
|
+
| **Light** | 💨 | Simple queries, greetings, basic info | gpt-5.4-nano, claude-haiku-4-5 |
|
|
304
|
+
| **Standard** | ⚖️ | Typical questions, explanations | gpt-5.4-mini, claude-sonnet-4-6 |
|
|
305
305
|
| **Advanced** | 🧠 | Complex analysis, creative tasks | gpt-5.2, claude-opus-4-6 |
|
|
306
306
|
|
|
307
307
|
**Benefits:**
|
|
@@ -323,11 +323,11 @@ Users can also select a specific model from the UI dropdown:
|
|
|
323
323
|
DEFAULT_MODEL_MODE=auto
|
|
324
324
|
|
|
325
325
|
# Model used for complexity classification (should be fast and cheap)
|
|
326
|
-
AUTO_CLASSIFIER_MODEL=gpt-5-nano
|
|
326
|
+
AUTO_CLASSIFIER_MODEL=gpt-5.4-nano
|
|
327
327
|
|
|
328
328
|
# Preferred models per tier (comma-separated, in order of preference)
|
|
329
|
-
PREFERRED_LIGHT_MODELS=gpt-5-nano,claude-haiku-4-5-20251001,gemini-2.5-flash-lite
|
|
330
|
-
PREFERRED_STANDARD_MODELS=gpt-5-mini,gemini-2.5-flash
|
|
329
|
+
PREFERRED_LIGHT_MODELS=gpt-5.4-nano,claude-haiku-4-5-20251001,gemini-2.5-flash-lite
|
|
330
|
+
PREFERRED_STANDARD_MODELS=gpt-5.4-mini,gemini-2.5-flash
|
|
331
331
|
PREFERRED_ADVANCED_MODELS=gpt-5.2,claude-opus-4-6,gemini-2.5-pro
|
|
332
332
|
```
|
|
333
333
|
|
|
@@ -340,12 +340,12 @@ curl http://localhost:8000/api/models
|
|
|
340
340
|
# Response
|
|
341
341
|
{
|
|
342
342
|
"models_by_tier": {
|
|
343
|
-
"light": [{"id": "gpt-5-nano", "provider": "openai", "available": true}, ...],
|
|
343
|
+
"light": [{"id": "gpt-5.4-nano", "provider": "openai", "available": true}, ...],
|
|
344
344
|
"standard": [...],
|
|
345
345
|
"advanced": [...]
|
|
346
346
|
},
|
|
347
347
|
"default_mode": "auto",
|
|
348
|
-
"classifier_model": "gpt-5-nano"
|
|
348
|
+
"classifier_model": "gpt-5.4-nano"
|
|
349
349
|
}
|
|
350
350
|
```
|
|
351
351
|
|
|
@@ -374,7 +374,7 @@ class MyAgent(LlamaIndexAgent):
|
|
|
374
374
|
)
|
|
375
375
|
# Default model config (can be overridden per session)
|
|
376
376
|
self.default_temperature = 0.7
|
|
377
|
-
self.default_model = "gpt-5-mini"
|
|
377
|
+
self.default_model = "gpt-5.4-mini"
|
|
378
378
|
```
|
|
379
379
|
|
|
380
380
|
**Runtime Configuration:**
|
{agent_framework_lib-0.6.3.post2 → agent_framework_lib-0.6.3.post4}/agent_framework/__init__.py
RENAMED
|
@@ -88,7 +88,7 @@ def _auto_setup_dependencies() -> None:
|
|
|
88
88
|
# Track if auto-setup has been done
|
|
89
89
|
_AUTO_SETUP_DONE = False
|
|
90
90
|
|
|
91
|
-
__version__ = "0.6.
|
|
91
|
+
__version__ = "0.6.3post3"
|
|
92
92
|
__author__ = "Cinco AI Team"
|
|
93
93
|
__license__ = "MIT"
|
|
94
94
|
__email__ = "sebastian@cinco.ai"
|
|
@@ -345,6 +345,11 @@ def create_basic_agent_server(
|
|
|
345
345
|
|
|
346
346
|
logger.info(f"[create_basic_agent_server] Starting server for {agent_class.__name__} on {host}:{port}")
|
|
347
347
|
logger.info(f"[create_basic_agent_server] Reload: {reload}")
|
|
348
|
+
|
|
349
|
+
# Ensure AGENT_HOST and AGENT_PORT are in the environment so that
|
|
350
|
+
# subprocesses (e.g. skill scripts via ShellTool) can reach this server.
|
|
351
|
+
os.environ["AGENT_HOST"] = host
|
|
352
|
+
os.environ["AGENT_PORT"] = str(port)
|
|
348
353
|
|
|
349
354
|
# When reload=True, uvicorn requires an import string, not the app object directly
|
|
350
355
|
if reload:
|
|
@@ -14,7 +14,7 @@ This module provides:
|
|
|
14
14
|
Environment Variables:
|
|
15
15
|
- OPENAI_API_KEY: OpenAI API key
|
|
16
16
|
- GEMINI_API_KEY: Google Gemini API key
|
|
17
|
-
- DEFAULT_MODEL: Default model to use (default: "gpt-5-mini")
|
|
17
|
+
- DEFAULT_MODEL: Default model to use (default: "gpt-5.4-mini")
|
|
18
18
|
- OPENAI_MODELS: Comma-separated list of OpenAI model names
|
|
19
19
|
- GEMINI_MODELS: Comma-separated list of Gemini model names
|
|
20
20
|
- FALLBACK_PROVIDER: Provider to use when model provider is unknown
|
|
@@ -27,7 +27,7 @@ Example:
|
|
|
27
27
|
from agent_framework.model_config import model_config
|
|
28
28
|
|
|
29
29
|
# Get provider for a model
|
|
30
|
-
provider = model_config.get_provider("gpt-5-mini")
|
|
30
|
+
provider = model_config.get_provider("gpt-5.4-mini")
|
|
31
31
|
|
|
32
32
|
# Get API key for a provider
|
|
33
33
|
api_key = model_config.get_api_key(provider)
|
|
@@ -383,7 +383,7 @@ class ModelConfigManager:
|
|
|
383
383
|
Get a flat list of all models with provider info and availability status.
|
|
384
384
|
|
|
385
385
|
Returns a list of dictionaries, each containing:
|
|
386
|
-
- id: The model identifier (e.g., "gpt-5-minio-mini")
|
|
386
|
+
- id: The model identifier (e.g., "gpt-5.4-minio-mini")
|
|
387
387
|
- provider: The provider name (e.g., "openai")
|
|
388
388
|
- available: Boolean indicating if the model's API key is configured
|
|
389
389
|
|
|
@@ -394,7 +394,7 @@ class ModelConfigManager:
|
|
|
394
394
|
```python
|
|
395
395
|
models = model_config.get_all_available_models()
|
|
396
396
|
# [
|
|
397
|
-
# {"id": "gpt-5-minio", "provider": "openai", "available": True},
|
|
397
|
+
# {"id": "gpt-5.4-minio", "provider": "openai", "available": True},
|
|
398
398
|
# {"id": "claude-3-opus", "provider": "anthropic", "available": False},
|
|
399
399
|
# ...
|
|
400
400
|
# ]
|
|
@@ -500,7 +500,7 @@ class ModelConfigManager:
|
|
|
500
500
|
```python
|
|
501
501
|
model_config.register_agent_config("my-agent", {
|
|
502
502
|
"system_prompt": "You are a helpful assistant.",
|
|
503
|
-
"model_name": "gpt-5-minio",
|
|
503
|
+
"model_name": "gpt-5.4-minio",
|
|
504
504
|
"model_config": {"temperature": 0.7, "max_tokens": 50000}
|
|
505
505
|
})
|
|
506
506
|
```
|
|
@@ -29,6 +29,11 @@ logger = logging.getLogger(__name__)
|
|
|
29
29
|
|
|
30
30
|
TRUNCATION_MARKER = "\n\n[... contenu tronqué ...]\n\n"
|
|
31
31
|
|
|
32
|
+
# OpenAI enforces a 10 485 760 character limit per message content.
|
|
33
|
+
# We use a conservative 8M limit to leave headroom for JSON serialization
|
|
34
|
+
# overhead, tool_call metadata, and other wrapper text added by the SDK.
|
|
35
|
+
MAX_MESSAGE_CONTENT_CHARS = 8_000_000
|
|
36
|
+
|
|
32
37
|
|
|
33
38
|
class ScratchpadCompressor:
|
|
34
39
|
"""Compresse le scratchpad de la boucle d'outils pour respecter le budget."""
|
|
@@ -106,22 +111,100 @@ class ScratchpadCompressor:
|
|
|
106
111
|
# Pas de paire trouvée, tout est considéré comme dernière paire
|
|
107
112
|
return [], list(scratchpad)
|
|
108
113
|
|
|
114
|
+
@staticmethod
|
|
115
|
+
def _flatten_message_content(message: ChatMessage) -> str:
|
|
116
|
+
"""Aplatit tous les blocks d'un message en une seule chaîne de texte.
|
|
117
|
+
|
|
118
|
+
LlamaIndex stocke le contenu des messages dans des blocks typés
|
|
119
|
+
(TextBlock, ToolCallBlock, ToolResultBlock, etc.). La propriété
|
|
120
|
+
.content ne retourne que le texte des TextBlock. Cette méthode
|
|
121
|
+
sérialise TOUS les blocks pour que la troncature opère sur le
|
|
122
|
+
contenu réel envoyé à l'API.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
message: ChatMessage à aplatir.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
Texte complet incluant tous les blocks.
|
|
129
|
+
"""
|
|
130
|
+
if not hasattr(message, "blocks") or not message.blocks:
|
|
131
|
+
return message.content or ""
|
|
132
|
+
|
|
133
|
+
parts: list[str] = []
|
|
134
|
+
for block in message.blocks:
|
|
135
|
+
block_type = type(block).__name__
|
|
136
|
+
if hasattr(block, "text"):
|
|
137
|
+
parts.append(block.text or "")
|
|
138
|
+
elif hasattr(block, "tool_kwargs"):
|
|
139
|
+
tool_name = getattr(block, "tool_name", "") or ""
|
|
140
|
+
kwargs = getattr(block, "tool_kwargs", None)
|
|
141
|
+
if kwargs:
|
|
142
|
+
import json as _json
|
|
143
|
+
try:
|
|
144
|
+
kwargs_str = _json.dumps(kwargs) if isinstance(kwargs, dict) else str(kwargs)
|
|
145
|
+
except (TypeError, ValueError):
|
|
146
|
+
kwargs_str = str(kwargs)
|
|
147
|
+
parts.append(f"[tool_call: {tool_name}({kwargs_str})]")
|
|
148
|
+
else:
|
|
149
|
+
parts.append(f"[tool_call: {tool_name}()]")
|
|
150
|
+
elif hasattr(block, "tool_output"):
|
|
151
|
+
output = str(getattr(block, "tool_output", "") or "")
|
|
152
|
+
parts.append(output)
|
|
153
|
+
elif block_type == "ImageBlock":
|
|
154
|
+
parts.append("[image]")
|
|
155
|
+
else:
|
|
156
|
+
try:
|
|
157
|
+
block_str = str(block)
|
|
158
|
+
if len(block_str) > 10:
|
|
159
|
+
parts.append(block_str)
|
|
160
|
+
except Exception:
|
|
161
|
+
parts.append("[block non sérialisable]")
|
|
162
|
+
|
|
163
|
+
return "\n".join(parts)
|
|
164
|
+
|
|
109
165
|
def _truncate_single_result(
|
|
110
166
|
self, message: ChatMessage, target_tokens: int
|
|
111
167
|
) -> ChatMessage:
|
|
112
168
|
"""Tronque le contenu d'un tool_result en gardant début + marqueur + fin.
|
|
113
169
|
|
|
170
|
+
Aplatit d'abord tous les blocks en texte brut pour que la troncature
|
|
171
|
+
opère sur le contenu réel (pas seulement .content/TextBlock).
|
|
172
|
+
|
|
173
|
+
Applique deux niveaux de troncature :
|
|
174
|
+
1. Par tokens (budget du context window)
|
|
175
|
+
2. Par caractères bruts (limite API OpenAI de 10M chars par message)
|
|
176
|
+
|
|
114
177
|
Args:
|
|
115
178
|
message: Message tool_result à tronquer.
|
|
116
179
|
target_tokens: Nombre cible de tokens pour le message tronqué.
|
|
117
180
|
|
|
118
181
|
Returns:
|
|
119
|
-
Nouveau ChatMessage avec le contenu
|
|
182
|
+
Nouveau ChatMessage avec le contenu tronqué (blocks nettoyés).
|
|
120
183
|
"""
|
|
121
|
-
content = message
|
|
184
|
+
content = self._flatten_message_content(message)
|
|
185
|
+
|
|
186
|
+
# Garde-fou caractères bruts : tronquer d'abord si on dépasse la
|
|
187
|
+
# limite API (10M chars) pour éviter un 400 même si le budget
|
|
188
|
+
# tokens semble OK.
|
|
189
|
+
content = self._enforce_char_limit(content)
|
|
190
|
+
|
|
122
191
|
current_tokens = self._token_counter.count_tokens(content).count
|
|
123
192
|
|
|
193
|
+
# Nettoyer additional_kwargs pour ne pas conserver les blocks originaux
|
|
194
|
+
# qui seraient re-sérialisés par LlamaIndex en plus du content tronqué.
|
|
195
|
+
clean_kwargs = {
|
|
196
|
+
k: v
|
|
197
|
+
for k, v in (message.additional_kwargs or {}).items()
|
|
198
|
+
if k not in ("tool_calls",)
|
|
199
|
+
}
|
|
200
|
+
|
|
124
201
|
if current_tokens <= target_tokens or target_tokens <= 0:
|
|
202
|
+
if content != (message.content or ""):
|
|
203
|
+
return ChatMessage(
|
|
204
|
+
role=message.role,
|
|
205
|
+
content=content,
|
|
206
|
+
additional_kwargs=clean_kwargs,
|
|
207
|
+
)
|
|
125
208
|
return message
|
|
126
209
|
|
|
127
210
|
# Réserver des tokens pour le marqueur de troncature
|
|
@@ -142,6 +225,12 @@ class ScratchpadCompressor:
|
|
|
142
225
|
end_chars = max(0, int(end_tokens * chars_per_token))
|
|
143
226
|
|
|
144
227
|
if begin_chars + end_chars >= len(content):
|
|
228
|
+
if content != (message.content or ""):
|
|
229
|
+
return ChatMessage(
|
|
230
|
+
role=message.role,
|
|
231
|
+
content=content,
|
|
232
|
+
additional_kwargs=clean_kwargs,
|
|
233
|
+
)
|
|
145
234
|
return message
|
|
146
235
|
|
|
147
236
|
begin_part = content[:begin_chars]
|
|
@@ -151,9 +240,40 @@ class ScratchpadCompressor:
|
|
|
151
240
|
return ChatMessage(
|
|
152
241
|
role=message.role,
|
|
153
242
|
content=truncated_content,
|
|
154
|
-
additional_kwargs=
|
|
243
|
+
additional_kwargs=clean_kwargs,
|
|
155
244
|
)
|
|
156
245
|
|
|
246
|
+
@staticmethod
|
|
247
|
+
def _enforce_char_limit(content: str, limit: int = MAX_MESSAGE_CONTENT_CHARS) -> str:
|
|
248
|
+
"""Tronque le contenu si sa longueur dépasse la limite en caractères.
|
|
249
|
+
|
|
250
|
+
Garde 60% du début et 40% de la fin pour préserver le contexte.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
content: Texte brut du message.
|
|
254
|
+
limit: Limite en caractères (défaut : MAX_MESSAGE_CONTENT_CHARS).
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
Contenu tronqué si nécessaire, sinon inchangé.
|
|
258
|
+
"""
|
|
259
|
+
if len(content) <= limit:
|
|
260
|
+
return content
|
|
261
|
+
|
|
262
|
+
marker_len = len(TRUNCATION_MARKER)
|
|
263
|
+
available = max(0, limit - marker_len)
|
|
264
|
+
begin_chars = int(available * 0.6)
|
|
265
|
+
end_chars = available - begin_chars
|
|
266
|
+
|
|
267
|
+
logger.warning(
|
|
268
|
+
"Message content exceeds char limit (%d > %d), truncating",
|
|
269
|
+
len(content),
|
|
270
|
+
limit,
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
begin_part = content[:begin_chars]
|
|
274
|
+
end_part = content[-end_chars:] if end_chars > 0 else ""
|
|
275
|
+
return begin_part + TRUNCATION_MARKER + end_part
|
|
276
|
+
|
|
157
277
|
async def compress(
|
|
158
278
|
self,
|
|
159
279
|
scratchpad: list[ChatMessage],
|
|
@@ -316,7 +436,7 @@ class ScratchpadCompressor:
|
|
|
316
436
|
result = list(old_entries)
|
|
317
437
|
while result and total > target_tokens:
|
|
318
438
|
removed = result.pop(0)
|
|
319
|
-
total -= self.
|
|
439
|
+
total -= self._count_tokens([removed])
|
|
320
440
|
return result
|
|
321
441
|
|
|
322
442
|
def _truncate_last_pair(
|
|
@@ -326,6 +446,9 @@ class ScratchpadCompressor:
|
|
|
326
446
|
) -> list[ChatMessage]:
|
|
327
447
|
"""Tronque le tool_result dans la dernière paire pour respecter le budget.
|
|
328
448
|
|
|
449
|
+
Utilise _count_tokens (blocks-aware) pour compter les tokens du
|
|
450
|
+
message ASSISTANT, pas seulement .content.
|
|
451
|
+
|
|
329
452
|
Args:
|
|
330
453
|
last_pair: Dernière paire de messages (tool_call + tool_result).
|
|
331
454
|
available_tokens: Tokens disponibles pour toute la paire.
|
|
@@ -341,7 +464,7 @@ class ScratchpadCompressor:
|
|
|
341
464
|
remaining = max(0, available_tokens - tokens_used)
|
|
342
465
|
result.append(self._truncate_single_result(msg, remaining))
|
|
343
466
|
else:
|
|
344
|
-
tokens_used += self.
|
|
467
|
+
tokens_used += self._count_tokens([msg])
|
|
345
468
|
result.append(msg)
|
|
346
469
|
|
|
347
470
|
return result
|
|
@@ -279,6 +279,16 @@ DEFAULT_TOOL_DISPLAY: dict[str, StepDisplayInfo] = {
|
|
|
279
279
|
category="file",
|
|
280
280
|
),
|
|
281
281
|
# ==========================================================================
|
|
282
|
+
# Shell & Script Execution Tools
|
|
283
|
+
# ==========================================================================
|
|
284
|
+
"shell_exec": StepDisplayInfo(
|
|
285
|
+
id="shell_exec",
|
|
286
|
+
friendly_name="🐚 Exécution du script",
|
|
287
|
+
description="Exécution d'un script ou d'une commande shell",
|
|
288
|
+
icon="🐚",
|
|
289
|
+
category="shell",
|
|
290
|
+
),
|
|
291
|
+
# ==========================================================================
|
|
282
292
|
# Code Execution Tools
|
|
283
293
|
# ==========================================================================
|
|
284
294
|
"execute_code": StepDisplayInfo(
|
|
@@ -20,6 +20,7 @@ from llama_index.core.workflow import Context
|
|
|
20
20
|
|
|
21
21
|
from agent_framework.core.knowledge_state import ToolCallSignature
|
|
22
22
|
from agent_framework.core.loop_detector import LoopDetector
|
|
23
|
+
from agent_framework.core.scratchpad_compressor import MAX_MESSAGE_CONTENT_CHARS
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
25
26
|
from agent_framework.core.context_budget import ContextBudgetManager
|
|
@@ -176,14 +177,66 @@ class BudgetAwareFunctionAgent(FunctionAgent):
|
|
|
176
177
|
"Compressing scratchpad: usage %.1f%% >= 80%% threshold",
|
|
177
178
|
usage_percent,
|
|
178
179
|
)
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
180
|
+
|
|
181
|
+
# Boucle de compression : re-vérifier après chaque passe
|
|
182
|
+
# car la première compression peut ne pas suffire (ex: blocks
|
|
183
|
+
# non aplatis, écart de tokenisation).
|
|
184
|
+
max_compression_passes = 3
|
|
185
|
+
for compression_pass in range(max_compression_passes):
|
|
186
|
+
compressed_scratchpad = await self._scratchpad_compressor.compress(
|
|
187
|
+
scratchpad=scratchpad,
|
|
188
|
+
llm_input=llm_input,
|
|
189
|
+
context_window=context_window,
|
|
190
|
+
sacred_zone_tokens=sacred_zone_tokens,
|
|
191
|
+
model_name=getattr(self.llm, "model", None),
|
|
192
|
+
)
|
|
193
|
+
await ctx.store.set(self.scratchpad_key, compressed_scratchpad)
|
|
194
|
+
|
|
195
|
+
# Recalculer le total après compression
|
|
196
|
+
new_scratchpad_tokens = self._count_total_tokens([], compressed_scratchpad)
|
|
197
|
+
new_total = sacred_zone_tokens + llm_input_tokens + new_scratchpad_tokens
|
|
198
|
+
new_usage = new_total / context_window * 100 if context_window > 0 else 0.0
|
|
199
|
+
|
|
200
|
+
logger.info(
|
|
201
|
+
"Post-compression pass %d: %d/%d tokens (%.1f%%), scratchpad=%d",
|
|
202
|
+
compression_pass + 1,
|
|
203
|
+
new_total,
|
|
204
|
+
context_window,
|
|
205
|
+
new_usage,
|
|
206
|
+
new_scratchpad_tokens,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
if new_usage < 80:
|
|
210
|
+
break
|
|
211
|
+
|
|
212
|
+
# Préparer la prochaine passe avec le scratchpad compressé
|
|
213
|
+
scratchpad = compressed_scratchpad
|
|
214
|
+
|
|
215
|
+
if compression_pass == max_compression_passes - 1:
|
|
216
|
+
logger.error(
|
|
217
|
+
"Scratchpad still at %.1f%% after %d compression passes",
|
|
218
|
+
new_usage,
|
|
219
|
+
max_compression_passes,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# Garde-fou caractères bruts : même après compression en tokens,
|
|
223
|
+
# un message peut dépasser la limite API (10M chars). On tronque
|
|
224
|
+
# chaque message du scratchpad qui dépasse avant l'appel LLM.
|
|
225
|
+
if self._scratchpad_compressor:
|
|
226
|
+
scratchpad = await ctx.store.get(self.scratchpad_key, default=[])
|
|
227
|
+
patched = False
|
|
228
|
+
for i, msg in enumerate(scratchpad):
|
|
229
|
+
content = msg.content or ""
|
|
230
|
+
if len(content) > MAX_MESSAGE_CONTENT_CHARS:
|
|
231
|
+
from agent_framework.core.scratchpad_compressor import ScratchpadCompressor
|
|
232
|
+
scratchpad[i] = ChatMessage(
|
|
233
|
+
role=msg.role,
|
|
234
|
+
content=ScratchpadCompressor._enforce_char_limit(content),
|
|
235
|
+
additional_kwargs=msg.additional_kwargs,
|
|
236
|
+
)
|
|
237
|
+
patched = True
|
|
238
|
+
if patched:
|
|
239
|
+
await ctx.store.set(self.scratchpad_key, scratchpad)
|
|
187
240
|
|
|
188
241
|
return await super().take_step(ctx, llm_input, tools, memory)
|
|
189
242
|
|
|
@@ -77,7 +77,7 @@ def get_tracer() -> Any:
|
|
|
77
77
|
tracer = get_tracer()
|
|
78
78
|
if tracer:
|
|
79
79
|
with tracer.start_as_current_span("llm.chat") as span:
|
|
80
|
-
span.set_attribute("model", "gpt-5")
|
|
80
|
+
span.set_attribute("model", "gpt-5.4")
|
|
81
81
|
```
|
|
82
82
|
"""
|
|
83
83
|
global _tracer
|
|
@@ -106,7 +106,7 @@ def get_meter() -> Any:
|
|
|
106
106
|
meter = get_meter()
|
|
107
107
|
if meter:
|
|
108
108
|
counter = meter.create_counter("llm.tokens.total")
|
|
109
|
-
counter.add(100, {"model": "gpt-5"})
|
|
109
|
+
counter.add(100, {"model": "gpt-5.4"})
|
|
110
110
|
```
|
|
111
111
|
"""
|
|
112
112
|
global _meter
|
|
@@ -147,7 +147,7 @@ class OTELInstrumentor:
|
|
|
147
147
|
|
|
148
148
|
with instrumentor.trace_llm_call(
|
|
149
149
|
operation_name="llm.chat",
|
|
150
|
-
model_name="gpt-5-mini",
|
|
150
|
+
model_name="gpt-5.4-mini",
|
|
151
151
|
session_id="session-123"
|
|
152
152
|
) as span:
|
|
153
153
|
# Perform LLM call
|
|
@@ -56,7 +56,7 @@ class TokenCounter:
|
|
|
56
56
|
|
|
57
57
|
Example:
|
|
58
58
|
```python
|
|
59
|
-
counter = TokenCounter(model_name="gpt-5-mini")
|
|
59
|
+
counter = TokenCounter(model_name="gpt-5.4-mini")
|
|
60
60
|
result = counter.count_tokens("Hello, world!")
|
|
61
61
|
print(f"Tokens: {result.count}, Encoding: {result.encoding_name}")
|
|
62
62
|
```
|
|
@@ -215,7 +215,7 @@ class TokenCounter:
|
|
|
215
215
|
|
|
216
216
|
Example:
|
|
217
217
|
```python
|
|
218
|
-
counter = TokenCounter(model_name="gpt-5-mini")
|
|
218
|
+
counter = TokenCounter(model_name="gpt-5.4-mini")
|
|
219
219
|
result = counter.count_tokens("Hello, world!")
|
|
220
220
|
print(f"Token count: {result.count}")
|
|
221
221
|
```
|
|
@@ -245,7 +245,7 @@ class TokenCounter:
|
|
|
245
245
|
|
|
246
246
|
Example:
|
|
247
247
|
```python
|
|
248
|
-
counter = TokenCounter(model_name="gpt-5-mini")
|
|
248
|
+
counter = TokenCounter(model_name="gpt-5.4-mini")
|
|
249
249
|
messages = [
|
|
250
250
|
{"role": "system", "content": "You are a helpful assistant."},
|
|
251
251
|
{"role": "user", "content": "Hello!"}
|
|
@@ -127,13 +127,16 @@ class SkillsMixin:
|
|
|
127
127
|
self._skill_registry.unload(name)
|
|
128
128
|
logger.info(f"Unloaded skill '{name}' for agent '{getattr(self, 'agent_id', 'unknown')}'")
|
|
129
129
|
|
|
130
|
-
def register_builtin_skills(self, source: str = "
|
|
130
|
+
def register_builtin_skills(self, source: str = "markdown") -> None:
|
|
131
131
|
"""Register all built-in skills with this agent.
|
|
132
132
|
|
|
133
|
+
After registering builtins, also loads any custom skills found in
|
|
134
|
+
the ``CUSTOM_SKILLS_DIR`` environment variable (default ``./custom_skills``).
|
|
135
|
+
|
|
133
136
|
Args:
|
|
134
137
|
source: Loading strategy passed to ``get_all_builtin_skills``.
|
|
135
|
-
Use ``"
|
|
136
|
-
``"
|
|
138
|
+
Use ``"markdown"`` (default) to load from SKILL.md files or
|
|
139
|
+
``"python"`` for legacy Python factory functions.
|
|
137
140
|
Skills already registered are skipped.
|
|
138
141
|
"""
|
|
139
142
|
from .builtin import get_all_builtin_skills
|
|
@@ -158,6 +161,62 @@ class SkillsMixin:
|
|
|
158
161
|
f"for agent '{getattr(self, 'agent_id', 'unknown')}'"
|
|
159
162
|
)
|
|
160
163
|
|
|
164
|
+
self._register_custom_skills()
|
|
165
|
+
|
|
166
|
+
def _register_custom_skills(self) -> None:
|
|
167
|
+
"""Load custom skills from CUSTOM_SKILLS_DIR into this agent's registry.
|
|
168
|
+
|
|
169
|
+
Each subdirectory containing a SKILL.md is loaded, has native tools
|
|
170
|
+
attached, and is registered with ``source="custom"``. Failures are
|
|
171
|
+
logged as warnings without blocking the remaining skills.
|
|
172
|
+
"""
|
|
173
|
+
import os
|
|
174
|
+
import shutil
|
|
175
|
+
|
|
176
|
+
from .markdown_loader import MarkdownSkillLoader
|
|
177
|
+
from ..tools.shell_tool import ShellTool
|
|
178
|
+
from ..tools.web_fetch_tool import WebFetchTool
|
|
179
|
+
|
|
180
|
+
custom_dir = Path(os.getenv("CUSTOM_SKILLS_DIR", "./custom_skills"))
|
|
181
|
+
if not custom_dir.is_dir():
|
|
182
|
+
return
|
|
183
|
+
|
|
184
|
+
loader = MarkdownSkillLoader()
|
|
185
|
+
count = 0
|
|
186
|
+
|
|
187
|
+
for child in sorted(custom_dir.iterdir()):
|
|
188
|
+
if not child.is_dir():
|
|
189
|
+
continue
|
|
190
|
+
skill_md = child / "SKILL.md"
|
|
191
|
+
if not skill_md.exists():
|
|
192
|
+
continue
|
|
193
|
+
try:
|
|
194
|
+
skill = loader.load_from_file(skill_md)
|
|
195
|
+
if self._skill_registry.get(skill.metadata.name) is not None:
|
|
196
|
+
continue
|
|
197
|
+
existing_types = {type(t) for t in skill.tools}
|
|
198
|
+
if ShellTool not in existing_types:
|
|
199
|
+
skill.tools.append(ShellTool(default_timeout=60))
|
|
200
|
+
if WebFetchTool not in existing_types:
|
|
201
|
+
skill.tools.append(WebFetchTool())
|
|
202
|
+
for binary in skill.metadata.requires_bins:
|
|
203
|
+
if shutil.which(binary) is None:
|
|
204
|
+
logger.warning(
|
|
205
|
+
"Custom skill '%s' requires binary '%s' not found in PATH",
|
|
206
|
+
skill.metadata.name,
|
|
207
|
+
binary,
|
|
208
|
+
)
|
|
209
|
+
self._skill_registry.register(skill, source="custom")
|
|
210
|
+
count += 1
|
|
211
|
+
except Exception as exc:
|
|
212
|
+
logger.warning("Failed to load custom skill from %s: %s", child, exc)
|
|
213
|
+
|
|
214
|
+
if count > 0:
|
|
215
|
+
logger.info(
|
|
216
|
+
f"Registered {count} custom skill(s) "
|
|
217
|
+
f"for agent '{getattr(self, 'agent_id', 'unknown')}'"
|
|
218
|
+
)
|
|
219
|
+
|
|
161
220
|
def get_skill_tools(self) -> list[Callable[..., str]]:
|
|
162
221
|
"""
|
|
163
222
|
Get skill management tools for the agent.
|