Skip to content

[feat][evaluation]eval0630#581

Open
tpfz wants to merge 139 commits into
mainfrom
feat/eval0630
Open

[feat][evaluation]eval0630#581
tpfz wants to merge 139 commits into
mainfrom
feat/eval0630

Conversation

@tpfz

@tpfz tpfz commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

What type of PR is this?

Check the PR title

  • This PR title match the format: [<type>][<scope>] <description>. For example: [fix][backend] flaky fix
  • The description of this PR title is user-oriented and clear enough for others to understand.
  • Add documentation if the current PR requires user awareness at the usage level.
  • This PR is written in English. PRs not in English will not be reviewed.

(Optional) Translate the PR title into Chinese

(Optional) More detailed description for this PR(en: English/zh: Chinese)

en:
zh(optional):

(Optional) Which issue(s) this PR fixes

xueyizheng and others added 30 commits June 24, 2026 20:47
…for item-centric experiment refactoring

- Add expt_item_ref table (new flat item-binding table with item_config)
- Add item_version_id to expt_item_result/run_log, expt_turn_result/run_log, eval_target_record, evaluator_record
- Add source_type/inline_key/alias/target_record_id to evaluator_record (Builtin/Alias/Inline unification)
- Add source_type/inline_key/alias to expt_turn_evaluator_result_ref; rebuild 7-col unique key
- Add eval_set_source_type to experiment (new/legacy path discriminator)
- Add alias/filter/binding_config/eval_set_id to expt_evaluator_ref (query-only snapshot)
- Update generate.go: add expt_item_ref to experiment tables; add evaluator_version/evaluator_record to evaluator tables
- Regenerate all affected gorm_gen model/query files

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…experiment

- domain/expt.thrift: add ExptEvalSetSourceType enum, EvalSetConfig/ExptTargetConf/
  ExptEvaluatorConf/ExptFilter/ExptFilterField/ExptEvalSetDetail structs
- domain/expt.thrift: add fields 110-114 to Experiment DTO (eval_set_source_type,
  eval_set_configs, eval_set_details, evaluators_concur_num, total_item_count)
- coze.loop.evaluation.expt.thrift: add eval_set_configs field 70 to
  CreateExperimentRequest, field 75 to SubmitExperimentRequest
- regenerate kitex_gen for evaluation domain

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… EvaluatorResults

- expt.go: add ExptEvalSetSourceType enum, ExptItemRef/ExptItemConfig structs,
  EvalSetConfig/ExptTargetConf/ExptEvaluatorConf/ExptItemFilter domain types;
  add EvalSetSourceType to Experiment, EvalSetConfigs to EvaluationConfiguration
- expt_result.go: add ItemVersionID to ExptItemResult/ExptItemResultRunLog/
  ExptTurnResult/ExptTurnResultRunLog; upgrade EvaluatorResults to dual-array
  format (Registered+Inline) with legacy EvalVerIDToResID backward compat;
  add SourceType/InlineKey/Alias to ExptTurnEvaluatorResultRef;
  add Alias/Filter/BindingConfig/EvalSetID to ExptEvaluatorRef
- evaluator_record.go: add ItemVersionID, SourceType, InlineKey, Alias,
  TargetRecordID fields; add EvaluatorRecordSourceType enum;
  add EvaluatorRunStatusSkipped constant
- target_record.go: add ItemVersionID field

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…etItemCount entity

- Add IExptItemRefRepo interface with BatchCreate, ListByExptID, GetByExptIDAndItemID,
  MGetByExptIDAndItemIDs, CountByEvalSetGrouped methods
- Add ExptEvalSetItemCount struct for eval_set grouped item counts
- Update go:generate directive to include IExptItemRefRepo

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ields in converters

- mysql/expt_item_ref.go: IExptItemRefDAO interface + implementation
  (BatchCreateNX, ListByExptID, GetByExptIDAndItemID, MGetByExptIDAndItemIDs,
  CountByEvalSetGrouped)
- experiment/expt_item_ref.go: IExptItemRefRepo implementation wiring DAO + converter
- convert/expt_item_ref.go: ExptItemRef DO/PO converter with item_config JSON marshaling
- convert/expt_result.go: propagate ItemVersionID in ExptItemResult/ExptTurnResult converters
- convert/expt_item_result_run_log.go: propagate ItemVersionID
- convert/expt_run_log.go: propagate ItemVersionID in ExptTurnResultRunLog converter
- convert/expt_turn_evaluator_result_ref.go: add SourceType/InlineKey/Alias fields
- convert/expt_evaluator_ref.go: add EvalSetID/Alias/Filter/BindingConfig fields
- evaluator/convertor/evaluator_record.go: add all new fields
  (ItemVersionID, SourceType, InlineKey, Alias_, TargetRecordID)
- target/convertor/eval_target_record.go: add ItemVersionID
- domain/repo/expt.go: add IExptItemRefRepo interface

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… convertor

- entity/param.go: add EvalSetConfigs to CreateExptParam
- entity/expt.go: update ToEvaluatorRefDO to generate alias/filter/binding_config
  for MultiSetConfig path; add EvalSetSourceType to Experiment struct
- service/expt_manage_impl.go: detect EvalSetConfigs in CreateExpt; set
  EvalSetSourceType=MultiSetConfig or SingleSet accordingly; serialize
  EvalSetConfigs into eval_conf
- infra/convert/expt.go: propagate EvalSetSourceType in DO2PO/PO2DO
- application/convertor/experiment/expt.go: ConvertCreateReq handles eval_set_configs
  field 70 → domain EvalSetConfigs; ToExptDTO fills fields 110-114

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…atorResults upgrade

ExptStart (Task 6):
- ExptSubmitExec: add exptItemRefRepo field (variadic backward-compat constructor)
- ExptStart: detect EvalSetSourceType==MultiSetConfig → call exptStartMultiSet
- exptStartMultiSet: paginate items per set, build ExptItemRef with item_config,
  batch-write expt_item_ref then expt_item_result/expt_turn_result
- buildItemConfigFromSetConf: materialize per-set evaluator/target conf into item_config

storeTurnRunResult / RecordItemRunLogs (Task 7):
- storeTurnRunResult: write new EvaluatorResults{Registered:[], Alias:''} format
- NewTurnEvaluatorResultRefs: handle both old map format and new Registered+Inline arrays;
  set SourceType=Builtin for registered, SourceType=Inline for inline
- terminateZombieEvaluatorRecords: extract record IDs from both old/new format
- RecordItemRunLogs: extract evaluator IDs from both formats for weight calculation

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- expt_result_impl_test.go: TestNewTurnEvaluatorResultRefs_NewFormat
  covers nil/old-map/Registered/Inline/mixed cases with SourceType assertion
- expt_result_eval_test.go: TestEvaluatorResultsSerializeCompat
  covers new-format serialize, old-format JSON backward-compat, new-format deserialize
- expt_convertor_test.go: TestConvertCreateReq_OldPath/EvalSetConfigs,
  TestConvertEvalSetConfigsDTOToDO - application convertor new path
- expt_run_scheduler_mode_multiset_test.go: TestBuildItemConfigFromSetConf
  covers empty/single-evaluator/with-target-conf cases

All 11 new test cases PASS

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…s collision

Replace sync.Map(int64 key) with mutex+slice (evalRecordCollector) in
callEvaluators/asyncCallEvaluator so alias multi-instances of the same
evaluatorVersionID are stored as separate records instead of overwriting
each other.

ExptTurnRunResult.EvaluatorResults changes from map[int64]*EvaluatorRecord
to []*EvaluatorRecord; GetEvaluatorRecord uses linear search by versionID
for backward compatibility.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
新实验类型 (MultiSetConfig) 聚合时跳过 EvaluatorScore/WeightedScore 维度
(多评测集 + alias 多实例下"实验级单一平均分"语义不成立), 保留 Target
latency/tokens + Annotation 维度。附加 Skipped record 过滤兜底和 field_key
兼容解析工具。

- domain/entity/aggr_field_key.go: 新增 ParseEvaluatorScoreFieldKey 工具,
  兼容纯数字 (当前 DB 行) 和 verID:alias (未来扩展)
- expt_result_aggr_impl.go:
  * CreateExptAggrResult 入口按 EvalSetSourceType 分流, 提取
    computeEvaluatorAggrGroup 为独立方法
  * createWeightedScoreAggrResult 入口 guard MultiSetConfig 返回 nil
  * UpdateExptAggrResult 入口 guard MultiSetConfig 早返回
  * 两处 recordMap 构建加 Status=Skipped 过滤
  * 3 处 ParseInt(FieldKey) 切换为 ParseEvaluatorScoreFieldKey
- filter.go: ConvertFilter ParseInt 切兼容解析
- 新增 11 个单测 (7 个工具 + 4 个分流), 既有聚合测试 0 回归

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
新 item-centric 路径 (MultiSetConfig) 下 ConvertCreateReq 只设 EvalSetConfigs,
未构建 EvalConf.ConnectorConf,而 CheckRun->CheckConnector->checkEvaluatorsConnector
仍按老连接器结构做同步字段映射校验,导致 SubmitExperiment 报
'invalid evaluator connector' (cause: nil EvaluatorConf)。

方案A: 新增 buildExptConfFromEvalSetConfigs,从 eval_set_configs[].evaluator_confs
/target_confs 的字段映射展平派生老连接器 (EvaluatorsConf + TargetConf),
按 (evaluator_version_id, alias) 去重,使两侧由同一份输入派生、天然一致。
EvalSetConfigs 仍是落库与调度的权威源。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
新实验类型 (MultiSetConfig) 执行 evaluator 时按 expt_item_ref.item_config
的 EvaluatorConfs 行级配置做 filter 判断, filter 不命中则跳过该 evaluator
(不实际调用 evaluator service)。老实验类型走原 expt 级 EvaluatorsConf 路径,
零行为变化。

- domain/entity/expt_run.go:
  * ExptItemEvalCtx 加 ItemConfig 字段
  * ExptTurnRunResult 加 GetEvaluatorRecordByVerAlias(versionID, alias) 方法,
    为后续 alias 多实例独立定位预留 (老 GetEvaluatorRecord 保留)
- domain/service/expt_run_item_event_impl.go:
  * ExptItemEventEvalServiceImpl 加 exptItemRefRepo 字段; NewExptRecordEvalService
    构造函数加 IExptItemRefRepo 参数
  * BuildExptRecordEvalCtx 按 EvalSetSourceType 分流: MultiSetConfig 调
    GetByExptIDAndItemID 拿 item_config 注入 ctx; 读不到降级 nil (走老路径)
- domain/service/expt_item_filter_match.go (新增):
  * ShouldRunByFilter 综合 FilterMode (None/Include/Exclude) + matcher 决策
  * MatchExptItemFilter 支持 QueryAndOr (AND/OR) + 多 FilterField
  * matchByQueryType 支持 equal/in/not_equal/not_in/contains/not_contains;
    未识别 QueryType 默认放行 (不阻断执行)
  * shouldRunEvaluatorByItemConfig 桥接器: 找到 versionID 对应的首个 conf
    做 filter 判定
- domain/service/expt_run_item_turn_impl.go:
  * CallEvaluators 入口加 ItemConfig 守卫: filter 不命中 → continue 跳过
    该 evaluator, 不进 pendingEvaluatorVersionIDs
- wire: experiment/wire.go 加 NewExptItemRefRepo, mysql/wire.go 加
  NewExptItemRefDAO, wire_gen.go 自动重新生成 (含 iExptItemRefRepo 变量)
- 新增 18 个单测 (12 filter matcher + 6 桥接器 + 4 双键查找), 既有测试 0 回归

tech debt (后续 PR):
- alias 多实例独立执行 + Skipped 占位 record 持久化 — 依赖 evaluatorService
  .RunEvaluator API 扩展 Alias/SourceType 字段; 当前 MVP 只是不实际调用
  evaluator (filter 行为正确), 但 GUI 看不到 Skipped 标记
- 同 versionID 多 alias 实例只取首个 conf 判定; 等 alias 真正落地后切换

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PR2 只在 BuildExptRecordEvalCtx (record eval 路径) 注入了 IExptItemRefRepo,
但 scheduler 路径的 DefaultSchedulerModeFactory 没注入。新实验类型
(MultiSetConfig) 首次调度触发 ExptSubmitExec.exptStartMultiSet 时,
e.exptItemRefRepo 为 nil, 直接报错 "exptItemRefRepo is nil, cannot run
multi-set ExptStart"。

BOE/PPE MQ consumer 已实锤复现, error stack 含 commit ff64c57
(PR2 之前 + 同事 commit, 两者都未含此修复)。

修复:
- DefaultSchedulerModeFactory struct 加 exptItemRefRepo 字段;
  NewSchedulerModeFactory 加参数, factory NewSchedulerMode 内调用
  NewExptSubmitMode / NewExptTrialRunMode 时传 f.exptItemRefRepo
- NewExptTrialRunMode 加 variadic IExptItemRefRepo 透传给内部
  NewExptSubmitMode (和后者 variadic 形式对齐)
- wire 重新生成 wire_gen.go, NewSchedulerModeFactory 调用点
  自动传入 iExptItemRefRepo
- 测试 TestNewSchedulerModeFactory 补 MockIExptItemRefRepo 参数

FailRetry/Append/RetryAll/RetryItems struct 都没 exptItemRefRepo
字段, 不受影响, 本次只修 Submit + TrialRun 路径。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… BAM parse

domain/expt.thrift 同时 include data + observability 两个同名 filter.thrift,
basename 相同导致 Thrift 别名冲突。thriftgo/kitex 能自动消歧(filter0),但 BAM
解析器把 filter.Filter 误绑到 observability namespace(无 Filter 结构)→
'struct not defined' → 阻塞 BAM idl update / AGW 发布。

重命名 data 侧 filter.thrift → data_filter.thrift,引用方改用 data_filter.Filter,
消除同名歧义。namespace 不变 → Go 包路径不变 → 后端业务代码零改动。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CallEvaluators 入口在 ItemConfig 非空时分流到 callEvaluatorsByItemConfig:
- 主循环按 ItemConfig.EvaluatorConfs 遍历, 同 versionID 不同 alias 跑两次
- existResult 按 (versionID, alias) 双键复用
- filter 不命中 → 写 Skipped 占位 record (带 alias)
- 命中 → 调 RunEvaluator/AsyncRunEvaluator, 把 alias + SourceType 透传

evaluator_impl.RunEvaluator/AsyncRunEvaluator 写入端把 request.Alias/SourceType
落到 EvaluatorRecord, 兜底 SourceType=Unknown -> Builtin.

清理 PR2 留下的 dead helper shouldRunEvaluatorByItemConfig + 单测,
该函数按 versionID 反查首个 conf, 在 alias 多实例下语义不正确;
现在 callEvaluatorsByItemConfig 直接按 conf 调 ShouldRunByFilter 不再需要它.
commit 2ced00e 把 submitReq := experiment.OpenAPITemplateToSubmitExperimentRequest(...)
误写为 expeinternal / cmd / evaluation / experiment.goriment.OpenAPITemplateToSubmitExperimentRequest(...),
导致 application 包整体不编译; 还原为原调用。
Get/MGet/List 实验响应里 eval_set_details[].item_count 此前一直是空。
本 PR 把读路径接通:

- entity.Experiment 加 EvalSetDetails 字段
- entity 新增 ExptEvalSetDetail (与 IDL domain/expt.thrift ExptEvalSetDetail 同构)
- ExptMangerImpl.NewExptManager 加 IExptItemRefRepo 参数 + struct 字段
- packExperimentResult 末尾调 fillEvalSetDetails (新实验类型才进, 老实验跳过)
- fillEvalSetDetails: 按 EvalConf.EvalSetConfigs 拼骨架, IsPrimary 与 EvalSetID 一致,
  ItemCount 来源 IExptItemRefRepo.CountByEvalSetGrouped, 首跑前为 0
- DTO converter 把 entity.EvalSetDetails 转 thrift Experiment.EvalSetDetails
- wire_gen 重新生成

5 个子测试 PASS: nil repo 跳过 / 仅 MultiSetConfig 触发 repo / IsPrimary 与 EvalSetID 一致 /
ItemCount 缺失补 0 / repo 错误传播 / EvalConf 缺失跳过 / 无 MultiSetConfig 不调 repo。
全 evaluation 模块 go test ./... 0 回归。
新实验类型 MultiSetConfig 支持同评估器版本多别名(alias),治理"按
evaluator_version_id 索引的 map 在 alias 多实例下撞 key"问题,覆盖聚合/
加速数仓(CK)/导出三条旧消费链路。向前兼容:旧实验(alias 为空)编码退化为
裸 version_id,全链路 byte 级不变。

- 新增 entity.EncodeEvaluatorInstanceKey: alias="" 退化裸 verID,否则
  verID:alias;与 ParseEvaluatorScoreFieldKey 互逆
- 聚合: 去掉 3 处 MultiSetConfig 跳过分支,恢复加权平均;computeEvaluator
  AggrGroup 按 (version,alias) 分桶;field_key 编码 verID:alias
- 加权计算: CalculateWeightedScore 两 map key int64→string;新增类型感知
  buildScoreWeights,MultiSetConfig 从 EvalSetConfigs[].EvaluatorConfs
  带 alias 取权重
- CK 宽表: 新增 item_version_id 列(String DEFAULT '0',含两处 init-sql);
  key_mapping FromField/lookup 升级 verID:alias;CreateExpt + ManualUpsert
  的 key_mapping 按 (version,alias) 实例展开(全局递增 ToKey + 去重)
- 导出: ExportExptResult_ 入口按 EvalSetSourceType 拒绝 MultiSetConfig,
  不动 DoExportCSV / 洞察分析

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…s 筛选)

两处缺口:
1. GetExperimentsOApi 单实验 Get 走 OpenAPIExptDO2DTO, 此前未回填 item-centric 字段
   (eval_set_source_type/eval_set_details/evaluators_concur_num/total_item_count); §5 的回填只加在
   DomainExperimentDTO2OpenAPI (List/Create resp 路径)。本次在 OpenAPIExptDO2DTO 补回填, total_item_count
   仅 MultiSetConfig 回显 (对齐 ToExptDTO)。
2. ListExperimentsOApi 的 eval_set_source_types 双层缺失: OpenAPI ExperimentFilterOption 缺字段 +
   OpenAPIExperimentFilterOptionDTO2Domain 未透传。本次 OpenAPI IDL 加 eval_set_source_types(field 2,
   与 fuzzy_name 同级) + regen kitex_gen + 转换 string→int 枚举透传 + 修「只传 source_types 被判空返回 nil」。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
xueyizheng and others added 17 commits July 12, 2026 14:21
standard eval output 接口(MGetExperimentStandardEvalOutputs /
ListExperimentStandardEvalOutputs)鉴权临时移除,改为直接放行,
用于 BOE 自测阶段;后续恢复 api_key 校验。同步更新单测断言。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
覆盖近 86 个 commit 中新增/大改的核心业务代码:
- convertor: aggr_result / evaluation_set(_item) 转换器
- entity: target_record utility / evaluation_set_item ItemErrorType 补丁分支
- infra: mysql/convert/expt DO↔PO round-trip、agent_studio/sandbox_scheduler 占位实现
- service: ProvideNilItemCompletePublisher provider

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
# Conflicts:
#	backend/api/handler/coze/loop/apis/eval_open_apiservice.go
#	backend/api/handler/coze/loop/apis/experiment_service.go
#	backend/api/router/coze/loop/apis/coze.loop.apis.go
#	backend/api/router/coze/loop/apis/middleware.go
#	backend/modules/evaluation/application/convertor/experiment/aggr_result_test.go
#	backend/modules/evaluation/application/eval_openapi_app.go
#	backend/modules/evaluation/application/wire_gen.go
#	backend/modules/evaluation/domain/service/evaluator_impl_test.go
#	backend/modules/evaluation/domain/service/expt_run_item_impl.go
#	backend/modules/evaluation/domain/service/expt_run_item_turn_impl.go
#	backend/modules/evaluation/domain/service/expt_run_item_turn_impl_test.go
- convertor/evaluation_set: expected EvaluationSet 补齐 DatasetKey (do.DatasetKey 现已透传为 *string(""))
- convertor/experiment: ConvertCreateReq ItemConcurNum 断言改用 NormalizeSubmitItemConcurNum 归一化后比较
- domain/service:
  - CompleteExpt terminated 分支补 MGetItemTurnRunLogs mock(沙箱销毁 best-effort 新增调用)
  - BatchGetExptAggrResultByExperimentIDs mock experiment 补 SpaceID 以过通过越权过滤
  - MGetExperimentResult 相关子测试补 BatchGetEvaluationSets / BatchGetEvaluationSetVersions mock(dataset_key 填充新增调用)
- asyncCallEvaluator: 失败时创建失败记录并存入 collector,与 sync 路径行为一致;相关测试改用 collector 断言

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
SubmitExperiment/CreateExperiment 此前对调用方显式传入的
ExperimentGroupKey 不做任何校验(仅空值兜底用实验 ID),外部可传入
与已有实验重复的 group key。

改动:
- domain/repo + infra/dao 新增 ExistGroupKey(groupKey): 全局(跨 space)
  判断 group key 是否已被占用(COUNT LIMIT 1)
- domain/service 新增 CheckGroupKey, 仿 CheckName
- 创建主链路: 仅当调用方显式传入非空 group key 时查 DB 校验唯一,
  撞车返回新错误码 ExperimentGroupKeyExistedCode(601204017);
  未传时走"默认=实验ID"逻辑, 天然唯一, 不查 DB
- 重新生成受影响的 repo/service/dao mocks

顺带修复 errno 源/产物漂移: pkg/errno/evaluation.go 是
script/errorx/evaluation.yaml 经 code_gen.py 生成的产物
(// Code generated by tool. DO NOT EDIT.), 但 3 个错误码
(AsyncEvaluatorZombieTimeout 601205069 / AsyncEvalTargetZombieTimeout
070 / AsyncEvalTargetTerminated 071)曾被手加进产物、未回写 YAML 源。
本次将其补回 evaluation.yaml, 使新错误码经正规 code_gen.py 流程生成,
源与产物重新一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
agent 块原先只拼 eval_target_id(=EvalTargetRecord.TargetID),下游拿不到
业务侧原始对象 ID。补 source_target_id:按 TargetID 反查 EvalTarget 得到
target 级恒定的 SourceTargetID(与 version 无关),MGet/List 两入口预解析
成 map 传入纯函数 builder。反查带 SpaceID 校验防跨空间越权,失败/跨空间/
空串降级为不填,不阻断主链路。老字段 target_id/target_version_id 不动。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SandboxAgent 评测对象在 SubmitExperiment / RetryExperiment 时的沙箱 Init
由 fire-and-forget best-effort 改为同步阻塞:Init 失败直接向调用方返回错误,
避免后续 SandboxRun 依赖一个未成功初始化的沙箱任务。同步调整相关单测语义。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
原 handler 只 bind 请求后返回空 response,从未调用 application 层,
导致该接口无论传入什么 group_key 都返回空 ExptIds,也不走鉴权与 DB 查询。
改为与同文件其它接口一致的 invokeAndRender,接通到 localExptSvc →
application → domain service → repo 完整链路。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.04012% with 199 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...valuation/application/convertor/experiment/expt.go 76.96% 42 Missing and 40 partials ⚠️
...uation/application/convertor/experiment/openapi.go 82.37% 36 Missing and 16 partials ⚠️
...on/application/convertor/evaluation_set/openapi.go 78.01% 28 Missing and 3 partials ⚠️
...i/handler/coze/loop/apis/evaluation_set_service.go 0.00% 12 Missing ⚠️
...api/handler/coze/loop/apis/eval_open_apiservice.go 0.00% 9 Missing ⚠️
...d/api/handler/coze/loop/apis/experiment_service.go 0.00% 6 Missing ⚠️
...ication/convertor/evaluation_set/evaluation_set.go 96.05% 2 Missing and 1 partial ⚠️
.../application/convertor/experiment/expt_template.go 0.00% 1 Missing and 1 partial ⚠️
...luation/application/convertor/experiment/filter.go 85.71% 1 Missing and 1 partial ⚠️

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #581      +/-   ##
==========================================
- Coverage   78.18%   77.44%   -0.74%     
==========================================
  Files         670      677       +7     
  Lines       76566    80674    +4108     
==========================================
+ Hits        59862    62481    +2619     
- Misses      13266    14466    +1200     
- Partials     3438     3727     +289     
Flag Coverage Δ
unittests 77.44% <80.04%> (-0.74%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...on/convertor/evaluation_set/evaluation_set_item.go 93.80% <100.00%> (+63.73%) ⬆️
...on/application/convertor/experiment/aggr_result.go 100.00% <100.00%> (ø)
...uation/application/convertor/target/eval_target.go 91.16% <ø> (+0.67%) ⬆️
...modules/evaluation/application/eval_openapi_app.go 82.65% <ø> (-9.78%) ⬇️
...dules/evaluation/application/evaluation_set_app.go 17.37% <ø> (-6.13%) ⬇️
...d/modules/evaluation/application/experiment_app.go 83.23% <ø> (-2.42%) ⬇️
...les/evaluation/application/standard_eval_output.go 63.28% <ø> (ø)
...modules/evaluation/domain/entity/aggr_field_key.go 100.00% <ø> (ø)
...modules/evaluation/domain/entity/evaluation_set.go 74.07% <ø> (ø)
...es/evaluation/domain/entity/evaluation_set_item.go 100.00% <ø> (+27.27%) ⬆️
... and 46 more

... and 2 files with indirect coverage changes


Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update a7d6cbb...d55bf29. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

xueyizheng and others added 12 commits July 14, 2026 15:12
单 item 评测完成事件 ItemCompleteEvent 原先只带 eval_target_id,下游拿不到
业务侧原始对象 ID。补 source_target_id:实验详情加载时 GetEvalTargetVersion
经 EvalTargetPO2DO 已回填 EvalTarget.SourceTargetID,组装处直接透传,零额外 IO。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- gofumpt/gofmt: 收敛格式化 (含 -extra 规则)
- unconvert: 删除别名恒等类型转换 (data_tag/domain_filter/SandboxAgentType 等)
- staticcheck QF1008: 简化 etec.ExptItemEvalCtx 嵌入字段选择
- unused: 删除未被引用的 runtimeParamFromTargetRecord / createAndStoreFailedEvaluatorRecord

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add filter(40, data_filter.Filter) + filter_mode(41, i32) to
OpenAPIExptEvaluatorConf so OpenAPI SubmitExperiment can carry
row-level (per-binding) evaluator filters, matching the internal
ExptEvaluatorConf.filter/filter_mode semantics. Convertor passes
them through to the internal domain; whitelist validation is still
handled by the internal SubmitExperiment path. Regenerated kitex_gen
and added TestOpenAPIEvalSetConfigsDTO2Domain_EvaluatorFilter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
补齐 target/eval_target.go 中 SandboxAgent 相关分支的单测:
- EvalTargetVersionDO2DTO 的 EvalTargetTypeSandboxAgent 分支
- SandboxAgentDTO2DO / SandboxAgentDO2DTO
- SandboxEnvVarsDTO2DO / SandboxEnvVarsDO2DTO

覆盖 nil 输入、空切片、混杂 nil 元素、零值指针等边界。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…filter

Emit a compact per-conf decision log (run/skip + item.ItemID + owned_tags
observed at runtime + filter fields/values) for every evaluator conf that
carries a filter. Pinpoints whether a tag filter that culls all items is
caused by item.Tags not being loaded (owned_tags empty) versus a values
mismatch, without changing any culling semantics.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…elds + ddl)

Carry filter/filter_mode through the OpenAPI experiment submit path: IDL +
generated kitex, app wiring, experiment model, and the experiment DDL/patch
SQL for the new columns.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rmat

buildExptTurnEvalCtx and pruneSuccessfulEvaluatorRecords only inspected
the legacy EvalVerIDToResID map, but the persist path writes only the
new Registered/Inline arrays. Async evaluator report re-triggers then
saw empty EvaluatorResults and reported "evaluator result missing";
fail-retry likewise discarded already-successful records.

Both now collect record IDs across Registered, Inline and the legacy
map. Prune preserves the original shape so (VersionID, Alias) /
InlineKey metadata is retained.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…val target

沙箱评测对象透传两个平台稳定标识到外部执行侧:
- ExperimentGroupKey(实验级)经 ExecuteTargetCtx / ExecuteEvalTargetParam 透传
- DatasetKey(评测集级)填入 EvalSetItemMeta,来自 EvaluationSet.DatasetKey
新增字段均 optional,向前兼容。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 新增 ref_group_experiment_id 字段(内部 Create/Submit + OpenAPI): 引用当前空间实验则复用其 group key 归入同组, 优先级高于 experiment_group_key
- group key 唯一校验从全局改为跨空间隔离(space_id != 当前空间才算冲突), 同空间允许多实验共享同一 group
- 新增错误码 RefGroupExperimentInvalid(601204019); ExperimentGroupKeyExisted 文案改为 already exists please use another one
- 重新生成 kitex_gen / errno 产物 / repo·service·dao mock

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add Apache-2.0 header to standard_eval_output_test.go
- Drop unnecessary string() conversion on QueryType (unconvert)
- gofmt EvalSetItemMeta struct field alignment

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants