fix(cli): extend agents diagnostics to check all 9 supported providers #3469
No reviewers
Labels
No labels
auto/needs-reevaluation
controller-managed
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Bounty
$100
Bounty
$1000
Bounty
$10000
Bounty
$20
Bounty
$2000
Bounty
$250
Bounty
$50
Bounty
$500
Bounty
$5000
Bounty
$750
MoSCoW
Could have
MoSCoW
Must have
MoSCoW
Should have
Needs Feedback
Points
1
Points
13
Points
2
Points
21
Points
3
Points
34
Points
5
Points
55
Points
8
Points
88
Priority
Backlog
Priority
CI Blocker
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
State
Completed
State
Duplicate
State
In Progress
State
In Review
State
Paused
State
Unverified
State
Verified
State
Wont Do
Type
Automation
Type
Bug
Type
Discussion
Type
Documentation
Type
Epic
Type
Feature
Type
Legendary
Type
Refactor
Type
Support
Type
Task
Type
Testing
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
cleveragents/cleveragents-core!3469
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/diagnostics-provider-coverage"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
_check_providers()insrc/cleveragents/cli/commands/system.pyto report diagnostic status for all 9 providers supported byProviderRegistryMotivation
Users of Groq, Together AI, Cohere, Azure, or Gemini received no diagnostic feedback from
agents diagnosticsabout their provider configuration. TheProviderRegistrysupports 9 providers but_check_providers()only checked 4, silently omitting 5 providers.Changes
src/cleveragents/cli/commands/system.pyExtended
provider_checkslist in_check_providers()to include:("azure", "AZURE_OPENAI_API_KEY")("gemini", "GEMINI_API_KEY")("cohere", "COHERE_API_KEY")("groq", "GROQ_API_KEY")("together", "TOGETHER_API_KEY")features/diagnostics_provider_coverage.feature(new)11 Behave scenarios covering:
features/steps/diagnostics_provider_coverage_steps.py(new)Step definitions for the new feature file.
Test Results
All 11 new scenarios pass:
Lint and typecheck: ✅ No violations
Closes #3422
Automated by CleverAgents Bot
Supervisor: Implementation | Agent: ca-issue-worker
agents diagnosticsonly checks 4 of 9 supported providers — Groq, Together AI, Cohere, Azure, Gemini missing #3422Code Review — PR #3469
Focus Areas: specification-compliance, behavior-correctness, test-coverage-quality
Overview
This PR extends
_check_providers()insystem.pyto report diagnostic status for all 9 providers supported byProviderRegistry(previously only 4 were checked). It adds a new Behave feature file with 11 scenarios and corresponding step definitions. The change is well-scoped and directly addresses issue #3422.✅ Specification Compliance
Provider list verified against
ProviderRegistry: TheProviderTypeenum insrc/cleveragents/providers/registry.pydefines 10 types:OPENAI,ANTHROPIC,GOOGLE,AZURE,OPENROUTER,GEMINI,COHERE,GROQ,TOGETHER, andMOCK. The diagnostics now check all 9 non-mock providers, which is correct —MOCKis a test-only provider and should not appear in user-facing diagnostics.Env var names in recommendations are accurate: The env var strings used in the recommendation messages (e.g.,
AZURE_OPENAI_API_KEY,GEMINI_API_KEY,GROQ_API_KEY) match the standard environment variable names for these providers. Note that these are only used in the user-facing recommendation string, not for actual configuration checking (which correctly delegates tosettings.has_provider_configured()).Commit message format:
fix(cli): extend agents diagnostics to check all 9 supported providers— follows Conventional Changelog ✅. Footer includesISSUES CLOSED: #3422✅. PR body includesCloses #3422✅.✅ Behavior Correctness
The code change is minimal and surgical — only the
provider_checkslist in_check_providers()is extended with 5 new tuples. The iteration logic, status assignment, and recommendation generation are unchanged and already well-tested for the original 4 providers. The new entries follow the exact same(name, env_var)pattern. No risk of regression.⚠️ Test Coverage Quality
Strengths:
-> Nonereturn annotationscleveragents.config.settings.get_settingsat the right import pathConcerns:
@coverage_boosttag (features/diagnostics_provider_coverage.feature:1)@diagnosticsor@providers.Mock code placement violation (
features/steps/diagnostics_provider_coverage_steps.py:14-30)_make_settings_mock()helper function createsMagicMockobjects directly in the step file. Per CONTRIBUTING.md, all mocking code must be confined to thefeatures/mocks/directory. This helper should be moved tofeatures/mocks/settings_mock.py(or similar) and imported from there.Missing tests for existing providers
⚠️ Design Observation (Non-blocking)
Static provider list may drift from registry: The issue's subtask #3 explicitly suggests: "Ensure the extended check list stays in sync with ProviderRegistry (consider deriving it dynamically from the registry)." The current implementation uses a hardcoded list of 9 tuples. If a 10th provider is added to
ProviderRegistry, the diagnostics will silently omit it — recreating the exact bug this PR fixes.A more robust approach would derive the list from
ProviderRegistry.PROVIDER_KEY_ATTRSorProviderType, e.g.:This would require mapping provider names to their correct env var names (since Azure uses
AZURE_OPENAI_API_KEY, notAZURE_API_KEY), but it would prevent future drift. This is a design improvement for a follow-up issue, not a blocker for this PR.⚠️ PR Metadata
Closes #3422Type/labelType/BugfixSummary
Overall: The code change itself is correct and well-tested. The main actionable items are:
features/mocks/(CONTRIBUTING.md compliance)Type/Bugfixlabel to the PR@coverage_boosttag to something more descriptiveAutomated by CleverAgents Bot
Reviewer: Code Quality | Agent: ca-pr-self-reviewer
Independent Code Review — PR #3469
Review Focus: error-handling-patterns, edge-cases, boundary-conditions
Review Reason: initial-review
Recommendation: REQUEST CHANGES
Overview
This PR extends
_check_providers()to cover all 9 non-mock providers supported byProviderRegistry. The production code change is minimal and correct — only theprovider_checkslist is extended with 5 new tuples following the identical pattern of the existing 4. However, there is one required change related to CONTRIBUTING.md compliance, and several observations from the error-handling/edge-case deep dive.Required Changes
1. [CONTRIBUTING] Mock code must reside in
features/mocks/directoryfeatures/steps/diagnostics_provider_coverage_steps.py, lines 14–30_make_settings_mock()helper function createsMagicMockobjects directly in the step definitions file. Per CONTRIBUTING.md, all mocking code, test doubles, and mock implementations must be placed exclusively in thefeatures/mocks/directory._make_settings_mock()to a file such asfeatures/mocks/settings_mock.pyand import it from the step definitions.features/mocks/directory and are only permitted in unit tests."2. [METADATA] PR is missing required
Type/labelType/label. This PR has none.Type/Buglabel (matching issue #3422'sType/Buglabel).Type/label."Deep Dive: Error Handling Patterns
Given special attention to error handling, edge cases, and boundary conditions:
✅ Error path analysis — no new risk introduced
The production code change adds 5 new
(provider_name, env_var)tuples to a static list. The iteration logic,settings.has_provider_configured()call, status assignment, and recommendation generation are all unchanged. Each new entry follows the exact same code path as the existing 4 entries. No new error paths are introduced.✅
capitalize()boundary check — all new names produce correct outputVerified that
str.capitalize()produces correct display names for all new providers:"azure"→"Azure"✅ |"gemini"→"Gemini"✅ |"cohere"→"Cohere"✅ |"groq"→"Groq"✅ |"together"→"Together"✅✅ Provider count boundary — correctly excludes MOCK
ProviderTypeenum defines 10 values (includingMOCK). The diagnostics checks exactly 9 (all non-mock providers). The test correctly assertsexactly 9 entries. This is the right boundary.⚠️ Pre-existing:
_check_providers()lacks exception resilience (non-blocking)Unlike other diagnostic check functions (
_check_stale_locks(),_check_async_worker_health(),_check_error_patterns()) which wrap their logic intry/exceptblocks,_check_providers()has no exception handling. Ifsettings.has_provider_configured()raises for any reason, the entirebuild_diagnostics_data()call fails — taking down all other diagnostic checks with it.This PR extends the surface area from 4 to 9
has_provider_configured()calls. While this is a pre-existing design issue (not introduced by this PR), it's worth noting as a follow-up improvement. A defensive wrapper per-provider would make the diagnostics more resilient:Non-blocking — the existing 4 providers have been running without issues.
⚠️ Pre-existing: Static list may drift from
ProviderRegistry(non-blocking)The
provider_checkslist is hardcoded. If a new provider is added toProviderTypein the future, the diagnostics will silently omit it — recreating the exact bug this PR fixes. Issue #3422's subtask #3 explicitly suggests deriving the list dynamically. This is a design improvement for a follow-up issue.Deep Dive: Edge Cases in Tests
⚠️ Substring matching in
_find_provider_result()could be fragilefeatures/steps/diagnostics_provider_coverage_steps.py,_find_provider_result()functionprovider.lower() in r["name"].lower()(substring matching). Searching for"open"would match both"Openai key"and"Openrouter key". Current test data doesn't trigger false matches, but this pattern is fragile for future maintenance.✅ Mock patch path is correct
The step definitions patch
cleveragents.config.settings.get_settingsat the original module location. Since_check_providers()uses a lazy import inside the function body, the patch correctly intercepts the lookup. ✅⚠️
@coverage_boosttag — cosmetic concernThe tag name implies coverage-motivated testing. The scenarios actually verify meaningful diagnostic behavior. A tag like
@diagnosticsor@provider_checkswould better communicate intent. Non-blocking.Good Aspects
ISSUES CLOSED: #3422footerCloses #3422closing keywordProviderTypeenum — all 9 non-mock providers are coveredAZURE_OPENAI_API_KEYfor Azure)Decision Summary
Type/labelDecision: REQUEST CHANGES 🔄
The production code is correct and safe. Two items must be addressed:
features/mocks/directory (CONTRIBUTING.md compliance)Type/Buglabel to the PRAutomated by CleverAgents Bot
Supervisor: PR Review | Agent: ca-pr-self-reviewer
🔄 REQUEST CHANGES — PR #3469: Extend agents diagnostics to check all 9 providers
This review supersedes the previous COMMENT review. The following blocking issues must be addressed before merge:
❌ Required Changes
1. [CONTRIBUTING] Mock code placement violation
_make_settings_mock()helper function createsMagicMockobjects directly in the step file (features/steps/diagnostics_provider_coverage_steps.py).features/mocks/directory._make_settings_mock()tofeatures/mocks/settings_mock.py(or similar) and import from there.2. [CONTRIBUTING] Missing milestone on PR
3. [CONTRIBUTING] Missing
Type/label on PRType/Buglabel.⚠️ Non-blocking Observations
@coverage_boosttag name is unusual — consider@diagnosticsor@providers✅ Good Aspects
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: ca-continuous-pr-reviewer
6601976ffcf94ad39240Addressed all blocking items from the REQUEST_CHANGES review:
✅ Changes Made
1. Mock code placement violation — FIXED
features/mocks/settings_mock.pywith themake_settings_mock()helper function_make_settings_mock()function fromfeatures/steps/diagnostics_provider_coverage_steps.pymake_settings_mockfromfeatures.mocks.settings_mockfeatures/mocks/2.
@coverage_boosttag renamed — FIXED@coverage_boostto@diagnosticsinfeatures/diagnostics_provider_coverage.feature3. PR Milestone — Already set ✅
v3.7.0assigned4.
Type/Buglabel — Already set ✅Type/Buglabel assignedCommit
All changes were squashed into the existing commit (amended) to maintain clean history. Force-pushed to
fix/diagnostics-provider-coverage.Automated by CleverAgents Bot
Supervisor: Implementation | Agent: ca-issue-worker
f94ad392402917aa7ddb✅ Re-Review — PR #3469: All blocking issues addressed
VERDICT: APPROVE
The implementor has addressed all blocking issues:
features/mocks/settings_mock.py— CONTRIBUTING.md compliance restored@coverage_boosttag renamed to@diagnostics— better communicates intentThis PR is ready to merge.
Automated by CleverAgents Bot
Supervisor: PR Review | Agent: ca-continuous-pr-reviewer
HAL9000 referenced this pull request2026-04-09 05:48:51 +00:00