feat: add hosted model providers#88247
Conversation
Dependency GuardThis PR changes dependency-related files. Maintainers should confirm these changes are intentional. Changed files:
Maintainer follow-up:
|
Dependency graph change authorizedThis PR includes dependency graph changes. A member of
A later push changes the PR head SHA and requires a fresh security approval. |
|
Codex review: needs real behavior proof before merge. Reviewed May 30, 2026, 1:44 AM ET / 05:44 UTC. Summary PR surface: Source +1011, Tests +255, Docs +196, Config +68, Other -5. Total +1525 across 45 files. Reproducibility: not applicable. this is a feature PR adding hosted provider surfaces, not a bug report with a current-main failure path. Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land only after maintainer approval for Qwen Portal-token support, security approval or removal of dependency graph changes, and sufficient live proof or a narrower split of unproven providers. Do we have a high-confidence way to reproduce the issue? Not applicable: this is a feature PR adding hosted provider surfaces, not a bug report with a current-main failure path. Is this the best way to solve the issue? Unclear: the GMI/Novita and Ollama Cloud additions follow existing plugin patterns, but restoring Qwen Portal-token support conflicts with current removal docs and needs maintainer approval. AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against 344aff383bdc. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +1011, Tests +255, Docs +196, Config +68, Other -5. Total +1525 across 45 files. View PR surface stats
Security concerns:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
|
/allow-dependencies-change intentional new first-class provider plugin manifests for GMI and Novita, plus workspace lock updates; no external runtime dependency added |
18374be to
c9714b9
Compare
|
/allow-dependencies-change intentional new first-class provider plugin manifests for GMI and Novita, plus workspace lock updates; no external runtime dependency added |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c9714b9fca
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| } | ||
|
|
||
| async function buildOllamaCloudProvider(): Promise<ModelProviderConfig> { | ||
| const discovered = await buildOllamaProvider(OLLAMA_CLOUD_BASE_URL, { quiet: true }); |
There was a problem hiding this comment.
Pass Ollama Cloud key into catalog discovery
When a user has a valid Ollama Cloud key, the live catalog still calls the hosted /api/tags path without that key because buildOllamaCloudProvider() invokes the shared Ollama discovery helper with only the base URL. Ollama Cloud's documented direct API requires an Authorization: Bearer $OLLAMA_API_KEY header, so discovery will get an unauthorized/empty response and silently fall back to the three static defaults instead of exposing the hosted model list. Thread the apiKey resolved in the catalog runner into the tags/show requests used for Ollama Cloud discovery.
Useful? React with 👍 / 👎.
|
Verification before merge: Exact local commands run after this patch:
Live provider proof:
CI:
Known proof gaps:
|
* feat(providers): add GMI provider * feat(providers): add Novita provider * feat(providers): add Qwen OAuth provider * feat(providers): add Ollama Cloud provider * docs: add hosted provider pages * test(providers): align qwen catalog result typing
* feat(providers): add GMI provider * feat(providers): add Novita provider * feat(providers): add Qwen OAuth provider * feat(providers): add Ollama Cloud provider * docs: add hosted provider pages * test(providers): align qwen catalog result typing
Summary
qwen-oauthprovider for externally supplied Qwen Portal tokens, including portal payload compatibility, alias auth/catalog metadata, docs, and legacy OAuth doctor guidance.ollama-cloudhosted provider support while preserving local Ollama behavior, plus docs and generated provider/plugin indexes.Verification
node -e "for (const f of ['extensions/gmi/openclaw.plugin.json','extensions/novita/openclaw.plugin.json','extensions/qwen/openclaw.plugin.json','extensions/ollama/openclaw.plugin.json']) JSON.parse(require('fs').readFileSync(f,'utf8')); console.log('json ok')"pnpm format:docs:checkpnpm plugins:inventory:checkpnpm deps:shrinkwrap:changed:checkgit diff --checknode scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json ...touched provider files...node scripts/run-tsgo.mjs -b extensions/gmi/tsconfig.json extensions/novita/tsconfig.json extensions/qwen/tsconfig.json extensions/ollama/tsconfig.json/Users/steipete/Projects/agent-scripts/skills/autoreview/scripts/autoreview --mode localreturned clean before the final test-only type-narrowing fix. Final autoreview accepted one remaining Qwen finding about the discontinued upstream free-tier OAuth path; this PR intentionally supports externally supplied Portal tokens for provider parity rather than an automated OAuth flow.Real behavior proof
Behavior addressed: GMI, NovitaAI, Qwen OAuth/Portal-token, and Ollama Cloud provider routing are available through bundled provider/plugin surfaces.
Real environment tested: Local OpenClaw checkout plus Blacksmith Testbox for generated guards and typecheck lanes; browser session for provider-key acquisition attempts; Ollama Cloud live API.
Exact steps or command run after this patch: Stored a newly generated Ollama Cloud API key in the Molty 1Password service-account vault, then called
https://ollama.com/api/tagswith that key. Ran the local and Testbox commands listed above.Evidence after fix: Ollama Cloud
/api/tagsreturned 39 hosted models, includinggpt-oss:120b,glm-4.7,qwen3-coder:480b,minimax-m2, andminimax-m2.7. Testboxpnpm check:changedreached all generated guards and then failed in unrelated all-typecheck files.Observed result after fix: Provider manifests parse, generated plugin inventory and shrinkwrap are current, docs format is clean, touched provider type/lint probes pass, and autoreview has no accepted provider-implementation defects after the explicit Qwen scope decision.
What was not tested: Live GMI, NovitaAI, and Qwen Portal calls were not completed because no existing 1Password keys were found and the browser sessions were not authenticated/reachable for those providers. Broad Testbox
pnpm check:changedis blocked by unrelated existing type errors insrc/agents/bash-tools.exec-host-node.test.tsandextensions/codex-supervisor/src/plugin-tools.ts.