


























@@ -3,6 +3,7 @@ import { jsonResponse, requestBodyText, requestUrl } from "../../../src/test-hel
33import {
44buildOllamaModelDefinition,
55enrichOllamaModelsWithContext,
6+parseOllamaNumCtxParameter,
67resetOllamaModelShowInfoCacheForTest,
78resolveOllamaApiBase,
89type OllamaTagModel,
@@ -42,6 +43,58 @@ describe("ollama provider models", () => {
4243]);
4344});
444546+it("uses Modelfile num_ctx when it expands the discovered context window", async () => {
47+const models: OllamaTagModel[] = [{ name: "llama3-32k:latest" }];
48+const fetchMock = vi.fn(async () =>
49+jsonResponse({
50+model_info: { "llama.context_length": 8192 },
51+parameters: 'stop "<|eot_id|>"\nnum_ctx 32768\nnum_keep 5',
52+capabilities: ["completion"],
53+}),
54+);
55+vi.stubGlobal("fetch", fetchMock);
56+57+const enriched = await enrichOllamaModelsWithContext("http://127.0.0.1:11434", models);
58+59+expect(enriched).toEqual([
60+{
61+name: "llama3-32k:latest",
62+contextWindow: 32768,
63+capabilities: ["completion"],
64+},
65+]);
66+});
67+68+it("keeps the larger native context window when Modelfile num_ctx is smaller", async () => {
69+const models: OllamaTagModel[] = [{ name: "llama3.2:latest" }];
70+const fetchMock = vi.fn(async () =>
71+jsonResponse({
72+model_info: { "llama.context_length": 131072 },
73+parameters: "num_ctx 4096",
74+}),
75+);
76+vi.stubGlobal("fetch", fetchMock);
77+78+const enriched = await enrichOllamaModelsWithContext("http://127.0.0.1:11434", models);
79+80+expect(enriched[0]?.contextWindow).toBe(131072);
81+});
82+83+it("uses positive num_ctx when /api/show omits model context metadata", async () => {
84+const models: OllamaTagModel[] = [{ name: "custom-model:latest" }];
85+const fetchMock = vi.fn(async () =>
86+jsonResponse({
87+model_info: {},
88+parameters: "num_ctx 16384",
89+}),
90+);
91+vi.stubGlobal("fetch", fetchMock);
92+93+const enriched = await enrichOllamaModelsWithContext("http://127.0.0.1:11434", models);
94+95+expect(enriched[0]?.contextWindow).toBe(16384);
96+});
97+4598it("sets models with vision capability from /api/show capabilities", async () => {
4699const models: OllamaTagModel[] = [{ name: "kimi-k2.5:cloud" }, { name: "glm-5.1:cloud" }];
47100const fetchMock = vi.fn(async (input: string | URL | Request, init?: RequestInit) => {
@@ -225,4 +278,11 @@ describe("ollama provider models", () => {
225278expect(model.reasoning).toBe(false);
226279expect(model.compat?.supportsTools).toBe(false);
227280});
281+282+it("parses the last positive Modelfile num_ctx value", () => {
283+expect(parseOllamaNumCtxParameter("num_ctx 8192\nnum_ctx 32768")).toBe(32768);
284+expect(parseOllamaNumCtxParameter("temperature 0.8\nnum_ctx -1\nnum_ctx 0")).toBeUndefined();
285+expect(parseOllamaNumCtxParameter('stop "<|eot_id|>"')).toBeUndefined();
286+expect(parseOllamaNumCtxParameter({ num_ctx: 8192 })).toBeUndefined();
287+});
228288});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。