Skip to content

Commit 72edc89

Browse files
wec4dre96-wtpfzCoda-botlsy357
authored
[feat][frontend] code evaluator route (#231) (#234)
* [feat][backend] code evaluator (#220) * feat: code evaluator --------- * fix: 补充路由 * fix: 评估器创建参数模型初始化 * fix: 隐藏筛选入口 * fix: 实验创建问题修复 * fix: 评估器问题修复 * fix: 回退配置文件 * fix: 回退配置文件 --------- Co-authored-by: tpfz <[email protected]> Co-authored-by: Coda <[email protected]> Co-authored-by: liushengyang <[email protected]>
1 parent a19326e commit 72edc89

File tree

9 files changed

+125
-94
lines changed

9 files changed

+125
-94
lines changed

frontend/packages/cozeloop/evaluate-components/src/stores/eval-target-store/prompt-definition/plugin-eval-target-form/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ const PluginEvalTargetForm = (props: PluginEvalTargetFormProps) => {
7575
};
7676

7777
const handleEvalTargetVersionChange = () => {
78+
const currentMapping = formValues?.evalTargetMapping || {};
79+
const objKeys = Object.keys(currentMapping);
80+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
81+
// @ts-expect-error
82+
objKeys.forEach(k => onChange(`evalTargetMapping.${k}`, undefined));
7883
onChange('evalTargetMapping', undefined);
7984
onChange('target_runtime_param', undefined);
8085
};

frontend/packages/cozeloop/evaluate-pages/src/app.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ const App = () => {
3737
<Route path="evaluators" element={<EvaluatorListPage />} />
3838

3939
<Route path="evaluators/create/llm" element={<EvaluatorCreatePage />} />
40+
41+
<Route
42+
path="evaluators/create/llm/:id"
43+
element={<EvaluatorCreatePage />}
44+
/>
4045
<Route
4146
path="evaluators/create/code"
4247
element={<CodeEvaluatorCreatePage />}

frontend/packages/cozeloop/evaluate/src/pages/evaluator/evaluator-create/evaluator-detail.tsx

Lines changed: 51 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -97,61 +97,59 @@ function EvaluatorCreatePage() {
9797
})
9898
.catch(e => console.warn(e));
9999

100-
const renderContent = () => (
101-
<>
102-
<Form
103-
initValues={
104-
sourceService.data || {
105-
evaluator_type: EvaluatorType.Prompt,
106-
}
100+
const formContent = (
101+
<Form
102+
initValues={
103+
sourceService.data || {
104+
evaluator_type: EvaluatorType.Prompt,
107105
}
108-
className="flex-1 w-[800px] mx-auto form-default"
109-
ref={formRef}
110-
onValueChange={(values, changeValues) => {
111-
setBlockLeave(true);
112-
}}
113-
>
114-
<div className="h-[28px] mb-3 text-[16px] leading-7 font-medium coz-fg-plus">
115-
{I18n.t('basic_info')}
116-
</div>
117-
<FormInput
118-
label={I18n.t('name')}
119-
field="name"
120-
placeholder={I18n.t('please_input', { field: '' })}
121-
required
122-
maxLength={50}
123-
trigger="blur"
124-
rules={[
125-
{ required: true, message: I18n.t('please_input_name') },
126-
{ max: 50 },
127-
{ validator: sourceNameRuleValidator },
128-
{
129-
asyncValidator: async (_, value: string) => {
130-
if (value) {
131-
const { pass } = await StoneEvaluationApi.CheckEvaluatorName({
132-
workspace_id: spaceID,
133-
name: value,
134-
});
135-
if (pass === false) {
136-
throw new Error(I18n.t('name_already_exists'));
137-
}
106+
}
107+
className="flex-1 w-[800px] mx-auto form-default"
108+
ref={formRef}
109+
onValueChange={(values, changeValues) => {
110+
setBlockLeave(true);
111+
}}
112+
>
113+
<div className="h-[28px] mb-3 text-[16px] leading-7 font-medium coz-fg-plus">
114+
{I18n.t('basic_info')}
115+
</div>
116+
<FormInput
117+
label={I18n.t('name')}
118+
field="name"
119+
placeholder={I18n.t('please_input', { field: '' })}
120+
required
121+
maxLength={50}
122+
trigger="blur"
123+
rules={[
124+
{ required: true, message: I18n.t('please_input_name') },
125+
{ max: 50 },
126+
{ validator: sourceNameRuleValidator },
127+
{
128+
asyncValidator: async (_, value: string) => {
129+
if (value) {
130+
const { pass } = await StoneEvaluationApi.CheckEvaluatorName({
131+
workspace_id: spaceID,
132+
name: value,
133+
});
134+
if (pass === false) {
135+
throw new Error(I18n.t('name_already_exists'));
138136
}
139-
},
137+
}
140138
},
141-
]}
142-
/>
143-
<FormTextArea
144-
label={I18n.t('description')}
145-
field="description"
146-
placeholder={I18n.t('please_input_description')}
147-
fieldStyle={{ paddingTop: 8 }}
148-
maxCount={200}
149-
maxLength={200}
150-
/>
151-
<div className="h-7 mt-[10px]" />
152-
<PromptConfigField refreshEditorModelKey={refreshEditorModelKey} />
153-
</Form>
154-
</>
139+
},
140+
]}
141+
/>
142+
<FormTextArea
143+
label={I18n.t('description')}
144+
field="description"
145+
placeholder={I18n.t('please_input_description')}
146+
fieldStyle={{ paddingTop: 8 }}
147+
maxCount={200}
148+
maxLength={200}
149+
/>
150+
<div className="h-7 mt-[10px]" />
151+
<PromptConfigField refreshEditorModelKey={refreshEditorModelKey} />
152+
</Form>
155153
);
156154

157155
return (
@@ -169,7 +167,7 @@ function EvaluatorCreatePage() {
169167
) : (
170168
<>
171169
<div className="p-6 pt-[12px] flex-1 overflow-y-auto styled-scrollbar pr-[18px]">
172-
{renderContent()}
170+
{formContent}
173171
</div>
174172
<div className="flex-shrink-0 p-6">
175173
<div className="w-[800px] mx-auto flex flex-row justify-end gap-2">

frontend/packages/cozeloop/evaluate/src/pages/evaluator/evaluator-create/prompt-field.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ export function PromptField({
115115
const afterTemplateSelect = (payload: PromptEvaluator) => {
116116
promptEvaluatorFieldApi.setValue({
117117
...promptEvaluator,
118+
model_config:
119+
formValues?.current_version?.evaluator_content?.prompt_evaluator
120+
?.model_config,
118121
message_list: payload.message_list,
119122
prompt_source_type: PromptSourceType.BuiltinTemplate,
120123
prompt_template_key: payload.prompt_template_key,

frontend/packages/cozeloop/evaluate/src/pages/evaluator/evaluator-detail/index.tsx

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33
/* eslint-disable @coze-arch/max-line-per-function */
44
import { useParams } from 'react-router-dom';
5-
import { useRef, useState } from 'react';
5+
import { type ReactNode, useRef, useState } from 'react';
66

77
import { useRequest } from 'ahooks';
88
import { I18n } from '@cozeloop/i18n-adapter';
@@ -109,6 +109,16 @@ function EvaluatorDetailPage() {
109109
},
110110
);
111111

112+
const formFieldContent = (
113+
<div className={`${!selectedVersion ? '' : 'hidden'}`}>
114+
<PromptConfigField
115+
disabled={guard.data.readonly}
116+
refreshEditorModelKey={refreshEditorModelKey}
117+
/>
118+
<div className="h-6" />
119+
</div>
120+
);
121+
112122
if (service.loading) {
113123
return (
114124
<div className="h-full flex items-center justify-center">
@@ -117,16 +127,18 @@ function EvaluatorDetailPage() {
117127
);
118128
}
119129

120-
const renderContent = () => {
121-
if (selectedVersion) {
122-
if (versionService.loading) {
123-
return (
124-
<div className="h-full w-full flex items-center justify-center">
125-
<Spin spinning={true} />
126-
</div>
127-
);
128-
}
129-
return (
130+
let evaluatorInfo: null | ReactNode = null;
131+
132+
if (selectedVersion) {
133+
if (versionService.loading) {
134+
evaluatorInfo = (
135+
<div className="h-full w-full flex items-center justify-center">
136+
<Spin spinning={true} />
137+
</div>
138+
);
139+
}
140+
if (!versionService.loading) {
141+
evaluatorInfo = (
130142
<div className="flex-1 max-w-[800px] mx-auto">
131143
<div className="h-[28px] mb-3 text-[16px] leading-7 font-medium coz-fg-plus">
132144
{I18n.t('config_info')}
@@ -145,27 +157,8 @@ function EvaluatorDetailPage() {
145157
</div>
146158
);
147159
}
160+
}
148161

149-
return (
150-
<Form
151-
initValues={evaluator}
152-
className="flex-1 max-w-[800px] mx-auto"
153-
ref={formRef}
154-
onValueChange={values => {
155-
// Demo 空间且没有管理权限,不保存
156-
if (!isDemoSpace) {
157-
autoSaveService.run(values);
158-
}
159-
}}
160-
>
161-
<PromptConfigField
162-
disabled={guard.data.readonly}
163-
refreshEditorModelKey={refreshEditorModelKey}
164-
/>
165-
<div className="h-6" />
166-
</Form>
167-
);
168-
};
169162
return (
170163
<div className="h-full overflow-hidden flex flex-col">
171164
<Header
@@ -197,7 +190,20 @@ function EvaluatorDetailPage() {
197190

198191
<div className="flex-1 overflow-hidden flex flex-row">
199192
<div className="flex-1 overflow-y-auto p-6 flex styled-scrollbar pr-[18px]">
200-
{renderContent()}
193+
<Form
194+
initValues={evaluator}
195+
className="flex-1 max-w-[800px] mx-auto"
196+
ref={formRef}
197+
onValueChange={values => {
198+
// Demo 空间且没有管理权限,不保存
199+
if (!isDemoSpace) {
200+
autoSaveService.run(values);
201+
}
202+
}}
203+
>
204+
{formFieldContent}
205+
{evaluatorInfo}
206+
</Form>
201207
</div>
202208
{versionListVisible && evaluator ? (
203209
<VersionListPane

frontend/packages/cozeloop/evaluate/src/pages/evaluator/evaluator-list/evaluator-list-page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ function EvaluatorListPage() {
109109
if (record.evaluator_type === EvaluatorType.Code) {
110110
navigate(`create/code/${record.evaluator_id}`);
111111
} else {
112-
navigate(`create/${record.evaluator_id}`);
112+
navigate(`create/llm/${record.evaluator_id}`);
113113
}
114114
},
115115
showCancelButton: true,

frontend/packages/cozeloop/evaluate/src/pages/experiment/contrast/components/contrast-table/table-header.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ColumnsManage,
1010
RefreshButton,
1111
} from '@cozeloop/evaluate-components';
12+
import { IS_HIDDEN_EXPERIMENT_DETAIL_FILTER } from '@cozeloop/biz-hooks-adapter';
1213
import {
1314
type ColumnEvaluator,
1415
type Experiment,
@@ -198,5 +199,10 @@ export default function ExperimentContrastTableHeader({
198199
<RefreshButton onRefresh={onRefresh} />
199200
</>
200201
);
201-
return <TableHeader filters={filters} actions={actions} />;
202+
return (
203+
<TableHeader
204+
filters={IS_HIDDEN_EXPERIMENT_DETAIL_FILTER ? null : filters}
205+
actions={actions}
206+
/>
207+
);
202208
}

frontend/packages/cozeloop/evaluate/src/pages/experiment/create/index.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ export default function ExperimentCreatePage() {
107107
// 保存当前步骤的值
108108
if (formRef?.current?.formApi) {
109109
const currentValues = formRef.current.formApi.getValues();
110-
const nextStepValues = calcNextStepRenderValue(
110+
const prevStepValues = calcNextStepRenderValue(
111111
createExperimentValues,
112112
currentValues,
113113
);
114-
setCreateExperimentValues(nextStepValues);
114+
setCreateExperimentValues(prevStepValues);
115115
}
116116

117117
reportStep({
@@ -194,10 +194,12 @@ export default function ExperimentCreatePage() {
194194

195195
if (values) {
196196
// 更新全局状态,确保包含最新的表单值
197-
setCreateExperimentValues(prev => ({
198-
...prev,
199-
...values,
200-
}));
197+
198+
setCreateExperimentValues(prev => {
199+
const prevStepValues = calcNextStepRenderValue(prev, values);
200+
return prevStepValues;
201+
});
202+
201203
// 设置下一步
202204
goNext();
203205
}

frontend/packages/cozeloop/evaluate/src/pages/experiment/detail/components/experiment-detail-table/index.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
type LogicField,
1212
type SemiTableSort,
1313
} from '@cozeloop/evaluate-components';
14+
import { IS_HIDDEN_EXPERIMENT_DETAIL_FILTER } from '@cozeloop/biz-hooks-adapter';
1415
import {
1516
type Experiment,
1617
FieldType,
@@ -422,7 +423,12 @@ export default function ({
422423
<TableForExperiment<ExperimentItem>
423424
service={service as Service}
424425
heightFull={true}
425-
header={<TableHeader actions={actions} filters={filters} />}
426+
header={
427+
<TableHeader
428+
actions={actions}
429+
filters={IS_HIDDEN_EXPERIMENT_DETAIL_FILTER ? null : filters}
430+
/>
431+
}
426432
pageSizeStorageKey="experiment_detail_page_size"
427433
empty={tableEmpty}
428434
tableProps={tableProps}

0 commit comments

Comments
 (0)