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.
Files changed (182) hide show
  1. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/PKG-INFO +1 -1
  2. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/PKG-INFO +1 -1
  3. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/eval.py +186 -64
  4. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/pyproject.toml +1 -1
  5. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/SOURCES.txt +0 -0
  6. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/dependency_links.txt +0 -0
  7. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/entry_points.txt +0 -0
  8. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/not-zip-safe +0 -0
  9. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/requires.txt +0 -0
  10. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/10xscale_agentflow_cli.egg-info/top_level.txt +0 -0
  11. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/MANIFEST.in +0 -0
  12. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/README.md +0 -0
  13. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow.json +0 -0
  14. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/__init__.py +0 -0
  15. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/__init__.py +0 -0
  16. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/__init__.py +0 -0
  17. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/api.py +0 -0
  18. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/build.py +0 -0
  19. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/init.py +0 -0
  20. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/skills.py +0 -0
  21. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/test.py +0 -0
  22. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/commands/version.py +0 -0
  23. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/constants.py +0 -0
  24. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/__init__.py +0 -0
  25. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/config.py +0 -0
  26. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/output.py +0 -0
  27. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/core/validation.py +0 -0
  28. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/exceptions.py +0 -0
  29. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/logger.py +0 -0
  30. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/main.py +0 -0
  31. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/__init__.py +0 -0
  32. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/defaults.py +0 -0
  33. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/dev/agentflow.json +0 -0
  34. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/dev/graph/__init__.py +0 -0
  35. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/dev/graph/agent.py +0 -0
  36. {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
  37. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/agentflow.json +0 -0
  38. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/auth/__init__.py +0 -0
  39. {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
  40. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/evals/__init__.py +0 -0
  41. {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
  42. {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
  43. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/__init__.py +0 -0
  44. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/agent.py +0 -0
  45. {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
  46. {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
  47. {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
  48. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/graph/state.py +0 -0
  49. {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
  50. {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
  51. {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
  52. {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
  53. {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
  54. {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
  55. {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
  56. {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
  57. {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
  58. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/tests/__init__.py +0 -0
  59. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/cli/templates/prod/tests/conftest.py +0 -0
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/__init__.py +0 -0
  98. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/__init__.py +0 -0
  99. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/__init__.py +0 -0
  100. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/__init__.py +0 -0
  101. {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
  102. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/authorization.py +0 -0
  103. {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
  104. {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
  105. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/auth/permissions.py +0 -0
  106. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/__init__.py +0 -0
  107. {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
  108. {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
  109. {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
  110. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/config/settings.py +0 -0
  111. {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
  112. {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
  113. {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
  114. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/exceptions/__init__.py +0 -0
  115. {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
  116. {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
  117. {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
  118. {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
  119. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/middleware/__init__.py +0 -0
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/core/utils/__init__.py +0 -0
  129. {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
  130. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/loader.py +0 -0
  131. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/main.py +0 -0
  132. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/__init__.py +0 -0
  133. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/a2a.py +0 -0
  134. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/a2ui.py +0 -0
  135. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/checkpointer/__init__.py +0 -0
  136. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/checkpointer/router.py +0 -0
  137. {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
  138. {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
  139. {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
  140. {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
  141. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/graph/__init__.py +0 -0
  142. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/graph/router.py +0 -0
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/media/__init__.py +0 -0
  149. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/media/router.py +0 -0
  150. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/media/schemas.py +0 -0
  151. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/ping/__init__.py +0 -0
  152. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/ping/router.py +0 -0
  153. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/setup_router.py +0 -0
  154. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/store/__init__.py +0 -0
  155. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/routers/store/router.py +0 -0
  156. {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
  157. {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
  158. {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
  159. {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
  160. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/tasks/__init__.py +0 -0
  161. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/tasks/user_tasks.py +0 -0
  162. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/__init__.py +0 -0
  163. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/callable_helper.py +0 -0
  164. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/media/__init__.py +0 -0
  165. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/media/extractor.py +0 -0
  166. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/media/pipeline.py +0 -0
  167. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/parse_output.py +0 -0
  168. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/response_helper.py +0 -0
  169. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/schemas/__init__.py +0 -0
  170. {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
  171. {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
  172. {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
  173. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/utils/swagger_helper.py +0 -0
  174. {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
  175. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/agentflow_cli/src/app/worker.py +0 -0
  176. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/graph/__init__.py +0 -0
  177. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/graph/react.py +0 -0
  178. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/requirements.txt +0 -0
  179. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/setup.cfg +0 -0
  180. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/tests/test_multimodal_sprint2_extraction.py +0 -0
  181. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/tests/test_sprint4_media_api.py +0 -0
  182. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.7}/tests/test_utils_parse_and_callable.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 10xscale-agentflow-cli
3
- Version: 0.3.2.5
3
+ Version: 0.3.2.7
4
4
  Summary: CLI and API for 10xscale AgentFlow
5
5
  Author-email: 10xscale <contact@10xscale.ai>
6
6
  Maintainer-email: Shudipto Trafder <shudiptotrafder@gmail.com>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: 10xscale-agentflow-cli
3
- Version: 0.3.2.5
3
+ Version: 0.3.2.7
4
4
  Summary: CLI and API for 10xscale AgentFlow
5
5
  Author-email: 10xscale <contact@10xscale.ai>
6
6
  Maintainer-email: Shudipto Trafder <shudiptotrafder@gmail.com>
@@ -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 TrajectoryCollector
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 EvalReport as ER, EvalCaseResult
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, -> EvalConfig is config."""
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
- else:
183
- file_config = global_config
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 global_config
268
+ else None
196
269
  )
197
- config = global_config if global_config.criteria else file_config
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
- f"\033[32m{status}\033[0m" if result.passed else f"\033[31m{status}\033[0m"
282
- )
283
- print(f"[{index:3d}/{total}] {label} {status_colored} {duration}", flush=True)
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
- try:
307
- result = await pc.evaluator._evaluate_case(
308
- pc.case, collector_override=local_collector
309
- )
310
- except Exception as exc:
311
- result = EvalCaseResult.failure(
312
- eval_id=pc.case.eval_id,
313
- error=str(exc),
314
- name=pc.case.name,
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
- criterion_results = [
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
- for m in sim_result.conversation
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 global config from agentflow.json
461
- global_eval_cfg: dict[str, Any] = {}
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. Build typed EvalConfig; CLI flags override everything.
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 = self._resolve_eval_dir()
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. Discover files
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
- # 5. Collect all pending cases across every file
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, global_config)
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
- # 6. Run all cases under a single asyncio event loop
552
- quads = asyncio.run(
553
- self._run_flat_pool(pending, effective_concurrency, effective_parallel)
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
- lambda: ("", [])
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 + [result])
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=global_config.model_dump(),
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "10xscale-agentflow-cli"
7
- version = "0.3.2.5"
7
+ version = "0.3.2.7"
8
8
  description = "CLI and API for 10xscale AgentFlow"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}