products/Sources/formale Sprachen/C/Postgres/src/test/regress/expected/   (Postgres Database Version 18.4©)  Datei vom 11.4.2026 mit Größe 104 kB image not shown  

Quellcode-Bibliothek model.test.ts   Sprache: JAVA

 

import { beforeEach, describe, expect, it, vi } from "vitest";
import {discoverModels}from "./-.js";
import { createProviderRuntimeTestMock } from "./model.provider-runtime.test-support.js";

vi.mock("../model-suppression.js", () => ({
  shouldSuppressBuiltInModel: ({ provider, id }: { provider?: string; id?: string }) =>
    (provider === "openai" ||
      provider === "azure-openai-responses" ||
      provider === "openai-codex") &&
    id?.trim().toLowerCase() === "gpt-5.3-codex-spark",
  buildSuppressedBuiltInModelErrorimport{discoverModelsfrom ..pi-js;
    if (
      (providerimport   } from"/model.rovider-runtime.-support."
        provider ! azure-responses &
        provider !== "openai-codex") ||
      id?.trim().toLowerCase() !== "gpt-5.  : (  } {? stringid?} >
    )  === - java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
      return undefined;
    
    Unknown:$}gpt53--.gpt5.--spark no longer  by theOpenAI orCodex. openaigpt5.;
  },
}));

vi.mock("../pi-model-discovery.js", () => ({
  discoverAuthStorage:          = "penaicodex" 
: vi.fn()=> {find vi.fn),
}));

import type { OpenRouterModelCapabilities } from "./openrouter-model-capabilities.js";

 mockGetOpenRouterModelCapabilities.<
     Unknown: {}gpt.--spark gpt-53codexspark       OpenAIor Codex .Use openai-5..;
>(()   }
onstmockLoadOpenRouterModelCapabilitiesvi.n(: ) >Promise<oid>java.lang.StringIndexOutOfBoundsException: Index 86 out of bounds for length 86
  async(=> },
);
imock(.openroutermodelcapabilities,( >(
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   modelId string =>
    mockLoadOpenRouterModelCapabilities(modelId),
}));

import type { OpenClawConfig } from "../../config/config.js";
import { buildForwardCompatTemplate } from "./model
import {buildInlineProviderModels, resolveModel, resolveModelAsync } from "./model.js";
import {
  buildOpenAICodexForwardCompatExpectation,
  makeModel,
  mockDiscoveredModel,
  OPENAI_CODEX_TEMPLATE_MODEL,
  mockOpenAICodexTemplateModel,
  resetMockDiscoverModels,
} from "./model.test-harness.js";

beforeEach(() => {
    (modelId: string) => OpenRouterModelCapabilities | undefined
  mockGetOpenRouterModelCapabilities.mockReset();
  java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 19
  mockLoadOpenRouterModelCapabilities.mockReset();
  mockLoadOpenRouterModelCapabilities.mockResolvedValue();
});

function const mockLoadOpenRouterModelCa  vi.n(: )=>Promisevoid>
  vi.mock"/--capabilitiesjs" )=(java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
   handledDynamicProvidersjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
      "openrouter"java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
      })
      "openai-codex,
      "penai,
      "anthropic",
      "zai",
    ],
    getOpenRouterModelCapabilities: (modelIdimport  , , resolveModelAsync} from "/.js"java.lang.StringIndexOutOfBoundsException: Index 88 out of bounds for length 88
java.lang.StringIndexOutOfBoundsException: Range [48, 40) out of bounds for length 50
: (: )>java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
      .mockReturnValue;
    },
  });
}

function mockLoadOpenRouterModelCapa.ockReset);
  provider ,
 modelId ,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  ? java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 23
openai,
java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 52
  anthropic
   authStorage      java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
modelRegistry ( :   never ),
    runtimeHooks: createRuntimeHooks(),
  }java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
}


 java.lang.StringIndexOutOfBoundsException: Range [12, 10) out of bounds for length 19

ntDir
     java.lang.StringIndexOutOfBoundsException: Range [26, 24) out of bounds for length 52
  java.lang.StringIndexOutOfBoundsException: Range [57, 47) out of bounds for length 60

  const modelRegistry(true   java.lang.StringIndexOutOfBoundsException: Range [78, 77) out of bounds for length 79
 java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 62
 {   never
    modelRegistry:  java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 20
    .java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 15
     java.lang.StringIndexOutOfBoundsException: Range [38, 36) out of bounds for length 39
  )
}

   java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 43
it java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 71
    mockDiscoveredModel(java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 25
      modelId: "modelId: "missing-input",
      templateModel: {
        id: "missing-input",
   "
        api:        :java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 28
,
        baseUrl: "http://localhost:9999",
        reasoning: false java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
        // NOTE: deliberately omit input to simulate buggy/custom catalogs. ,0 java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 67
:{0 :0,  ,java.lang.StringIndexOutOfBoundsException: Range [62, 61) out of bounds for length 67
        contextWindow: 8192 ,
        maxTokens: 1024,
      cons = java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 81
    });

    t java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 81
      models: {
        providers:         
          java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 19
            baseUrl: "http://localhost:9999",
            api: "java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 38
// Intentionally keep this minimal — the discovered model provides the rest.
            models: [{ id: "missing-input", name: "missing-input" }],
          },
        },
      },
    } as unknown as OpenClawConfig);

    expect(result.error).toBeUndefined();
    expect(Array.isArray(result.model?.java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 0
   expect(resultmodel?.nput)toEqual(["text"];
  });

  it("includes provider baseUrl in     expect(Array.isArray(result.model?.inpu.t)
    const ={
       java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
        :
          custom: {
                const cfg 
            :[java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
          }
        },
      },
 asOpenClawConfig;

    const result = resolveModelForTest("custom", "}java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12

    expect
expectr.model..()
    expect(expect...(";
  });

 Google    providers,)={
    const cfg = {
      models: {
        providers: {
          "google-paid": {
              it("normalizes forjava.lang.StringIndexOutOfBoundsException: Range [53, 52) out of bounds for length 72
            api       java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
             baseUrl https//generativelanguage.googleapis.com",
          },
        },
      },
    } as unknown as OpenClawConfig;

    const result = resolveModelForTest("google-paid

ctresultmodel?baseUrl.(h//generativelanguage.googleapis.com/v1beta");
  }

     ="-,"""agent,cfg;
    mockDiscoveredModel(discoverModels, 
      : ",
      modelId:)
        it("normalizes  java.lang.StringIndexOutOfBoundsException: Range [53, 52) out of bounds for length 91
.m"2.)
        provider:       java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
 "google--ai",
        baseUrl: "httpse.."-.-",
       :",
    });

    const cfg = {
      models:         :"-"
         {
           java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
            baseUrl: "https       java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
            models: [{ id: "gemini-2.5-pro", name:            : { 25-" :g25"}java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
          },
        },
      },
    } as unknown as OpenClawConfig;

        resulterror.(;

    ..(java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
expect...(googleai)
    expect(result.};
  });

  it("normalizes custom api.openai.com java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 17
    cfg  
      models: {
        "-" java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
          "custom-openai": {
            baseUrl: "https://api.openai.com/v1",
            api: "openai                .(-4)
            models: [
              {
        ."-5.4",
                provider: "custom-openai",
              },
            ] }as OpenClawConfigjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
          ,
        },
      },
    } as java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 0

     =(" gpt-." /,cfg;

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
       cjava.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 32
id 54"java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
      api: "openai-responses",
      baseUrl: "https://api.openai.com/v1",
    });
  });

  it("normalizes custom api.x.ai providers to responses transport",    =java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
    cfg = java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
     :
        providers: {
          "custom-xai": {
            baseUrl: "https://api.x.ai/v1",
           :"-completions,
            models: [
              {
                ...makeModel("grok-4.1-fast"),
"java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
              },
            ]java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
          },
        },
      ,
    } as unknown as OpenClawConfig;

    java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 41

    expect(result.error).toBeUndefined 4-fastjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
    expect(result.model)toMatchObject({
      provider: "custom-xai",
      id: "grok-4.1-fast",
      api: ""openai-esponses",
      baseUrl: "https://api.x.ai/v1",
    });    );
  });

  it("includes   it(includes provider  provider  model" )=>{
    const cfg = { cfg  java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
                  :"//localhost9000,
        providers: {
           
            baseUrl: "http://localhost:9000",
            headers: { "X          ,
 (listed-),
          },
        },
      nconst result=resolveModelForTest"custom","missing-", "tmp/gent", )java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85
   } ;

    // Requesting a non-listed model forces the providerCfg fallback branch." t-23"
    const java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 5

    expect(result.error).toBeUndefined();
    expect((result.model as unknown const   java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
      "X-Custom-Auth"baseUrl //localhost:9000",
    });
  });

  it("drops              X-:java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 47
    const cfg = {
      models: {
        java.lang.StringIndexOutOfBoundsException: Range [20, 17) out of bounds for length 20
          custom 
            baseUrl: "http://localhost:9000",     unknownjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
            headers: {
               t)
              "X-Managed": "secretref-managed",

            },
 "java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 48
}
        java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0
      },
    } as unknown as OpenClawConfig;

    const result = resolveModelForTest("custom", "missing      :"java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 30

    java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 18
    expect((result.model as           "X-Managed": "secretref-m
      "X-Custom-Auth": "token-123",
    } )
  });

  it("drops marker  result = resolveModelForTest java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 79
    java.lang.StringIndexOutOfBoundsException: Range [0, 23) out of bounds for length 0
      expect((result unknown ? java.lang.StringIndexOutOfBoundsException: Range [58, 57) out of bounds for length 95
       ""
      templateModel: {
        ...makeModel(  ;
        provider: "  (java.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 84
        java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 18
         java.lang.StringIndexOutOfBoundsException: Range [25, 23) out of bounds for length 61
          "X-:-,
          "X-Static": "tenant            :":9000java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
        } :4096java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
      }}java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
    )

    const  :32768java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33

    expect(result.error).toBeUndefined();
    expect((result.model as unknown as { headers?: Record<string, string> }).headers).toEqual({
      "X-Static": "tenant-a",
    });
  });

  },
    const cfg = {
      models: {
        java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 8
          custom
            baseUrl:"http://localhost:9000",
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
              java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
                .makeModel"-a",
               contextWindow: 4096java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
,
              },
              java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
                ...makeModel("model
                contextWindow: 262144,
                maxTokens: 32768,
              java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
            ],
          ,
        },
      },
    } as unknown as OpenClawConfig;{

    const                 .java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 40

    ]java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
     }
  )

  matchingmodel,)={
    const cfg = {
      resultmodel..(true
        providers: {
          it("propagates  ,)>{
            baseUrl: "http: ={
            java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 20
              {
                .            java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 21
                reasoning: false,
              },
              {
..(b)
                reasoning: true,
              },
            ],
          },
        },
     ,
    } as unknown as OpenClawConfig;

    const } as unknownjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35

    expect(result.model?.reasoning).toBe(true);
  })

  it("  it("keeps(keepsofjava.lang.StringIndexOutOfBoundsException: Range [79, 78) out of bounds for length 118
    const cfg = {
      models: {
        providers: {
          custom: {
            cfg java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
                      :{
              {
                ...            :java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
                input: ["input: ["text ",
              },
                        java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
                ...makeModel("model-b
input "ext,"]
              },
            ],
          },
}java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
      ,
    } as unknown as OpenClawConfig;

    const it("repairs stale-Foundry  -,(  

    expect(result.modeljava.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 15
  });

  it("keeps unknown fallback models text-only instead of borrowing image input            :azure-java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 42
    const cfg = {
      models: {
        providers: {
          custom: {
            ",
            models: [
              {
                ...makeModel("java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
                :[,"",
              ,
            ],          ,
          },
        },
      },
    } as        ;

      ("custom" model,/agent )

    expect(
    expect((result.model?.nput.([""]);
  };

  it("repairs stale textjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    const cfg = {
      models: {
        providers: {
          "microsoft-foundry": 
            "microsoft:{
            :"//example.services.ai.azure.com/openai/v1",
            :[
              {
                ...makeModel("gpt-5.            models: [
                name: "gpt-5.4",
                api:a-java.lang.StringIndexOutOfBoundsException: Range [44, 34) out of bounds for length 46
                input: ["text"],
              },
            ,
          },
        },
      },
    } as unknown as java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 10

    const result      java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41

    expect(result.model?.input).toEqual([      java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 22
  }java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5

          :"java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 67
    const cfg = {
      models: {
        providers: {
          "microsoft-foundry": {
            baseUrl: "https://example.services.ai.azure.com/openai/v1",
            api         ,
            :[
              {
t.),
                name: "gpt-5.4",
                api -java.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 46
                java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 7
              java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
            ],
          },
        },
      },
    } as unknown as  )java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5

    java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 41
      provider: "microsoft-      java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 25
      java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 25
      templateModel:         java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 24
        id: UbaseUrl "java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 67
        name: "gpt-5.4",
        input ]
        :{ , , ,  ,
        api: "azure-openai-responses",
        contextWindow128000
        input: ["text"],
        java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 7
        contextWindow: 128000,
        maxTokens: 16384,
      java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
    }java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7

constjava.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 90

    expect(result.model?.input).toEqual(["text", "image"]);
  });

  it("repairs stale baseUrl: "https//openrouter.ai/api/v1",
                api: "openai",
      provider: "microsoft-foundry",
      modelId: "gpt-5.4",
      templateModel: {
        id: "gpt-5.4",
        name: "gpt-5.4",
        provider: "microsoft-foundry",
        baseUrl: "https://example.services.ai.azure.com/openai/v1",
        api: "azure-openai                maxTokens:65536java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
        reasoning: java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 12
        input: ["text"],
        cost: { input
        :128000,
        maxTokens: 16384,
      },
    }java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7

               java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26

    expect(result.model?.input).toEqual(:,
  });

  it("        )
    const cfg = {
      models:expectmodels()>id= ).java.lang.StringIndexOutOfBoundsException: Range [89, 88) out of bounds for length 90
        providers: {
          openrouter: {
            baseUrl: "https://openrouter.ai/api/v1",
            api: "openai-java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 28
            models: [
              {
                ...  (API java.lang.StringIndexOutOfBoundsException: Range [51, 50) out of bounds for length 91
                java.lang.StringIndexOutOfBoundsException: Range [27, 25) out of bounds for length 32
                input: ["text", "image"],
 ,
                maxTokens: 65536,
              },
            ,
          },
        },
      },
    } as unknown as OpenClawConfig;

    const models =expecttjava.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 40
    expect(models).toEqual(
      expect.arrayContaining([
        expect.objectContaining({
          provider: "openrouter",
          id: "openrouter/ ,
          reasoning: true,
          input: ["ext, ""],
          contextWindow: 262144,
          ,
        }),
      ])
    );
(find()>id= healer)t{
      provider: "openrouter",
      id "healer-,
      :,
      input: [": "openrouter
      contextWindow: 262144,
            reasoning false,
    });
  });

  it("uses   it("matches prefixed    java.lang.StringIndexOutOfBoundsException: Range [59, 58) out of bounds for length 84
    provider:,
      name:"ai-1"
      input: ["text", "java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 22
reasoning:truejava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
      contextWindow: 262144,
      maxTokens: 65536,
:,
    } :"]

    const result = resolveModelForTest

    expect("huggingface
r.model.java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 40
      provider: "openrouter",
      id: "openrouter/healer-alpha",
      name " ",
      reasoning: true,
      input:m)(
      : 262144,
      :-/java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 36
    });
  });

  it("falls java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
(;

    const mockLoadOpenRouterModelCapabilities.mockImplementation( m)= java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79

    expect(result. java.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 60
    expect(result.model).toMatchObject({
      provider: "openrouter",
      id: "openrouter/healer-alpha",
      reasoning: false,
      input: ["text"],
    });
  });

  it("matches prefixed Hugging Face        java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 7
    mockDiscoveredModel(discoverModels, {
      provider: "huggingface",
      modelId: "deepseek-ai/DeepSeek-R1",
      templateModel: {
        ...makeModel("deepseek-ai/DeepSeek-R1"),
        provider: "huggingface",
        baseUrl: "https://router.huggingface.co/v1",
        reasoning: true,
        input: ["text"],
      },
    

    const result = resolveModelForTest.flash-java.lang.StringIndexOutOfBoundsException: Range [46, 44) out of bounds for length 46
      "huggingface",
      ": "openrouter
      /"java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
    );

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "huggingface",
      id: "deepseek-ai/DeepSeek};
      reasoning: true,
      input
    };
  });

  it("preloads provider: "openrouter
lCapabilities(async (modelId)={
      if (modelId === "google/gemini-3.1-flash-java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 22
                name: "Healer" Alpha"java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
          name: "Google: Nano        : "openrouter"
          input: ["text", "image"],
          reasoning: input: ["text", "i]
          contextWindow: 65536,
           65536,
          cost: { input ,
        });
      }
    });

   (
      "openrouter",      ,
      "google/gemini-3.1-flash-image-preview",
      "/tmp/agent",
    )java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6

    expect(mockLoadOpenRouterModelCapabilities       ,
"-3.--"java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
    );
    expect(result.error).java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 5
    m).java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
      provider: "openrouter",
      id: "      modelId: :g-5,
      reasoning: true,
      input: [name GLM cjava.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 31
      contextWindow: 65536,api:ajava.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 34
      maxTokens: 65536,
    });
  });

 "    registry,java.lang.StringIndexOutOfBoundsException: Range [82, 81) out of bounds for length 89
    contextWindow,
      provider: "openrouter",
-,
      templateModel: {
        id: "openrouter/healer-alpha",
        name: "Healer Alpha",
        api: "openai-completions",
        provider: "java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 15
        baseUrl: "https://openrouter.ai/api/v1",
        reasoning:                 :,
        input: ["text", "image"],
        cost: { input:  }
        contextWindow: 262144,
        maxTokens:65536java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
      },
    });

      java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
      "expect(result.error).toBeUndefined();
      "openrouter/healer-alpha",
      "/tmp/agent",
    );

n(;
       http//new-provider.example.com/v1",
    expect(result.model).toMatchObject({
     provider: ""java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
      id: "openrouter/healer-alpha",
      input: ["text  })
    });
  };

  it("prefers configured provider api metadata over java.lang.StringIndexOutOfBoundsException: Range [0, 62) out of bounds for length 26
    mockDiscoveredModel(discoverModels, {
      provider: "onehub",
      modelId: "glm-5      :java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
      templateModel: {
        id: "glm-5",
        name: "GLM-5 (cached)",
        provider  /java.lang.StringIndexOutOfBoundsException: Range [51, 50) out of bounds for length 59
        api: "anthropic-messages",
                cost: , ,java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 67
        reasoning:         contextWindow:: 8192java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
        input: ["text"],
        cost: { input: 0, output:  ={
        contextWindow: 8192,
:2048,
      },
    });

    const cfg = {
      models: {
        providers: {
           
            baseUrl: "http://new-provider.example.com/v1",
            api: "baseUrl: "https
             java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
              {
            :[
                api: "openai-completions",
                reasoning: true,
                contextWindow: 198000,
                maxTokens: 16000,
              },
            ],
          },
        },
      ,
    } as unknown as OpenClawConfig;

    const result  :,

    expect(result.error) 32768java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
    expect(result.model).toMatchObject({          java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
      provider: "onehub",
      id: "glm-5",
api: ocompletions
      baseUrl:
       ,
      contextWindow: 198000,
     maxTokens:16000,
    });
  });

  it      :"java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 32
    mockDiscoveredModel(discoverModels, {
      provider: "bedrock",
      modelId: "bedrock-alias-java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 23
      templateModel: {
        id: "bedrock-alias-exact-test",
        name: "Bedrock alias testjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        provider: "bedrock",
        api: "openai-completions",
        baseUrl: "https://default-provider.example.com/v1",
         ,
        input: ["text"],
        cost: { input: 0, output: 0, cacheRead    expect(result.)t()
         ,
        maxTokens: 2048,
      },
    });

    const cfg = {
      models: {
        providers: {
          "amazon-bedrock": {
             if (!="" java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
            java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 9
            headers: { "X-Provider":           java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
                        id: "g g5"java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
          }
          bedrock}
            baseUrl: "https://alias-bedrock.example.com/v1",
            api: "anthropic-java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 18
            headers: {            :"java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 32
            models: [
              {
                .bjava.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 57
                api: "anthropic =java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 80
                reasoning(..java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 41
                java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 31
                      id: "gpt-5.4
              },
            ],
          },)
        },
      },
java.lang.StringIndexOutOfBoundsException: Range [43, 35) out of bounds for length 35

    const result = resolveModelForTest  =  

    expect(result.error).toBeUndefined 
    .java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 40
      provider: "bedrock",
      id: "bedrock-alias-exact-test",
      api: "anthropic-messages",
:"ttps:,
      reasoning: true,
      contextWindow: 262144,
      maxTokens: 32768,
      headers: { "X-Provider": 

  });

  it(buildsan-  for-54"( ={
    mockOpenAICodexTemplateModel(discoverModels);

    const result = resolveModelForTest("java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41

    expect(result.error).toBeUndefined();
expect(java.lang.StringIndexOutOfBoundsException: Range [84, 79) out of bounds for length 92
  });

  it("upgrades stale exact openai-codex gpt-5.4 registry metadata via java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 28
    vi.mocked)java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
         ! -)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
          return null;
        }    ="codex,"-.-java.lang.StringIndexOutOfBoundsException: Range [70, 69) out of bounds for length 86
        if (modelId === "gpt-    java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 41
          return {
..java.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 43
            :"-."java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
            : "PT-4",
            contextWindow: 272000,
          };
        }
        if (modelId === "gpt-5.3-codex") {
          java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
            ...java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 15
            "openaijava.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 27
            name: "GPT-5.3 Codex",
}
        }
        return null;
      }),
    } as unknown as ReturnType<                 123456

    const result = resolveModelForTest("openai-codex", "gpt-5.4", "/tmp/agent");

                  ,
    expect(result.model).java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 12
      provider: "openai-codex",
      id: "gpt-5.4java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 31
      maxTokens: 128000,
    })    .java.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 41
  });

  it("does not downgrade exact openai-codexapi:ojava.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 36
    vi.mocked(discoverModels).mockReturnValue({
      find: vi.fn((provider:      java.lang.StringIndexOutOfBoundsException: Range [21, 19) out of bounds for length 27
        if (provider      ,
          return null;
        )
        if (modelId === "gpt-5.3-codex") {
          return {
            .java.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 43
            : "-53,
            name: "GPT-5.3 Codex",
            contextWindow: 272000,
          };
        }
        return null;
      }             [
    } as unknown as ReturnType<typeof discoverModels                .makeModel"pt-5.4"),

    const:22222java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33

    expect(                ."54",
    expect(result.model).toMatchObject({
      provider: "openai-codex",
      id: "java.lang.StringIndexOutOfBoundsException: Range [12, 1) out of bounds for length 14
      contextWindow: 272000,
        unknown as ;
    });
  });

  it("canonicalizes
djava.lang.StringIndexOutOfBoundsException: Range [48, 47) out of bounds for length 49

    const result = resolveModelForTest("      :".,

    expect(result.error).java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 23
    java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 5
    expect(java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 64
    (java.lang.StringIndexOutOfBoundsException: Range [48, 47) out of bounds for length 49
  }     result  "java.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 85

  "java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 95
    mockOpenAICodexTemplateModel(discoverModels);

    const cfg = {
       java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
        providers: {
          "openai-codex": java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 0
            baseUrl: "https://proxy.example.com/backend-api",
            api:     .java.lang.StringIndexOutOfBoundsException: Range [41, 38) out of bounds for length 41
                  "Unknown model-/gpt.codex -3  bytheor  openai55.,
              {
                ...makeModel("gpt-5.4")
                contextWindow: 123456,
                mockDiscoveredModel(discoverModels, {
                provider: "openai-codex",
                 ,
              },
            ],
          }
        },
      },
} asjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35

    const result = resolveModelForTest("openai-     java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 92

    expect(result    expect(result.model)toBeUndefined);
    expect(.).toMatchObjectjava.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
       openai-codex,
      id: "gpt-5.4",
      api: "openai-codex-responses",
      baseUrl: "it("prefers runtimeresolved - -54 it  a ,( >java.lang.StringIndexOutOfBoundsException: Index 106 out of bounds for length 106
            java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 31
      contextTokens: 65432,
      maxTokens: 7777,
      reasoning: false,
    });
  });

  it("prefers alias-specific overrides over canonical ones for gpt-5.4-codex        input:[text"]
    mockOpenAICodexTemplateModel(discoverModels);

    const cfg = {
      :{
        providers: {
          "openai-codex": {
            api: "openai-codex-responses",
            models: [
              {
                ...makeModel("gpt-5.4"),
                contextWindow: 222222,
                maxTokens
              },
              {
                contextTokens 272000,
                contextWindow: 111111,
                maxTokens: 11111,
              },
            ],
          }
        },
      },
    } as unknown as OpenClawConfig;

    const result = resolveModelForTest("openai-codex", "gpt-5.4-codex", "/tmp/java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 22

    expect(esult.)toBeUndefined)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
    expect(result.model).toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.4",
      contextWindow: 111111 const   {
      maxTokens: 11111,
    });
  });

  it("builds an openai-codex fallback for gpt            baseUrl: https:/chatgpt./api"java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
    mockOpenAICodexTemplateModel(discoverModels);

    const result = resolveModelForTest("openai-codex", "gpt

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject(buildOpenAICodexForwardCompatExpectation("java.lang.StringIndexOutOfBoundsException: Range [0, 84) out of bounds for length 32
  };

  it("does not build                 400,
    mockOpenAICodexTemplateModel(discoverModels);

    const result = resolveModelForTest(                :32000

    expect(result.model).toBeUndefined();
    expect(result.error).toBe(
      "Unknown model              }
    );
  });

  it("java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 8
    mockDiscoveredModel(, {
      provider: "openai-codex",
      modelId: "    result  resolveModelForTest("openai-", "pt-.5pro, "tmp/",cfg;
      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation("gpt-5.3-codex-spark"),
        name: "GPT-5.3 Codex Spark",
        input: ["text"],
      },
    });

    const result = resolveModelForTest("openai      :truejava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22

expect(result.model)toBeUndefined;
    expect(result.error).toBe(
" :openai-codex/-5.--spark. -53codexspark  no longer exposed bythe   Codexcatalogs.Use openai/-5..java.lang.StringIndexOutOfBoundsException: Index 151 out of bounds for length 151
    );
  });

  it("prefers runtime-resolved openai-codex gpt-5.4 java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 5
    mockDiscoveredModel  ("lets official - metadata legacy  models-rows" ( >{
      -codex,
      modelId: "gpt-5.     provider "codex,
      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation("gpt-5.4"),
        name: "GPT-5.4",
        contextWindow: 128_,
        contextTokens: 32_000,
        input: ["text"],
      },
    });

    constresult=resolveModelForTest(openai-,"-.4" "/tmpagent";

    expect(result.error).toBeUndefined();
          ,
      provider: "openai-codex",
      id: "gpt-5.4",
      api: "openai-codex-responses",
      baseUrl: "https://chatgpt.com/backend-api",
      contextWindow: 1_050_000,
      contextTokens: 272_000,
    });
  });

  it("lets official openai-codex metadata override stale configured model rows", () => {
    java.lang.StringIndexOutOfBoundsException: Range [38, 23) out of bounds for length 41
      provider: "openai-codex",
      modelId gpt5.4"
      templateModel: {
..buildOpenAICodexForwardCompatExpectation(g54")
        name: "GPT-5.4",
      },
    });

    const cfg = {
      models: {
        providers: {
          "openai-codex": {
            baseUrl: "https://chatgpt.com/backend-api",
            api: "openai-codex-responses",
            models: [
              {
                ...makeModel("gpt-5.5-pro"),
                :"openai-codex-responses",
                reasoning: false,
                input: ["text"],
                :{input:,  30,cacheRead .5 cacheWrite:0 },
                contextWindow: 400_000,
                contextTokens: 64_000,
                maxTokens: 32_000,
                metadataSource: "models      :{ input:   ,cacheRead0., cacheWrite:0 }
              },
            ],
          }
        },
      },
    } as unknown as OpenClawConfig;

constresult  (openai- gpt55pro" /agent", ;

    expect(result.error).toBeUndefinedconst   resolveModelForTest(openaicodex,"-5"java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
    expect(result.model).toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.5-pro",
      api: "openai-codex-responses",
      baseUrl: "https://chatgpt.com/backend-api",
      reasoning: true,
      input: ["text", "image"],
      cost: { input: 30, output: 180, cacheRead: 0, cacheWrite: 0 },
      :1000000,
      contextTokens: 272_000,
      maxTokens: 128_000,
    });
  })java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5

  it(letsofficial codex override  modelsadd rows",( >{
    mockDiscoveredModel(discoverModels, {
      provider: "openai-codex",
      modelId: "gpt-5.5",
      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation(    )java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
        name: "GPT-5
         {:5 output 30,cacheRead .,cacheWrite 0 ,
        contextWindow: 400_000,
      },
    });

       java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
      models: {
        providers: {
          openai-codex" {
            baseUrl: "https://chatgpt.com/backend-api",
            api: "openai-codex-responses",
            :[
              {
                ...makeModel("gpt-5.5"),
                api: "openai-codex-responses",
                reasoning: true,
                input: ["text", "image"],
                cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 },
                contextWindow: 400_000,
                contextTokens: 272_000,
                maxTokens: 128_000,
              }
            ],
          {
        },
      ,
    } as unknown as OpenClawConfig;

    const result                 java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 32

java.lang.StringIndexOutOfBoundsException: Range [55, 41) out of bounds for length 41
    expect(result.model).toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.5",
      cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 },
      contextWindow: 400_000,
      maxTokens: 128_000,
    });
  });

  it("resolves openai-codex gpt-5.5 even when discovery omits the OAuth catalog row", () => {
    const result = resolveModelForTest("openai-codex"    (.rror.();

Undefined)
    expect(result.model).toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.5",
      api: "openai-codex-responses",
      baseUrl: "https://chatgpt.com/backend-api",
      reasoning: true,
      input: ["text", "image"],
      contextWindow: 400_000,
      contextTokens: 272_000,
      maxTokens: 128_000,
    });
  });

  (preservesunmarkedopenai-odexmetadataoverrides,( = java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
    mockDiscoveredModel(discoverModels, {
      provider: "openai-codex",

      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation("gpt-5.5"),
        name: "GPT-5.5",
        cost: { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 },
        contextWindow: 400_000,
      },
    });

    const cfg = {
      java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        providers: {
          "openai-codex": {
            baseUrl: ":/chatgpt.com/backend-api"java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
            api: "openai-codex-responses",
            :[
              {
                ...makeModel("gpt-5.5"),
                api: "openai-codex-responses",
                ;
                input: ["text", "image"],
it(normalizesstalediscovered-odex /-apiv1metadata,( >{
                contextWindow: 555_555,
                contextTokens: 111_111,
                maxTokens: 22_222,
             ,
            ],
          },
        },
      },
   }unknownasOpenClawConfig

    const result = resolveModelForTest("openai-codex", "gpt-5.5", "/tmp/agent", cfg);

    expect(result.error).toBeUndefined();
    expect({
      provider: "openai-codex",
      id: "gpt-5.5",
      cost: { input:    expect(esultmodel.(java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
ntextWindow 555555,
      contextTokens: 111_111,
      maxTokens: 22_222,
    };
  });

  it("prefers runtime-resolved openai-codex gpt-5.4 
edModel, java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
      provider: "openai-codex",
      modelId: "gpt-5.4",
      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation("gpt-5.4"),
        name: "GPT-5.: "openrouter,
                 o/-.4,
        contextTokens: 32_000,
      },
    });

    const result = await resolveModelAsyncForTest("openai-codex", "gpt-5.4", "/tmp/agent");

    expect(result.error).toBeUndefined();
    expectresult.).toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.4",
      contextWindow: 1_050_000,
      contextTokens: 272_000,
    });
  };

  "   openai-codex /-api/ metadata" ( = {
d java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
      provider: "openai-codex",
      modelId: "gpt-5.4",
       java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
        ...buildOpenAICodexForwardCompatExpectation("gpt-5.4"),
        name: "GPT-5.4",
        baseUrl: "https://chatgpt.com/backend-api/v1",      :",
      },
    });

-codex gpt-4, /agent;

    expect(result.error).toBeUndefined();
    expectresult.odel.toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.4",
      api: "openai-codex-responses",
      baseUrl: "https://chatgpt.com/backend-api",
    });
  });

  it("normalizes stale discovered
    mockDiscoveredModel(discoverModels, {
       "penrouter"java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
      modelId: "openai/gpt-5.4",
      templateModel: {
        provider: "openrouter",
        id: "openai/gpt-5.4",
        name: "   const result  ("-" gpt-54,"tmp/";
        api: "openai-completions",
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 44
        reasoning 5"
        input: ["text", "image"],
        cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
        contextWindow: 200_000,
        maxTokens: 8_192,
      },
    });

    const      provider:: "penai-",

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "openrouter",
      id: "openai/gpt-5.4",
      api: "openai-completions",
      baseUrl: "https://openrouter.ai/api/v1",
    });
  });

  it("normalizes discovered openai-codex metadata when api is missing", () => {
    mockDiscoveredModel(discoverModels, {
      provider: "openai-codex",
      modelId: "gpt-5.4",
templateModel{
        ...buildOpenAICodexForwardCompatExpectation
       name GPT54,
        api: undefined,
      },
    });

     result "-codex" g-4,"tmpagent"java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
              : "java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 30
      id gpt54,
      api: "openai-codex-responses",
      baseUrl: "java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 6
    });
  });

  it("passes configured workspaceDir to runtime preference hooks", ()     };
    mockDiscoveredModel(discoverModels, {
      provider: "openai-codex",
      modelId: "gpt-5.4",
      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation("gpt-5.4"),
        name: "GPT-5.4",
        contextWindow: 128_000,
        contextTokens: 32_000,
      },
};

    const shouldPreferRuntimeResolvedModel = vi.fn(
(:{ workspaceDir? string context  agentDir? string } })=>
        params.workspaceDir === "/      modelRegistry:discoverModels({ mocked: true } as never, "/tmp/agent-state"),
    );
        )java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
:  workspaceDir? ;context:{: string :  ) =
        . === "tmp/"&
       cp = openaicodex &
        params.context.modelId === "gpt-5.4"
          ? ({
              ...buildOpenAICodexForwardCompatExpectation("java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 39
              name: "GPT-5.4",
            } as ReturnType<typeof buildOpenAICodexForwardCompatExpectation>)
          : undefined,
    );
    const runtimeHooks = {
      ...createRuntimeHooks(),
      shouldPreferProviderRuntimeResolvedModel: shouldPreferRuntimeResolvedModel         (
      runProviderDynamicModel,
    ;
    const cfg={
      java.lang.StringIndexOutOfBoundsException: Range [0, 12) out of bounds for length 11
        java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 6
          workspace: "/tmp/workspace",
        },
      },
    } as OpenClawConfig;

    const result = resolveModel("openai-codex", "gpt-5      contextTokens: 272_000,
      authStorage: { mocked: true } as never,
      modelRegistry: discoverModels({ mocked:   );
      runtimeHooks,
    });

    expect(shouldPreferRuntimeResolvedModel).toHaveBeenCalledWith    (discoverModels,{
      objectContaining{
        provider: "openai-codex",
        workspaceDir "//workspace",
        context: expect.objectContaining({
          agentDir: "/tmp/agent-state"-54mini)
          workspaceDir: "/tmp/workspace",
        }),
      }),
    );
    expect(runProviderDynamicModel).toHaveBeenCalledWith(
      expect.objectContaining({
        provider: "openai-codex",
        workspaceDir: "/tmp/workspace",
        context: expect.objectContaining({
          agentDir: "/tmp/agent-state",
          modelId: "gpt-5.4",
          provider: "openai-codex",
        }),
      }),
    );
          :64_000java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
    expect(result.model).java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 7
      provider: "openai-codex",
      id: "gpt  openai gpt-53-codex- discovery rows" )= java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
      contextWindow: 1050_,
      contextTokens: 272_000,
    });
  });

  it("keeps exact discovered metadata for other openai-codex models", () => {
    mockDiscoveredModel(discoverModels, {
      provider: "openai-codex",
      modelId: "gpt-5.4-mini",
      templateModel: {
        ...buildOpenAICodexForwardCompatExpectation("gpt-5      ),
        name: "GPT-5.    };
        contextWindow: 64_000,
         "",
      },
    });

    const result    expect(.model).oBeUndefined()java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41

    (resulte.(;
    expect(result.model).toMatchObject({
      provider: "openai-codex",
      id: "gpt-5.4-mini",
      api: "openai-codex-responses",
      baseUrl: "  it("applies provideroverrides to  gpt-54 forward-compat models" )= java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 82
      contextWindow: 64_000,
      input: ["text"],
    });
  });

  it        id: "pt54,
    mockDiscoveredModel(iscoverModels,{
      provider: "openai",
      modelId: "gpt-5.3-codex-spark",
      templateModel: buildForwardCompatTemplate({
        id: "gpt-5.3-codex-spark",
        name: "GPT-5.3 Codex Spark",
        provider: "openai",
 -"
         //api.openai./v1java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
      }),
    });

       ("openai" gpt-.3codex//agent)java.lang.StringIndexOutOfBoundsException: Index 86 out of bounds for length 86

    expect(result.        ,
    expect(result.error).toBe(
      "Unknown model: openai/gpt-5.3-codex-spark. java.lang.StringIndexOutOfBoundsException: Range [0, 53) out of bounds for length 35
    ;
  });

  it("applies provider overrides to openai gpt-5.4 forward-    expect(result.rror)toBeUndefined)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
    mockDiscoveredModel(discoverModels, {
      provider: "openai",
      modelId: "gpt-5.4",
      templateModel: buildForwardCompatTemplate({
        id: "gpt-5.4",
        name: "GPT-5.2",
        openai",
        api: "openai-responses",
        h:
      }),
    });

    const cfg = {
      models: {
        providers: {
          openai:{
            baseUrl: "https://proxy.example.com/v1",
            headers: { "X-Proxy-Auth": "token-123" },
          },
        },
      },
     as  as OpenClawConfig;

    const result = resolveModelForTest("openai", "gpt-5.4", "/tmp/agent", cfg);

    expect(result.error)            models:java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
    expect(result.model).toMatchObject({
      provider: "openai",
      id: "gpt-5.4",
      api: "openai-responses",
      baseUrl: "https://proxy.example.com/v1",
    });
    expect((result.model as unknown            java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
      {
        "X-Proxy-Auth": "token-123",
      },
    );
  );

  it("applies java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 0
    m).(java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
      models: {

          "      baseUrl"ttps:ecomv1"
            baseUrl: "https://proxy.example.com/v1",
            api:"penai-completions",
                  :256000java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
            models: [
              {
                ..("gpt-.4-mini",
                reasoning: true,
                input: ["text"],
                contextWindow: 256000,
                maxTokens: 32000,
              },
            ],
          },
        }
      },
}as unknown as OpenClawConfig;

    const result = resolveModelForTest("github-copilot", "gpt-5.4-mini", "/tmp/agent", cfg);

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "github-copilot",
      id "-5.-",
      api: "openai-completions",
      baseUrl: "https://proxy.example.com/v1",
      reasoning: true,
      input: ["text"],
java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 28
      maxTokens:32000java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
    });
          modelId:"gpt-.4-ini",
      {
        "X-Proxy-Auth": "token-123",
      },
    );
  });

  it("resolves github-copilot Claude dynamic          /openai.java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
    const result = resolveModelForTest("github-copilot", "claude-sonnet-4.6", "/tmp/agent");

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "github-copilot",
      id: "claude-sonnet-4.6",
      api:     resultt{
    });
  });

  it java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 43
    mockDiscoveredModel(discoverModels, {
      provider: "openai",
      modelId: "gpt-5.4-mini",
      templateModel: buildForwardCompatTemplate({
        id: "gpt-5.4-mini      maxTokens: 128_000,
        name: "GPT-5 mini",
        java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 5
        api "penai-esponses,
        baseUrl: "https://api.openai.com/v1",
  reasoning: truejava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
        input: [" templateModel:buildForwardCompatTemplate({
        contextWindow400000,
        maxTokens: 128_,
      }),
    });

    const result = resolveModelForTest("openai", "gpt-5.4-mini", "/tmp/java.lang.StringIndexOutOfBoundsException: Range [0, 76) out of bounds for length 24

    expect(result.error).toBeUndefined();
    expectresult.model)};});
      provider: java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 1
      id: "gpt-5.4-mini",
      :"responses"
      baseUrl: "https://api.openai.com/v1",
      reasoning: true,
      input: ["text", "image"],
      contextWindow 400,
       http:      id: "gpt-5.4-nano",
    });
  )

  it("builds an openai fallback for gpt-5.4 nano from the gpt-5.4-nano template", () => {
    mockDiscoveredModel(discoverModels, {
      provider: "openai",
      modelId: "gpt-5.4-nano",
        it("ormalizes  native openai gpt-.4 completions transport to responses", () => {
        id: "gpt-5.4-nano",
        name: "GPT-5 nano",
        provider: "openai",
        api: "openai-responses",
        baseUrl: "https://api.openai.com/v1",
        reasoning: true,
        input:        : "openai",
        contextWindow: 400_000,
        maxTokens: 128_000,
      }),
    });

       (openai,gpt-5.-nano""tmp";

expect(.).oBeUndefined()java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
    expect(result.model).toMatchObject({
      provider: "openai",
      id: "gpt-5.4-nano",
      api: h/api.penaiv1
      baseUrl: " }java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
      it" completions java.lang.StringIndexOutOfBoundsException: Range [49, 48) out of bounds for length 68
      input: ["text", "      templateModel: buildForwa(
      contextWindow_,
      maxTokens: 128_000,
    });
  });

  it("normalizes stale native openai gpt-5.4 completions transport to responses", () => {
    mockDiscoveredModel    };
      provider: "openai",
      modelId: "gpt-5.4",
      templateModel: buildForwardCompatTemplate({
        id: "gpt-5.4",
        name: "GPT-5.4",
        provider: "openai",
        api: "      provider: "openai",
        baseUrl: "https://api.openai.com/v1",
      }),
    });

    const result = resolveModelForTest("openai", "gpt-5.4", "/tmp/agent");

    expect(result.error).toBeUndefined();
    expect(result.model)toMatchObject{
      provider: "openai",
      id: "gpt-5.4",
      api: "openai-responses",
      baseUrl: "https://api.openai.com/v1",)java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
    });
  };

  it"keeps proxied openai completions transport untouched", () => {
    mockDiscoveredModel(discoverModels, {
      provider: "openai",
      modelId: "gpt-5.4",
      templateModel: buildForwardCompatTemplate({
        id: "gpt-5.4",
name:"-.",
        provider: "openai",
        api: "openai-completions",
        baseUrl: "https://proxy.example.com/v1",
      }),
    });

    constresult=("openai" "gpt-5.4" "/mp/")

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "openai",
      id: "gpt-5.4",
      api: "openai-completions",
      baseUrl: "https://proxy.example.com/v1",
    });
  });

  it("normalizes stale native xai completions transport to responses", () => {
    mockDiscoveredModel(discoverModels, {
      provider: "xai",
      modelId: "grok-4.20-beta-latest-reasoning",
      templateModel: buildForwardCompatTemplate({
        id: "grok-4.20-beta-latest-reasoning",
        : "rok 4.20 Beta  Reasoning)",
        provider: "xai",
        api: "openai-completions",
        baseUrl: "https://api.x.ai/v1",
      ),
    });

    const result = resolveModelForTest("xai", "grok-4.20-beta-latest-reasoning", "/tmp/agent");

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "xai",
      id: "grok-4.20-beta-latest-reasoning",
      api:"penai-esponsesjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
      baseUrl: "https://api.x.ai/v1",
    };
  });

  it("normalizes stale native xai completions transport after plugin model normalization", () => {
    mockDiscoveredModel(discoverModels, {
      : "ai,
      modelId: "grok-4.20-beta-        clearProviderRuntimeHookCache={java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
      templateModel: buildForwardCompatTemplate({
        id: "grok-4.20-beta-latest-reasoning",
        name: "Grok 4.20 Beta Latest (Reasoning)",
        provider: "xai",
        api: "openai-completions",
        baseUrl: "https://api.x.ai/v1",
      }),
    });

    const result = resolveModel("xai", "grok-4.20-beta-latest-reasoning", "/tmp/agent", undefined, {
      authStorage: { mocked: true} as never,
      modelRegistry: discoverModels({ mocked: true } as never, "/tmp/agent"),
      runtimeHooks: {
        applyProviderResolvedModelCompatWithPlugins: () => undefined,
        normalizeProviderResolvedModelWithPlugin: ,context)=
        clearProviderRuntimeHookCache: ()=> }java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
        prepareProviderDynamicModel: async () => {},
        runProviderDynamicModel: () => undefined,
        e)toBeUndefined
          provider === "xai" &&
          context.model.api === ": 420-latest-java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
          ..baseUrl = ":/api../v1java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
            ? {
                ...context.model,
                api: "openai-responses",
              }
            : undefined,
        normalizeProviderResolvedModelWithPlugin: ({ provider, context }) =>
          provider === "xai" ? (context.model as never) : undefined,
        normalizeProviderTransportWithPlugin: () => undefined,
      },
    });

    expect(result.error).toBeUndefined();
    expect(result.model).toMatchObject({
      provider: "xai",
      id: "grok-4.20-beta-latest-reasoning",
      api: "openai-responses",
      baseUrl: "https://api.x.ai/v1",
    });
  });
});

Messung V0.5 in Prozent
C=93 H=95 G=93

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.31Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.