






















@@ -152,7 +152,31 @@ export function wrapOllamaCompatNumCtx(baseFn: StreamFn | undefined, numCtx: num
152152});
153153}
154154155-type OllamaThinkValue = boolean | "low" | "medium" | "high";
155+type OllamaThinkValue = boolean | "low" | "medium" | "high" | "max";
156+157+const OLLAMA_OPTION_PARAM_KEYS = new Set([
158+"num_keep",
159+"seed",
160+"num_predict",
161+"top_k",
162+"top_p",
163+"min_p",
164+"typical_p",
165+"repeat_last_n",
166+"temperature",
167+"repeat_penalty",
168+"presence_penalty",
169+"frequency_penalty",
170+"stop",
171+"num_ctx",
172+"num_batch",
173+"num_gpu",
174+"main_gpu",
175+"use_mmap",
176+"num_thread",
177+]);
178+179+const OLLAMA_TOP_LEVEL_PARAM_KEYS = new Set(["format", "keep_alive", "truncate", "shift"]);
156180157181function createOllamaThinkingWrapper(
158182baseFn: StreamFn | undefined,
@@ -181,6 +205,22 @@ function resolveOllamaThinkValue(thinkingLevel: unknown): OllamaThinkValue | und
181205return undefined;
182206}
183207208+function resolveOllamaThinkParamValue(
209+params: Record<string, unknown> | undefined,
210+): OllamaThinkValue | undefined {
211+const raw = params?.think ?? params?.thinking;
212+if (typeof raw === "boolean") {
213+return raw;
214+}
215+if (raw === "off") {
216+return false;
217+}
218+if (raw === "low" || raw === "medium" || raw === "high" || raw === "max") {
219+return raw;
220+}
221+return undefined;
222+}
223+184224function resolveOllamaConfiguredNumCtx(model: ProviderRuntimeModel): number | undefined {
185225const raw = model.params?.num_ctx;
186226if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0) {
@@ -196,6 +236,39 @@ function resolveOllamaNumCtx(model: ProviderRuntimeModel): number {
196236);
197237}
198238239+function resolveOllamaModelOptions(model: ProviderRuntimeModel): Record<string, unknown> {
240+const options: Record<string, unknown> = {};
241+const params = model.params;
242+if (params && typeof params === "object" && !Array.isArray(params)) {
243+for (const [key, value] of Object.entries(params)) {
244+if (value !== undefined && OLLAMA_OPTION_PARAM_KEYS.has(key)) {
245+options[key] = value;
246+}
247+}
248+}
249+options.num_ctx = resolveOllamaNumCtx(model);
250+return options;
251+}
252+253+function resolveOllamaTopLevelParams(
254+model: ProviderRuntimeModel,
255+): Record<string, unknown> | undefined {
256+const requestParams: Record<string, unknown> = {};
257+const params = model.params;
258+if (params && typeof params === "object" && !Array.isArray(params)) {
259+for (const [key, value] of Object.entries(params)) {
260+if (value !== undefined && OLLAMA_TOP_LEVEL_PARAM_KEYS.has(key)) {
261+requestParams[key] = value;
262+}
263+}
264+}
265+const think = resolveOllamaThinkParamValue(params);
266+if (think !== undefined) {
267+requestParams.think = think;
268+}
269+return Object.keys(requestParams).length > 0 ? requestParams : undefined;
270+}
271+199272function isOllamaCloudKimiModelRef(modelId: string): boolean {
200273const normalizedModelId = normalizeLowercaseStringOrEmpty(modelId);
201274return normalizedModelId.startsWith("kimi-k") && normalizedModelId.includes(":cloud");
@@ -257,6 +330,7 @@ export function buildOllamaChatRequest(params: {
257330messages: OllamaChatMessage[];
258331tools?: OllamaTool[];
259332options?: Record<string, unknown>;
333+requestParams?: Record<string, unknown>;
260334stream?: boolean;
261335}): OllamaChatRequest {
262336return {
@@ -265,6 +339,7 @@ export function buildOllamaChatRequest(params: {
265339stream: params.stream ?? true,
266340 ...(params.tools && params.tools.length > 0 ? { tools: params.tools } : {}),
267341 ...(params.options ? { options: params.options } : {}),
342+ ...params.requestParams,
268343};
269344}
270345@@ -754,7 +829,7 @@ export function createOllamaStreamFn(
754829);
755830const ollamaTools = extractOllamaTools(context.tools);
756831757-const ollamaOptions: Record<string, unknown> = { num_ctx: resolveOllamaNumCtx(model) };
832+const ollamaOptions: Record<string, unknown> = resolveOllamaModelOptions(model);
758833if (typeof options?.temperature === "number") {
759834ollamaOptions.temperature = options.temperature;
760835}
@@ -769,6 +844,7 @@ export function createOllamaStreamFn(
769844stream: true,
770845tools: ollamaTools,
771846options: ollamaOptions,
847+requestParams: resolveOllamaTopLevelParams(model),
772848});
773849options?.onPayload?.(body, model);
774850const headers: Record<string, string> = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。