Add feature to unlist a model (#625)
Browse files
src/lib/server/models.ts
CHANGED
|
@@ -65,6 +65,7 @@ const modelConfig = z.object({
|
|
| 65 |
.passthrough()
|
| 66 |
.optional(),
|
| 67 |
multimodal: z.boolean().default(false),
|
|
|
|
| 68 |
});
|
| 69 |
|
| 70 |
const modelsRaw = z.array(modelConfig).parse(JSON.parse(MODELS));
|
|
@@ -156,4 +157,7 @@ export const smallModel = TASK_MODEL
|
|
| 156 |
defaultModel
|
| 157 |
: defaultModel;
|
| 158 |
|
| 159 |
-
export type BackendModel = Optional<
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
.passthrough()
|
| 66 |
.optional(),
|
| 67 |
multimodal: z.boolean().default(false),
|
| 68 |
+
unlisted: z.boolean().default(false),
|
| 69 |
});
|
| 70 |
|
| 71 |
const modelsRaw = z.array(modelConfig).parse(JSON.parse(MODELS));
|
|
|
|
| 157 |
defaultModel
|
| 158 |
: defaultModel;
|
| 159 |
|
| 160 |
+
export type BackendModel = Optional<
|
| 161 |
+
typeof defaultModel,
|
| 162 |
+
"preprompt" | "parameters" | "multimodal" | "unlisted"
|
| 163 |
+
>;
|
src/lib/types/Model.ts
CHANGED
|
@@ -14,4 +14,5 @@ export type Model = Pick<
|
|
| 14 |
| "datasetUrl"
|
| 15 |
| "preprompt"
|
| 16 |
| "multimodal"
|
|
|
|
| 17 |
>;
|
|
|
|
| 14 |
| "datasetUrl"
|
| 15 |
| "preprompt"
|
| 16 |
| "multimodal"
|
| 17 |
+
| "unlisted"
|
| 18 |
>;
|
src/routes/+layout.server.ts
CHANGED
|
@@ -27,6 +27,17 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => {
|
|
| 27 |
});
|
| 28 |
}
|
| 29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
// get the number of messages where `from === "assistant"` across all conversations.
|
| 31 |
const totalMessages =
|
| 32 |
(
|
|
@@ -89,6 +100,7 @@ export const load: LayoutServerLoad = async ({ locals, depends }) => {
|
|
| 89 |
parameters: model.parameters,
|
| 90 |
preprompt: model.preprompt,
|
| 91 |
multimodal: model.multimodal,
|
|
|
|
| 92 |
})),
|
| 93 |
oldModels,
|
| 94 |
user: locals.user && {
|
|
|
|
| 27 |
});
|
| 28 |
}
|
| 29 |
|
| 30 |
+
// if the model is unlisted, set the active model to the default model
|
| 31 |
+
if (
|
| 32 |
+
settings?.activeModel &&
|
| 33 |
+
models.find((m) => m.id === settings?.activeModel)?.unlisted === true
|
| 34 |
+
) {
|
| 35 |
+
settings.activeModel = defaultModel.id;
|
| 36 |
+
await collections.settings.updateOne(authCondition(locals), {
|
| 37 |
+
$set: { activeModel: defaultModel.id },
|
| 38 |
+
});
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
// get the number of messages where `from === "assistant"` across all conversations.
|
| 42 |
const totalMessages =
|
| 43 |
(
|
|
|
|
| 100 |
parameters: model.parameters,
|
| 101 |
preprompt: model.preprompt,
|
| 102 |
multimodal: model.multimodal,
|
| 103 |
+
unlisted: model.unlisted,
|
| 104 |
})),
|
| 105 |
oldModels,
|
| 106 |
user: locals.user && {
|
src/routes/conversation/+server.ts
CHANGED
|
@@ -39,6 +39,15 @@ export const POST: RequestHandler = async ({ locals, request }) => {
|
|
| 39 |
}
|
| 40 |
|
| 41 |
const model = models.find((m) => m.name === values.model);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
// Use the model preprompt if there is no conversation/preprompt in the request body
|
| 43 |
preprompt = preprompt === undefined ? model?.preprompt : preprompt;
|
| 44 |
|
|
|
|
| 39 |
}
|
| 40 |
|
| 41 |
const model = models.find((m) => m.name === values.model);
|
| 42 |
+
|
| 43 |
+
if (!model) {
|
| 44 |
+
throw error(400, "Invalid model");
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
if (model.unlisted) {
|
| 48 |
+
throw error(400, "Can't start a conversation with an unlisted model");
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
// Use the model preprompt if there is no conversation/preprompt in the request body
|
| 52 |
preprompt = preprompt === undefined ? model?.preprompt : preprompt;
|
| 53 |
|
src/routes/settings/+layout.svelte
CHANGED
|
@@ -48,7 +48,7 @@
|
|
| 48 |
<div
|
| 49 |
class="col-span-1 flex flex-col overflow-y-auto whitespace-nowrap max-md:-mx-4 max-md:h-[160px] max-md:border md:pr-6"
|
| 50 |
>
|
| 51 |
-
{#each data.models as model}
|
| 52 |
<a
|
| 53 |
href="{base}/settings/{model.id}"
|
| 54 |
class="group flex h-11 flex-none items-center gap-3 pl-3 pr-2 text-gray-500 hover:bg-gray-100 md:rounded-xl {model.id ===
|
|
|
|
| 48 |
<div
|
| 49 |
class="col-span-1 flex flex-col overflow-y-auto whitespace-nowrap max-md:-mx-4 max-md:h-[160px] max-md:border md:pr-6"
|
| 50 |
>
|
| 51 |
+
{#each data.models.filter((el) => !el.unlisted) as model}
|
| 52 |
<a
|
| 53 |
href="{base}/settings/{model.id}"
|
| 54 |
class="group flex h-11 flex-none items-center gap-3 pl-3 pr-2 text-gray-500 hover:bg-gray-100 md:rounded-xl {model.id ===
|
src/routes/settings/[...model]/+page.ts
CHANGED
|
@@ -4,7 +4,9 @@ import { redirect } from "@sveltejs/kit";
|
|
| 4 |
export async function load({ parent, params }) {
|
| 5 |
const data = await parent();
|
| 6 |
|
| 7 |
-
|
|
|
|
|
|
|
| 8 |
throw redirect(302, `${base}/settings`);
|
| 9 |
}
|
| 10 |
|
|
|
|
| 4 |
export async function load({ parent, params }) {
|
| 5 |
const data = await parent();
|
| 6 |
|
| 7 |
+
const model = data.models.find(({ id }) => id === params.model);
|
| 8 |
+
|
| 9 |
+
if (!model || model.unlisted) {
|
| 10 |
throw redirect(302, `${base}/settings`);
|
| 11 |
}
|
| 12 |
|