zhou zhou
12 小时以前 287a666e1b2bb155e86aa88ebace201d1e8a51f6
rsf-admin/src/page/system/aiPrompt/AiPromptForm.jsx
@@ -3,6 +3,7 @@
    FormDataConsumer,
    TextInput,
    useNotify,
    useTranslate,
} from "react-admin";
import { Alert, Button, Grid, Stack, TextField, Typography } from "@mui/material";
import StatusSelectInput from "@/page/components/StatusSelectInput";
@@ -10,7 +11,8 @@
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);
@@ -25,10 +27,10 @@
                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);
        }
@@ -37,11 +39,11 @@
    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
@@ -51,7 +53,7 @@
            </Grid>
            <Grid item xs={12}>
                <TextField
                    label="示例元数据 JSON"
                    label={translate("ai.prompt.preview.metadata")}
                    value={metadataText}
                    onChange={(event) => setMetadataText(event.target.value)}
                    fullWidth
@@ -62,10 +64,10 @@
            <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>
@@ -73,12 +75,14 @@
                <>
                    <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
@@ -88,7 +92,7 @@
                    </Grid>
                    <Grid item xs={12}>
                        <TextField
                            label="渲染后的 User Prompt"
                            label={translate("ai.prompt.preview.renderedUserPrompt")}
                            value={preview.renderedUserPrompt || ""}
                            fullWidth
                            multiline
@@ -102,45 +106,49 @@
    );
};
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;