10xscale-agentflow-cli 0.3.2.5__tar.gz → 0.3.2.6__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.
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/PKG-INFO +1 -1
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/PKG-INFO +1 -1
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/eval.py +172 -63
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/pyproject.toml +1 -1
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/SOURCES.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/dependency_links.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/entry_points.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/not-zip-safe +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/requires.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/top_level.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/MANIFEST.in +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/README.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow.json +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/api.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/build.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/init.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/skills.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/test.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/version.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/constants.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/config.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/output.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/validation.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/exceptions.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/logger.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/main.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/defaults.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/dev/agentflow.json +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/dev/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/dev/graph/agent.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/.pre-commot-config.yaml +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/agentflow.json +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/auth/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/auth/agent_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/evals/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/evals/user_simulator_eval.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/evals/weather_agents_eval.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/agent.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/nodes/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/nodes/main_node.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/nodes/tool_node.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/state.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/thread_name_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/tools/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/tools/weather_tool.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/utils/tool_decision.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/validators/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/validators/lifecyle.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/validators/manager.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/validators/validators.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/conftest.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/test_agent_eval.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/test_catalog_tools.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/test_graph_nodes.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/SKILL.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/agents-and-tools.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/api-client.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/api-configuration.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/api-settings-and-middleware.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/architecture.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/auth-and-authorization.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/callbacks-and-command.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/checkpointing-and-threads.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/cli-commands.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/client-auth-and-errors.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/client-messages-invoke-stream.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/client-threads-memory-files.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/context-id-background.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/dependency-injection.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/evaluation.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/id-and-thread-name-generators.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/media-and-files.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/memory-and-store.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/prebuilt-agents-and-tools.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/production-runtime.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/providers-and-adapters.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/publishers-and-runtime-protocols.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/rate-limiting.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/remote-tools.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/rest-api-and-errors.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/security-and-validators.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/state-and-messages.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/state-graph.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/stream-emitter.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/streaming.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/testing-and-evaluation.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/agent-skills/references/unit-testing.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/skills/copilot/agentflow.instructions.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/auth_backend.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/authorization.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/base_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/jwt_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/permissions.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/graph_config.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/media_settings.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/sentry_config.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/settings.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/setup_logs.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/setup_middleware.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/worker_middleware.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/exceptions/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/exceptions/general_exception.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/exceptions/handle_errors.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/exceptions/resources_exceptions.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/exceptions/user_exception.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/rate_limit/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/rate_limit/base.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/rate_limit/factory.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/rate_limit/memory.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/rate_limit/middleware.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/rate_limit/redis.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/request_limits.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/security_headers.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/utils/log_sanitizer.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/loader.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/main.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/a2a.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/a2ui.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/schemas/checkpointer_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/services/checkpointer_service.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/schemas/graph_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/services/graph_service.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/services/multimodal_preprocessor.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/media/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/media/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/media/schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/ping/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/ping/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/setup_router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/schemas/store_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/services/store_service.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/tasks/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/tasks/user_tasks.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/callable_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/media/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/media/extractor.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/media/pipeline.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/parse_output.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/response_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/schemas/output_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/schemas/user_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/snowflake_id_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/swagger_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/thread_name_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/worker.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/graph/react.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/requirements.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/setup.cfg +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/tests/test_multimodal_sprint2_extraction.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/tests/test_sprint4_media_api.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/tests/test_utils_parse_and_callable.py +0 -0
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/eval.py
RENAMED
|
@@ -15,11 +15,17 @@ from pathlib import Path
|
|
|
15
15
|
from typing import TYPE_CHECKING, Any
|
|
16
16
|
|
|
17
17
|
from agentflow.qa.evaluation import CriterionConfig, EvalConfig, MatchType
|
|
18
|
-
from agentflow.qa.evaluation.collectors.trajectory_collector import
|
|
18
|
+
from agentflow.qa.evaluation.collectors.trajectory_collector import (
|
|
19
|
+
TrajectoryCollector,
|
|
20
|
+
make_trajectory_callback,
|
|
21
|
+
)
|
|
19
22
|
from agentflow.qa.evaluation.config.eval_config import ReporterConfig
|
|
20
|
-
from agentflow.qa.evaluation.eval_result import
|
|
23
|
+
from agentflow.qa.evaluation.eval_result import EvalCaseResult
|
|
24
|
+
from agentflow.qa.evaluation.eval_result import EvalReport as ER
|
|
21
25
|
from agentflow.qa.evaluation.evaluator import AgentEvaluator
|
|
22
26
|
from agentflow.qa.evaluation.reporters.manager import ReporterManager
|
|
27
|
+
from agentflow.utils.callbacks import CallbackManager
|
|
28
|
+
from injectq.testing import override_dependency
|
|
23
29
|
|
|
24
30
|
from agentflow_cli.cli.commands import BaseCommand
|
|
25
31
|
from agentflow_cli.cli.core.config import ConfigManager
|
|
@@ -48,6 +54,32 @@ class _PendingSimulation:
|
|
|
48
54
|
eval_set_name: str
|
|
49
55
|
|
|
50
56
|
|
|
57
|
+
def _reset_inject_proxy(service_type: type) -> None:
|
|
58
|
+
"""Reset the lazy Inject[T] proxy cached on Node.execute's default parameters.
|
|
59
|
+
|
|
60
|
+
Inject[T] proxies cache their resolved value in _injected_value on first use.
|
|
61
|
+
container.override() clears the singleton scope, but the proxy's own cache is
|
|
62
|
+
independent — it must be cleared so the proxy re-resolves from the container
|
|
63
|
+
on next invocation instead of returning the stale value.
|
|
64
|
+
"""
|
|
65
|
+
try:
|
|
66
|
+
from agentflow.core.graph.node import Node as _GraphNode
|
|
67
|
+
|
|
68
|
+
defaults = getattr(_GraphNode.execute, "__defaults__", None) or ()
|
|
69
|
+
for d in defaults:
|
|
70
|
+
if (
|
|
71
|
+
hasattr(d, "_injected_value")
|
|
72
|
+
and hasattr(d, "service_type")
|
|
73
|
+
and d.service_type is service_type
|
|
74
|
+
):
|
|
75
|
+
d._injected_value = None
|
|
76
|
+
except Exception: # nosec B110 # noqa: S110
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
DEFAULT_CONCURRENCY = 4
|
|
81
|
+
|
|
82
|
+
|
|
51
83
|
class EvalCommand(BaseCommand):
|
|
52
84
|
"""Discover and run agent evaluations; always write HTML + JSON reports."""
|
|
53
85
|
|
|
@@ -112,8 +144,44 @@ class EvalCommand(BaseCommand):
|
|
|
112
144
|
},
|
|
113
145
|
)
|
|
114
146
|
|
|
147
|
+
# ------------------------------------------------------------------
|
|
148
|
+
# confeval.py loading
|
|
149
|
+
# ------------------------------------------------------------------
|
|
150
|
+
|
|
151
|
+
def _load_confeval(self, evals_dir: Path) -> EvalConfig | None:
|
|
152
|
+
"""Find and load confeval.py from evals_dir, returning its EvalConfig.
|
|
153
|
+
|
|
154
|
+
Tries get_eval_config() first, then falls back to the EVAL_CONFIG
|
|
155
|
+
constant. Returns None if no confeval.py is found so callers can
|
|
156
|
+
distinguish "no confeval" from "confeval with empty criteria".
|
|
157
|
+
"""
|
|
158
|
+
confeval_path = evals_dir / "confeval.py"
|
|
159
|
+
if not confeval_path.exists():
|
|
160
|
+
return None
|
|
161
|
+
|
|
162
|
+
try:
|
|
163
|
+
mod = self._load_module(confeval_path)
|
|
164
|
+
except Exception as exc:
|
|
165
|
+
self.logger.warning("Failed to load confeval.py: %s", exc)
|
|
166
|
+
return None
|
|
167
|
+
|
|
168
|
+
if hasattr(mod, "get_eval_config"):
|
|
169
|
+
try:
|
|
170
|
+
return mod.get_eval_config()
|
|
171
|
+
except Exception as exc:
|
|
172
|
+
self.logger.warning("get_eval_config() in confeval.py failed: %s", exc)
|
|
173
|
+
|
|
174
|
+
if hasattr(mod, "EVAL_CONFIG"):
|
|
175
|
+
return mod.EVAL_CONFIG
|
|
176
|
+
|
|
177
|
+
self.logger.warning(
|
|
178
|
+
"confeval.py found but has no get_eval_config() or EVAL_CONFIG — ignoring"
|
|
179
|
+
)
|
|
180
|
+
return None
|
|
181
|
+
|
|
115
182
|
def _collect_eval_functions(self, mod: Any) -> tuple[list[tuple[str, Any]], Any]:
|
|
116
|
-
"""Pytest-style discovery: functions annotated -> EvalSet are evals, ->
|
|
183
|
+
"""Pytest-style discovery: functions annotated -> EvalSet are evals, ->
|
|
184
|
+
EvalConfig is config."""
|
|
117
185
|
from agentflow.qa.evaluation import EvalConfig, EvalSet
|
|
118
186
|
|
|
119
187
|
eval_pairs: list[tuple[str, Any]] = []
|
|
@@ -150,10 +218,15 @@ class EvalCommand(BaseCommand):
|
|
|
150
218
|
# ------------------------------------------------------------------
|
|
151
219
|
|
|
152
220
|
def _collect_from_file(
|
|
153
|
-
self, path: Path, global_config: EvalConfig
|
|
221
|
+
self, path: Path, global_config: EvalConfig | None
|
|
154
222
|
) -> list[_PendingCase | _PendingSimulation]:
|
|
155
223
|
"""Load a module and return pending work for every eval case or simulation scenario.
|
|
156
224
|
|
|
225
|
+
Config priority chain (highest → lowest):
|
|
226
|
+
1. confeval.py — global_config (not None when confeval was found)
|
|
227
|
+
2. Per-file — EVAL_CONFIG / get_eval_config() inside the file
|
|
228
|
+
3. Built-in defaults — _default_config()
|
|
229
|
+
|
|
157
230
|
Returns _PendingSimulation items when the file exposes get_scenarios() or SCENARIOS.
|
|
158
231
|
Returns _PendingCase items for the standard get_eval_set() / pytest-style protocols.
|
|
159
232
|
"""
|
|
@@ -175,13 +248,13 @@ class EvalCommand(BaseCommand):
|
|
|
175
248
|
|
|
176
249
|
# get_eval_set() protocol
|
|
177
250
|
if hasattr(mod, "get_eval_set"):
|
|
251
|
+
file_config: EvalConfig | None = None
|
|
178
252
|
if hasattr(mod, "get_eval_config"):
|
|
179
253
|
file_config = mod.get_eval_config()
|
|
180
254
|
elif hasattr(mod, "EVAL_CONFIG"):
|
|
181
255
|
file_config = mod.EVAL_CONFIG
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
config = global_config if global_config.criteria else file_config
|
|
256
|
+
# Priority: confeval > per-file > defaults
|
|
257
|
+
config = global_config or file_config or self._default_config()
|
|
185
258
|
return self._make_pending(mod, mod.get_eval_set(), config, file_name)
|
|
186
259
|
|
|
187
260
|
# pytest-style discovery
|
|
@@ -192,9 +265,10 @@ class EvalCommand(BaseCommand):
|
|
|
192
265
|
if hasattr(mod, "get_eval_config")
|
|
193
266
|
else mod.EVAL_CONFIG
|
|
194
267
|
if hasattr(mod, "EVAL_CONFIG")
|
|
195
|
-
else
|
|
268
|
+
else None
|
|
196
269
|
)
|
|
197
|
-
|
|
270
|
+
# Priority: confeval > per-file > defaults
|
|
271
|
+
config = global_config or file_config or self._default_config()
|
|
198
272
|
pending: list[_PendingCase] = []
|
|
199
273
|
for _, es in eval_pairs:
|
|
200
274
|
pending.extend(self._make_pending(mod, es, config, file_name))
|
|
@@ -262,6 +336,34 @@ class EvalCommand(BaseCommand):
|
|
|
262
336
|
for c in eval_set.eval_cases
|
|
263
337
|
]
|
|
264
338
|
|
|
339
|
+
# ------------------------------------------------------------------
|
|
340
|
+
# Criteria display
|
|
341
|
+
# ------------------------------------------------------------------
|
|
342
|
+
|
|
343
|
+
def _print_criteria_block(
|
|
344
|
+
self,
|
|
345
|
+
confeval_config: EvalConfig | None,
|
|
346
|
+
target_path: Path,
|
|
347
|
+
) -> None:
|
|
348
|
+
"""Print the active criteria and their source before any case runs."""
|
|
349
|
+
if confeval_config is not None:
|
|
350
|
+
source = str(target_path / "confeval.py")
|
|
351
|
+
criteria = confeval_config.criteria
|
|
352
|
+
else:
|
|
353
|
+
source = "built-in defaults"
|
|
354
|
+
criteria = self._default_config().criteria
|
|
355
|
+
|
|
356
|
+
print(f"Criteria source: {source}", flush=True) # noqa: T201
|
|
357
|
+
for name, cfg in criteria.items():
|
|
358
|
+
parts = [f"threshold={cfg.threshold}"]
|
|
359
|
+
parts.append(cfg.match_type.value)
|
|
360
|
+
if cfg.judge_model:
|
|
361
|
+
parts.append(f"judge={cfg.judge_model}")
|
|
362
|
+
if cfg.num_samples and cfg.num_samples != 1:
|
|
363
|
+
parts.append(f"samples={cfg.num_samples}")
|
|
364
|
+
print(f" {name:<40} {' '.join(parts)}", flush=True) # noqa: T201
|
|
365
|
+
print("", flush=True) # noqa: T201
|
|
366
|
+
|
|
265
367
|
# ------------------------------------------------------------------
|
|
266
368
|
# Progress printing
|
|
267
369
|
# ------------------------------------------------------------------
|
|
@@ -277,10 +379,12 @@ class EvalCommand(BaseCommand):
|
|
|
277
379
|
status = "PASSED" if result.passed else ("ERROR" if result.is_error else "FAILED")
|
|
278
380
|
duration = f"{result.duration_seconds:.2f}s"
|
|
279
381
|
label = f"{file_name}::{case_name}"
|
|
280
|
-
status_colored =
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
382
|
+
status_colored = f"\033[32m{status}\033[0m" if result.passed else f"\033[31m{status}\033[0m"
|
|
383
|
+
tok = getattr(result, "token_usage", None)
|
|
384
|
+
tok_str = ""
|
|
385
|
+
if tok and (tok.input_tokens or tok.output_tokens):
|
|
386
|
+
tok_str = f" in={tok.input_tokens} out={tok.output_tokens}"
|
|
387
|
+
print(f"[{index:3d}/{total}] {label} {status_colored} {duration}{tok_str}", flush=True) # noqa: T201
|
|
284
388
|
|
|
285
389
|
# ------------------------------------------------------------------
|
|
286
390
|
# Flat pool execution — single asyncio event loop for all cases
|
|
@@ -303,16 +407,23 @@ class EvalCommand(BaseCommand):
|
|
|
303
407
|
local_collector = TrajectoryCollector(
|
|
304
408
|
capture_all_events=pc.evaluator.collector.capture_all_events,
|
|
305
409
|
)
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
410
|
+
_, local_mgr = make_trajectory_callback(local_collector)
|
|
411
|
+
container = pc.evaluator.graph._state_graph._container
|
|
412
|
+
# The Inject[CallbackManager] proxy on Node.execute caches its resolved
|
|
413
|
+
# value independently of the container — reset it so it re-resolves
|
|
414
|
+
# inside the override context instead of returning the stale instance.
|
|
415
|
+
_reset_inject_proxy(CallbackManager)
|
|
416
|
+
with override_dependency(CallbackManager, local_mgr, container=container):
|
|
417
|
+
try:
|
|
418
|
+
result = await pc.evaluator._evaluate_case(
|
|
419
|
+
pc.case, collector_override=local_collector
|
|
420
|
+
)
|
|
421
|
+
except Exception as exc:
|
|
422
|
+
result = EvalCaseResult.failure(
|
|
423
|
+
eval_id=pc.case.eval_id,
|
|
424
|
+
error=str(exc),
|
|
425
|
+
name=pc.case.name,
|
|
426
|
+
)
|
|
316
427
|
return (pc.file_name, pc.eval_set_id, pc.eval_set_name, result)
|
|
317
428
|
|
|
318
429
|
async def _run_simulation(ps: _PendingSimulation) -> tuple[str, str, str, EvalCaseResult]:
|
|
@@ -342,8 +453,7 @@ class EvalCommand(BaseCommand):
|
|
|
342
453
|
)
|
|
343
454
|
]
|
|
344
455
|
conversation_text = "\n".join(
|
|
345
|
-
f"{m['role'].upper()}: {m['content']}"
|
|
346
|
-
for m in sim_result.conversation
|
|
456
|
+
f"{m['role'].upper()}: {m['content']}" for m in sim_result.conversation
|
|
347
457
|
)
|
|
348
458
|
result = EvalCaseResult.success(
|
|
349
459
|
eval_id=ps.scenario.scenario_id,
|
|
@@ -457,10 +567,13 @@ class EvalCommand(BaseCommand):
|
|
|
457
567
|
quiet: bool = False,
|
|
458
568
|
**kwargs: Any,
|
|
459
569
|
) -> int:
|
|
460
|
-
# 1. Load
|
|
461
|
-
|
|
570
|
+
# 1. Load infra settings from agentflow.json — no criteria here.
|
|
571
|
+
# Criteria come exclusively from confeval.py (step 4) or per-file config.
|
|
462
572
|
config_manager = ConfigManager()
|
|
463
573
|
discovered = config_manager.auto_discover_config()
|
|
574
|
+
json_directory = "evals"
|
|
575
|
+
effective_parallel = parallel
|
|
576
|
+
effective_concurrency = max_concurrency
|
|
464
577
|
if discovered:
|
|
465
578
|
try:
|
|
466
579
|
config_manager.load_config(str(discovered))
|
|
@@ -469,33 +582,19 @@ class EvalCommand(BaseCommand):
|
|
|
469
582
|
output_dir = global_eval_cfg.get("output_dir", output_dir)
|
|
470
583
|
if threshold is None:
|
|
471
584
|
threshold = global_eval_cfg.get("threshold")
|
|
585
|
+
if not parallel:
|
|
586
|
+
effective_parallel = global_eval_cfg.get("parallel", False)
|
|
587
|
+
if max_concurrency == DEFAULT_CONCURRENCY:
|
|
588
|
+
effective_concurrency = global_eval_cfg.get(
|
|
589
|
+
"max_concurrency", DEFAULT_CONCURRENCY
|
|
590
|
+
)
|
|
591
|
+
json_directory = global_eval_cfg.get("directory", json_directory)
|
|
472
592
|
except Exception:
|
|
473
593
|
self.logger.warning(
|
|
474
594
|
"Failed to load eval config from agentflow.json; using defaults"
|
|
475
595
|
)
|
|
476
596
|
|
|
477
|
-
# 2.
|
|
478
|
-
# If agentflow.json has an evaluation section but no criteria key, inject
|
|
479
|
-
# the built-in defaults so at least one criterion always runs.
|
|
480
|
-
try:
|
|
481
|
-
global_config = (
|
|
482
|
-
EvalConfig.model_validate(global_eval_cfg)
|
|
483
|
-
if global_eval_cfg
|
|
484
|
-
else self._default_config()
|
|
485
|
-
)
|
|
486
|
-
except Exception:
|
|
487
|
-
global_config = self._default_config()
|
|
488
|
-
|
|
489
|
-
if not global_config.criteria:
|
|
490
|
-
global_config.criteria = self._default_config().criteria
|
|
491
|
-
|
|
492
|
-
if parallel:
|
|
493
|
-
global_config.parallel = True
|
|
494
|
-
if max_concurrency != 4:
|
|
495
|
-
global_config.max_concurrency = max_concurrency
|
|
496
|
-
|
|
497
|
-
effective_parallel = global_config.parallel
|
|
498
|
-
effective_concurrency = global_config.max_concurrency
|
|
597
|
+
# 2. CLI flags already captured as function parameters (highest priority).
|
|
499
598
|
|
|
500
599
|
# 3. Resolve target path
|
|
501
600
|
if target:
|
|
@@ -504,7 +603,7 @@ class EvalCommand(BaseCommand):
|
|
|
504
603
|
self.output.error(f"Path not found: {target}")
|
|
505
604
|
return 1
|
|
506
605
|
else:
|
|
507
|
-
target_path =
|
|
606
|
+
target_path = Path.cwd() / json_directory
|
|
508
607
|
if not target_path.exists():
|
|
509
608
|
self.output.error(
|
|
510
609
|
f"Eval directory '{target_path}' not found. "
|
|
@@ -512,17 +611,20 @@ class EvalCommand(BaseCommand):
|
|
|
512
611
|
)
|
|
513
612
|
return 1
|
|
514
613
|
|
|
515
|
-
# 4.
|
|
614
|
+
# 4. Load confeval.py → global criteria config (None if not found)
|
|
615
|
+
confeval_config = self._load_confeval(target_path)
|
|
616
|
+
|
|
617
|
+
# 5. Discover files
|
|
516
618
|
files = self._discover(target_path)
|
|
517
619
|
if not files:
|
|
518
620
|
self.output.error(f"No eval files found in {target_path}")
|
|
519
621
|
return 1
|
|
520
622
|
|
|
521
|
-
#
|
|
623
|
+
# 6. Collect all pending cases across every file
|
|
522
624
|
pending: list[_PendingCase] = []
|
|
523
625
|
for f in files:
|
|
524
626
|
try:
|
|
525
|
-
cases = self._collect_from_file(f,
|
|
627
|
+
cases = self._collect_from_file(f, confeval_config)
|
|
526
628
|
pending.extend(cases)
|
|
527
629
|
except Exception as exc:
|
|
528
630
|
self.output.error(f"Error loading {f.name}: {exc}")
|
|
@@ -548,22 +650,21 @@ class EvalCommand(BaseCommand):
|
|
|
548
650
|
f"Found {', '.join(parts)} across {n_files} file(s) in {target_path}",
|
|
549
651
|
)
|
|
550
652
|
|
|
551
|
-
#
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
653
|
+
# 7. Print criteria block so users know what is being evaluated
|
|
654
|
+
self._print_criteria_block(confeval_config, target_path)
|
|
655
|
+
|
|
656
|
+
# 8. Run all cases under a single asyncio event loop
|
|
657
|
+
quads = asyncio.run(self._run_flat_pool(pending, effective_concurrency, effective_parallel))
|
|
555
658
|
|
|
556
659
|
if not quads:
|
|
557
660
|
self.output.error("No results produced.")
|
|
558
661
|
return 1
|
|
559
662
|
|
|
560
663
|
# 7. Group by eval_set_id → one EvalReport per set
|
|
561
|
-
groups: dict[str, tuple[str, list[EvalCaseResult]]] = defaultdict(
|
|
562
|
-
|
|
563
|
-
)
|
|
564
|
-
for file_name, eval_set_id, eval_set_name, result in quads:
|
|
664
|
+
groups: dict[str, tuple[str, list[EvalCaseResult]]] = defaultdict(lambda: ("", []))
|
|
665
|
+
for _, eval_set_id, eval_set_name, result in quads:
|
|
565
666
|
name, results_list = groups[eval_set_id]
|
|
566
|
-
groups[eval_set_id] = (eval_set_name or name, results_list
|
|
667
|
+
groups[eval_set_id] = (eval_set_name or name, [*results_list, result])
|
|
567
668
|
|
|
568
669
|
reports: list[EvalReport] = []
|
|
569
670
|
for eval_set_id, (eval_set_name, results) in groups.items():
|
|
@@ -572,7 +673,7 @@ class EvalCommand(BaseCommand):
|
|
|
572
673
|
eval_set_id=eval_set_id,
|
|
573
674
|
eval_set_name=eval_set_name,
|
|
574
675
|
results=results,
|
|
575
|
-
config_used=
|
|
676
|
+
config_used=(confeval_config or self._default_config()).model_dump(),
|
|
576
677
|
)
|
|
577
678
|
)
|
|
578
679
|
|
|
@@ -618,5 +719,13 @@ class EvalCommand(BaseCommand):
|
|
|
618
719
|
f"({summary.pass_rate:.1%})",
|
|
619
720
|
emoji=False,
|
|
620
721
|
)
|
|
722
|
+
tok = summary.total_token_usage
|
|
723
|
+
if tok.total_tokens:
|
|
724
|
+
cache_part = f" cache_read: {tok.cache_read_tokens:,}" if tok.cache_read_tokens else ""
|
|
725
|
+
self.output.info(
|
|
726
|
+
f"Tokens — input: {tok.input_tokens:,} output: {tok.output_tokens:,}"
|
|
727
|
+
f"{cache_part} total: {tok.total_tokens:,}",
|
|
728
|
+
emoji=False,
|
|
729
|
+
)
|
|
621
730
|
|
|
622
731
|
return return_code
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/api.py
RENAMED
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/init.py
RENAMED
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/test.py
RENAMED
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/constants.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/__init__.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/config.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/output.py
RENAMED
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/exceptions.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/logger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/__init__.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/loader.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/main.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/tests/test_sprint4_media_api.py
RENAMED
|
File without changes
|
|
File without changes
|