Files
openwork/apps/app/tests/ollama-local-provider.test.ts

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");
});
});