134 lines
3.4 KiB
TypeScript
134 lines
3.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import type { ClawdbotConfig } from "../config/config.js";
|
|
import { resolveEntriesWithActiveFallback, resolveModelEntries } from "./resolve.js";
|
|
|
|
const providerRegistry = new Map([
|
|
["openai", { capabilities: ["image"] }],
|
|
["groq", { capabilities: ["audio"] }],
|
|
]);
|
|
|
|
describe("resolveModelEntries", () => {
|
|
it("uses provider capabilities for shared entries without explicit caps", () => {
|
|
const cfg: ClawdbotConfig = {
|
|
tools: {
|
|
media: {
|
|
models: [{ provider: "openai", model: "gpt-5.2" }],
|
|
},
|
|
},
|
|
};
|
|
|
|
const imageEntries = resolveModelEntries({
|
|
cfg,
|
|
capability: "image",
|
|
providerRegistry,
|
|
});
|
|
expect(imageEntries).toHaveLength(1);
|
|
|
|
const audioEntries = resolveModelEntries({
|
|
cfg,
|
|
capability: "audio",
|
|
providerRegistry,
|
|
});
|
|
expect(audioEntries).toHaveLength(0);
|
|
});
|
|
|
|
it("keeps per-capability entries even without explicit caps", () => {
|
|
const cfg: ClawdbotConfig = {
|
|
tools: {
|
|
media: {
|
|
image: {
|
|
models: [{ provider: "openai", model: "gpt-5.2" }],
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const imageEntries = resolveModelEntries({
|
|
cfg,
|
|
capability: "image",
|
|
config: cfg.tools?.media?.image,
|
|
providerRegistry,
|
|
});
|
|
expect(imageEntries).toHaveLength(1);
|
|
});
|
|
|
|
it("skips shared CLI entries without capabilities", () => {
|
|
const cfg: ClawdbotConfig = {
|
|
tools: {
|
|
media: {
|
|
models: [{ type: "cli", command: "gemini", args: ["--file", "{{MediaPath}}"] }],
|
|
},
|
|
},
|
|
};
|
|
|
|
const entries = resolveModelEntries({
|
|
cfg,
|
|
capability: "image",
|
|
providerRegistry,
|
|
});
|
|
expect(entries).toHaveLength(0);
|
|
});
|
|
});
|
|
|
|
describe("resolveEntriesWithActiveFallback", () => {
|
|
it("uses active model when enabled and no models are configured", () => {
|
|
const cfg: ClawdbotConfig = {
|
|
tools: {
|
|
media: {
|
|
audio: { enabled: true },
|
|
},
|
|
},
|
|
};
|
|
|
|
const entries = resolveEntriesWithActiveFallback({
|
|
cfg,
|
|
capability: "audio",
|
|
config: cfg.tools?.media?.audio,
|
|
providerRegistry,
|
|
activeModel: { provider: "groq", model: "whisper-large-v3" },
|
|
});
|
|
expect(entries).toHaveLength(1);
|
|
expect(entries[0]?.provider).toBe("groq");
|
|
});
|
|
|
|
it("ignores active model when configured entries exist", () => {
|
|
const cfg: ClawdbotConfig = {
|
|
tools: {
|
|
media: {
|
|
audio: { enabled: true, models: [{ provider: "openai", model: "whisper-1" }] },
|
|
},
|
|
},
|
|
};
|
|
|
|
const entries = resolveEntriesWithActiveFallback({
|
|
cfg,
|
|
capability: "audio",
|
|
config: cfg.tools?.media?.audio,
|
|
providerRegistry,
|
|
activeModel: { provider: "groq", model: "whisper-large-v3" },
|
|
});
|
|
expect(entries).toHaveLength(1);
|
|
expect(entries[0]?.provider).toBe("openai");
|
|
});
|
|
|
|
it("skips active model when provider lacks capability", () => {
|
|
const cfg: ClawdbotConfig = {
|
|
tools: {
|
|
media: {
|
|
video: { enabled: true },
|
|
},
|
|
},
|
|
};
|
|
|
|
const entries = resolveEntriesWithActiveFallback({
|
|
cfg,
|
|
capability: "video",
|
|
config: cfg.tools?.media?.video,
|
|
providerRegistry,
|
|
activeModel: { provider: "groq", model: "whisper-large-v3" },
|
|
});
|
|
expect(entries).toHaveLength(0);
|
|
});
|
|
});
|