feat: Add Number of Retrieved Documents on RAG
This commit is contained in:
parent
564b137e66
commit
35b8579028
@ -311,6 +311,11 @@
|
|||||||
"label": "Knowledge Base Default File Upload Limit",
|
"label": "Knowledge Base Default File Upload Limit",
|
||||||
"placeholder": "Enter default file upload limit (e.g., 10)",
|
"placeholder": "Enter default file upload limit (e.g., 10)",
|
||||||
"required": "Please enter the default file upload limit"
|
"required": "Please enter the default file upload limit"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Number of Retrieved Documents",
|
||||||
|
"placeholder": "Enter Number of Retrieved Documents",
|
||||||
|
"required": "Please enter the number of retrieved documents"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Enviar notificación después de terminar el procesamiento de la base de conocimientos"
|
"label": "Enviar notificación después de terminar el procesamiento de la base de conocimientos"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Generar título usando IA"
|
"label": "Generar título usando IA"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -310,7 +310,13 @@
|
|||||||
"totalFilePerKB": {
|
"totalFilePerKB": {
|
||||||
"label": "Límite predeterminado de carga de archivos para la Base de Conocimientos",
|
"label": "Límite predeterminado de carga de archivos para la Base de Conocimientos",
|
||||||
"placeholder": "Ingrese el límite predeterminado de carga de archivos (ej., 10)",
|
"placeholder": "Ingrese el límite predeterminado de carga de archivos (ej., 10)",
|
||||||
"required": "Por favor, ingrese el límite predeterminado de carga de archivos" }
|
"required": "Por favor, ingrese el límite predeterminado de carga de archivos"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Número de Documentos Recuperados",
|
||||||
|
"placeholder": "Ingrese el Número de Documentos Recuperados",
|
||||||
|
"required": "Por favor, ingrese el número de documentos recuperados"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "Configurar el Prompt del RAG",
|
"label": "Configurar el Prompt del RAG",
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "ارسال نوتیفیکیشن پس از اتمام پردازش پایگاه دانش"
|
"label": "ارسال نوتیفیکیشن پس از اتمام پردازش پایگاه دانش"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "تولید عنوان با استفاده از هوش مصنوعی"
|
"label": "تولید عنوان با استفاده از هوش مصنوعی"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -309,7 +309,13 @@
|
|||||||
"totalFilePerKB": {
|
"totalFilePerKB": {
|
||||||
"label": "محدودیت پیشفرض آپلود فایل پایگاه دانش",
|
"label": "محدودیت پیشفرض آپلود فایل پایگاه دانش",
|
||||||
"placeholder": "محدودیت پیشفرض آپلود فایل را وارد کنید (مثلاً 10)",
|
"placeholder": "محدودیت پیشفرض آپلود فایل را وارد کنید (مثلاً 10)",
|
||||||
"required": "لطفاً محدودیت پیشفرض آپلود فایل را وارد کنید" }
|
"required": "لطفاً محدودیت پیشفرض آپلود فایل را وارد کنید"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "تعداد اسناد بازیابی شده",
|
||||||
|
"placeholder": "تعداد اسناد بازیابی شده را وارد کنید",
|
||||||
|
"required": "لطفاً تعداد اسناد بازیابی شده را وارد کنید"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "پیکربندی پرامپت RAG",
|
"label": "پیکربندی پرامپت RAG",
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Envoyer une notification après avoir terminé le traitement de la base de connaissances"
|
"label": "Envoyer une notification après avoir terminé le traitement de la base de connaissances"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Générer le titre en utilisant l'IA"
|
"label": "Générer le titre en utilisant l'IA"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -310,7 +310,13 @@
|
|||||||
"totalFilePerKB": {
|
"totalFilePerKB": {
|
||||||
"label": "Limite par défaut de téléchargement de fichiers pour la base de connaissances",
|
"label": "Limite par défaut de téléchargement de fichiers pour la base de connaissances",
|
||||||
"placeholder": "Entrez la limite par défaut de téléchargement de fichiers (par exemple, 10)",
|
"placeholder": "Entrez la limite par défaut de téléchargement de fichiers (par exemple, 10)",
|
||||||
"required": "Veuillez saisir la limite par défaut de téléchargement de fichiers" }
|
"required": "Veuillez saisir la limite par défaut de téléchargement de fichiers"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Nombre de documents récupérés",
|
||||||
|
"placeholder": "Entrez le nombre de documents récupérés",
|
||||||
|
"required": "Veuillez saisir le nombre de documents récupérés"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "Configure RAG Prompt",
|
"label": "Configure RAG Prompt",
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Inviare notifica dopo aver terminato l'elaborazione della base di conoscenza"
|
"label": "Inviare notifica dopo aver terminato l'elaborazione della base di conoscenza"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Genera titolo utilizzando l'IA"
|
"label": "Genera titolo utilizzando l'IA"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -310,7 +310,13 @@
|
|||||||
"totalFilePerKB": {
|
"totalFilePerKB": {
|
||||||
"label": "Limite Predefinito di Caricamento File per la Base di Conoscenza",
|
"label": "Limite Predefinito di Caricamento File per la Base di Conoscenza",
|
||||||
"placeholder": "Inserisci il limite predefinito di caricamento file (es. 10)",
|
"placeholder": "Inserisci il limite predefinito di caricamento file (es. 10)",
|
||||||
"required": "Inserisci il limite predefinito di caricamento file" }
|
"required": "Inserisci il limite predefinito di caricamento file"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Numero di Documenti Recuperati",
|
||||||
|
"placeholder": "Inserisci il Numero di Documenti Recuperati",
|
||||||
|
"required": "Inserisci il numero di documenti recuperati"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "Configura il Prompt RAG",
|
"label": "Configura il Prompt RAG",
|
||||||
|
@ -314,6 +314,11 @@
|
|||||||
"label": "知識ベースのデフォルトファイルアップロード制限",
|
"label": "知識ベースのデフォルトファイルアップロード制限",
|
||||||
"placeholder": "デフォルトのファイルアップロード制限を入力してください(例:10)",
|
"placeholder": "デフォルトのファイルアップロード制限を入力してください(例:10)",
|
||||||
"required": "デフォルトのファイルアップロード制限を入力してください"
|
"required": "デフォルトのファイルアップロード制限を入力してください"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "取得ドキュメント数",
|
||||||
|
"placeholder": "取得ドキュメント数を入力",
|
||||||
|
"required": "取得ドキュメント数を入力してください"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
@ -314,6 +314,11 @@
|
|||||||
"label": "വിജ്ഞാനാധാരത്തിന്റെ സ്ഥിര ഫയൽ അപ്ലോഡ് പരിധി",
|
"label": "വിജ്ഞാനാധാരത്തിന്റെ സ്ഥിര ഫയൽ അപ്ലോഡ് പരിധി",
|
||||||
"placeholder": "സ്ഥിര ഫയൽ അപ്ലോഡ് പരിധി നൽകുക (ഉദാ: 10)",
|
"placeholder": "സ്ഥിര ഫയൽ അപ്ലോഡ് പരിധി നൽകുക (ഉദാ: 10)",
|
||||||
"required": "ദയവായി സ്ഥിര ഫയൽ അപ്ലോഡ് പരിധി നൽകുക"
|
"required": "ദയവായി സ്ഥിര ഫയൽ അപ്ലോഡ് പരിധി നൽകുക"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "വീണ്ടെടുത്ത രേഖകളുടെ എണ്ണം",
|
||||||
|
"placeholder": "വീണ്ടെടുത്ത രേഖകളുടെ എണ്ണം നൽകുക",
|
||||||
|
"required": "ദയവായി വീണ്ടെടുത്ത രേഖകളുടെ എണ്ണം നൽകുക"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
@ -311,6 +311,11 @@
|
|||||||
"label": "Limite Padrão de Upload de Arquivos da Base de Conhecimento",
|
"label": "Limite Padrão de Upload de Arquivos da Base de Conhecimento",
|
||||||
"placeholder": "Digite o limite padrão de upload de arquivos (ex: 10)",
|
"placeholder": "Digite o limite padrão de upload de arquivos (ex: 10)",
|
||||||
"required": "Por favor, insira o limite padrão de upload de arquivos"
|
"required": "Por favor, insira o limite padrão de upload de arquivos"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Número de Documentos Recuperados",
|
||||||
|
"placeholder": "Digite o Número de Documentos Recuperados",
|
||||||
|
"required": "Por favor, insira o número de documentos recuperados"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
@ -312,7 +312,13 @@
|
|||||||
"totalFilePerKB": {
|
"totalFilePerKB": {
|
||||||
"label": "Лимит загрузки файлов по умолчанию для базы знаний",
|
"label": "Лимит загрузки файлов по умолчанию для базы знаний",
|
||||||
"placeholder": "Введите лимит загрузки файлов по умолчанию (например, 10)",
|
"placeholder": "Введите лимит загрузки файлов по умолчанию (например, 10)",
|
||||||
"required": "Пожалуйста, введите лимит загрузки файлов по умолчанию" }
|
"required": "Пожалуйста, введите лимит загрузки файлов по умолчанию"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Количество извлеченных документов",
|
||||||
|
"placeholder": "Введите количество извлеченных документов",
|
||||||
|
"required": "Пожалуйста, введите количество извлеченных документов"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "Настройка системной подсказки RAG",
|
"label": "Настройка системной подсказки RAG",
|
||||||
|
@ -316,6 +316,11 @@
|
|||||||
"label": "知识库默认文件上传限制",
|
"label": "知识库默认文件上传限制",
|
||||||
"placeholder": "输入默认文件上传限制(例如:10)",
|
"placeholder": "输入默认文件上传限制(例如:10)",
|
||||||
"required": "请输入默认文件上传限制"
|
"required": "请输入默认文件上传限制"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "检索文档数量",
|
||||||
|
"placeholder": "输入检索文档数量",
|
||||||
|
"required": "请输入检索文档数量"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
@ -10,7 +10,7 @@ import {
|
|||||||
} from "~/services/ollama"
|
} from "~/services/ollama"
|
||||||
import { SettingPrompt } from "./prompt"
|
import { SettingPrompt } from "./prompt"
|
||||||
import { useTranslation } from "react-i18next"
|
import { useTranslation } from "react-i18next"
|
||||||
import { getTotalFilePerKB } from "@/services/app"
|
import { getNoOfRetrievedDocs, getTotalFilePerKB } from "@/services/app"
|
||||||
import { SidepanelRag } from "./sidepanel-rag"
|
import { SidepanelRag } from "./sidepanel-rag"
|
||||||
|
|
||||||
export const RagSettings = () => {
|
export const RagSettings = () => {
|
||||||
@ -21,20 +21,28 @@ export const RagSettings = () => {
|
|||||||
const { data: ollamaInfo, status } = useQuery({
|
const { data: ollamaInfo, status } = useQuery({
|
||||||
queryKey: ["fetchRAGSettings"],
|
queryKey: ["fetchRAGSettings"],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const [allModels, chunkOverlap, chunkSize, defaultEM, totalFilePerKB] =
|
const [
|
||||||
await Promise.all([
|
allModels,
|
||||||
|
chunkOverlap,
|
||||||
|
chunkSize,
|
||||||
|
defaultEM,
|
||||||
|
totalFilePerKB,
|
||||||
|
noOfRetrievedDocs
|
||||||
|
] = await Promise.all([
|
||||||
getAllModels({ returnEmpty: true }),
|
getAllModels({ returnEmpty: true }),
|
||||||
defaultEmbeddingChunkOverlap(),
|
defaultEmbeddingChunkOverlap(),
|
||||||
defaultEmbeddingChunkSize(),
|
defaultEmbeddingChunkSize(),
|
||||||
defaultEmbeddingModelForRag(),
|
defaultEmbeddingModelForRag(),
|
||||||
getTotalFilePerKB()
|
getTotalFilePerKB(),
|
||||||
|
getNoOfRetrievedDocs()
|
||||||
])
|
])
|
||||||
return {
|
return {
|
||||||
models: allModels,
|
models: allModels,
|
||||||
chunkOverlap,
|
chunkOverlap,
|
||||||
chunkSize,
|
chunkSize,
|
||||||
defaultEM,
|
defaultEM,
|
||||||
totalFilePerKB
|
totalFilePerKB,
|
||||||
|
noOfRetrievedDocs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -45,8 +53,15 @@ export const RagSettings = () => {
|
|||||||
chunkSize: number
|
chunkSize: number
|
||||||
overlap: number
|
overlap: number
|
||||||
totalFilePerKB: number
|
totalFilePerKB: number
|
||||||
|
noOfRetrievedDocs: number
|
||||||
}) => {
|
}) => {
|
||||||
await saveForRag(data.model, data.chunkSize, data.overlap, data.totalFilePerKB)
|
await saveForRag(
|
||||||
|
data.model,
|
||||||
|
data.chunkSize,
|
||||||
|
data.overlap,
|
||||||
|
data.totalFilePerKB,
|
||||||
|
data.noOfRetrievedDocs
|
||||||
|
)
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
@ -75,14 +90,16 @@ export const RagSettings = () => {
|
|||||||
model: data.defaultEM,
|
model: data.defaultEM,
|
||||||
chunkSize: data.chunkSize,
|
chunkSize: data.chunkSize,
|
||||||
overlap: data.chunkOverlap,
|
overlap: data.chunkOverlap,
|
||||||
totalFilePerKB: data.totalFilePerKB
|
totalFilePerKB: data.totalFilePerKB,
|
||||||
|
noOfRetrievedDocs: data.noOfRetrievedDocs
|
||||||
})
|
})
|
||||||
}}
|
}}
|
||||||
initialValues={{
|
initialValues={{
|
||||||
chunkSize: ollamaInfo?.chunkSize,
|
chunkSize: ollamaInfo?.chunkSize,
|
||||||
chunkOverlap: ollamaInfo?.chunkOverlap,
|
chunkOverlap: ollamaInfo?.chunkOverlap,
|
||||||
defaultEM: ollamaInfo?.defaultEM,
|
defaultEM: ollamaInfo?.defaultEM,
|
||||||
totalFilePerKB: ollamaInfo?.totalFilePerKB
|
totalFilePerKB: ollamaInfo?.totalFilePerKB,
|
||||||
|
noOfRetrievedDocs: ollamaInfo?.noOfRetrievedDocs
|
||||||
}}>
|
}}>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name="defaultEM"
|
name="defaultEM"
|
||||||
@ -142,6 +159,23 @@ export const RagSettings = () => {
|
|||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
|
<Form.Item
|
||||||
|
name="noOfRetrievedDocs"
|
||||||
|
label={t("rag.ragSettings.noOfRetrievedDocs.label")}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: t("rag.ragSettings.noOfRetrievedDocs.required")
|
||||||
|
}
|
||||||
|
]}>
|
||||||
|
<InputNumber
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
placeholder={t(
|
||||||
|
"rag.ragSettings.noOfRetrievedDocs.placeholder"
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name="totalFilePerKB"
|
name="totalFilePerKB"
|
||||||
label={t("rag.ragSettings.totalFilePerKB.label")}
|
label={t("rag.ragSettings.totalFilePerKB.label")}
|
||||||
@ -153,11 +187,11 @@ export const RagSettings = () => {
|
|||||||
]}>
|
]}>
|
||||||
<InputNumber
|
<InputNumber
|
||||||
style={{ width: "100%" }}
|
style={{ width: "100%" }}
|
||||||
|
min={1}
|
||||||
placeholder={t("rag.ragSettings.totalFilePerKB.placeholder")}
|
placeholder={t("rag.ragSettings.totalFilePerKB.placeholder")}
|
||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
|
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
<SaveButton disabled={isSaveRAGPending} btnType="submit" />
|
<SaveButton disabled={isSaveRAGPending} btnType="submit" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -32,6 +32,7 @@ import { useStorage } from "@plasmohq/storage/hook"
|
|||||||
import { useStoreChatModelSettings } from "@/store/model"
|
import { useStoreChatModelSettings } from "@/store/model"
|
||||||
import { getAllDefaultModelSettings } from "@/services/model-settings"
|
import { getAllDefaultModelSettings } from "@/services/model-settings"
|
||||||
import { pageAssistModel } from "@/models"
|
import { pageAssistModel } from "@/models"
|
||||||
|
import { getNoOfRetrievedDocs } from "@/services/app"
|
||||||
|
|
||||||
export const useMessageOption = () => {
|
export const useMessageOption = () => {
|
||||||
const {
|
const {
|
||||||
@ -680,8 +681,9 @@ export const useMessageOption = () => {
|
|||||||
const response = await questionOllama.invoke(promptForQuestion)
|
const response = await questionOllama.invoke(promptForQuestion)
|
||||||
query = response.content.toString()
|
query = response.content.toString()
|
||||||
}
|
}
|
||||||
|
const docSize = await getNoOfRetrievedDocs()
|
||||||
|
|
||||||
const docs = await vectorstore.similaritySearch(query, 4)
|
const docs = await vectorstore.similaritySearch(query, docSize)
|
||||||
const context = formatDocs(docs)
|
const context = formatDocs(docs)
|
||||||
const source = docs.map((doc) => {
|
const source = docs.map((doc) => {
|
||||||
return {
|
return {
|
||||||
|
@ -109,3 +109,12 @@ export const getTotalFilePerKB = async (): Promise<number> => {
|
|||||||
export const setTotalFilePerKB = async (totalFilePerKB: number): Promise<void> => {
|
export const setTotalFilePerKB = async (totalFilePerKB: number): Promise<void> => {
|
||||||
await storage.set("totalFilePerKB", totalFilePerKB);
|
await storage.set("totalFilePerKB", totalFilePerKB);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getNoOfRetrievedDocs = async (): Promise<number> => {
|
||||||
|
const noOfRetrievedDocs = await storage.get<number>("noOfRetrievedDocs");
|
||||||
|
return noOfRetrievedDocs || 4
|
||||||
|
}
|
||||||
|
|
||||||
|
export const setNoOfRetrievedDocs = async (noOfRetrievedDocs: number): Promise<void> => {
|
||||||
|
await storage.set("noOfRetrievedDocs", noOfRetrievedDocs);
|
||||||
|
}
|
@ -2,7 +2,7 @@ import { Storage } from "@plasmohq/storage"
|
|||||||
import { cleanUrl } from "../libs/clean-url"
|
import { cleanUrl } from "../libs/clean-url"
|
||||||
import { urlRewriteRuntime } from "../libs/runtime"
|
import { urlRewriteRuntime } from "../libs/runtime"
|
||||||
import { getChromeAIModel } from "./chrome"
|
import { getChromeAIModel } from "./chrome"
|
||||||
import { setTotalFilePerKB } from "./app"
|
import { setNoOfRetrievedDocs, setTotalFilePerKB } from "./app"
|
||||||
|
|
||||||
const storage = new Storage()
|
const storage = new Storage()
|
||||||
|
|
||||||
@ -326,12 +326,14 @@ export const saveForRag = async (
|
|||||||
model: string,
|
model: string,
|
||||||
chunkSize: number,
|
chunkSize: number,
|
||||||
overlap: number,
|
overlap: number,
|
||||||
totalFilePerKB: number
|
totalFilePerKB: number,
|
||||||
|
noOfRetrievedDocs: number
|
||||||
) => {
|
) => {
|
||||||
await setDefaultEmbeddingModelForRag(model)
|
await setDefaultEmbeddingModelForRag(model)
|
||||||
await setDefaultEmbeddingChunkSize(chunkSize)
|
await setDefaultEmbeddingChunkSize(chunkSize)
|
||||||
await setDefaultEmbeddingChunkOverlap(overlap)
|
await setDefaultEmbeddingChunkOverlap(overlap)
|
||||||
await setTotalFilePerKB(totalFilePerKB)
|
await setTotalFilePerKB(totalFilePerKB)
|
||||||
|
await setNoOfRetrievedDocs(noOfRetrievedDocs)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getWebSearchPrompt = async () => {
|
export const getWebSearchPrompt = async () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user