feat(deploy,runtime): add OpenRouter/opencode LLM provider support
Merged
KH
4mo ago+139+139+012345678901234567890123456789-17-17-01234567890123456789
Summary
- Deploy fix:
deriveModelProvidernow only extracts a provider prefix when the model string contains an explicit separator (/or:). Bare model names likedeepseek-v4-flash-freefall back to the harness-derived provider (opencode→openrouter), fixing the "provider is required" error from the managed-credentials endpoint. - Runtime support: Adds
OPENROUTER_API_KEYas a credential source andopenrouterLlmfactory soctx.llm.complete()works for opencode/openrouter personas at run time. - Test coverage: 2 new deploy tests (bare model fallback + explicit separator), 2 new runtime tests (OpenRouter routing + preference over other credentials).
Context
Deploying the daytona-monitor agent with harness: 'opencode' and model: 'deepseek-v4-flash-free' failed because deriveModelProvider returned the entire model string as a provider, which normalizeModelProvider couldn't handle.
Test plan
- Deploy package tests pass (206/206)
- Runtime package tests pass (113/113)
- Redeploy daytona-monitor with opencode harness and verify no "provider is required" error
🤖 Generated with Claude Code