feat(agent): refresh assistant model catalog

This commit is contained in:
ginnoir
2026-07-08 19:37:17 -05:00
parent 4dc04b21d6
commit b279f16ba0
6 changed files with 111 additions and 41 deletions
+3
View File
@@ -28,6 +28,9 @@ test("assistant chat smoke after opt-in", async ({ page }) => {
await expect(page.getByRole("dialog", { name: "Assistant" })).toBeVisible();
const modelSelector = page.getByRole("combobox", { name: "Assistant model" });
await expect(modelSelector).toBeVisible();
const refreshModels = page.getByRole("button", { name: "Refresh assistant models" });
await expect(refreshModels).toBeVisible();
await refreshModels.click();
await expect.poll(() => modelSelector.evaluate((node) => node.tagName)).toBe("SELECT");
await expect
.poll(() => modelSelector.evaluate((node) => node.getBoundingClientRect().height))
+17
View File
@@ -0,0 +1,17 @@
import assert from "node:assert/strict";
import { describe, it } from "node:test";
describe("GET /api/agent/models", () => {
it("is dynamic and returns no-store responses", async () => {
process.env.DATABASE_URL ??= "postgres://famapp:famapp@localhost:5432/famapp";
const { GET, dynamic } = await import("../../src/app/api/agent/models/route");
assert.equal(dynamic, "force-dynamic");
const response = await GET(new Request("http://localhost/api/agent/models?refresh=1"));
assert.equal(response.status, 401);
assert.equal(response.headers.get("Cache-Control"), "no-store");
});
});
+18 -6
View File
@@ -88,16 +88,28 @@ describe("listLlmModels", () => {
assert.equal(result.degraded, true);
});
it("uses an unadvertised fallback alias instead of unrelated provider models", async () => {
it("fetches the typed uncensored catalog when uncensored is the fallback route", async () => {
const requests: Request[] = [];
const result = await listLlmModels({
config: { ...openAiConfig, model: "uncensored" },
fetchImpl: async () =>
Response.json({
data: [{ id: "auto" }, { id: "qwen3:8b" }, { id: "qwen3-coder:30b" }],
}),
fetchImpl: async (input, init) => {
requests.push(new Request(input, init));
return Response.json({
data: [
{ id: "uncensored" },
{ id: "gemma4-uncensored:26b" },
{ id: "dolphin-mistral:latest" },
],
});
},
});
assert.deepEqual(result.models, [{ id: "uncensored", label: "uncensored" }]);
assert.equal(requests[0]?.url, "https://llm.example.test/v1/models?type=uncensored");
assert.deepEqual(result.models, [
{ id: "dolphin-mistral:latest", label: "dolphin-mistral:latest" },
{ id: "gemma4-uncensored:26b", label: "gemma4-uncensored:26b" },
{ id: "uncensored", label: "uncensored" },
]);
assert.equal(result.fallbackModel, "uncensored");
assert.equal(result.degraded, false);
});