Skip to content

Commit

Permalink
Remove model dialog, update tests to use keys related models
Browse files Browse the repository at this point in the history
  • Loading branch information
codewithcheese committed Aug 5, 2024
1 parent 998199d commit 4f00b2c
Show file tree
Hide file tree
Showing 31 changed files with 145 additions and 754 deletions.
2 changes: 1 addition & 1 deletion src/components/ui/select/select-item.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
on:pointermove
>
{#if image}
<img src={image} alt={label || value || "item"} class="absolute left-2 h-4 w-4" />
<img src={image} alt={label} class="absolute left-2 h-4 w-4" />
{:else}
<span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<SelectPrimitive.ItemIndicator>
Expand Down
4 changes: 2 additions & 2 deletions src/database/migrations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -968,12 +968,12 @@ describe("Migration Tests", () => {

// Verify that the initial data was inserted correctly
const aiSdkCount = db.get<{ count: number }>(sql`SELECT COUNT(*) as count FROM aiSdk`).count;
expect(aiSdkCount).toBe(10); // 10 SDKs were inserted
expect(aiSdkCount).toBe(11); // 11 SDKs were inserted

const aiServiceCount = db.get<{ count: number }>(
sql`SELECT COUNT(*) as count FROM aiService`,
).count;
expect(aiServiceCount).toBe(10); // 10 services were inserted
expect(aiServiceCount).toBe(11); // 11 services were inserted

// Check some specific entries to ensure data integrity
const openaiSdk = db.get<{ id: string; slug: string; name: string }>(
Expand Down
15 changes: 0 additions & 15 deletions src/database/migrations/0011_easy_slapstick.sql
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,10 @@ ALTER TABLE `aiService` RENAME TO `service`;--> statement-breakpoint
ALTER TABLE `key` RENAME COLUMN `aiServiceId` TO `serviceId`;--> statement-breakpoint
ALTER TABLE `model` RENAME COLUMN `aiAccountId` TO `keyId`;--> statement-breakpoint
ALTER TABLE `service` RENAME COLUMN `aiSdkId` TO `sdkId`;--> statement-breakpoint
/*
SQLite does not support "Dropping foreign key" out of the box, we do not generate automatic migration for that, so it has to be done manually
Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
https://www.sqlite.org/lang_altertable.html
Due to that we don't generate migration automatically and it has to be done manually
*/--> statement-breakpoint
DROP INDEX IF EXISTS `accountId_idx`;--> statement-breakpoint
DROP INDEX IF EXISTS `accountId_unique`;--> statement-breakpoint
CREATE INDEX `accountId_idx` ON `model` (`keyId`);--> statement-breakpoint
CREATE UNIQUE INDEX `accountId_unique` ON `model` (`keyId`,`name`);--> statement-breakpoint
/*
SQLite does not support "Creating foreign key on existing column" out of the box, we do not generate automatic migration for that, so it has to be done manually
Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
https://www.sqlite.org/lang_altertable.html
Due to that we don't generate migration automatically and it has to be done manually
*/
--> statement-breakpoint
ALTER TABLE `model` RENAME TO `model_old`;
--> statement-breakpoint
CREATE TABLE `model` (
Expand Down
2 changes: 1 addition & 1 deletion src/database/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export const chatRelations = relations(chatTable, ({ many }) => ({
}));

export const modelRelations = relations(modelTable, ({ one }) => ({
service: one(keyTable, {
key: one(keyTable, {
fields: [modelTable.keyId],
references: [keyTable.id],
}),
Expand Down
29 changes: 18 additions & 11 deletions src/routes/(app)/$data.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,26 @@ describe("(app)/$data", () => {
await db.delete(schema.keyTable);

// Insert dummy data
await db.insert(schema.keyTable).values([
{
id: "service1",
name: "Test Service",
providerId: "provider1",
baseURL: "https://api.test.com",
apiKey: "test-api-key",
},
]);

await db.insert(schema.sdkTable).values([{ id: "sdk1", name: "Test SDK", slug: "test-sdk" }]);
await db
.insert(schema.serviceTable)
.values([
{ id: "service1", name: "Test Service", sdkId: "sdk1", baseURL: "https://api.test.com" },
]);
await db
.insert(schema.keyTable)
.values([
{
id: "key1",
name: "Test Key",
serviceId: "service1",
baseURL: "https://api.test.com",
apiKey: "test-api-key",
},
]);
await db
.insert(schema.modelTable)
.values([{ id: "model1", serviceId: "service1", name: "Test Model", visible: 1 }]);
.values([{ id: "model1", keyId: "key1", name: "Test Model", visible: 1 }]);

await db.insert(schema.chatTable).values([
{ id: "chat1", name: "Chat 1", prompt: "Prompt 1" },
Expand Down
12 changes: 7 additions & 5 deletions src/routes/(app)/api/chat/+server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,24 @@ import { createMistral } from "@ai-sdk/mistral";
import { createGoogleGenerativeAI } from "@ai-sdk/google";

export const POST = (async ({ request }) => {
const { messages, providerId, apiKey, baseURL, modelName } = (await request.json()) as {
let { messages, sdkId, apiKey, baseURL, modelName } = (await request.json()) as {
messages: any[];
providerId: string;
sdkId: string;
baseURL: string;
apiKey: string;
modelName: string;
};

if (!providerId || !baseURL || !modelName) {
baseURL = baseURL ?? undefined;

if (!sdkId || !modelName) {
return new Response(`Malformed request`, {
status: 400,
});
}

let provider;
switch (providerId) {
switch (sdkId) {
case "openai":
provider = createOpenAI({ apiKey, baseURL });
break;
Expand All @@ -35,7 +37,7 @@ export const POST = (async ({ request }) => {
provider = createGoogleGenerativeAI({ apiKey, baseURL });
break;
default:
return new Response(`Unsupported provider ${providerId}`, {
return new Response(`Unsupported sdk ${sdkId}`, {
status: 400,
});
}
Expand Down
45 changes: 31 additions & 14 deletions src/routes/(app)/chat/[id]/$data.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import {
appendMessages,
createRevision,
getLatestRevision,
getModelService,
getModelKey,
getRevision,
interpolateDocuments,
isTab,
loadServices,
getKeys,
tabRouteId,
updateChat,
} from "./$data";
Expand Down Expand Up @@ -54,19 +54,36 @@ beforeEach(async () => {
await runMigrations(true);

// Insert test data
await db.insert(schema.keyTable).values([
await db.insert(schema.sdkTable).values([
{
id: "sdk1",
name: "Test SDK",
slug: "test-sdk",
},
]);

await db.insert(schema.serviceTable).values([
{
id: "service1",
name: "Test Service",
providerId: "provider1",
sdkId: "sdk1",
baseURL: "https://api.test.com",
},
]);

await db.insert(schema.keyTable).values([
{
id: "key1",
name: "Test Key",
serviceId: "service1",
baseURL: "https://api.test.com",
apiKey: "test-api-key",
},
]);

await db
.insert(schema.modelTable)
.values([{ id: "model1", serviceId: "service1", name: "Test Model", visible: 1 }]);
.values([{ id: "model1", keyId: "key1", name: "Test Model", visible: 1 }]);

await db
.insert(schema.chatTable)
Expand Down Expand Up @@ -144,11 +161,11 @@ describe("interpolateDocuments", () => {

describe("loadServices", () => {
it("should load services with their models", async () => {
const services = await loadServices();
expect(services).toHaveLength(1);
expect(services[0]).toMatchObject({
id: "service1",
name: "Test Service",
const keys = await getKeys();
expect(keys).toHaveLength(1);
expect(keys[0]).toMatchObject({
id: "key1",
name: "Test Key",
models: [{ id: "model1", name: "Test Model" }],
});
});
Expand Down Expand Up @@ -186,11 +203,11 @@ describe("getLatestRevision", () => {

describe("getModelService", () => {
it("should get a model with its service", async () => {
const modelService = await getModelService("model1");
expect(modelService).toMatchObject({
const modelKey = await getModelKey("model1");
expect(modelKey).toMatchObject({
id: "model1",
name: "Test Model",
service: { id: "service1", name: "Test Service" },
key: { id: "key1", name: "Test Key" },
});
});
});
Expand All @@ -210,7 +227,7 @@ describe("appendMessage", () => {
it("should append a message to a revision", async () => {
const message = {
id: "new-message",
role: "user",
role: "user" as const,
content: "New message content",
attachments: [],
};
Expand Down
26 changes: 22 additions & 4 deletions src/routes/(app)/chat/[id]/$data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { sql } from "drizzle-orm/sql";
import type { RouteId } from "$lib/route";
import type { MessageAttachment, ChatMessage } from "$lib/chat-service.svelte";

export type ServicesView = Awaited<ReturnType<typeof loadServices>>;
export type KeysView = Awaited<ReturnType<typeof getKeys>>;

export type RevisionView = NonNullable<Awaited<ReturnType<typeof getRevision>>>;

Expand All @@ -31,10 +31,11 @@ export function tabRouteId(tab: Tab): RouteId {
return tab === "chat" ? `/chat/[id]` : `/chat/[id]/${tab}`;
}

export function loadServices() {
export function getKeys() {
return useDb().query.keyTable.findMany({
with: {
models: true,
service: true,
},
});
}
Expand Down Expand Up @@ -95,11 +96,28 @@ export function getLatestRevision(chatId: string) {
});
}

export function getModelService(modelId: string) {
export function getModelKey(modelId: string) {
return useDb().query.modelTable.findFirst({
where: eq(modelTable.id, modelId),
with: {
service: true,
key: {
with: {
service: {
columns: {
id: true,
name: true,
},
with: {
sdk: {
columns: {
id: true,
name: true,
},
},
},
},
},
},
},
});
}
Expand Down
4 changes: 2 additions & 2 deletions src/routes/(app)/chat/[id]/+layout.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import { toast } from "svelte-french-toast";
let { data } = $props();
let services = $derived(data.services);
let keys = $derived(data.keys);
let chat = $derived(data.chat);
let revision = $derived(data.revision);
Expand Down Expand Up @@ -52,7 +52,7 @@
</nav>
<div class="relative ml-auto flex-1 md:grow-0">
<div class="flex flex-row">
<SelectModel {services} />
<SelectModel {keys} />
<Button variant="ghost" onclick={() => goto(route(`/settings`))}>
<SettingsIcon size={16} />
</Button>
Expand Down
25 changes: 5 additions & 20 deletions src/routes/(app)/chat/[id]/+layout.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,7 @@
import { eq } from "drizzle-orm";
import {
chatTable,
registerModel,
type Revision,
type Message,
revisionTable,
keyTable,
useDb,
} from "@/database";
import { chatTable, keyTable, registerModel, revisionTable, useDb } from "@/database";
import { error } from "@sveltejs/kit";
import {
createRevision,
getLatestRevision,
getRevision,
loadServices,
type RevisionView,
type Tab,
} from "./$data";
import { getKeys, getRevision, type Tab } from "./$data";
import { match } from "$lib/route";

export async function load({ route, url, params, depends }) {
Expand Down Expand Up @@ -44,8 +29,8 @@ export async function load({ route, url, params, depends }) {
}
registerModel(chatTable, chat, depends);

const services = await loadServices();
registerModel(keyTable, services, depends);
const keys = await getKeys();
registerModel(keyTable, keys, depends);

const version = Number(url.searchParams.get("version")) || null;
const revision = await getRevision(params.id, version);
Expand All @@ -55,5 +40,5 @@ export async function load({ route, url, params, depends }) {
registerModel(revisionTable, revision, depends);
depends("view:messages");
depends("view:chat");
return { chat, services, tab, revision, version };
return { chat, keys, tab, revision, version };
}
10 changes: 5 additions & 5 deletions src/routes/(app)/chat/[id]/ChatPage.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import {
appendMessages,
createRevision,
getModelService,
getModelKey,
type RevisionView,
toChatMessage,
} from "./$data";
Expand Down Expand Up @@ -69,7 +69,7 @@
toast.error("No model selected");
return false;
}
const model = await getModelService(store.selected.modelId);
const model = await getModelKey(store.selected.modelId);
if (!model) {
toast.error("Selected model not found");
return false;
Expand All @@ -90,10 +90,10 @@
chatService.submit({
options: {
body: {
providerId: model.service.providerId,
sdkId: model.key.service.sdk.id,
modelName: model.name,
baseURL: model.service.baseURL,
apiKey: model.service.apiKey,
baseURL: model.key.baseURL,
apiKey: model.key.apiKey,
},
},
});
Expand Down
Loading

0 comments on commit 4f00b2c

Please sign in to comment.