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.
Files changed (182) hide show
  1. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/PKG-INFO +1 -1
  2. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/PKG-INFO +1 -1
  3. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/eval.py +172 -63
  4. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/pyproject.toml +1 -1
  5. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/SOURCES.txt +0 -0
  6. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/dependency_links.txt +0 -0
  7. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/entry_points.txt +0 -0
  8. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/not-zip-safe +0 -0
  9. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/requires.txt +0 -0
  10. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/10xscale_agentflow_cli.egg-info/top_level.txt +0 -0
  11. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/MANIFEST.in +0 -0
  12. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/README.md +0 -0
  13. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow.json +0 -0
  14. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/__init__.py +0 -0
  15. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/__init__.py +0 -0
  16. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/__init__.py +0 -0
  17. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/api.py +0 -0
  18. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/build.py +0 -0
  19. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/init.py +0 -0
  20. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/skills.py +0 -0
  21. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/test.py +0 -0
  22. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/commands/version.py +0 -0
  23. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/constants.py +0 -0
  24. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/__init__.py +0 -0
  25. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/config.py +0 -0
  26. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/output.py +0 -0
  27. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/core/validation.py +0 -0
  28. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/exceptions.py +0 -0
  29. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/logger.py +0 -0
  30. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/main.py +0 -0
  31. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/__init__.py +0 -0
  32. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/defaults.py +0 -0
  33. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/dev/agentflow.json +0 -0
  34. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/dev/graph/__init__.py +0 -0
  35. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/dev/graph/agent.py +0 -0
  36. {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
  37. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/agentflow.json +0 -0
  38. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/auth/__init__.py +0 -0
  39. {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
  40. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/evals/__init__.py +0 -0
  41. {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
  42. {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
  43. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/__init__.py +0 -0
  44. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/agent.py +0 -0
  45. {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
  46. {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
  47. {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
  48. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/graph/state.py +0 -0
  49. {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
  50. {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
  51. {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
  52. {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
  53. {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
  54. {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
  55. {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
  56. {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
  57. {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
  58. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/__init__.py +0 -0
  59. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/cli/templates/prod/tests/conftest.py +0 -0
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/__init__.py +0 -0
  98. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/__init__.py +0 -0
  99. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/__init__.py +0 -0
  100. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/__init__.py +0 -0
  101. {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
  102. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/authorization.py +0 -0
  103. {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
  104. {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
  105. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/auth/permissions.py +0 -0
  106. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/__init__.py +0 -0
  107. {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
  108. {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
  109. {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
  110. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/config/settings.py +0 -0
  111. {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
  112. {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
  113. {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
  114. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/exceptions/__init__.py +0 -0
  115. {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
  116. {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
  117. {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
  118. {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
  119. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/middleware/__init__.py +0 -0
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/core/utils/__init__.py +0 -0
  129. {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
  130. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/loader.py +0 -0
  131. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/main.py +0 -0
  132. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/__init__.py +0 -0
  133. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/a2a.py +0 -0
  134. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/a2ui.py +0 -0
  135. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/__init__.py +0 -0
  136. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/checkpointer/router.py +0 -0
  137. {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
  138. {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
  139. {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
  140. {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
  141. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/__init__.py +0 -0
  142. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/graph/router.py +0 -0
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/media/__init__.py +0 -0
  149. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/media/router.py +0 -0
  150. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/media/schemas.py +0 -0
  151. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/ping/__init__.py +0 -0
  152. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/ping/router.py +0 -0
  153. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/setup_router.py +0 -0
  154. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/__init__.py +0 -0
  155. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/routers/store/router.py +0 -0
  156. {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
  157. {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
  158. {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
  159. {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
  160. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/tasks/__init__.py +0 -0
  161. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/tasks/user_tasks.py +0 -0
  162. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/__init__.py +0 -0
  163. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/callable_helper.py +0 -0
  164. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/media/__init__.py +0 -0
  165. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/media/extractor.py +0 -0
  166. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/media/pipeline.py +0 -0
  167. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/parse_output.py +0 -0
  168. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/response_helper.py +0 -0
  169. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/schemas/__init__.py +0 -0
  170. {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
  171. {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
  172. {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
  173. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/utils/swagger_helper.py +0 -0
  174. {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
  175. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/agentflow_cli/src/app/worker.py +0 -0
  176. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/graph/__init__.py +0 -0
  177. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/graph/react.py +0 -0
  178. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/requirements.txt +0 -0
  179. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/setup.cfg +0 -0
  180. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/tests/test_multimodal_sprint2_extraction.py +0 -0
  181. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/tests/test_sprint4_media_api.py +0 -0
  182. {10xscale_agentflow_cli-0.3.2.5 → 10xscale_agentflow_cli-0.3.2.6}/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.6
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.6
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,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
- 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)
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
- 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
- )
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 global config from agentflow.json
461
- global_eval_cfg: dict[str, Any] = {}
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. 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
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 = self._resolve_eval_dir()
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. Discover files
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
- # 5. Collect all pending cases across every file
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, global_config)
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
- # 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
- )
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
- lambda: ("", [])
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 + [result])
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=global_config.model_dump(),
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
@@ -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.6"
8
8
  description = "CLI and API for 10xscale AgentFlow"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}