|
|
import { parseStringToList } from "$lib/utils/parseStringToList"; |
|
|
import { toolFromConfigs } from "$lib/server/tools"; |
|
|
import { z } from "zod"; |
|
|
import { collections } from "$lib/server/database"; |
|
|
import { ObjectId } from "mongodb"; |
|
|
import { sha256 } from "$lib/utils/sha256"; |
|
|
|
|
|
export const asssistantSchema = z.object({ |
|
|
name: z.string().min(1), |
|
|
modelId: z.string().min(1), |
|
|
preprompt: z.string().min(1), |
|
|
description: z.string().optional(), |
|
|
exampleInput1: z.string().optional(), |
|
|
exampleInput2: z.string().optional(), |
|
|
exampleInput3: z.string().optional(), |
|
|
exampleInput4: z.string().optional(), |
|
|
avatar: z.union([z.instanceof(File), z.literal("null")]).optional(), |
|
|
ragLinkList: z.preprocess(parseStringToList, z.string().url().array().max(10)), |
|
|
ragDomainList: z.preprocess(parseStringToList, z.string().array()), |
|
|
ragAllowAll: z.preprocess((v) => v === "true", z.boolean()), |
|
|
dynamicPrompt: z.preprocess((v) => v === "on", z.boolean()), |
|
|
temperature: z |
|
|
.union([z.literal(""), z.coerce.number().min(0.1).max(2)]) |
|
|
.transform((v) => (v === "" ? undefined : v)), |
|
|
top_p: z |
|
|
.union([z.literal(""), z.coerce.number().min(0.05).max(1)]) |
|
|
.transform((v) => (v === "" ? undefined : v)), |
|
|
|
|
|
repetition_penalty: z |
|
|
.union([z.literal(""), z.coerce.number().min(0.1).max(2)]) |
|
|
.transform((v) => (v === "" ? undefined : v)), |
|
|
|
|
|
top_k: z |
|
|
.union([z.literal(""), z.coerce.number().min(5).max(100)]) |
|
|
.transform((v) => (v === "" ? undefined : v)), |
|
|
tools: z |
|
|
.string() |
|
|
.optional() |
|
|
.transform((v) => (v ? v.split(",") : [])) |
|
|
.transform(async (v) => [ |
|
|
...(await collections.tools |
|
|
.find({ _id: { $in: v.map((toolId) => new ObjectId(toolId)) } }) |
|
|
.project({ _id: 1 }) |
|
|
.toArray() |
|
|
.then((tools) => tools.map((tool) => tool._id.toString()))), |
|
|
...toolFromConfigs |
|
|
.filter((el) => (v ?? []).includes(el._id.toString())) |
|
|
.map((el) => el._id.toString()), |
|
|
]) |
|
|
.optional(), |
|
|
}); |
|
|
|
|
|
export const uploadAssistantAvatar = async ( |
|
|
avatar: File, |
|
|
assistantId: ObjectId |
|
|
): Promise<string> => { |
|
|
const hash = await sha256(await avatar.text()); |
|
|
const upload = collections.bucket.openUploadStream(`${assistantId.toString()}`, { |
|
|
metadata: { type: avatar.type, hash }, |
|
|
}); |
|
|
|
|
|
upload.write((await avatar.arrayBuffer()) as unknown as Buffer); |
|
|
upload.end(); |
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => { |
|
|
upload.once("finish", () => resolve(hash)); |
|
|
upload.once("error", reject); |
|
|
setTimeout(() => reject(new Error("Upload timed out")), 10000); |
|
|
}); |
|
|
}; |
|
|
|