diff --git a/backend/__tests__/unit/routes/registry.catalog-model-names.test.js b/backend/__tests__/unit/routes/registry.catalog-model-names.test.js new file mode 100644 index 0000000000..42d34c8bf3 --- /dev/null +++ b/backend/__tests__/unit/routes/registry.catalog-model-names.test.js @@ -0,0 +1,25 @@ +// D111 (2026-10-27): we have no GPT model access, and LiteLLM serves the internal +// openai-codex/* and gpt-* aliases with DeepSeek V4 Flash. A catalog entry that +// recommends one of those names tells a reader we run a model we do not. +const fs = require('fs'); +const path = require('path'); +const { PRESET_DEFINITIONS } = require('../../../routes/registry/presets'); + +const GPT_NAME = /(^|\/)(gpt-|codex-mini|o4-mini)|^openai-codex\//; + +describe('catalog model names (D111)', () => { + it('no preset recommends a GPT or openai-codex model', () => { + const offenders = PRESET_DEFINITIONS + .filter((p) => typeof p.recommendedModel === 'string' && GPT_NAME.test(p.recommendedModel)) + .map((p) => `${p.id}: ${p.recommendedModel}`); + expect(offenders).toEqual([]); + }); + + it('the published openclaw manifest lists no GPT or openai-codex model', () => { + const src = fs.readFileSync(path.join(__dirname, '../../../routes/registry/publish.ts'), 'utf8'); + const models = src.match(/name: 'openclaw',[\s\S]*?models:\s*\{[\s\S]*?supported:\s*\[([^\]]*)\][\s\S]*?recommended:\s*'([^']*)'/); + expect(models).not.toBeNull(); + const names = [...models[1].matchAll(/'([^']+)'/g)].map((m) => m[1]).concat(models[2]); + expect(names.filter((n) => GPT_NAME.test(n))).toEqual([]); + }); +}); diff --git a/backend/routes/registry/presets.ts b/backend/routes/registry/presets.ts index 16b22574e0..ce7a6b37dc 100644 --- a/backend/routes/registry/presets.ts +++ b/backend/routes/registry/presets.ts @@ -119,7 +119,7 @@ You are **Research Analyst** — a deep-research specialist who turns raw inform agentName: 'openclaw', description: 'Code-quality-focused collaborator. Reviews diffs, suggests refactors, drafts implementations on request. Reacts to @mentions; no heartbeat.', targetUsage: 'Other agents (Pixel/Theo/Ops) DMing for code work; humans wanting a code-quality second opinion.', - recommendedModel: 'openai-codex/gpt-5.4-mini', + recommendedModel: 'deepseek-v4-flash', requiredTools: [ { id: 'pod-context', label: 'Commonly pod context + memory', type: 'core' }, ], @@ -1116,7 +1116,7 @@ You are **Community Hype Host** — an engagement catalyst. You turn notable pos description: 'Project Manager. Breaks user requests into actionable tasks, assigns to the engineering team, and tracks progress.', targetUsage: 'Coordinating backend, frontend, and devops work on Commonly.', - recommendedModel: 'openai-codex/gpt-5.4', + recommendedModel: 'deepseek-v4-flash', installHints: { scopes: [ 'agent:context:read', @@ -1224,7 +1224,7 @@ If tasks changed, blockers found, or a PR was reviewed → ONE status message us description: 'Backend engineer. Implements Node.js/Express/MongoDB/PostgreSQL tasks on the Commonly codebase via codex.', targetUsage: 'Bug fixes, new API endpoints, database migrations, backend tests.', - recommendedModel: 'openai-codex/gpt-5.4', + recommendedModel: 'deepseek-v4-flash', installHints: { scopes: [ 'agent:context:read', @@ -1316,7 +1316,7 @@ Use the arrays from call #3 (DevPodId) and call #4 (MyPodId) — do NOT re-fetch description: 'Frontend engineer. Implements React/MUI/CSS tasks on the Commonly frontend in-session.', targetUsage: 'UI components, styling fixes, React hooks, frontend tests.', - recommendedModel: 'openai-codex/gpt-5.4', + recommendedModel: 'deepseek-v4-flash', installHints: { scopes: [ 'agent:context:read', @@ -1405,7 +1405,7 @@ Use the arrays from calls #3/#4 — do NOT re-fetch. Skip messages where sender description: 'DevOps engineer. Handles GKE, Docker, CI/CD, Helm, and infrastructure tasks in-session.', targetUsage: 'Deployments, node pool fixes, Helm updates, Kubernetes configs, CI/CD pipelines.', - recommendedModel: 'openai-codex/gpt-5.4', + recommendedModel: 'deepseek-v4-flash', installHints: { scopes: [ 'agent:context:read', @@ -2281,7 +2281,7 @@ You are **Creative Director** — the quality gate. Your job is to make sure wha agentName: 'openclaw', description: 'Ground-truth source for Team-Commonly/commonly. Reads README, docs, recent PRs, open issues, and architecture to answer technical questions from the marketing/strategy team.', targetUsage: 'Answer "what is Commonly?", "what features exist today?", "how does X work?", "what just shipped?"', - recommendedModel: 'openai-codex/gpt-5.4-nano', + recommendedModel: 'deepseek-v4-flash', requiredTools: [ { id: 'pod-context', label: 'Commonly pod context + memory', type: 'core' }, { id: 'acpx', label: 'Coding agent for repo exploration', type: 'plugin', matchAny: ['acpx'] }, @@ -2375,7 +2375,7 @@ Save summary into \`## RepoSnapshot\`. agentName: 'openclaw', description: 'Scans GitHub for trending AI orchestration, agent-harness, and multi-agent projects. Surfaces patterns, novel mechanics, and ideas the team could absorb.', targetUsage: 'Competitive/ecosystem intelligence across LangChain, LlamaIndex, CrewAI, AutoGen, OpenAgent-style projects. Surface adoption trends and novel architectures.', - recommendedModel: 'openai-codex/gpt-5.4-nano', + recommendedModel: 'deepseek-v4-flash', requiredTools: [ { id: 'pod-context', label: 'Commonly pod context + memory', type: 'core' }, { id: 'acpx', label: 'Coding agent for repo exploration', type: 'plugin', matchAny: ['acpx'] }, diff --git a/backend/routes/registry/publish.ts b/backend/routes/registry/publish.ts index c6b5891617..ebee06c4d0 100644 --- a/backend/routes/registry/publish.ts +++ b/backend/routes/registry/publish.ts @@ -152,10 +152,11 @@ publishRouter.post('/seed', auth, async (req: any, res: any) => { context: { required: ['context:read', 'summaries:read', 'messages:write'] }, models: { // Listed here for the marketplace catalog only. Runtime model selection - // happens per-agent in agentProvisionerServiceK8s.ts (dev agents on - // openai-codex/gpt-5.4, community agents on OpenRouter free tier). - supported: ['openai-codex/gpt-5.4', 'openrouter/nvidia/nemotron-3-super-120b-a12b:free'], - recommended: 'openai-codex/gpt-5.4', + // happens per-agent in agentProvisionerServiceK8s.ts. Dev agents keep the + // internal openai-codex/* alias names, which LiteLLM serves with DeepSeek V4 + // Flash since 2026-10-27; community agents are on the OpenRouter free tier. + supported: ['deepseek-v4-flash', 'openrouter/nvidia/nemotron-3-super-120b-a12b:free'], + recommended: 'deepseek-v4-flash', }, runtime: { type: 'standalone',