10xscale-agentflow-cli 0.3.2.5__tar.gz → 0.3.2.7__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.7}/10xscale_agentflow_cli.egg-info/PKG-INFO +1 -1
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/PKG-INFO +1 -1
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/eval.py +186 -64
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/pyproject.toml +1 -1
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/SOURCES.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/dependency_links.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/entry_points.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/not-zip-safe +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/requires.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/top_level.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/MANIFEST.in +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/README.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow.json +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/api.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/build.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/init.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/skills.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/test.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/version.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/constants.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/config.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/output.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/validation.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/exceptions.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/logger.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/main.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/defaults.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/dev/agentflow.json +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/dev/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/dev/graph/agent.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/.pre-commot-config.yaml +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/agentflow.json +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/auth/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/auth/agent_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/evals/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/agentflow_cli/cli/templates/prod/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/agent.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/nodes/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/agentflow_cli/cli/templates/prod/graph/state.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/cli/templates/prod/graph/tools/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/cli/templates/prod/graph/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/cli/templates/prod/graph/validators/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/validators/lifecyle.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/validators/manager.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/validators/validators.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/tests/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/tests/conftest.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/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.7}/agentflow_cli/cli/templates/skills/agent-skills/SKILL.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/agentflow_cli/cli/templates/skills/copilot/agentflow.instructions.md +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/auth_backend.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/authorization.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/base_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/jwt_auth.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/permissions.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/graph_config.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/media_settings.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/sentry_config.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/settings.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/setup_logs.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/setup_middleware.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/worker_middleware.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/exceptions/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/exceptions/general_exception.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/exceptions/handle_errors.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/exceptions/resources_exceptions.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/exceptions/user_exception.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/middleware/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/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.7}/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.7}/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.7}/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.7}/agentflow_cli/src/app/core/middleware/request_limits.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/middleware/security_headers.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/utils/log_sanitizer.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/loader.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/main.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/a2a.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/a2ui.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/checkpointer/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/checkpointer/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/checkpointer/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/app/routers/checkpointer/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/app/routers/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/graph/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/graph/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/app/routers/graph/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/agentflow_cli/src/app/routers/media/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/media/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/media/schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/ping/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/ping/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/setup_router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/store/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/store/router.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/store/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/app/routers/store/services/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/app/tasks/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/tasks/user_tasks.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/callable_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/media/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/media/extractor.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/media/pipeline.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/parse_output.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/response_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/schemas/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/schemas/output_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/schemas/user_schemas.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/snowflake_id_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/swagger_helper.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/thread_name_generator.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/worker.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/graph/__init__.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/graph/react.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/requirements.txt +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/setup.cfg +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/tests/test_multimodal_sprint2_extraction.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/tests/test_sprint4_media_api.py +0 -0
- {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/tests/test_utils_parse_and_callable.py +0 -0
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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,38 @@ 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 in criteria.model_fields:
|
|
358
|
+
cfg = getattr(criteria, name)
|
|
359
|
+
if cfg is None:
|
|
360
|
+
continue
|
|
361
|
+
|
|
362
|
+
parts = [f"threshold={cfg.threshold}"]
|
|
363
|
+
parts.append(cfg.match_type.value)
|
|
364
|
+
if cfg.judge_model:
|
|
365
|
+
parts.append(f"judge={cfg.judge_model}")
|
|
366
|
+
if cfg.num_samples and cfg.num_samples != 1:
|
|
367
|
+
parts.append(f"samples={cfg.num_samples}")
|
|
368
|
+
print(f" {name:<40} {' '.join(parts)}", flush=True) # noqa: T201
|
|
369
|
+
print("", flush=True) # noqa: T201
|
|
370
|
+
|
|
265
371
|
# ------------------------------------------------------------------
|
|
266
372
|
# Progress printing
|
|
267
373
|
# ------------------------------------------------------------------
|
|
@@ -277,10 +383,12 @@ class EvalCommand(BaseCommand):
|
|
|
277
383
|
status = "PASSED" if result.passed else ("ERROR" if result.is_error else "FAILED")
|
|
278
384
|
duration = f"{result.duration_seconds:.2f}s"
|
|
279
385
|
label = f"{file_name}::{case_name}"
|
|
280
|
-
status_colored =
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
386
|
+
status_colored = f"\033[32m{status}\033[0m" if result.passed else f"\033[31m{status}\033[0m"
|
|
387
|
+
tok = getattr(result, "token_usage", None)
|
|
388
|
+
tok_str = ""
|
|
389
|
+
if tok and (tok.input_tokens or tok.output_tokens):
|
|
390
|
+
tok_str = f" in={tok.input_tokens} out={tok.output_tokens}"
|
|
391
|
+
print(f"[{index:3d}/{total}] {label} {status_colored} {duration}{tok_str}", flush=True) # noqa: T201
|
|
284
392
|
|
|
285
393
|
# ------------------------------------------------------------------
|
|
286
394
|
# Flat pool execution — single asyncio event loop for all cases
|
|
@@ -303,24 +411,34 @@ class EvalCommand(BaseCommand):
|
|
|
303
411
|
local_collector = TrajectoryCollector(
|
|
304
412
|
capture_all_events=pc.evaluator.collector.capture_all_events,
|
|
305
413
|
)
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
414
|
+
_, local_mgr = make_trajectory_callback(local_collector)
|
|
415
|
+
container = pc.evaluator.graph._state_graph._container
|
|
416
|
+
# The Inject[CallbackManager] proxy on Node.execute caches its resolved
|
|
417
|
+
# value independently of the container — reset it so it re-resolves
|
|
418
|
+
# inside the override context instead of returning the stale instance.
|
|
419
|
+
_reset_inject_proxy(CallbackManager)
|
|
420
|
+
with override_dependency(CallbackManager, local_mgr, container=container):
|
|
421
|
+
try:
|
|
422
|
+
result = await pc.evaluator._evaluate_case(
|
|
423
|
+
pc.case, collector_override=local_collector
|
|
424
|
+
)
|
|
425
|
+
except Exception as exc:
|
|
426
|
+
result = EvalCaseResult.failure(
|
|
427
|
+
eval_id=pc.case.eval_id,
|
|
428
|
+
error=str(exc),
|
|
429
|
+
name=pc.case.name,
|
|
430
|
+
)
|
|
316
431
|
return (pc.file_name, pc.eval_set_id, pc.eval_set_name, result)
|
|
317
432
|
|
|
318
433
|
async def _run_simulation(ps: _PendingSimulation) -> tuple[str, str, str, EvalCaseResult]:
|
|
319
434
|
from agentflow.qa.evaluation.eval_result import CriterionResult
|
|
435
|
+
from agentflow.qa.evaluation.token_usage import TokenUsage
|
|
320
436
|
|
|
321
437
|
try:
|
|
322
438
|
sim_result = await ps.simulator.run(ps.graph, ps.scenario)
|
|
323
|
-
|
|
439
|
+
# Use the full CriterionResult objects (with per-criterion token_usage)
|
|
440
|
+
# if available; fall back to rebuilding from scores dict.
|
|
441
|
+
criterion_results = sim_result.criterion_results or [
|
|
324
442
|
CriterionResult.success(
|
|
325
443
|
criterion=name,
|
|
326
444
|
score=score,
|
|
@@ -342,14 +460,19 @@ class EvalCommand(BaseCommand):
|
|
|
342
460
|
)
|
|
343
461
|
]
|
|
344
462
|
conversation_text = "\n".join(
|
|
345
|
-
f"{m['role'].upper()}: {m['content']}"
|
|
346
|
-
|
|
463
|
+
f"{m['role'].upper()}: {m['content']}" for m in sim_result.conversation
|
|
464
|
+
)
|
|
465
|
+
criteria_token_usage = sum(
|
|
466
|
+
(cr.token_usage for cr in criterion_results), TokenUsage()
|
|
347
467
|
)
|
|
468
|
+
total_token_usage = sim_result.simulator_token_usage + criteria_token_usage
|
|
348
469
|
result = EvalCaseResult.success(
|
|
349
470
|
eval_id=ps.scenario.scenario_id,
|
|
350
471
|
name=ps.scenario.description or ps.scenario.scenario_id,
|
|
351
472
|
criterion_results=criterion_results,
|
|
352
473
|
actual_response=conversation_text,
|
|
474
|
+
token_usage=total_token_usage,
|
|
475
|
+
agent_token_usage=sim_result.simulator_token_usage,
|
|
353
476
|
metadata={
|
|
354
477
|
"turns": sim_result.turns,
|
|
355
478
|
"goals_achieved": sim_result.goals_achieved,
|
|
@@ -457,10 +580,13 @@ class EvalCommand(BaseCommand):
|
|
|
457
580
|
quiet: bool = False,
|
|
458
581
|
**kwargs: Any,
|
|
459
582
|
) -> int:
|
|
460
|
-
# 1. Load
|
|
461
|
-
|
|
583
|
+
# 1. Load infra settings from agentflow.json — no criteria here.
|
|
584
|
+
# Criteria come exclusively from confeval.py (step 4) or per-file config.
|
|
462
585
|
config_manager = ConfigManager()
|
|
463
586
|
discovered = config_manager.auto_discover_config()
|
|
587
|
+
json_directory = "evals"
|
|
588
|
+
effective_parallel = parallel
|
|
589
|
+
effective_concurrency = max_concurrency
|
|
464
590
|
if discovered:
|
|
465
591
|
try:
|
|
466
592
|
config_manager.load_config(str(discovered))
|
|
@@ -469,33 +595,19 @@ class EvalCommand(BaseCommand):
|
|
|
469
595
|
output_dir = global_eval_cfg.get("output_dir", output_dir)
|
|
470
596
|
if threshold is None:
|
|
471
597
|
threshold = global_eval_cfg.get("threshold")
|
|
598
|
+
if not parallel:
|
|
599
|
+
effective_parallel = global_eval_cfg.get("parallel", False)
|
|
600
|
+
if max_concurrency == DEFAULT_CONCURRENCY:
|
|
601
|
+
effective_concurrency = global_eval_cfg.get(
|
|
602
|
+
"max_concurrency", DEFAULT_CONCURRENCY
|
|
603
|
+
)
|
|
604
|
+
json_directory = global_eval_cfg.get("directory", json_directory)
|
|
472
605
|
except Exception:
|
|
473
606
|
self.logger.warning(
|
|
474
607
|
"Failed to load eval config from agentflow.json; using defaults"
|
|
475
608
|
)
|
|
476
609
|
|
|
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
|
|
610
|
+
# 2. CLI flags already captured as function parameters (highest priority).
|
|
499
611
|
|
|
500
612
|
# 3. Resolve target path
|
|
501
613
|
if target:
|
|
@@ -504,7 +616,7 @@ class EvalCommand(BaseCommand):
|
|
|
504
616
|
self.output.error(f"Path not found: {target}")
|
|
505
617
|
return 1
|
|
506
618
|
else:
|
|
507
|
-
target_path =
|
|
619
|
+
target_path = Path.cwd() / json_directory
|
|
508
620
|
if not target_path.exists():
|
|
509
621
|
self.output.error(
|
|
510
622
|
f"Eval directory '{target_path}' not found. "
|
|
@@ -512,17 +624,20 @@ class EvalCommand(BaseCommand):
|
|
|
512
624
|
)
|
|
513
625
|
return 1
|
|
514
626
|
|
|
515
|
-
# 4.
|
|
627
|
+
# 4. Load confeval.py → global criteria config (None if not found)
|
|
628
|
+
confeval_config = self._load_confeval(target_path)
|
|
629
|
+
|
|
630
|
+
# 5. Discover files
|
|
516
631
|
files = self._discover(target_path)
|
|
517
632
|
if not files:
|
|
518
633
|
self.output.error(f"No eval files found in {target_path}")
|
|
519
634
|
return 1
|
|
520
635
|
|
|
521
|
-
#
|
|
636
|
+
# 6. Collect all pending cases across every file
|
|
522
637
|
pending: list[_PendingCase] = []
|
|
523
638
|
for f in files:
|
|
524
639
|
try:
|
|
525
|
-
cases = self._collect_from_file(f,
|
|
640
|
+
cases = self._collect_from_file(f, confeval_config)
|
|
526
641
|
pending.extend(cases)
|
|
527
642
|
except Exception as exc:
|
|
528
643
|
self.output.error(f"Error loading {f.name}: {exc}")
|
|
@@ -548,22 +663,21 @@ class EvalCommand(BaseCommand):
|
|
|
548
663
|
f"Found {', '.join(parts)} across {n_files} file(s) in {target_path}",
|
|
549
664
|
)
|
|
550
665
|
|
|
551
|
-
#
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
666
|
+
# 7. Print criteria block so users know what is being evaluated
|
|
667
|
+
self._print_criteria_block(confeval_config, target_path)
|
|
668
|
+
|
|
669
|
+
# 8. Run all cases under a single asyncio event loop
|
|
670
|
+
quads = asyncio.run(self._run_flat_pool(pending, effective_concurrency, effective_parallel))
|
|
555
671
|
|
|
556
672
|
if not quads:
|
|
557
673
|
self.output.error("No results produced.")
|
|
558
674
|
return 1
|
|
559
675
|
|
|
560
676
|
# 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:
|
|
677
|
+
groups: dict[str, tuple[str, list[EvalCaseResult]]] = defaultdict(lambda: ("", []))
|
|
678
|
+
for _, eval_set_id, eval_set_name, result in quads:
|
|
565
679
|
name, results_list = groups[eval_set_id]
|
|
566
|
-
groups[eval_set_id] = (eval_set_name or name, results_list
|
|
680
|
+
groups[eval_set_id] = (eval_set_name or name, [*results_list, result])
|
|
567
681
|
|
|
568
682
|
reports: list[EvalReport] = []
|
|
569
683
|
for eval_set_id, (eval_set_name, results) in groups.items():
|
|
@@ -572,7 +686,7 @@ class EvalCommand(BaseCommand):
|
|
|
572
686
|
eval_set_id=eval_set_id,
|
|
573
687
|
eval_set_name=eval_set_name,
|
|
574
688
|
results=results,
|
|
575
|
-
config_used=
|
|
689
|
+
config_used=(confeval_config or self._default_config()).model_dump(),
|
|
576
690
|
)
|
|
577
691
|
)
|
|
578
692
|
|
|
@@ -618,5 +732,13 @@ class EvalCommand(BaseCommand):
|
|
|
618
732
|
f"({summary.pass_rate:.1%})",
|
|
619
733
|
emoji=False,
|
|
620
734
|
)
|
|
735
|
+
tok = summary.total_token_usage
|
|
736
|
+
if tok.total_tokens:
|
|
737
|
+
cache_part = f" cache_read: {tok.cache_read_tokens:,}" if tok.cache_read_tokens else ""
|
|
738
|
+
self.output.info(
|
|
739
|
+
f"Tokens — input: {tok.input_tokens:,} output: {tok.output_tokens:,}"
|
|
740
|
+
f"{cache_part} total: {tok.total_tokens:,}",
|
|
741
|
+
emoji=False,
|
|
742
|
+
)
|
|
621
743
|
|
|
622
744
|
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.7}/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.7}/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.7}/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.7}/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.7}/agentflow_cli/cli/constants.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/__init__.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/config.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/cli/exceptions.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/__init__.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/agentflow_cli/src/app/loader.py
RENAMED
|
File without changes
|
{10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/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.7}/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.7}/tests/test_sprint4_media_api.py
RENAMED
|
File without changes
|
|
File without changes
|