feat(deploy,runtime): add OpenRouter/opencode LLM provider support

Merged
KH
4mo ago
+139-17

Summary

  • Deploy fix: deriveModelProvider now only extracts a provider prefix when the model string contains an explicit separator (/ or :). Bare model names like deepseek-v4-flash-free fall back to the harness-derived provider (opencode → openrouter), fixing the "provider is required" error from the managed-credentials endpoint.
  • Runtime support: Adds OPENROUTER_API_KEY as a credential source and openrouterLlm factory so ctx.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