| | |
| | | FormDataConsumer, |
| | | TextInput, |
| | | useNotify, |
| | | useTranslate, |
| | | } from "react-admin"; |
| | | import { Alert, Button, Grid, Stack, TextField, Typography } from "@mui/material"; |
| | | import StatusSelectInput from "@/page/components/StatusSelectInput"; |
| | |
| | | |
| | | const AiPromptPreviewSection = ({ formData }) => { |
| | | const notify = useNotify(); |
| | | const [input, setInput] = useState("请帮我总结当前页面能做什么"); |
| | | const translate = useTranslate(); |
| | | const [input, setInput] = useState(() => translate("ai.prompt.preview.defaultInput")); |
| | | const [metadataText, setMetadataText] = useState("{\"path\":\"/system/aiPrompt\"}"); |
| | | const [preview, setPreview] = useState(null); |
| | | const [loading, setLoading] = useState(false); |
| | |
| | | metadata, |
| | | }); |
| | | setPreview(data); |
| | | notify("Prompt 预览完成"); |
| | | notify(translate("ai.prompt.preview.success")); |
| | | } catch (error) { |
| | | setPreview(null); |
| | | notify(error?.message || "Prompt 预览失败", { type: "error" }); |
| | | notify(error?.message || translate("ai.prompt.preview.failed"), { type: "error" }); |
| | | } finally { |
| | | setLoading(false); |
| | | } |
| | |
| | | return ( |
| | | <> |
| | | <Grid item xs={12}> |
| | | <Typography variant="h6">Prompt 预览</Typography> |
| | | <Typography variant="h6">{translate("ai.prompt.preview.title")}</Typography> |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextField |
| | | label="示例输入" |
| | | label={translate("ai.prompt.preview.input")} |
| | | value={input} |
| | | onChange={(event) => setInput(event.target.value)} |
| | | fullWidth |
| | |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextField |
| | | label="示例元数据 JSON" |
| | | label={translate("ai.prompt.preview.metadata")} |
| | | value={metadataText} |
| | | onChange={(event) => setMetadataText(event.target.value)} |
| | | fullWidth |
| | |
| | | <Grid item xs={12}> |
| | | <Stack direction="row" spacing={1} alignItems="center"> |
| | | <Button variant="outlined" onClick={handlePreview} disabled={loading}> |
| | | {loading ? "预览中..." : "预览渲染"} |
| | | {loading ? translate("ai.prompt.preview.loading") : translate("ai.prompt.preview.render")} |
| | | </Button> |
| | | <Typography variant="body2" color="text.secondary"> |
| | | 用当前表单内容渲染 System Prompt 和 User Prompt。 |
| | | {translate("ai.prompt.preview.description")} |
| | | </Typography> |
| | | </Stack> |
| | | </Grid> |
| | |
| | | <> |
| | | <Grid item xs={12}> |
| | | <Alert severity="success"> |
| | | 已解析变量:{(preview.resolvedVariables || []).join(", ") || "无"} |
| | | {translate("ai.prompt.preview.resolvedVariables", { |
| | | value: (preview.resolvedVariables || []).join(", ") || translate("ai.common.none"), |
| | | })} |
| | | </Alert> |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextField |
| | | label="渲染后的 System Prompt" |
| | | label={translate("ai.prompt.preview.renderedSystemPrompt")} |
| | | value={preview.renderedSystemPrompt || ""} |
| | | fullWidth |
| | | multiline |
| | |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextField |
| | | label="渲染后的 User Prompt" |
| | | label={translate("ai.prompt.preview.renderedUserPrompt")} |
| | | value={preview.renderedUserPrompt || ""} |
| | | fullWidth |
| | | multiline |
| | |
| | | ); |
| | | }; |
| | | |
| | | const AiPromptForm = ({ readOnly = false }) => ( |
| | | const AiPromptForm = ({ readOnly = false }) => { |
| | | const translate = useTranslate(); |
| | | |
| | | return ( |
| | | <Grid container spacing={2} width={{ xs: "100%", xl: "80%" }}> |
| | | <Grid item xs={12}> |
| | | <Typography variant="h6">Prompt 配置</Typography> |
| | | <Typography variant="h6">{translate("ai.prompt.form.sections.main")}</Typography> |
| | | </Grid> |
| | | <Grid item xs={12} md={6}> |
| | | <TextInput source="name" label="名称" fullWidth disabled={readOnly} /> |
| | | <TextInput source="name" label="common.field.name" fullWidth disabled={readOnly} /> |
| | | </Grid> |
| | | <Grid item xs={12} md={6}> |
| | | <TextInput source="code" label="编码" fullWidth disabled={readOnly} /> |
| | | <TextInput source="code" label="ai.prompt.fields.code" fullWidth disabled={readOnly} /> |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextInput source="scene" label="场景" fullWidth disabled={readOnly} /> |
| | | <TextInput source="scene" label="ai.prompt.fields.scene" fullWidth disabled={readOnly} /> |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextInput source="systemPrompt" label="System Prompt" fullWidth multiline minRows={6} disabled={readOnly} /> |
| | | <TextInput source="systemPrompt" label="ai.prompt.fields.systemPrompt" fullWidth multiline minRows={6} disabled={readOnly} /> |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextInput source="userPromptTemplate" label="User Prompt Template" fullWidth multiline minRows={5} disabled={readOnly} /> |
| | | <TextInput source="userPromptTemplate" label="ai.prompt.fields.userPromptTemplate" fullWidth multiline minRows={5} disabled={readOnly} /> |
| | | </Grid> |
| | | <Grid item xs={12} md={6}> |
| | | <StatusSelectInput disabled={readOnly} /> |
| | | </Grid> |
| | | <Grid item xs={12}> |
| | | <TextInput source="memo" label="备注" fullWidth multiline minRows={3} disabled={readOnly} /> |
| | | <TextInput source="memo" label="common.field.memo" fullWidth multiline minRows={3} disabled={readOnly} /> |
| | | </Grid> |
| | | <FormDataConsumer> |
| | | {({ formData }) => <AiPromptPreviewSection formData={formData} />} |
| | | </FormDataConsumer> |
| | | <Grid item xs={12}> |
| | | <Typography variant="h6">运行与审计信息</Typography> |
| | | <Typography variant="h6">{translate("ai.prompt.form.sections.runtime")}</Typography> |
| | | </Grid> |
| | | <Grid item xs={12} md={6}> |
| | | <TextInput source="updateBy" label="最近更新人" fullWidth disabled /> |
| | | <TextInput source="updateBy" label="ai.common.lastUpdatedBy" fullWidth disabled /> |
| | | </Grid> |
| | | <Grid item xs={12} md={6}> |
| | | <TextInput source="updateTime$" label="最近更新时间" fullWidth disabled /> |
| | | <TextInput source="updateTime$" label="ai.common.lastUpdatedAt" fullWidth disabled /> |
| | | </Grid> |
| | | </Grid> |
| | | ); |
| | | }; |
| | | |
| | | export default AiPromptForm; |