101 lines
3.7 KiB
TypeScript
101 lines
3.7 KiB
TypeScript
import { Err, Ok, type Result } from "~~/types/result";
|
|
|
|
export const useTopic = () => {
|
|
enum AutoRenameError {
|
|
AutoRenameDisabled = 0,
|
|
NoModelSelected,
|
|
NoModelFound,
|
|
ModelDisabled,
|
|
DatabaseOperationFailed,
|
|
FailedToDecryptProviderApiKey,
|
|
FailedToGenerate,
|
|
}
|
|
const autoRename = async (topicId: string): Promise<Result<string, AutoRenameError>> => {
|
|
const { settings } = await useUserSettings();
|
|
|
|
if (!settings.value.systemAssistants.rename.enabled) {
|
|
return Err(AutoRenameError.AutoRenameDisabled);
|
|
}
|
|
|
|
if (!settings.value.systemAssistants.rename.modelId) {
|
|
return Err(AutoRenameError.NoModelSelected);
|
|
}
|
|
|
|
const { allModels } = await useModels();
|
|
|
|
const model = allModels.value.find(model => model.id === settings.value.systemAssistants.rename.modelId);
|
|
|
|
if (!model) {
|
|
return Err(AutoRenameError.NoModelFound);
|
|
}
|
|
|
|
if (model.enabled === false || model.provider?.enabled === false) {
|
|
return Err(AutoRenameError.ModelDisabled)
|
|
}
|
|
|
|
let providerApiKey: string | undefined = undefined;
|
|
if (model.provider!.config.apiKey !== undefined) {
|
|
try {
|
|
const key = await crypto.subtle.importKey(
|
|
"jwk",
|
|
JSON.parse(window.localStorage.getItem("encryptionKey")!),
|
|
"AES-GCM",
|
|
false,
|
|
["encrypt", "decrypt"]
|
|
)
|
|
|
|
providerApiKey = await decrypt(
|
|
key,
|
|
base64ToUint8Array(model.provider!.config.apiKey)
|
|
);
|
|
} catch (error) {
|
|
console.error('Failed to decrypt provider API key:', error);
|
|
return Err(AutoRenameError.FailedToDecryptProviderApiKey);
|
|
}
|
|
}
|
|
|
|
const { agents } = await useAgents();
|
|
|
|
try {
|
|
// @ts-ignore - excessive stack depth
|
|
const res = await $fetch(`/api/topic/${topicId}/auto-rename`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
modelId: model.id,
|
|
providerApiKey,
|
|
}),
|
|
onRequest() {
|
|
const topics = agents.value.flatMap(agent => agent.topics);
|
|
const topic = topics.find(topic => topic.id === topicId);
|
|
if (topic) {
|
|
agents.value = agents.value.map(agent => {
|
|
return agent.id === topic.agentId ? { ...agent, topics: agent.topics.map(t => t.id === topic.id ? { ...topic, renaming: true } : t) } : agent;
|
|
});
|
|
}
|
|
},
|
|
onRequestError() {
|
|
const topics = agents.value.flatMap(agent => agent.topics);
|
|
const topic = topics.find(topic => topic.id === topicId);
|
|
if (topic) {
|
|
agents.value = agents.value.map(agent => {
|
|
return agent.id === topic.agentId ? { ...agent, topics: agent.topics.map(t => t.id === topic.id ? { ...topic, renaming: false } : t) } : agent;
|
|
});
|
|
}
|
|
},
|
|
}) as { ok: true, renameId: string } | { ok: false, code: string };
|
|
if (!res.ok) {
|
|
console.error('Failed to auto-rename:', res.code);
|
|
return Err(AutoRenameError.FailedToGenerate);
|
|
}
|
|
|
|
return Ok(res.renameId);
|
|
} catch (error) {
|
|
console.error('Failed to auto-rename:', error);
|
|
return Err(AutoRenameError.FailedToGenerate);
|
|
}
|
|
}
|
|
|
|
return {
|
|
autoRename
|
|
};
|
|
} |