


















@@ -8,6 +8,7 @@ import { discoverLmstudioModels, ensureLmstudioModelLoaded } from "./models.fetc
88import {
99normalizeLmstudioProviderConfig,
1010resolveLmstudioInferenceBase,
11+resolveLmstudioReasoningCompat,
1112resolveLmstudioReasoningCapability,
1213resolveLmstudioServerBase,
1314} from "./models.js";
@@ -145,6 +146,40 @@ describe("lmstudio-models", () => {
145146).toBe(false);
146147});
147148149+it("maps LM Studio native reasoning options into OpenAI-compatible effort compat", () => {
150+expect(
151+resolveLmstudioReasoningCompat({
152+capabilities: {
153+reasoning: {
154+allowed_options: ["off", "on"],
155+default: "on",
156+},
157+},
158+}),
159+).toEqual({
160+supportsReasoningEffort: true,
161+supportedReasoningEfforts: ["off", "on"],
162+reasoningEffortMap: expect.objectContaining({
163+off: "off",
164+none: "off",
165+low: "on",
166+medium: "on",
167+high: "on",
168+}),
169+});
170+171+expect(
172+resolveLmstudioReasoningCompat({
173+capabilities: {
174+reasoning: {
175+allowed_options: ["off"],
176+default: "off",
177+},
178+},
179+}),
180+).toBeUndefined();
181+});
182+148183it("discovers llm models and maps metadata", async () => {
149184const fetchMock = vi.fn(async (_url: string | URL) => ({
150185ok: true,
@@ -205,7 +240,17 @@ describe("lmstudio-models", () => {
205240reasoning: true,
206241input: ["text", "image"],
207242cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
208-compat: { supportsUsageInStreaming: true },
243+compat: {
244+supportsUsageInStreaming: true,
245+supportsReasoningEffort: true,
246+supportedReasoningEfforts: ["off", "on"],
247+reasoningEffortMap: expect.objectContaining({
248+off: "off",
249+none: "off",
250+medium: "on",
251+high: "on",
252+}),
253+},
209254contextWindow: 262144,
210255contextTokens: LMSTUDIO_DEFAULT_LOAD_CONTEXT_LENGTH,
211256maxTokens: SELF_HOSTED_DEFAULT_MAX_TOKENS,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。