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;
="-,"""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
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
);
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":
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 returnnull;
} ="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",
}
} returnnull;
}),
} 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 , returnnull;
) 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,
};
} returnnull;
} [
} 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 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: 111111const {
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"],
},
});
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",
},
});
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.();
(preservesunmarkedopenai-odexmetadataoverrides,( = java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
mockDiscoveredModel(discoverModels, {
provider: "openai-codex",
" 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", :",
},
});
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
});
});
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 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");
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,
});
});
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
});
};
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,
},
});
¤ 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:
¤
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.