




















@@ -517,6 +517,75 @@ describe("/model chat UX", () => {
517517expect(reply?.text).not.toContain("missing (missing)");
518518});
519519520+it("hides missing-auth direct provider rows covered by OpenRouter nested model ids", async () => {
521+const reply = await resolveModelInfoReply({
522+directives: parseInlineDirectives("/model status"),
523+provider: "openrouter",
524+model: "google/gemini-3-flash-preview",
525+defaultProvider: "openrouter",
526+defaultModel: "google/gemini-3-flash-preview",
527+cfg: {
528+commands: { text: true },
529+models: {
530+providers: {
531+openrouter: {
532+models: [{ id: "google/gemini-3-flash-preview", name: "Gemini via OpenRouter" }],
533+},
534+},
535+},
536+} as OpenClawConfig,
537+allowedModelCatalog: [
538+{ provider: "google", id: "gemini-3-flash-preview", name: "Gemini 3 Flash" },
539+{
540+provider: "openrouter",
541+id: "google/gemini-3-flash-preview",
542+name: "Gemini via OpenRouter",
543+},
544+],
545+});
546+547+expect(reply?.text).toContain("[openrouter]");
548+expect(reply?.text).toContain("openrouter/google/gemini-3-flash-preview");
549+expect(reply?.text).not.toContain("\n[google]");
550+expect(reply?.text).not.toContain("\n • google/gemini-3-flash-preview");
551+});
552+553+it("keeps explicitly configured direct provider rows next to OpenRouter nested ids", async () => {
554+const reply = await resolveModelInfoReply({
555+directives: parseInlineDirectives("/model status"),
556+provider: "openrouter",
557+model: "google/gemini-3-flash-preview",
558+defaultProvider: "openrouter",
559+defaultModel: "google/gemini-3-flash-preview",
560+cfg: {
561+commands: { text: true },
562+models: {
563+providers: {
564+google: {
565+models: [{ id: "gemini-3-flash-preview", name: "Gemini 3 Flash" }],
566+},
567+openrouter: {
568+models: [{ id: "google/gemini-3-flash-preview", name: "Gemini via OpenRouter" }],
569+},
570+},
571+},
572+} as OpenClawConfig,
573+allowedModelCatalog: [
574+{ provider: "google", id: "gemini-3-flash-preview", name: "Gemini 3 Flash" },
575+{
576+provider: "openrouter",
577+id: "google/gemini-3-flash-preview",
578+name: "Gemini via OpenRouter",
579+},
580+],
581+});
582+583+expect(reply?.text).toContain("[google]");
584+expect(reply?.text).toContain("google/gemini-3-flash-preview");
585+expect(reply?.text).toContain("[openrouter]");
586+expect(reply?.text).toContain("openrouter/google/gemini-3-flash-preview");
587+});
588+520589it("reports Codex runtime auth for OpenAI status rows", async () => {
521590setAuthProfiles({
522591"openai-codex:patrick@example.test": {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。