60 lines
2.1 KiB
TypeScript
60 lines
2.1 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
|
|
import {
|
|
buildLocalProviderConfig,
|
|
fetchOllamaModelSupportsVision,
|
|
parseOllamaVisionCapability,
|
|
type LocalProviderInstallInput,
|
|
} from "../src/react-app/domains/settings/openai-image-extension";
|
|
|
|
function providerInput(supportsVision: boolean): LocalProviderInstallInput {
|
|
return {
|
|
providerId: "ollama",
|
|
name: "Ollama (local)",
|
|
baseURL: "http://localhost:11434/v1",
|
|
modelId: "llava:latest",
|
|
modelName: "llava:latest",
|
|
setDefault: true,
|
|
supportsVision,
|
|
};
|
|
}
|
|
|
|
describe("Ollama local provider config", () => {
|
|
test("parses vision capabilities from /api/show payloads", () => {
|
|
expect(parseOllamaVisionCapability({ capabilities: ["completion", "vision"] })).toBe(true);
|
|
expect(parseOllamaVisionCapability({ capabilities: ["completion"] })).toBe(false);
|
|
expect(parseOllamaVisionCapability({ capabilities: ["completion", "pdf"] })).toBe(false);
|
|
});
|
|
|
|
test("treats /api/show failures as non-vision", async () => {
|
|
const originalFetch = globalThis.fetch;
|
|
const failingFetch: typeof fetch = () => Promise.reject(new Error("offline"));
|
|
globalThis.fetch = failingFetch;
|
|
try {
|
|
expect(await fetchOllamaModelSupportsVision("llava:latest", "http://localhost:11434/v1")).toBe(false);
|
|
} finally {
|
|
globalThis.fetch = originalFetch;
|
|
}
|
|
});
|
|
|
|
test("vision models declare text and image input without PDF support", () => {
|
|
const config = buildLocalProviderConfig(providerInput(true));
|
|
const model = config.models?.["llava:latest"];
|
|
const inputModalities = model?.modalities?.input ?? [];
|
|
|
|
expect(model?.attachment).toBe(true);
|
|
expect(inputModalities).toEqual(["text", "image"]);
|
|
expect(inputModalities).not.toContain("pdf");
|
|
});
|
|
|
|
test("non-vision models stay text-only without PDF support", () => {
|
|
const config = buildLocalProviderConfig(providerInput(false));
|
|
const model = config.models?.["llava:latest"];
|
|
const inputModalities = model?.modalities?.input ?? [];
|
|
|
|
expect(model?.attachment).toBe(false);
|
|
expect(inputModalities).toEqual(["text"]);
|
|
expect(inputModalities).not.toContain("pdf");
|
|
});
|
|
});
|