Skip to content

fix: support Claude OAuth token model discovery for Gigacode/OpenCode#109

Merged
NathanFlurry merged 1 commit intorivet-dev:mainfrom
financialvice:fix/claude-oauth-model-listing
Feb 7, 2026
Merged

fix: support Claude OAuth token model discovery for Gigacode/OpenCode#109
NathanFlurry merged 1 commit intorivet-dev:mainfrom
financialvice:fix/claude-oauth-model-listing

Conversation

@financialvice
Copy link
Contributor

@financialvice financialvice commented Feb 6, 2026

Summary

Support CLAUDE_CODE_OAUTH_TOKEN and ANTHROPIC_AUTH_TOKEN as Anthropic credential sources. When Anthropic's /v1/models rejects OAuth auth, fall back to a hardcoded Claude model set (default, opus, haiku).

Problem

OpenCode model discovery needs CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_AUTH_TOKEN. Without an ANTHROPIC_API_KEY, the /v1/models call fails with OAuth tokens, causing Claude to disappear from provider lists.

Changes

  • agent-credentials/src/lib.rs: Extract CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_AUTH_TOKEN as OAuth credentials (lower priority than API key env vars)
  • sandbox-agent/src/router.rs: Return fallback model list when Anthropic rejects OAuth or returns empty results
  • ARCHITECTURE.md: Document the new env vars

Validation

3 new unit tests + live verified with only CLAUDE_CODE_OAUTH_TOKEN set (no API key):

  • /models returns 3 fallback models
  • /providers includes Claude

@NathanFlurry NathanFlurry merged commit a5a6492 into rivet-dev:main Feb 7, 2026
1 check passed
@NathanFlurry
Copy link
Member

ty!

graphite-app bot pushed a commit that referenced this pull request Feb 7, 2026
## Summary

Fix credential detection bugs and add credential availability status to the API. Consolidate Claude fallback models and add `sonnet` alias.

Builds on #109 (OAuth token support).

Related issues:
- Fixes #117 (Claude, Codex not showing up in gigacode)
- Related to #113 (Default agent should be Claude Code)

## Changes

### Credential detection fixes
- **`agent-credentials/src/lib.rs`**: Fix `?` operator bug in `extract_claude_credentials` - now continues to next config path if one is missing instead of returning early

### API credential status
- **`sandbox-agent/src/router.rs`**: Add `credentialsAvailable` field to `AgentInfo` struct
- **`/v1/agents`** endpoint now reports whether each agent has valid credentials

### OpenCode provider improvements
- **`sandbox-agent/src/opencode_compat.rs`**: Build `connected` array based on actual credential availability, not just model presence
- Check provider-specific credentials for OpenCode groups (e.g., `opencode:anthropic` only connected if Anthropic creds available)
- Add logging when credential extraction fails in model cache building

### Fallback model consolidation
- Renamed `claude_oauth_fallback_models()` → `claude_fallback_models()` (used for all fallback cases, not just OAuth)
- Added `sonnet` to fallback models (confirmed working via headless CLI test)
- Added `codex_fallback_models()` for Codex when credentials missing
- Added comment explaining aliases work for both API and OAuth users

### Documentation
- **`docs/credentials.mdx`**: New reference doc covering credential sources, extraction behavior, and error handling
- Documents that extraction failures are silent (not errors)
- Documents that agents spawn without credential pre-validation

### Inspector UI
- **`AgentsTab.tsx`**: Added credential status pill showing "Authenticated" or "No Credentials"

## Error Handling Philosophy

- **Extraction failures are silent**: Missing/malformed config files don't error, just continue to next source
- **Agents spawn without credential validation**: No pre-flight auth check; agent's native error surfaces if credentials are missing
- **Fallback models for UI**: When credentials missing, show alias-based models so users can still configure sessions

## Validation

- Tested Claude Code model aliases via headless CLI:
  - `claude --model default --print "say hi"` ✓
  - `claude --model sonnet --print "say hi"` ✓
  - `claude --model haiku --print "say hi"` ✓
- Build passes
- TypeScript types regenerated with `credentialsAvailable` field
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants