feat: Enable title generation in GeneralSettings component
This commit is contained in:
parent
48a4af50ee
commit
eccf8f8a88
@ -29,6 +29,8 @@ export const GeneralSettings = () => {
|
|||||||
false
|
false
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const [generateTitle, setGenerateTitle] = useStorage("titleGenEnabled", false)
|
||||||
|
|
||||||
const [hideCurrentChatModelSettings, setHideCurrentChatModelSettings] =
|
const [hideCurrentChatModelSettings, setHideCurrentChatModelSettings] =
|
||||||
useStorage("hideCurrentChatModelSettings", false)
|
useStorage("hideCurrentChatModelSettings", false)
|
||||||
|
|
||||||
@ -141,6 +143,19 @@ export const GeneralSettings = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-row justify-between">
|
||||||
|
<div className="inline-flex items-center gap-2">
|
||||||
|
<span className="text-gray-700 dark:text-neutral-50">
|
||||||
|
{t("generalSettings.settings.generateTitle.label")}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
checked={generateTitle}
|
||||||
|
onChange={(checked) => setGenerateTitle(checked)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-row justify-between">
|
<div className="flex flex-row justify-between">
|
||||||
<span className="text-gray-700 dark:text-neutral-50 ">
|
<span className="text-gray-700 dark:text-neutral-50 ">
|
||||||
{t("generalSettings.settings.darkMode.label")}
|
{t("generalSettings.settings.darkMode.label")}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { saveHistory, saveMessage } from "@/db"
|
import { saveHistory, saveMessage } from "@/db"
|
||||||
import { setLastUsedChatModel } from "@/services/model-settings"
|
import { setLastUsedChatModel } from "@/services/model-settings"
|
||||||
|
import { generateTitle } from "@/services/title"
|
||||||
import { ChatHistory } from "@/store/option"
|
import { ChatHistory } from "@/store/option"
|
||||||
|
|
||||||
export const saveMessageOnError = async ({
|
export const saveMessageOnError = async ({
|
||||||
@ -73,7 +74,8 @@ export const saveMessageOnError = async ({
|
|||||||
)
|
)
|
||||||
await setLastUsedChatModel(historyId, selectedModel)
|
await setLastUsedChatModel(historyId, selectedModel)
|
||||||
} else {
|
} else {
|
||||||
const newHistoryId = await saveHistory(userMessage, false, message_source)
|
const title = await generateTitle(selectedModel, userMessage, userMessage)
|
||||||
|
const newHistoryId = await saveHistory(title, false, message_source)
|
||||||
if (!isRegenerating) {
|
if (!isRegenerating) {
|
||||||
await saveMessage(
|
await saveMessage(
|
||||||
newHistoryId.id,
|
newHistoryId.id,
|
||||||
@ -154,7 +156,8 @@ export const saveMessageOnSuccess = async ({
|
|||||||
)
|
)
|
||||||
await setLastUsedChatModel(historyId, selectedModel!)
|
await setLastUsedChatModel(historyId, selectedModel!)
|
||||||
} else {
|
} else {
|
||||||
const newHistoryId = await saveHistory(message, false, message_source)
|
const title = await generateTitle(selectedModel, message, message)
|
||||||
|
const newHistoryId = await saveHistory(title, false, message_source)
|
||||||
await saveMessage(
|
await saveMessage(
|
||||||
newHistoryId.id,
|
newHistoryId.id,
|
||||||
selectedModel,
|
selectedModel,
|
||||||
|
@ -13,12 +13,12 @@ export const pageAssistModel = async ({
|
|||||||
}: {
|
}: {
|
||||||
model: string
|
model: string
|
||||||
baseUrl: string
|
baseUrl: string
|
||||||
keepAlive: string
|
keepAlive?: string
|
||||||
temperature: number
|
temperature?: number
|
||||||
topK: number
|
topK?: number
|
||||||
topP: number
|
topP?: number
|
||||||
numCtx: number
|
numCtx?: number
|
||||||
seed: number
|
seed?: number
|
||||||
}) => {
|
}) => {
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case "chrome::gemini-nano::page-assist":
|
case "chrome::gemini-nano::page-assist":
|
||||||
|
72
src/services/title.ts
Normal file
72
src/services/title.ts
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import { pageAssistModel } from "@/models"
|
||||||
|
import { Storage } from "@plasmohq/storage"
|
||||||
|
import { getOllamaURL } from "./ollama"
|
||||||
|
import { cleanUrl } from "@/libs/clean-url"
|
||||||
|
import { HumanMessage } from "langchain/schema"
|
||||||
|
const storage = new Storage()
|
||||||
|
|
||||||
|
// this prompt is copied from the OpenWebUI codebase
|
||||||
|
export const DEFAULT_TITLE_GEN_PROMPT = `Here is the query:
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
{{query}}
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Create a concise, 3-5 word phrase as a title for the previous query. Suitable emojis for the summary can be used to enhance understanding. Avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT. ANSWER USING THE SAME LANGUAGE AS THE QUERY.
|
||||||
|
|
||||||
|
|
||||||
|
Examples of titles:
|
||||||
|
|
||||||
|
Stellar Achievement Celebration
|
||||||
|
Family Bonding Activities
|
||||||
|
🇫🇷 Voyage à Paris
|
||||||
|
🍜 Receta de Ramen Casero
|
||||||
|
Shakespeare Analyse Literarische
|
||||||
|
日本の春祭り体験
|
||||||
|
Древнегреческая Философия Обзор
|
||||||
|
|
||||||
|
Response:`
|
||||||
|
|
||||||
|
|
||||||
|
export const isTitleGenEnabled = async () => {
|
||||||
|
const enabled = await storage.get<boolean | undefined>("titleGenEnabled")
|
||||||
|
return enabled ?? false
|
||||||
|
}
|
||||||
|
|
||||||
|
export const setTitleGenEnabled = async (enabled: boolean) => {
|
||||||
|
await storage.set("titleGenEnabled", enabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const generateTitle = async (model: string, query: string, fallBackTitle: string) => {
|
||||||
|
|
||||||
|
const isEnabled = await isTitleGenEnabled()
|
||||||
|
|
||||||
|
if (!isEnabled) {
|
||||||
|
return fallBackTitle
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const url = await getOllamaURL()
|
||||||
|
|
||||||
|
const titleModel = await pageAssistModel({
|
||||||
|
baseUrl: cleanUrl(url),
|
||||||
|
model
|
||||||
|
})
|
||||||
|
|
||||||
|
const prompt = DEFAULT_TITLE_GEN_PROMPT.replace("{{query}}", query)
|
||||||
|
|
||||||
|
const title = await titleModel.invoke([
|
||||||
|
new HumanMessage({
|
||||||
|
content: prompt
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
return title.content.toString()
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`Error generating title: ${error}`)
|
||||||
|
return fallBackTitle
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user