zhou zhou
12 小时以前 287a666e1b2bb155e86aa88ebace201d1e8a51f6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import React, { useState } from "react";
import {
    FormDataConsumer,
    TextInput,
    useNotify,
    useTranslate,
} from "react-admin";
import { Alert, Button, Grid, Stack, TextField, Typography } from "@mui/material";
import StatusSelectInput from "@/page/components/StatusSelectInput";
import { renderAiPromptPreview } from "@/api/ai/configCenter";
 
const AiPromptPreviewSection = ({ formData }) => {
    const notify = useNotify();
    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);
 
    const handlePreview = async () => {
        setLoading(true);
        try {
            const metadata = metadataText ? JSON.parse(metadataText) : {};
            const data = await renderAiPromptPreview({
                ...formData,
                input,
                metadata,
            });
            setPreview(data);
            notify(translate("ai.prompt.preview.success"));
        } catch (error) {
            setPreview(null);
            notify(error?.message || translate("ai.prompt.preview.failed"), { type: "error" });
        } finally {
            setLoading(false);
        }
    };
 
    return (
        <>
            <Grid item xs={12}>
                <Typography variant="h6">{translate("ai.prompt.preview.title")}</Typography>
            </Grid>
            <Grid item xs={12}>
                <TextField
                    label={translate("ai.prompt.preview.input")}
                    value={input}
                    onChange={(event) => setInput(event.target.value)}
                    fullWidth
                    multiline
                    minRows={3}
                />
            </Grid>
            <Grid item xs={12}>
                <TextField
                    label={translate("ai.prompt.preview.metadata")}
                    value={metadataText}
                    onChange={(event) => setMetadataText(event.target.value)}
                    fullWidth
                    multiline
                    minRows={3}
                />
            </Grid>
            <Grid item xs={12}>
                <Stack direction="row" spacing={1} alignItems="center">
                    <Button variant="outlined" onClick={handlePreview} disabled={loading}>
                        {loading ? translate("ai.prompt.preview.loading") : translate("ai.prompt.preview.render")}
                    </Button>
                    <Typography variant="body2" color="text.secondary">
                        {translate("ai.prompt.preview.description")}
                    </Typography>
                </Stack>
            </Grid>
            {preview && (
                <>
                    <Grid item xs={12}>
                        <Alert severity="success">
                            {translate("ai.prompt.preview.resolvedVariables", {
                                value: (preview.resolvedVariables || []).join(", ") || translate("ai.common.none"),
                            })}
                        </Alert>
                    </Grid>
                    <Grid item xs={12}>
                        <TextField
                            label={translate("ai.prompt.preview.renderedSystemPrompt")}
                            value={preview.renderedSystemPrompt || ""}
                            fullWidth
                            multiline
                            minRows={5}
                            InputProps={{ readOnly: true }}
                        />
                    </Grid>
                    <Grid item xs={12}>
                        <TextField
                            label={translate("ai.prompt.preview.renderedUserPrompt")}
                            value={preview.renderedUserPrompt || ""}
                            fullWidth
                            multiline
                            minRows={5}
                            InputProps={{ readOnly: true }}
                        />
                    </Grid>
                </>
            )}
        </>
    );
};
 
const AiPromptForm = ({ readOnly = false }) => {
    const translate = useTranslate();
 
    return (
    <Grid container spacing={2} width={{ xs: "100%", xl: "80%" }}>
        <Grid item xs={12}>
            <Typography variant="h6">{translate("ai.prompt.form.sections.main")}</Typography>
        </Grid>
        <Grid item xs={12} md={6}>
            <TextInput source="name" label="common.field.name" fullWidth disabled={readOnly} />
        </Grid>
        <Grid item xs={12} md={6}>
            <TextInput source="code" label="ai.prompt.fields.code" fullWidth disabled={readOnly} />
        </Grid>
        <Grid item xs={12}>
            <TextInput source="scene" label="ai.prompt.fields.scene" fullWidth disabled={readOnly} />
        </Grid>
        <Grid item xs={12}>
            <TextInput source="systemPrompt" label="ai.prompt.fields.systemPrompt" fullWidth multiline minRows={6} disabled={readOnly} />
        </Grid>
        <Grid item xs={12}>
            <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="common.field.memo" fullWidth multiline minRows={3} disabled={readOnly} />
        </Grid>
        <FormDataConsumer>
            {({ formData }) => <AiPromptPreviewSection formData={formData} />}
        </FormDataConsumer>
        <Grid item xs={12}>
            <Typography variant="h6">{translate("ai.prompt.form.sections.runtime")}</Typography>
        </Grid>
        <Grid item xs={12} md={6}>
            <TextInput source="updateBy" label="ai.common.lastUpdatedBy" fullWidth disabled />
        </Grid>
        <Grid item xs={12} md={6}>
            <TextInput source="updateTime$" label="ai.common.lastUpdatedAt" fullWidth disabled />
        </Grid>
    </Grid>
    );
};
 
export default AiPromptForm;