mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-18 03:34:20 +00:00
feat: add functions for frontend of kb
This commit is contained in:
@@ -50,6 +50,9 @@ export default function DynamicFormComponent({
|
|||||||
case 'llm-model-selector':
|
case 'llm-model-selector':
|
||||||
fieldSchema = z.string();
|
fieldSchema = z.string();
|
||||||
break;
|
break;
|
||||||
|
case 'knowledge-base-selector':
|
||||||
|
fieldSchema = z.string();
|
||||||
|
break;
|
||||||
case 'prompt-editor':
|
case 'prompt-editor':
|
||||||
fieldSchema = z.array(
|
fieldSchema = z.array(
|
||||||
z.object({
|
z.object({
|
||||||
|
|||||||
@@ -14,9 +14,10 @@ import {
|
|||||||
import { Switch } from '@/components/ui/switch';
|
import { Switch } from '@/components/ui/switch';
|
||||||
import { ControllerRenderProps } from 'react-hook-form';
|
import { ControllerRenderProps } from 'react-hook-form';
|
||||||
import { Button } from '@/components/ui/button';
|
import { Button } from '@/components/ui/button';
|
||||||
import { useEffect, useState } from 'react';
|
import { use, useEffect, useState } from 'react';
|
||||||
import { httpClient } from '@/app/infra/http/HttpClient';
|
import { httpClient } from '@/app/infra/http/HttpClient';
|
||||||
import { LLMModel } from '@/app/infra/entities/api';
|
import { LLMModel } from '@/app/infra/entities/api';
|
||||||
|
import { KnowledgeBase } from '@/app/infra/entities/api';
|
||||||
import { toast } from 'sonner';
|
import { toast } from 'sonner';
|
||||||
import {
|
import {
|
||||||
HoverCard,
|
HoverCard,
|
||||||
@@ -35,6 +36,7 @@ export default function DynamicFormItemComponent({
|
|||||||
field: ControllerRenderProps<any, any>;
|
field: ControllerRenderProps<any, any>;
|
||||||
}) {
|
}) {
|
||||||
const [llmModels, setLlmModels] = useState<LLMModel[]>([]);
|
const [llmModels, setLlmModels] = useState<LLMModel[]>([]);
|
||||||
|
const [knowledgeBases, setKnowledgeBases] = useState<KnowledgeBase[]>([]);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -49,6 +51,19 @@ export default function DynamicFormItemComponent({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [config.type]);
|
}, [config.type]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (config.type === DynamicFormItemType.KNOWLEDGE_BASE_SELECTOR) {
|
||||||
|
httpClient
|
||||||
|
.getKnowledgeBases()
|
||||||
|
.then((resp) => {
|
||||||
|
setKnowledgeBases(resp.bases);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
toast.error('获取知识库列表失败:' + err.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [config.type]);
|
||||||
|
|
||||||
switch (config.type) {
|
switch (config.type) {
|
||||||
case DynamicFormItemType.INT:
|
case DynamicFormItemType.INT:
|
||||||
@@ -249,6 +264,42 @@ export default function DynamicFormItemComponent({
|
|||||||
</Select>
|
</Select>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
case DynamicFormItemType.KNOWLEDGE_BASE_SELECTOR:
|
||||||
|
return (
|
||||||
|
<Select value={field.value} onValueChange={field.onChange}>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue placeholder={t('knowledge.selectKnowledgeBase')} />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent>
|
||||||
|
<SelectGroup>
|
||||||
|
{/* <SelectItem value="">{t('knowledge.empty')}</SelectItem> */}
|
||||||
|
{knowledgeBases.map((base) => (
|
||||||
|
<HoverCard key={base.uuid} openDelay={0} closeDelay={0}>
|
||||||
|
<HoverCardTrigger asChild>
|
||||||
|
<SelectItem value={base.uuid ?? ''}>{base.name}</SelectItem>
|
||||||
|
</HoverCardTrigger>
|
||||||
|
<HoverCardContent
|
||||||
|
className="w-80 data-[state=open]:animate-none data-[state=closed]:animate-none"
|
||||||
|
align="end"
|
||||||
|
side="right"
|
||||||
|
sideOffset={10}
|
||||||
|
>
|
||||||
|
<div className="space-y-2">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<h4 className="font-medium">{base.name}</h4>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-muted-foreground">
|
||||||
|
{base.description}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</HoverCardContent>
|
||||||
|
</HoverCard>
|
||||||
|
))}
|
||||||
|
</SelectGroup>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
);
|
||||||
|
|
||||||
case DynamicFormItemType.PROMPT_EDITOR:
|
case DynamicFormItemType.PROMPT_EDITOR:
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
|
|||||||
@@ -55,6 +55,15 @@ export interface LLMModel {
|
|||||||
// updated_at: string;
|
// updated_at: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface KnowledgeBase {
|
||||||
|
uuid?: string;
|
||||||
|
name: string;
|
||||||
|
description: string;
|
||||||
|
embedding_model_uuid: string;
|
||||||
|
created_at?: string;
|
||||||
|
top_k?: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ApiRespProviderEmbeddingModels {
|
export interface ApiRespProviderEmbeddingModels {
|
||||||
models: EmbeddingModel[];
|
models: EmbeddingModel[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export enum DynamicFormItemType {
|
|||||||
LLM_MODEL_SELECTOR = 'llm-model-selector',
|
LLM_MODEL_SELECTOR = 'llm-model-selector',
|
||||||
PROMPT_EDITOR = 'prompt-editor',
|
PROMPT_EDITOR = 'prompt-editor',
|
||||||
UNKNOWN = 'unknown',
|
UNKNOWN = 'unknown',
|
||||||
|
KNOWLEDGE_BASE_SELECTOR = 'knowledge-base-selector',
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDynamicFormItemOption {
|
export interface IDynamicFormItemOption {
|
||||||
|
|||||||
@@ -234,6 +234,8 @@ const enUS = {
|
|||||||
title: 'Knowledge',
|
title: 'Knowledge',
|
||||||
createKnowledgeBase: 'Create Knowledge Base',
|
createKnowledgeBase: 'Create Knowledge Base',
|
||||||
editKnowledgeBase: 'Edit Knowledge Base',
|
editKnowledgeBase: 'Edit Knowledge Base',
|
||||||
|
selectKnowledgeBase: 'Select Knowledge Base',
|
||||||
|
empty: 'Empty',
|
||||||
editDocument: 'Documents',
|
editDocument: 'Documents',
|
||||||
description: 'Configuring knowledge bases for improved LLM responses',
|
description: 'Configuring knowledge bases for improved LLM responses',
|
||||||
metadata: 'Metadata',
|
metadata: 'Metadata',
|
||||||
|
|||||||
@@ -236,6 +236,8 @@ const jaJP = {
|
|||||||
title: '知識ベース',
|
title: '知識ベース',
|
||||||
createKnowledgeBase: '知識ベースを作成',
|
createKnowledgeBase: '知識ベースを作成',
|
||||||
editKnowledgeBase: '知識ベースを編集',
|
editKnowledgeBase: '知識ベースを編集',
|
||||||
|
selectKnowledgeBase: '知識ベースを選択',
|
||||||
|
empty: 'なし',
|
||||||
editDocument: 'ドキュメント',
|
editDocument: 'ドキュメント',
|
||||||
description: 'LLMの回答品質向上のための知識ベースを設定します',
|
description: 'LLMの回答品質向上のための知識ベースを設定します',
|
||||||
metadata: 'メタデータ',
|
metadata: 'メタデータ',
|
||||||
|
|||||||
@@ -229,6 +229,8 @@ const zhHans = {
|
|||||||
title: '知识库',
|
title: '知识库',
|
||||||
createKnowledgeBase: '创建知识库',
|
createKnowledgeBase: '创建知识库',
|
||||||
editKnowledgeBase: '编辑知识库',
|
editKnowledgeBase: '编辑知识库',
|
||||||
|
selectKnowledgeBase: '选择知识库',
|
||||||
|
empty: '无',
|
||||||
editDocument: '文档',
|
editDocument: '文档',
|
||||||
description: '配置可用于提升模型回复质量的知识库',
|
description: '配置可用于提升模型回复质量的知识库',
|
||||||
metadata: '元数据',
|
metadata: '元数据',
|
||||||
|
|||||||
Reference in New Issue
Block a user