From 826076ee20fc7bb944b647856baefc03df9d4f97 Mon Sep 17 00:00:00 2001 From: qihai Date: Wed, 15 Apr 2026 19:30:50 +0800 Subject: [PATCH 1/5] feat(idl2ts): add banner plugin --- frontend/infra/idl/idl2ts-cli/src/actions.ts | 2 ++ frontend/infra/idl/idl2ts-cli/src/types.ts | 2 ++ .../infra/idl/idl2ts-generator/src/core.ts | 3 ++ .../src/plugin/banner-plugin.ts | 29 +++++++++++++++++++ .../idl/idl2ts-generator/src/plugin/index.ts | 1 + .../infra/idl/idl2ts-generator/src/types.ts | 2 ++ 6 files changed, 39 insertions(+) create mode 100644 frontend/infra/idl/idl2ts-generator/src/plugin/banner-plugin.ts diff --git a/frontend/infra/idl/idl2ts-cli/src/actions.ts b/frontend/infra/idl/idl2ts-cli/src/actions.ts index 7e4fd4d8b1..3aae45f0e7 100644 --- a/frontend/infra/idl/idl2ts-cli/src/actions.ts +++ b/frontend/infra/idl/idl2ts-cli/src/actions.ts @@ -24,6 +24,7 @@ export const gen = (projectRoot: string, options: GenOptions) => { commonCodePath, aggregationExport, formatter, + banner, } = config; const aliasMap = new Map(); const idlRoot = path.resolve(projectRoot, config.idlRoot); @@ -53,6 +54,7 @@ export const gen = (projectRoot: string, options: GenOptions) => { new LocalConfigPlugin({ outputDir: output, projectRoot, idlRoot }), ...plugins, ], + banner, entryName: aggregationExport || 'index', outputDir: output, commonCodePath, diff --git a/frontend/infra/idl/idl2ts-cli/src/types.ts b/frontend/infra/idl/idl2ts-cli/src/types.ts index 86fc44494f..e005296e6d 100644 --- a/frontend/infra/idl/idl2ts-cli/src/types.ts +++ b/frontend/infra/idl/idl2ts-cli/src/types.ts @@ -23,6 +23,8 @@ export interface ApiConfig { aggregationExport?: string; // 格式化文件 formatter: (name: string, content: string) => string; + // banner + banner?: string; idlFetchConfig?: { source: string; branch?: string; diff --git a/frontend/infra/idl/idl2ts-generator/src/core.ts b/frontend/infra/idl/idl2ts-generator/src/core.ts index 6f8b6e3621..88bcaf3ee3 100644 --- a/frontend/infra/idl/idl2ts-generator/src/core.ts +++ b/frontend/infra/idl/idl2ts-generator/src/core.ts @@ -28,6 +28,7 @@ import { IgnoreStructFiledPlugin, AutoFixDuplicateIncludesPlugin, CommentFormatPlugin, + BannerPlugin, } from './plugin'; import { type Contexts, HOOK } from './context'; @@ -41,6 +42,7 @@ export class ClientGenerator { private output: IGentsRes = new Map(); static PLUGIN_PRIORITY = 0; private processFile = new Set(); + constructor(options: Options) { this.entries = options.entries.map(i => path.resolve(options.idlRoot, i)); this.options = options; @@ -50,6 +52,7 @@ export class ClientGenerator { new AutoFixPathPlugin(), new CommentFormatPlugin(), new AutoFixDuplicateIncludesPlugin(), + new BannerPlugin({ banner: options.banner }), new AdapterPlugin(options), new MetaPlugin(options), new IgnoreStructFiledPlugin({ filter: ignoreField }), diff --git a/frontend/infra/idl/idl2ts-generator/src/plugin/banner-plugin.ts b/frontend/infra/idl/idl2ts-generator/src/plugin/banner-plugin.ts new file mode 100644 index 0000000000..1c68e3e602 --- /dev/null +++ b/frontend/infra/idl/idl2ts-generator/src/plugin/banner-plugin.ts @@ -0,0 +1,29 @@ +import { EOL } from 'os'; + +import { type IPlugin, type Program, before } from '@coze-arch/idl2ts-plugin'; + +import { type Contexts, HOOK } from '../context'; + +interface BannerOptions { + banner?: string; +} + +export class BannerPlugin implements IPlugin { + private options: BannerOptions; + + constructor(options: BannerOptions) { + this.options = options; + } + + apply(program: Program): void { + const { banner } = this.options; + if (!banner) { + return; + } + + program.register(before(HOOK.WRITE_FILE), ctx => { + ctx.content = banner + EOL + ctx.content; + return ctx; + }); + } +} diff --git a/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts b/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts index 6e35dd3481..b0f52ba590 100644 --- a/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts +++ b/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts @@ -8,3 +8,4 @@ export * from './auto-fix-path-plugin'; export * from './ignore-struct-field'; export * from './auto-fix-duplicate-plugin'; export * from './comment-format-plugin'; +export * from './banner-plugin'; diff --git a/frontend/infra/idl/idl2ts-generator/src/types.ts b/frontend/infra/idl/idl2ts-generator/src/types.ts index ab9b34ebf7..83eb3f93ac 100644 --- a/frontend/infra/idl/idl2ts-generator/src/types.ts +++ b/frontend/infra/idl/idl2ts-generator/src/types.ts @@ -19,6 +19,8 @@ export interface Options { patchTypesOutput?: string; // patchTypesOutput 的别名,patch type 需要使用额外的 pkg 组织时需要提供 patchTypesAliasOutput?: string; + /** file banner */ + banner?: string; } export interface IGenOptions extends Options { From e9f41735a7443fe3b708da2c8707c4de4802f688 Mon Sep 17 00:00:00 2001 From: qihai Date: Wed, 15 Apr 2026 19:35:26 +0800 Subject: [PATCH 2/5] feat(idl2ts): add auto-fix-duplicate-namespace-plugin --- frontend/infra/idl/idl2ts-cli/package.json | 1 + frontend/infra/idl/idl2ts-cli/src/index.ts | 1 + frontend/infra/idl/idl2ts-cli/src/types.ts | 26 +- .../infra/idl/idl2ts-generator/src/core.ts | 2 + .../auto-fix-duplicate-namespace-plugin.ts | 312 ++++++++++++++++++ .../idl/idl2ts-generator/src/plugin/index.ts | 1 + .../loop-base/api-schema/api.config.js | 3 + .../loop-base/api-schema/package.json | 8 +- .../api/idl/data/coze.loop.data.dataset.ts | 8 +- .../src/api/idl/data/domain/dataset.ts | 58 +++- .../src/api/idl/data/domain/dataset_job.ts | 3 +- .../src/api/idl/data/domain/filter.ts | 71 ++++ .../coze.loop.evaluation.eval_set.ts | 76 ++++- .../coze.loop.evaluation.eval_target.ts | 27 ++ .../coze.loop.evaluation.evaluator.ts | 154 +++++++-- .../evaluation/coze.loop.evaluation.expt.ts | 208 +++++++++++- .../evaluation/coze.loop.evaluation.spi.ts | 24 ++ .../src/api/idl/evaluation/domain/common.ts | 34 ++ .../src/api/idl/evaluation/domain/eval_set.ts | 1 + .../api/idl/evaluation/domain/eval_target.ts | 15 + .../api/idl/evaluation/domain/evaluator.ts | 47 +++ .../src/api/idl/evaluation/domain/expt.ts | 129 +++++++- .../loop-base/api-schema/src/api/idl/extra.ts | 6 + .../coze.loop.foundation.openapi.ts | 3 + .../loop-base/api-schema/src/api/idl/index.ts | 1 + .../src/api/idl/llm/coze.loop.llm.manage.ts | 20 +- .../src/api/idl/llm/domain/manage.ts | 124 +++++++ .../src/api/idl/llm/domain/runtime.ts | 6 + .../api/idl/observability/domain/common.ts | 1 + .../src/api/idl/observability/domain/span.ts | 4 + .../api/idl/prompt/coze.loop.prompt.manage.ts | 26 +- .../prompt/coze.loop.prompt.tool_manage.ts | 185 +++++++++++ .../src/api/idl/prompt/domain/prompt.ts | 48 +++ .../src/api/idl/prompt/domain/tool.ts | 38 +++ 34 files changed, 1609 insertions(+), 62 deletions(-) create mode 100644 frontend/infra/idl/idl2ts-cli/src/index.ts create mode 100644 frontend/infra/idl/idl2ts-generator/src/plugin/auto-fix-duplicate-namespace-plugin.ts create mode 100644 frontend/packages/loop-base/api-schema/src/api/idl/data/domain/filter.ts create mode 100644 frontend/packages/loop-base/api-schema/src/api/idl/extra.ts create mode 100644 frontend/packages/loop-base/api-schema/src/api/idl/prompt/coze.loop.prompt.tool_manage.ts create mode 100644 frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/tool.ts diff --git a/frontend/infra/idl/idl2ts-cli/package.json b/frontend/infra/idl/idl2ts-cli/package.json index 914c9b8c62..aa2f607cfd 100644 --- a/frontend/infra/idl/idl2ts-cli/package.json +++ b/frontend/infra/idl/idl2ts-cli/package.json @@ -5,6 +5,7 @@ "homepage": "", "license": "Apache-2.0", "author": "fanwenjie.fe@bytedance.com", + "main": "./src/index.ts", "bin": { "idl2ts": "./src/cli.js" }, diff --git a/frontend/infra/idl/idl2ts-cli/src/index.ts b/frontend/infra/idl/idl2ts-cli/src/index.ts new file mode 100644 index 0000000000..4ef5f0d2d3 --- /dev/null +++ b/frontend/infra/idl/idl2ts-cli/src/index.ts @@ -0,0 +1 @@ +export type { ApiConfig, ApiTypeConfig } from './types'; diff --git a/frontend/infra/idl/idl2ts-cli/src/types.ts b/frontend/infra/idl/idl2ts-cli/src/types.ts index e005296e6d..a1f046910e 100644 --- a/frontend/infra/idl/idl2ts-cli/src/types.ts +++ b/frontend/infra/idl/idl2ts-cli/src/types.ts @@ -1,29 +1,29 @@ import { type IPlugin } from '@coze-arch/idl2ts-generator'; export interface ApiConfig { - // idl 入口 + /** idl 入口 */ entries: Record; - // idl 根目录 + /** idl 根目录 */ idlRoot: string; - // 服务别名 - // 自定义 api 方法 + /** 服务别名 */ + /** 自定义 api 方法 */ commonCodePath: string; - // api 产物目录 + /** api 产物目录 */ output: string; - // 仓库信息设置 + /** 仓库信息设置 */ repository?: { - // 仓库地址 + /** 仓库地址 */ url: string; - // clone 到本地的位置 + /** clone 到本地的位置 */ dest: string; }; - // 插件 + /** 插件 */ plugins?: IPlugin[]; - // 聚合导出的文件名 + /** 聚合导出的文件名 */ aggregationExport?: string; - // 格式化文件 + /** 格式化文件 */ formatter: (name: string, content: string) => string; - // banner + /** banner */ banner?: string; idlFetchConfig?: { source: string; @@ -34,6 +34,6 @@ export interface ApiConfig { } export interface ApiTypeConfig extends ApiConfig { - // 需要过滤的方法 + /** 需要过滤的方法 */ filters: Record; } diff --git a/frontend/infra/idl/idl2ts-generator/src/core.ts b/frontend/infra/idl/idl2ts-generator/src/core.ts index 88bcaf3ee3..6846755c28 100644 --- a/frontend/infra/idl/idl2ts-generator/src/core.ts +++ b/frontend/infra/idl/idl2ts-generator/src/core.ts @@ -27,6 +27,7 @@ import { AutoFixPathPlugin, IgnoreStructFiledPlugin, AutoFixDuplicateIncludesPlugin, + AutoFixDuplicateNamespacePlugin, CommentFormatPlugin, BannerPlugin, } from './plugin'; @@ -52,6 +53,7 @@ export class ClientGenerator { new AutoFixPathPlugin(), new CommentFormatPlugin(), new AutoFixDuplicateIncludesPlugin(), + new AutoFixDuplicateNamespacePlugin(), new BannerPlugin({ banner: options.banner }), new AdapterPlugin(options), new MetaPlugin(options), diff --git a/frontend/infra/idl/idl2ts-generator/src/plugin/auto-fix-duplicate-namespace-plugin.ts b/frontend/infra/idl/idl2ts-generator/src/plugin/auto-fix-duplicate-namespace-plugin.ts new file mode 100644 index 0000000000..d0c14bef0c --- /dev/null +++ b/frontend/infra/idl/idl2ts-generator/src/plugin/auto-fix-duplicate-namespace-plugin.ts @@ -0,0 +1,312 @@ +import path from 'path'; + +import { type Program, after, type IPlugin } from '@coze-arch/idl2ts-plugin'; +import { + type IParseEntryCtx, + type IParseResultItem, + isPbFile, + isIdentifier, + isMapType, + isSetType, + isListType, + isStructDefinition, + isServiceDefinition, + isTypedefDefinition, + isConstDefinition, +} from '@coze-arch/idl2ts-helper'; +import type { + FieldType, + FunctionType, + Identifier, + StructDefinition, +} from '@coze-arch/idl-parser'; + +import { HOOK } from '../context'; + +/** + * Fix TS2308 errors caused by multiple generated files exporting the same + * namespace alias name from different source modules. + * + * The plugin prefixes namespace aliases for **cross-domain** includes with the + * source domain directory name (e.g., `filter` → `observability_filter`), while + * keeping **same-domain** includes unchanged. + * + * "Domain" is defined as the first divergent directory segment between the + * importing file and the imported file. For example, files under + * `evaluation/domain/` importing from `observability/domain/` cross the domain + * boundary, so the alias gets the `observability_` prefix. + */ +export class AutoFixDuplicateNamespacePlugin implements IPlugin { + apply(p: Program<{ PARSE_ENTRY: any }>) { + p.register(after(HOOK.PARSE_ENTRY), (ctx: IParseEntryCtx) => { + if (isPbFile(ctx.entries[0])) { + return ctx; + } + + // Collect all existing alias names across all AST items to detect conflicts + const allAliases = new Set(); + for (const astItem of ctx.ast) { + for (const alias of Object.values(astItem.includeRefer)) { + if (alias) { + allAliases.add(alias); + } + } + } + + // Cache for cross-domain renames: resolvedPath → newName. + // Ensures the same target file gets a consistent prefixed name across + // all files that cross-domain-include it, while NOT affecting same-domain + // includes of the same file. + const crossDomainRenameCache = new Map(); + + for (const astItem of ctx.ast) { + for (const includeKey of Object.keys(astItem.includeMap)) { + const alias = astItem.includeRefer[includeKey]; + if (!alias) { + continue; + } + const resolvedPath = astItem.includeMap[includeKey]; + const targetDomain = getCrossDomain(astItem.idlPath, resolvedPath); + + if (!targetDomain) { + // Same domain — keep original alias, no rename + continue; + } + + // Cross-domain include — check cache first + const cached = crossDomainRenameCache.get(resolvedPath); + if (cached !== undefined) { + if (cached !== alias) { + astItem.includeRefer[includeKey] = cached; + renameNamespaceInStatements(astItem.statements, alias, cached); + renameNamespaceInNestedDefs(astItem.statements, alias, cached); + } + continue; + } + + // Prefix with target domain name + let newName = `${targetDomain}_${alias}`; + + // If the prefixed name conflicts with an existing alias, + // keep adding parent directory segments until unique + if (allAliases.has(newName) && newName !== alias) { + newName = deriveUniqueName(alias, resolvedPath, allAliases); + } + + if (newName === alias) { + crossDomainRenameCache.set(resolvedPath, alias); + continue; + } + + allAliases.add(newName); + crossDomainRenameCache.set(resolvedPath, newName); + astItem.includeRefer[includeKey] = newName; + renameNamespaceInStatements(astItem.statements, alias, newName); + renameNamespaceInNestedDefs(astItem.statements, alias, newName); + } + } + + return ctx; + }); + } +} + +/** + * Determine whether two IDL file paths belong to different domains. + * + * Returns the target's domain directory name if they cross a domain boundary + * (e.g., `"observability"`), or `null` if they are in the same domain. + * + * The domain boundary is the first divergent **directory** segment after the + * common ancestor directory. If the paths only differ at the filename level + * (same directory), they are considered same-domain. + * + * Both paths are normalized before comparison to avoid symlink/realpath + * inconsistencies (e.g., /private/Users vs /Users on macOS). + */ +function getCrossDomain(sourcePath: string, targetPath: string): string | null { + // Normalize paths to resolve symlinks, '..' etc. for stable comparison + const sourceDir = path.dirname(path.resolve(sourcePath)); + const targetDir = path.dirname(path.resolve(targetPath)); + + if (sourceDir === targetDir) { + // Same directory — always same domain + return null; + } + + const sourceSegments = sourceDir.split(path.sep); + const targetSegments = targetDir.split(path.sep); + + // Find the longest common prefix + let commonLen = 0; + const minLen = Math.min(sourceSegments.length, targetSegments.length); + for (let i = 0; i < minLen; i++) { + if (sourceSegments[i] === targetSegments[i]) { + commonLen = i + 1; + } else { + break; + } + } + + // Get the first divergent directory segment for each path + const sourceDomain = sourceSegments[commonLen]; + const targetDomain = targetSegments[commonLen]; + + if (!sourceDomain || !targetDomain) { + // One directory is a parent of the other (e.g., evaluation/ vs evaluation/domain/) + // This means they are within the same module hierarchy + return null; + } + + if (sourceDomain === targetDomain) { + // Same first-level directory after common prefix — same domain + return null; + } + + // Different domains — return the target domain name + return targetDomain; +} + +/** + * Fallback: derive a unique alias name by trying parent directory segments + * as prefix when the simple `domain_alias` conflicts with an existing name. + * Generated names are sanitized to be valid JS identifiers. + */ +function deriveUniqueName( + originalAlias: string, + resolvedPath: string, + usedNames: Set, +): string { + const dirSegments = path + .dirname(resolvedPath) + .split(path.sep) + .filter(Boolean); + + // Try each individual parent directory as prefix (from closest to farthest) + for (let i = dirSegments.length - 1; i >= 0; i--) { + const candidate = sanitizeIdentifier(`${dirSegments[i]}_${originalAlias}`); + if (!usedNames.has(candidate)) { + return candidate; + } + } + + // Try combined prefixes with increasing depth + for (let depth = 2; depth <= dirSegments.length; depth++) { + const prefix = dirSegments.slice(dirSegments.length - depth).join('_'); + const candidate = sanitizeIdentifier(`${prefix}_${originalAlias}`); + if (!usedNames.has(candidate)) { + return candidate; + } + } + + // Fallback: append a numeric suffix + let counter = 2; + while (usedNames.has(`${originalAlias}_${counter}`)) { + counter++; + } + return `${originalAlias}_${counter}`; +} + +/** + * Sanitize a string to be a valid JS identifier. + * Replaces non-alphanumeric/non-underscore characters with underscores. + */ +function sanitizeIdentifier(name: string): string { + return name.replace(/[^a-zA-Z0-9_$]/g, '_'); +} + +/** + * Rename namespace references in all type identifiers within an array of statements. + */ +function renameNamespaceInStatements( + statements: IParseResultItem['statements'], + oldName: string, + newName: string, +): void { + for (const stmt of statements) { + if (isStructDefinition(stmt)) { + for (const field of stmt.fields) { + renameInFieldType(field.fieldType, oldName, newName); + if (field.defaultValue && isIdentifier(field.defaultValue as any)) { + renameIdentifier(field.defaultValue as Identifier, oldName, newName); + } + } + } else if (isServiceDefinition(stmt)) { + for (const func of stmt.functions) { + renameInFieldType(func.returnType as FieldType, oldName, newName); + for (const field of func.fields) { + renameInFieldType(field.fieldType, oldName, newName); + } + for (const field of func.throws) { + renameInFieldType(field.fieldType, oldName, newName); + } + } + } else if (isTypedefDefinition(stmt)) { + renameInFieldType(stmt.definitionType, oldName, newName); + } else if (isConstDefinition(stmt)) { + renameInFieldType(stmt.fieldType, oldName, newName); + } + } +} + +/** + * Handle nested struct/enum definitions. + */ +function renameNamespaceInNestedDefs( + statements: IParseResultItem['statements'], + oldName: string, + newName: string, +): void { + for (const stmt of statements) { + if (isStructDefinition(stmt) && stmt.nested) { + for (const nestedDef of Object.values(stmt.nested)) { + if (isStructDefinition(nestedDef as any)) { + const nested = nestedDef as StructDefinition; + for (const field of nested.fields) { + renameInFieldType(field.fieldType, oldName, newName); + } + } + } + } + } +} + +/** + * Recursively rename namespace in a field type. + */ +function renameInFieldType( + fieldType: FieldType | FunctionType, + oldName: string, + newName: string, +): void { + if (!fieldType) { + return; + } + if (isIdentifier(fieldType as any)) { + renameIdentifier(fieldType as Identifier, oldName, newName); + } else if (isMapType(fieldType as any)) { + const mapType = fieldType as { keyType: FieldType; valueType: FieldType }; + renameInFieldType(mapType.keyType, oldName, newName); + renameInFieldType(mapType.valueType, oldName, newName); + } else if (isListType(fieldType as any) || isSetType(fieldType as any)) { + const containerType = fieldType as { valueType: FieldType }; + renameInFieldType(containerType.valueType, oldName, newName); + } +} + +/** + * Rename namespace prefix in an Identifier node. + */ +function renameIdentifier( + identifier: Identifier, + oldName: string, + newName: string, +): void { + const prefix = `${oldName}.`; + if (identifier.value.startsWith(prefix)) { + identifier.value = `${newName}.${identifier.value.slice(prefix.length)}`; + } + if (identifier.namespaceValue?.startsWith(prefix)) { + identifier.namespaceValue = `${newName}.${identifier.namespaceValue.slice(prefix.length)}`; + } +} diff --git a/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts b/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts index b0f52ba590..9dd7f5e83f 100644 --- a/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts +++ b/frontend/infra/idl/idl2ts-generator/src/plugin/index.ts @@ -7,5 +7,6 @@ export * from './pkg-entry-plugin'; export * from './auto-fix-path-plugin'; export * from './ignore-struct-field'; export * from './auto-fix-duplicate-plugin'; +export * from './auto-fix-duplicate-namespace-plugin'; export * from './comment-format-plugin'; export * from './banner-plugin'; diff --git a/frontend/packages/loop-base/api-schema/api.config.js b/frontend/packages/loop-base/api-schema/api.config.js index 90dd43179f..4a94a38646 100644 --- a/frontend/packages/loop-base/api-schema/api.config.js +++ b/frontend/packages/loop-base/api-schema/api.config.js @@ -2,6 +2,7 @@ const path = require('path'); +/** @type {import('@coze-arch/idl2ts-cli').ApiConfig[] } */ const config = [ { // idl 根目录 @@ -10,6 +11,8 @@ const config = [ 'node_modules/.cache/coze-loop-idl/thrift/coze/loop', ), genMock: false, + banner: `// Copyright (c) 2025 coze-dev Authors +// SPDX-License-Identifier: Apache-2.0`, entries: { promptDebug: './prompt/coze.loop.prompt.debug.thrift', promptManage: './prompt/coze.loop.prompt.manage.thrift', diff --git a/frontend/packages/loop-base/api-schema/package.json b/frontend/packages/loop-base/api-schema/package.json index 7c5a99268e..8fee0cdc06 100644 --- a/frontend/packages/loop-base/api-schema/package.json +++ b/frontend/packages/loop-base/api-schema/package.json @@ -6,12 +6,8 @@ "author": "fanwenjie.fe@bytedance.com", "maintainers": [], "exports": { - ".": [ - "./src/index.ts" - ], - "./observation": [ - "./src/api/observability/index.ts" - ], + ".": "./src/index.ts", + "./observation": "./src/api/observability/index.ts", "./evaluation": "./src/api/evaluation/index.ts", "./data": "./src/api/data/index.ts", "./llm-manage": "./src/api/llm-manage/index.ts", diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/data/coze.loop.data.dataset.ts b/frontend/packages/loop-base/api-schema/src/api/idl/data/coze.loop.data.dataset.ts index ee223c9e0b..2430ba67c6 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/data/coze.loop.data.dataset.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/data/coze.loop.data.dataset.ts @@ -207,6 +207,7 @@ export interface BatchCreateDatasetItemsRequest { skip_invalid_items?: boolean, /** 批量写入 items 如果超出数据集容量限制,默认不会写入任何数据;设置 partialAdd=true 会写入不超出容量限制的前 N 条 */ allow_partial_add?: boolean, + field_write_options?: dataset.FieldWriteOption[], } export interface BatchCreateDatasetItemsResponse { /** key: item 在 items 中的索引 */ @@ -223,6 +224,7 @@ export interface UpdateDatasetItemRequest { data?: dataset.FieldData[], /** 多轮对话数据内容,当数据集为多轮对话时,写入此处的值 */ repeated_data?: dataset.ItemData[], + field_write_options?: dataset.FieldWriteOption[], } export interface UpdateDatasetItemResponse {} export interface DeleteDatasetItemRequest { @@ -253,6 +255,7 @@ export interface ListDatasetItemsResponse { /** pagination */ next_page_token?: string, total?: string, + filter_total?: string, } export interface ListDatasetItemsByVersionRequest { workspace_id?: string, @@ -271,6 +274,7 @@ export interface ListDatasetItemsByVersionResponse { /** pagination */ next_page_token?: string, total?: string, + filter_total?: string, } export interface GetDatasetItemRequest { workspace_id?: string, @@ -543,7 +547,7 @@ export const BatchCreateDatasetItems = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluation_sets", @@ -317,7 +371,7 @@ export const CreateEvaluationSetWithImport = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/evaluation_sets/multi_part_data/validate", + "method": "POST", + "name": "ValidateEvaluationSetMultiPartData", + "reqType": "ValidateEvaluationSetMultiPartDataRequest", + "reqMapping": { + "body": ["space_id", "preview_data", "store_option"] + }, + "resType": "ValidateEvaluationSetMultiPartDataResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.eval_set", + "service": "evaluationEvalSet" }); \ No newline at end of file diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts index 7399eef94d..bd18a1b96f 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts @@ -93,6 +93,20 @@ export interface BatchGetEvalTargetRecordsRequest { export interface BatchGetEvalTargetRecordsResponse { eval_target_records: eval_target.EvalTargetRecord[] } +/** 按需查询 output 中的大对象完整内容 */ +export interface GetEvalTargetOutputFieldContentRequest { + workspace_id: string, + /** eval_target_record_id */ + eval_target_record_id: string, + /** output_fields 中待查询的字段 key */ + field_keys: string[], +} +export interface GetEvalTargetOutputFieldContentResponse { + /** field_key -> 完整 Content */ + field_contents?: { + [key: string | number]: common.Content + } +} export interface ListSourceEvalTargetsRequest { workspace_id: string, target_type?: eval_target.EvalTargetType, @@ -336,6 +350,19 @@ export const BatchGetEvalTargetRecords = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/eval_target_records/output_fields", + "method": "POST", + "name": "GetEvalTargetOutputFieldContent", + "reqType": "GetEvalTargetOutputFieldContentRequest", + "reqMapping": { + "body": ["workspace_id", "eval_target_record_id", "field_keys"] + }, + "resType": "GetEvalTargetOutputFieldContentResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.eval_target", + "service": "evaluationEvalTarget" +}); /** debug */ export const DebugEvalTarget = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/eval_targets/debug", diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.evaluator.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.evaluator.ts index 75d71bac1c..c52f378d67 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.evaluator.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.evaluator.ts @@ -45,6 +45,7 @@ export interface GetEvaluatorResponse { } export interface CreateEvaluatorRequest { evaluator: evaluator.Evaluator, + workspace_id?: string, cid?: string, } export interface CreateEvaluatorResponse { @@ -117,6 +118,19 @@ export interface BatchGetEvaluatorVersionsRequest { export interface BatchGetEvaluatorVersionsResponse { evaluators?: evaluator.Evaluator[] } +/** EvaluatorID 与版本号组成的对,用于 BatchGetEvaluatorVersionIDs(仅 RPC,无 HTTP 路由) */ +export interface EvaluatorIDVersionPair { + evaluator_id: number, + version: string, +} +export interface BatchGetEvaluatorVersionIDsRequest { + workspace_id: number, + evaluator_id_version_pairs?: EvaluatorIDVersionPair[], +} +export interface BatchGetEvaluatorVersionIDsResponse { + /** 与请求 evaluator_id_version_pairs 顺序一致;evaluator_version_id 为解析结果,未找到对应版本时可不填或为 0 */ + id_version_items?: evaluator.EvaluatorIDVersionItem[] +} export interface SubmitEvaluatorVersionRequest { workspace_id: string, evaluator_id: string, @@ -164,6 +178,28 @@ export interface RunEvaluatorRequest { export interface RunEvaluatorResponse { record: evaluator.EvaluatorRecord } +export interface AsyncRunEvaluatorRequest { + /** 空间 id */ + workspace_id: string, + /** 评测规则 id */ + evaluator_version_id: string, + /** 评测数据输入: 数据集行内容 + 评测目标输出内容与历史记录 + 评测目标的 trace */ + input_data: evaluator.EvaluatorInputData, + /** experiment id */ + experiment_id?: string, + /** experiment run id */ + experiment_run_id?: string, + item_id?: string, + turn_id?: string, + /** 评估器运行配置参数 */ + evaluator_run_conf?: evaluator.EvaluatorRunConfig, + ext?: { + [key: string | number]: string + }, +} +export interface AsyncRunEvaluatorResponse { + invoke_id?: string +} export interface DebugEvaluatorRequest { /** 空间 id */ workspace_id: string, @@ -179,6 +215,20 @@ export interface DebugEvaluatorResponse { /** 输出数据 */ evaluator_output_data?: evaluator.EvaluatorOutputData } +export interface AsyncDebugEvaluatorRequest { + /** 空间 id */ + workspace_id: string, + /** 待调试评估器内容 */ + evaluator_content: evaluator.EvaluatorContent, + /** 评测数据输入: 数据集行内容 + 评测目标输出内容与历史记录 + 评测目标的 trace */ + input_data: evaluator.EvaluatorInputData, + evaluator_type: evaluator.EvaluatorType, + /** 评估器运行配置参数 */ + evaluator_run_conf?: evaluator.EvaluatorRunConfig, +} +export interface AsyncDebugEvaluatorResponse { + invoke_id?: string +} export interface BatchDebugEvaluatorRequest { /** 空间 id */ workspace_id: string, @@ -328,10 +378,7 @@ export interface ListEvaluatorTagsResponse { [key: string | number]: string[] } } -/** - * 评估器 - * 按查询条件查询evaluator -*/ +/** 评估器 */ export const ListEvaluators = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/list", "method": "POST", @@ -344,7 +391,7 @@ export const ListEvaluators = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/batch_get", "method": "POST", @@ -357,7 +404,7 @@ export const BatchGetEvaluators = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/:evaluator_id", "method": "GET", @@ -371,20 +418,20 @@ export const GetEvaluator = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators", "method": "POST", "name": "CreateEvaluator", "reqType": "CreateEvaluatorRequest", "reqMapping": { - "body": ["evaluator", "cid"] + "body": ["evaluator", "workspace_id", "cid"] }, "resType": "CreateEvaluatorResponse", "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.evaluator", "service": "evaluationEvaluator" }); -/** 修改evaluator元信息 */ +/** 创建evaluator */ export const UpdateEvaluator = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/:evaluator_id", "method": "PATCH", @@ -398,7 +445,7 @@ export const UpdateEvaluator = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/:evaluator_id/update_draft", "method": "PATCH", @@ -412,7 +459,7 @@ export const UpdateEvaluatorDraft = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/:evaluator_id", "method": "DELETE", @@ -426,7 +473,7 @@ export const DeleteEvaluator = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/check_name", "method": "POST", @@ -440,8 +487,8 @@ export const CheckEvaluatorName = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/:evaluator_id/versions/list", @@ -456,7 +503,7 @@ export const ListEvaluatorVersions = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators_versions/:evaluator_version_id", "method": "GET", @@ -470,7 +517,7 @@ export const GetEvaluatorVersion = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators_versions/batch_get", "method": "POST", @@ -483,7 +530,6 @@ export const BatchGetEvaluatorVersions = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/:evaluator_id/submit_version", "method": "POST", @@ -498,8 +544,8 @@ export const SubmitEvaluatorVersion = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/list_template", @@ -513,7 +559,7 @@ export const ListTemplates = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/get_template_info", "method": "POST", @@ -526,7 +572,7 @@ export const GetTemplateInfo = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/default_prompt_evaluator_tools", "method": "POST", @@ -538,8 +584,8 @@ export const GetDefaultPromptEvaluatorTools = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators_versions/:evaluator_version_id/run", @@ -554,7 +600,7 @@ export const RunEvaluator = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/debug", "method": "POST", @@ -580,9 +626,36 @@ export const BatchDebugEvaluator = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/evaluators_versions/:evaluator_version_id/async_run", + "method": "POST", + "name": "AsyncRunEvaluator", + "reqType": "AsyncRunEvaluatorRequest", + "reqMapping": { + "body": ["workspace_id", "input_data", "experiment_id", "experiment_run_id", "item_id", "turn_id", "evaluator_run_conf", "ext"], + "path": ["evaluator_version_id"] + }, + "resType": "AsyncRunEvaluatorResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.evaluator", + "service": "evaluationEvaluator" +}); +/** evaluator 异步运行 */ +export const AsyncDebugEvaluator = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/evaluators/async_debug", + "method": "POST", + "name": "AsyncDebugEvaluator", + "reqType": "AsyncDebugEvaluatorRequest", + "reqMapping": { + "body": ["workspace_id", "evaluator_content", "input_data", "evaluator_type", "evaluator_run_conf"] + }, + "resType": "AsyncDebugEvaluatorResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.evaluator", + "service": "evaluationEvaluator" +}); /** + * evaluator 异步调试 * 评估器执行结果 - * 修正evaluator运行分数 */ export const UpdateEvaluatorRecord = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluator_records/:evaluator_record_id", @@ -597,7 +670,37 @@ export const UpdateEvaluatorRecord = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/evaluator_records/:evaluator_record_id", + "method": "GET", + "name": "GetEvaluatorRecord", + "reqType": "GetEvaluatorRecordRequest", + "reqMapping": { + "query": ["workspace_id", "include_deleted"], + "path": ["evaluator_record_id"] + }, + "resType": "GetEvaluatorRecordResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.evaluator", + "service": "evaluationEvaluator" +}); +/** 获取evaluator运行记录详情 */ +export const BatchGetEvaluatorRecords = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/evaluator_records/batch_get", + "method": "POST", + "name": "BatchGetEvaluatorRecords", + "reqType": "BatchGetEvaluatorRecordsRequest", + "reqMapping": { + "body": ["workspace_id", "evaluator_record_ids", "include_deleted"] + }, + "resType": "BatchGetEvaluatorRecordsResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.evaluator", + "service": "evaluationEvaluator" +}); +/** + * 按id批量查询evaluator运行记录详情 + * 评估器验证 +*/ export const ValidateEvaluator = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/validate", "method": "POST", @@ -676,10 +779,7 @@ export const DeleteEvaluatorTemplate = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/evaluators/debug_builtin", "method": "POST", diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts index f7a8437d25..79ed9a9f5a 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts @@ -36,6 +36,14 @@ export interface CreateExperimentRequest { source_id?: string, /** 补充的评估器id+version关联评估器方式,和evaluator_version_ids共同使用,兼容老逻辑 */ evaluator_id_version_list?: evaluator.EvaluatorIDVersionItem[], + /** 是否启用评估器得分加权汇总,以及各评估器的权重配置(key 为 evaluator_version_id,value 为权重) */ + enable_weighted_score?: boolean, + evaluator_score_weights?: { + [key: string | number]: number + }, + expt_template_id?: string, + item_retry_num?: number, + trigger_type?: expt.ExptTriggerType, session?: common.Session, } export interface CreateExperimentResponse { @@ -62,6 +70,12 @@ export interface SubmitExperimentRequest { source_id?: string, /** 补充的评估器id+version关联评估器方式,和evaluator_version_ids共同使用,兼容老逻辑 */ evaluator_id_version_list?: evaluator.EvaluatorIDVersionItem[], + /** 是否启用评估器得分加权汇总,以及各评估器的权重配置(key 为 evaluator_version_id,value 为权重) */ + enable_weighted_score?: boolean, + expt_template_id?: string, + item_retry_num?: number, + trigger_type?: expt.ExptTriggerType, + time_range?: expt.TaskTimeRange, ext?: { [key: string | number]: string }, @@ -113,6 +127,7 @@ export interface RunExperimentRequest { expt_id?: string, item_ids?: string[], expt_type?: expt.ExptType, + item_retry_num?: number, ext?: { [key: string | number]: string }, @@ -235,6 +250,91 @@ export interface ListExperimentStatsResponse { expt_stats_infos?: expt.ExptStatsInfo[], total?: number, } +/** + * ========================= + * 实验模板相关接口 + * ========================= +*/ +export interface CreateExperimentTemplateRequest { + workspace_id: string, + /** 模板结构,与 ExptTemplate 保持一致 */ + meta?: expt.ExptTemplateMeta, + triple_config?: expt.ExptTuple, + field_mapping_config?: expt.ExptFieldMapping, + /** 创建评估对象参数(不在 ExptTemplate 结构中,保留在顶层) */ + create_eval_target_param?: coze_loop_evaluation_eval_target.CreateEvalTargetParam, + /** 默认评估器并发数(不在 ExptTemplate 结构中,保留在顶层) */ + default_evaluators_concur_num?: number, + /** 调度配置(不在 ExptTemplate 结构中,保留在顶层) */ + schedule_cron?: string, + expt_source?: expt.ExptSource, + /** 模板运行态信息(如是否开启定时触发);创建时可只填 cron_activate */ + expt_info?: expt.ExptInfo, + session?: common.Session, +} +export interface CreateExperimentTemplateResponse { + experiment_template?: expt.ExptTemplate +} +export interface BatchGetExperimentTemplateRequest { + workspace_id: string, + template_ids: string[], +} +export interface BatchGetExperimentTemplateResponse { + experiment_templates?: expt.ExptTemplate[] +} +export interface UpdateExperimentTemplateMetaRequest { + workspace_id: string, + template_id: string, + meta?: expt.ExptTemplateMeta, +} +export interface UpdateExperimentTemplateMetaResponse { + meta?: expt.ExptTemplateMeta +} +export interface UpdateExperimentTemplateRequest { + workspace_id: string, + template_id: string, + /** + * 模板结构,与 ExptTemplate 保持一致 + * 注意:eval_set_id / target_id 不允许修改,仅允许调整版本与配置 + */ + meta?: expt.ExptTemplateMeta, + triple_config?: expt.ExptTuple, + field_mapping_config?: expt.ExptFieldMapping, + /** 创建评估对象参数(不在 ExptTemplate 结构中,保留在顶层) */ + create_eval_target_param?: coze_loop_evaluation_eval_target.CreateEvalTargetParam, + /** 默认评估器并发数(不在 ExptTemplate 结构中,保留在顶层) */ + default_evaluators_concur_num?: number, + /** 调度配置(不在 ExptTemplate 结构中,保留在顶层) */ + schedule_cron?: string, + expt_info?: expt.ExptInfo, +} +export interface UpdateExperimentTemplateResponse { + experiment_template?: expt.ExptTemplate +} +export interface DeleteExperimentTemplateRequest { + workspace_id: string, + template_id: string, +} +export interface DeleteExperimentTemplateResponse {} +export interface ListExperimentTemplatesRequest { + workspace_id: string, + page_number?: number, + page_size?: number, + filter_option?: expt.ExperimentTemplateFilter, + order_bys?: common.OrderBy[], +} +export interface ListExperimentTemplatesResponse { + experiment_templates?: expt.ExptTemplate[], + total?: number, +} +export interface CheckExperimentTemplateNameRequest { + workspace_id: string, + name: string, + template_id?: string, +} +export interface CheckExperimentTemplateNameResponse { + is_available?: boolean +} export enum UpsertExptTurnResultFilterType { /** 标签状态 */ MANUAL = "manual", @@ -287,9 +387,25 @@ export interface UpdateAnnotateRecordReq { session?: common.Session, } export interface UpdateAnnotateRecordResp {} +/** 实验报告 CSV 导出列:多个一级分组,组内 list。不传 export_columns:导出全部(含标注列等)。传 export_columns(含空 struct):白名单模式,仅 item_id、status 等必填列 + 各分组非空 list 中的列;某一 list 未传(unset)与传 [] 对该组均表示不导出。人工标注列需在 tag_key_ids 中显式列出 TagKeyID(十进制字符串)才会在白名单导出中出现。 */ +export interface ExptResultExportColumnSpec { + /** 评测集字段:ColumnEvalSetField.Key */ + eval_set_fields?: string[], + /** 评测对象输出(非性能指标):ColumnEvalTarget.Name,如 actual_output、trajectory、自定义输出名 */ + eval_target_outputs?: string[], + /** 性能指标:ColumnEvalTarget.Name(如 eval_target_total_latency、eval_target_input_tokens 等) */ + metrics?: string[], + /** 评估器版本 ID 列表(字符串形式十进制);每个 ID 导出该评估器的 score 与 reason 列 */ + evaluator_version_ids?: string[], + /** 是否导出加权分数 */ + weighted_score?: boolean, + /** 人工标注:每项为标注 TagKeyID(十进制字符串),与 ColumnAnnotation.TagKeyID 对应,导出该标注列 */ + tag_key_ids?: string[], +} export interface ExportExptResultRequest { workspace_id: string, expt_id: string, + export_columns?: ExptResultExportColumnSpec, export_type?: expt.ExptResultExportType, session?: common.Session, } @@ -402,7 +518,7 @@ export const SubmitExperiment = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates", + "method": "POST", + "name": "CreateExperimentTemplate", + "reqType": "CreateExperimentTemplateRequest", + "reqMapping": { + "body": ["workspace_id", "meta", "triple_config", "field_mapping_config", "create_eval_target_param", "default_evaluators_concur_num", "schedule_cron", "expt_source", "expt_info", "session"] + }, + "resType": "CreateExperimentTemplateResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" +}); +export const BatchGetExperimentTemplate = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates/batch_get", + "method": "POST", + "name": "BatchGetExperimentTemplate", + "reqType": "BatchGetExperimentTemplateRequest", + "reqMapping": { + "body": ["workspace_id", "template_ids"] + }, + "resType": "BatchGetExperimentTemplateResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" +}); +export const UpdateExperimentTemplateMeta = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates/update_meta", + "method": "POST", + "name": "UpdateExperimentTemplateMeta", + "reqType": "UpdateExperimentTemplateMetaRequest", + "reqMapping": { + "body": ["workspace_id", "template_id", "meta"] + }, + "resType": "UpdateExperimentTemplateMetaResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" +}); +export const UpdateExperimentTemplate = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates/:template_id", + "method": "PATCH", + "name": "UpdateExperimentTemplate", + "reqType": "UpdateExperimentTemplateRequest", + "reqMapping": { + "body": ["workspace_id", "meta", "triple_config", "field_mapping_config", "create_eval_target_param", "default_evaluators_concur_num", "schedule_cron", "expt_info"], + "path": ["template_id"] + }, + "resType": "UpdateExperimentTemplateResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" +}); +/** 更新实验模板(不允许修改关联的评测对象 / 评测集,仅允许修改默认版本、映射、评估器与配置) */ +export const DeleteExperimentTemplate = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates/:template_id", + "method": "DELETE", + "name": "DeleteExperimentTemplate", + "reqType": "DeleteExperimentTemplateRequest", + "reqMapping": { + "body": ["workspace_id"], + "path": ["template_id"] + }, + "resType": "DeleteExperimentTemplateResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" +}); +export const ListExperimentTemplates = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates/list", + "method": "POST", + "name": "ListExperimentTemplates", + "reqType": "ListExperimentTemplatesRequest", + "reqMapping": { + "body": ["workspace_id", "page_number", "page_size", "filter_option", "order_bys"] + }, + "resType": "ListExperimentTemplatesResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" +}); +export const CheckExperimentTemplateName = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/experiment_templates/check_name", + "method": "POST", + "name": "CheckExperimentTemplateName", + "reqType": "CheckExperimentTemplateNameRequest", + "reqMapping": { + "body": ["workspace_id", "name", "template_id"] + }, + "resType": "CheckExperimentTemplateNameResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.expt", + "service": "evaluationExpt" }); \ No newline at end of file diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.spi.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.spi.ts index b2e034e2e0..15ead2573c 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.spi.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.spi.ts @@ -62,6 +62,10 @@ export enum InvokeEvalTargetStatus { /** 新增 */ export interface InvokeEvalTargetOutput { actual_output?: Content, + /** 额外输出,用户可自定义评测对象的输出字段和结构 */ + ext_output?: { + [key: string | number]: Content + }, /** 扩展字段,用户如果想返回一些额外信息可以塞在这个字段 */ ext?: { [key: string | number]: string @@ -76,17 +80,27 @@ export interface Content { image?: Image, /** 当content_type=multi_part,则从此字段遍历获取多模态的值 */ multi_part?: Content[], + audio?: Audio, + video?: Video, } export enum ContentType { Text = "text", /** 文本类型:string、integer、float、boolean、object、array都属于文本类型 */ Image = "image", + Audio = "audio", + Video = "video", MultiPart = "multi_part", } /** 多模态,例如图+文 */ export interface Image { url?: string } +export interface Video { + url?: string +} +export interface Audio { + url?: string +} export interface InvokeEvalTargetUsage { /** 输入token消耗 */ input_tokens?: number, @@ -138,6 +152,7 @@ export interface InvokeEvaluatorOutputData { evaluator_result?: InvokeEvaluatorResult, evaluator_usage?: InvokeEvaluatorUsage, evaluator_run_error?: InvokeEvaluatorRunError, + extra_output?: EvaluatorExtraOutputContent, } /** the result data structure for custom evaluator */ export interface InvokeEvaluatorResult { @@ -154,6 +169,15 @@ export interface InvokeEvaluatorRunError { code?: number, message?: string, } +export enum EvaluatorExtraOutputType { + HTML = "html", + Markdown = "markdown", +} +export interface EvaluatorExtraOutputContent { + output_type?: EvaluatorExtraOutputType, + uri?: string, + url?: string, +} /** invoke custom evaluator request */ export interface InvokeEvaluatorRequest { workspace_id?: number, diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/common.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/common.ts index 134507ba64..da38cb904e 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/common.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/common.ts @@ -1,5 +1,7 @@ // Copyright (c) 2025 coze-dev Authors // SPDX-License-Identifier: Apache-2.0 +import * as manage from './../../llm/domain/manage'; +export { manage }; import * as dataset from './../../data/domain/dataset'; export { dataset }; export enum ContentType { @@ -7,6 +9,7 @@ export enum ContentType { /** 空间 */ Image = "Image", Audio = "Audio", + Video = "Video", MultiPart = "MultiPart", MultiPartVariable = "multi_part_variable", } @@ -17,6 +20,7 @@ export interface Content { image?: Image, multi_part?: Content[], audio?: Audio, + video?: Video, /** * 超大文本相关字段 * 当前列的数据是否省略, 如果此处返回 true, 需要通过 GetDatasetItemField 获取当前列的具体内容, 或者是通过 omittedDataStorage.url 下载 @@ -30,9 +34,21 @@ export interface Content { export interface AudioContent { audios?: Audio[] } +export interface Video { + name?: string, + url?: string, + uri?: string, + thumb_url?: string, + /** 当前多模态附件存储的 provider. 如果为空,则会从对应的 url 下载文件并上传到默认的存储中,并填充uri */ + storage_provider?: dataset.StorageProvider, +} export interface Audio { format?: string, url?: string, + name?: string, + uri?: string, + /** 当前多模态附件存储的 provider. 如果为空,则会从对应的 url 下载文件并上传到默认的存储中,并填充uri */ + storage_provider?: dataset.StorageProvider, } export interface Image { name?: string, @@ -45,6 +61,8 @@ export interface Image { export interface OrderBy { field?: string, is_asc?: boolean, + /** 用于区分当前字段是否是 field key,仅在评测集场景下生效 */ + is_field_key?: boolean, } export enum Role { System = 1, @@ -106,6 +124,9 @@ export interface ModelConfig { temperature?: number, max_tokens?: number, top_p?: number, + protocol?: manage.Protocol, + identification?: string, + preset_model?: boolean, json_ext?: string, } export interface Session { @@ -120,4 +141,17 @@ export interface RateLimit { rate?: number, burst?: number, period?: string, +} +export enum AgentType { + Vibe = "vibe", +} +export interface AgentConfig { + /** Agent type */ + agent_type?: AgentType +} +export interface SkillConfig { + /** skill id */ + skill_id?: string, + /** skill version */ + version?: string, } \ No newline at end of file diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_set.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_set.ts index 4e74f64726..f5a57359f7 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_set.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_set.ts @@ -127,6 +127,7 @@ export interface FieldData { key?: string, name?: string, content?: common.Content, + trace_id?: string, } export enum BizCategory { FromOnlineTrace = "from_online_trace", diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_target.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_target.ts index 58f3e3a09d..9ce40c0eac 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_target.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/eval_target.ts @@ -71,6 +71,20 @@ export enum EvalTargetType { VolcengineAgent = 5, /** 自定义RPC服务 for内场 */ CustomRPCServer = 6, + /** 火山智能体Agentkit */ + VolcengineAgentAgentkit = 7, + /** CozeBot在线(评测过程中不执行对象,仅用于展示对象) */ + CozeBotOnline = 11, + /** Prompt在线(评测过程中不执行对象,仅用于展示对象) */ + CozeLoopPromptOnline = 12, + /** CozeWorkflow在线(评测过程中不执行对象,仅用于展示对象) */ + CozeWorkflowOnline = 13, + /** 火山智能体在线(评测过程中不执行对象,仅用于展示对象) */ + VolcengineAgentOnline = 14, + /** 自定义RPC服务在线(评测过程中不执行对象,仅用于展示对象) */ + CustomRPCServerOnline = 15, + /** 火山智能体Agentkit在线(评测过程中不执行对象,仅用于展示对象) */ + VolcengineAgentAgentkitOnline = 16, } /** Agent协议类型 */ export enum VolcengineAgentProtocol { @@ -160,6 +174,7 @@ export interface VolcengineAgent { volcengine_agent_endpoints?: VolcengineAgentEndpoint[], /** 注册协议 */ protocol?: VolcengineAgentProtocol, + runtime_id?: string, base_info?: common.BaseInfo, } export interface VolcengineAgentEndpoint { diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/evaluator.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/evaluator.ts index 5dff5bbcb6..cbd9b6f69f 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/evaluator.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/evaluator.ts @@ -8,6 +8,7 @@ export enum EvaluatorType { Prompt = 1, Code = 2, CustomRPC = 3, + Agent = 4, } export enum LanguageType { Python = "Python", @@ -33,6 +34,7 @@ export enum EvaluatorRunStatus { Unknown = 0, Success = 1, Fail = 2, + AsyncInvoking = 3, } export enum EvaluatorTagType { Evaluator = "Evaluator", @@ -91,6 +93,29 @@ export interface PromptEvaluator { prompt_template_name?: string, tools?: Tool[], } +/** AgentEvaluator: an agent implementation, based on a model, equipped with some skills, running some prompt */ +export interface AgentEvaluator { + /** agent config */ + agent_config?: common.AgentConfig, + /** model config for agent */ + model_config?: common.ModelConfig, + /** skill configs for agent */ + skill_configs?: common.SkillConfig[], + /** agent prompt config for agent */ + prompt_config?: AgentEvaluatorPromptConfig, +} +export interface AgentEvaluatorPromptConfig { + message_list?: common.Message[], + output_rules?: AgentEvaluatorPromptConfigOutputRules, +} +export interface AgentEvaluatorPromptConfigOutputRules { + /** 分值 */ + score_prompt?: common.Message, + /** 原因 */ + reasoning_prompt?: common.Message, + /** 附加输出 */ + extra_output_prompt?: common.Message, +} export interface CodeEvaluator { language_type?: LanguageType, code_content?: string, @@ -135,12 +160,15 @@ export interface EvaluatorContent { prompt_evaluator?: PromptEvaluator, code_evaluator?: CodeEvaluator, custom_rpc_evaluator?: CustomRPCEvaluator, + agent_evaluator?: AgentEvaluator, } /** 明确有顺序的 evaluator 与版本映射元素 */ export interface EvaluatorIDVersionItem { evaluator_id?: string, version?: string, run_config?: EvaluatorRunConfig, + evaluator_version_id?: string, + score_weight?: number, } export interface EvaluatorInfo { benchmark?: string, @@ -266,6 +294,7 @@ export interface EvaluatorOutputData { evaluator_run_error?: EvaluatorRunError, time_consuming_ms?: string, stdout?: string, + extra_output?: EvaluatorExtraOutputContent, } export interface EvaluatorResult { score?: number, @@ -280,6 +309,15 @@ export interface EvaluatorRunError { code?: number, message?: string, } +export enum EvaluatorExtraOutputType { + HTML = "html", + Markdown = "markdown", +} +export interface EvaluatorExtraOutputContent { + output_type?: EvaluatorExtraOutputType, + uri?: string, + url?: string, +} export interface EvaluatorInputData { history_messages?: common.Message[], input_fields?: { @@ -306,4 +344,13 @@ export enum EvaluatorHTTPMethod { export interface EvaluatorRunConfig { env?: string, evaluator_runtime_param?: common.RuntimeParam, +} +export interface EvaluatorProgressMessage { + /** 如 system, assistant */ + role?: string, + /** 如 tool_use, tool_result */ + type?: string, + /** 如 Check current user identity and working directory */ + message?: string, + created_at_ms?: number, } \ No newline at end of file diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/expt.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/expt.ts index e0c5dab5ac..00af792f3a 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/expt.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/domain/expt.ts @@ -1,5 +1,9 @@ // Copyright (c) 2025 coze-dev Authors // SPDX-License-Identifier: Apache-2.0 +import * as task from './../../observability/domain/task'; +export { task }; +import * as filter from './../../observability/domain/filter'; +export { filter }; import * as dataset from './../../data/domain/dataset'; export { dataset }; import * as tag from './../../data/domain/tag'; @@ -38,6 +42,12 @@ export enum ExptType { export enum SourceType { Evaluation = 1, AutoTask = 2, + Workflow = 3, +} +export enum ExptTriggerType { + Manual = "manual", + OpenAPI = "openapi", + Schedule = "schedule", } export interface Experiment { id?: string, @@ -66,8 +76,107 @@ export interface Experiment { max_alive_time?: number, source_type?: SourceType, source_id?: string, + item_retry_num?: number, /** 补充的评估器id+version关联评估器方式,和evaluator_version_ids共同使用,兼容老逻辑 */ evaluator_id_version_list?: evaluator.EvaluatorIDVersionItem[], + expt_template_meta?: ExptTemplateMeta, + /** 评估器得分加权配置 */ + score_weight_config?: ExptScoreWeight, + enable_weighted_score?: boolean, + /** 触发方式 */ + trigger_type?: ExptTriggerType, + expt_source?: ExptSource, +} +/** 实验模板基础信息 */ +export interface ExptTemplateMeta { + id?: string, + workspace_id?: string, + name?: string, + desc?: string, + /** 模板对应的实验类型,当前主要为 Offline */ + expt_type?: ExptType, +} +/** 实验三元组配置 */ +export interface ExptTuple { + eval_set_id?: string, + eval_set_version_id?: string, + target_id?: string, + target_version_id?: string, + evaluator_id_version_items?: evaluator.EvaluatorIDVersionItem[], + eval_set?: eval_set.EvaluationSet, + eval_target?: eval_target.EvalTarget, + evaluators?: evaluator.Evaluator[], +} +/** 实验字段映射和运行时参数配置 */ +export interface ExptFieldMapping { + target_field_mapping?: TargetFieldMapping, + evaluator_field_mapping?: EvaluatorFieldMapping[], + target_runtime_param?: common.RuntimeParam, + item_concur_num?: number, + item_retry_num?: number, +} +/** 实验评估器得分加权配置 */ +export interface ExptScoreWeight { + enable_weighted_score?: boolean, + evaluator_score_weights?: { + [key: string | number]: number + }, +} +export interface ExptTemplate { + meta?: ExptTemplateMeta, + triple_config?: ExptTuple, + field_mapping_config?: ExptFieldMapping, + score_weight_config?: ExptScoreWeight, + expt_info?: ExptInfo, + expt_source?: ExptSource, + base_info?: common.BaseInfo, +} +export interface TaskTimeRange { + /** 生效开始时间(时间戳,毫秒) */ + start_time?: string, + /** 生效结束时间(时间戳,毫秒) */ + end_time?: string, +} +export interface ExptSource { + source_type?: SourceType, + source_id?: string, + /** 不同source里的源数据结构 */ + span_filter_fields?: filter.SpanFilterFields, + scheduler?: Scheduler, + /** 采样配置,与 pipeline 节点 task.rule.sampler(见 pipeline.json)及 task.Sampler 对齐 */ + sampler?: task.Sampler, + time_range?: TaskTimeRange, +} +export enum Frequency { + FrequencyEveryday = "every_day", + FrequencyMonday = "monday", + FrequencyTuesday = "tuesday", + FrequencyWednesday = "wednesday", + FrequencyThursday = "thursday", + FrequencyFriday = "friday", + FrequencySaturday = "saturday", + FrequencySunday = "sunday", +} +export interface Scheduler { + /** 定时触发器开关,默认关闭 */ + enabled?: boolean, + /** 触发频次 */ + frequency?: Frequency, + /** 触发时间(时间戳,秒。只使用时间,不使用日期) */ + trigger_at?: string, + /** 生效开始时间(时间戳,秒) */ + start_time?: string, + /** 生效结束时间(时间戳,秒) */ + end_time?: string, +} +export interface ExptInfo { + created_expt_count?: number, + latest_expt_id?: string, + latest_expt_status?: ExptStatus, + /** 最新实验开始时间(时间戳,毫秒) */ + latest_expt_start_time?: string, + /** 是否开启定时触发 */ + cron_activate?: boolean, } export interface TokenUsage { input_tokens?: string, @@ -169,6 +278,9 @@ export interface ColumnEvalTarget { name?: string, description?: string, label?: string, + content_type?: common.ContentType, + text_schema?: string, + schema_key?: dataset.SchemaKey, } export interface ColumnEvalSetField { key?: string, @@ -219,7 +331,9 @@ export interface TurnTargetOutput { export interface TurnEvaluatorOutput { evaluator_records: { [key: string | number]: evaluator.EvaluatorRecord - } + }, + /** 加权汇总得分 */ + weighted_score?: number, } export interface TurnAnnotateResult { /** tag_key_id -> annotate_record */ @@ -267,6 +381,11 @@ export interface ExperimentFilter { filters?: Filters, keyword_search?: KeywordSearch, } +/** 实验模板筛选器,字段设计复用实验的 Filters / KeywordSearch 能力 */ +export interface ExperimentTemplateFilter { + filters?: Filters, + keyword_search?: KeywordSearch, +} export interface Filters { filter_conditions?: FilterCondition[], logic_op?: FilterLogicOp, @@ -325,6 +444,11 @@ export enum FieldType { OutputTokens = 62, /** 目前使用固定key:total_tokens */ TotalTokens = 63, + ExperimentTemplateID = 70, + EvaluatorWeightedScore = 71, + UpdatedBy = 72, + CronActivate = 73, + TriggerType = 74, } /** 字段过滤器 */ export interface FilterCondition { @@ -386,6 +510,7 @@ export interface ExptAggregateResult { eval_target_aggr_result?: EvalTargetAggregateResult, /** timestamp in seconds */ update_time?: number, + weighted_results?: AggregatorResult[], } export interface EvalTargetAggregateResult { target_id?: string, @@ -494,9 +619,11 @@ export interface ExptResultExportRecord { base_info?: common.BaseInfo, start_time?: string, end_time?: string, + /** deprecated, cause not match snake name */ URL?: string, expired?: boolean, error?: RunError, + url?: string, } /** 分析任务状态 */ export enum InsightAnalysisStatus { diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/extra.ts b/frontend/packages/loop-base/api-schema/src/api/idl/extra.ts new file mode 100644 index 0000000000..3cba1a5ccd --- /dev/null +++ b/frontend/packages/loop-base/api-schema/src/api/idl/extra.ts @@ -0,0 +1,6 @@ +// Copyright (c) 2025 coze-dev Authors +// SPDX-License-Identifier: Apache-2.0 +export interface Extra { + src?: string, + "user-agent"?: string, +} \ No newline at end of file diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/foundation/coze.loop.foundation.openapi.ts b/frontend/packages/loop-base/api-schema/src/api/idl/foundation/coze.loop.foundation.openapi.ts index 3e8add12b3..5cce8e678d 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/foundation/coze.loop.foundation.openapi.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/foundation/coze.loop.foundation.openapi.ts @@ -1,5 +1,7 @@ // Copyright (c) 2025 coze-dev Authors // SPDX-License-Identifier: Apache-2.0 +import * as extra from './../extra'; +export { extra }; import * as base from './../../../base'; export { base }; export interface UploadLoopFileRequest { @@ -7,6 +9,7 @@ export interface UploadLoopFileRequest { "Content-Type": string, /** binary data */ body: Blob, + extra?: extra.Extra, } export interface UploadLoopFileResponse { code?: number, diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/index.ts b/frontend/packages/loop-base/api-schema/src/api/idl/index.ts index 07b04cbe20..a1dacb00c2 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/index.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/index.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 export * as promptDebug from './prompt/coze.loop.prompt.debug'; export * as promptManage from './prompt/coze.loop.prompt.manage'; +export * as toolManage from './prompt/coze.loop.prompt.tool_manage'; export * as observabilityTrace from './observability/coze.loop.observability.trace'; export * as observabilityTask from './observability/coze.loop.observability.task'; export * as observabilityMetric from './observability/coze.loop.observability.metric'; diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/llm/coze.loop.llm.manage.ts b/frontend/packages/loop-base/api-schema/src/api/idl/llm/coze.loop.llm.manage.ts index f30a79f0b7..91ad669790 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/llm/coze.loop.llm.manage.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/llm/coze.loop.llm.manage.ts @@ -7,11 +7,22 @@ export { manage }; import * as base from './../../../base'; export { base }; import { createAPI } from './../../config'; +export interface Filter { + name_like?: string, + families?: manage.Family[], + statuses?: manage.ModelStatus[], + abilities?: manage.AbilityEnum[], +} export interface ListModelsRequest { workspace_id?: string, scenario?: common.Scenario, + filter?: Filter, + /** 是否为预置模型 */ + preset_model?: boolean, + cookie?: string, page_size?: number, page_token?: string, + page?: number, } export interface ListModelsResponse { models?: manage.Model[], @@ -22,6 +33,10 @@ export interface ListModelsResponse { export interface GetModelRequest { workspace_id?: string, model_id?: string, + identification?: string, + protocol?: manage.Protocol, + /** 是否为预置模型 */ + preset_model?: boolean, } export interface GetModelResponse { model?: manage.Model @@ -32,7 +47,8 @@ export const ListModels = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/prompts/batch_get_prompt_basic", + "method": "POST", + "name": "BatchGetPromptBasic", + "reqType": "BatchGetPromptBasicRequest", + "reqMapping": { + "body": ["workspace_id", "prompt_ids"] + }, + "resType": "BatchGetPromptBasicResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.manage", + "service": "promptManage" +}); /** 改 */ export const UpdatePrompt = /*#__PURE__*/createAPI({ "url": "/api/prompt/v1/prompts/:prompt_id", @@ -96,7 +108,7 @@ export const UpdatePrompt = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools", + "method": "POST", + "name": "CreateTool", + "reqType": "CreateToolRequest", + "reqMapping": { + "body": ["workspace_id", "tool_name", "tool_description", "draft_detail"] + }, + "resType": "CreateToolResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export const GetToolDetail = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools/:tool_id", + "method": "GET", + "name": "GetToolDetail", + "reqType": "GetToolDetailRequest", + "reqMapping": { + "path": ["tool_id"], + "query": ["workspace_id", "with_commit", "commit_version", "with_draft"] + }, + "resType": "GetToolDetailResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export const ListTool = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools/list", + "method": "POST", + "name": "ListTool", + "reqType": "ListToolRequest", + "reqMapping": { + "body": ["workspace_id", "key_word", "created_bys", "committed_only", "page_num", "page_size", "order_by", "asc"] + }, + "resType": "ListToolResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export const SaveToolDetail = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools/:tool_id/drafts/save", + "method": "POST", + "name": "SaveToolDetail", + "reqType": "SaveToolDetailRequest", + "reqMapping": { + "path": ["tool_id"], + "query": ["workspace_id"], + "body": ["tool_detail", "base_version"] + }, + "resType": "SaveToolDetailResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export const CommitToolDraft = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools/:tool_id/drafts/commit", + "method": "POST", + "name": "CommitToolDraft", + "reqType": "CommitToolDraftRequest", + "reqMapping": { + "path": ["tool_id"], + "query": ["workspace_id"], + "body": ["commit_version", "commit_description", "base_version"] + }, + "resType": "CommitToolDraftResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export const ListToolCommit = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools/:tool_id/commits/list", + "method": "POST", + "name": "ListToolCommit", + "reqType": "ListToolCommitRequest", + "reqMapping": { + "path": ["tool_id"], + "query": ["workspace_id", "with_commit_detail"], + "body": ["page_size", "page_token", "asc"] + }, + "resType": "ListToolCommitResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export const BatchGetTools = /*#__PURE__*/createAPI({ + "url": "/api/prompt/v1/tools/mget", + "method": "POST", + "name": "BatchGetTools", + "reqType": "BatchGetToolsRequest", + "reqMapping": { + "body": ["workspace_id", "queries"] + }, + "resType": "BatchGetToolsResponse", + "schemaRoot": "api://schemas/prompt_coze.loop.prompt.tool_manage", + "service": "toolManage" +}); +export interface CreateToolRequest { + workspace_id?: string, + tool_name?: string, + tool_description?: string, + draft_detail?: tool.ToolDetail, +} +export interface CreateToolResponse { + tool_id?: string +} +export interface GetToolDetailRequest { + tool_id?: string, + workspace_id?: string, + with_commit?: boolean, + commit_version?: string, + with_draft?: boolean, +} +export interface GetToolDetailResponse { + tool?: tool.Tool +} +export interface ListToolRequest { + workspace_id?: string, + key_word?: string, + created_bys?: string[], + committed_only?: boolean, + page_num?: number, + page_size?: number, + order_by?: ListToolOrderBy, + asc?: boolean, +} +export interface ListToolResponse { + tools?: tool.Tool[], + users?: user.UserInfoDetail[], + total?: number, +} +export enum ListToolOrderBy { + CommittedAt = "committed_at", + CreatedAt = "created_at", +} +export interface SaveToolDetailRequest { + tool_id?: string, + workspace_id?: string, + tool_detail?: tool.ToolDetail, + base_version?: string, +} +export interface SaveToolDetailResponse {} +export interface CommitToolDraftRequest { + tool_id?: string, + workspace_id?: string, + commit_version?: string, + commit_description?: string, + base_version?: string, +} +export interface CommitToolDraftResponse {} +export interface ListToolCommitRequest { + tool_id?: string, + workspace_id?: string, + with_commit_detail?: boolean, + page_size?: number, + page_token?: string, + asc?: boolean, +} +export interface ListToolCommitResponse { + tool_commit_infos?: tool.CommitInfo[], + tool_commit_detail_mapping?: { + [key: string | number]: tool.ToolDetail + }, + users?: user.UserInfoDetail[], + has_more?: boolean, + next_page_token?: string, +} +export interface ToolQuery { + tool_id?: string, + version?: string, +} +export interface ToolResult { + query?: ToolQuery, + tool?: tool.Tool, +} +export interface BatchGetToolsRequest { + workspace_id?: string, + queries?: ToolQuery[], +} +export interface BatchGetToolsResponse { + items?: ToolResult[] +} \ No newline at end of file diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/prompt.ts b/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/prompt.ts index fde9175c64..371527d03f 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/prompt.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/prompt.ts @@ -18,11 +18,18 @@ export interface PromptBasic { updated_at?: string, latest_committed_at?: string, prompt_type?: PromptType, + security_level?: SecurityLevel, } export enum PromptType { Normal = "normal", Snippet = "snippet", } +export enum SecurityLevel { + L1 = "L1", + L2 = "L2", + L3 = "L3", + L4 = "L4", +} export interface PromptCommit { detail?: PromptDetail, commit_info?: CommitInfo, @@ -50,10 +57,22 @@ export interface PromptDetail { tools?: Tool[], tool_call_config?: ToolCallConfig, model_config?: ModelConfig, + mcp_config?: McpConfig, ext_infos?: { [key: string | number]: string }, } +export interface McpConfig { + is_mcp_call_auto_retry?: boolean, + mcp_servers?: McpServerCombine[], +} +export interface McpServerCombine { + mcp_server_id?: string, + access_point_id?: string, + disabled_tools?: string[], + enabled_tools?: string[], + is_enabled_tools?: boolean, +} export interface PromptTemplate { template_type?: TemplateType, messages?: Message[], @@ -106,8 +125,27 @@ export interface ModelConfig { frequency_penalty?: number, json_mode?: boolean, extra?: string, + thinking?: ThinkingConfig, param_config_values?: ParamConfigValue[], } +export interface ThinkingConfig { + /** thinking内容的最大输出token */ + budget_tokens?: string, + thinking_option?: ThinkingOption, + /** 思考长度 */ + reasoning_effort?: ReasoningEffort, +} +export enum ReasoningEffort { + Minimal = "minimal", + Low = "low", + Medium = "medium", + High = "high", +} +export enum ThinkingOption { + Disabled = "disabled", + Enabled = "enabled", + Auto = "auto", +} export interface ParamConfigValue { /** 传给下游模型的key,与ParamSchema.name对齐 */ name?: string, @@ -129,6 +167,10 @@ export interface Message { parts?: ContentPart[], tool_call_id?: string, tool_calls?: ToolCall[], + /** 是否跳过渲染 */ + skip_render?: boolean, + /** gemini3 thought_signature */ + signature?: string, metadata?: { [key: string | number]: string }, @@ -146,6 +188,8 @@ export interface ContentPart { image_url?: ImageURL, video_url?: VideoURL, media_config?: MediaConfig, + /** gemini3 thought_signature */ + signature?: string, } export enum ContentType { Text = "text", @@ -169,6 +213,8 @@ export interface ToolCall { id?: string, type?: ToolType, function_call?: FunctionCall, + /** gemini3 thought_signature */ + signature?: string, } export interface FunctionCall { name?: string, @@ -231,6 +277,8 @@ export interface DebugMessage { parts?: ContentPart[], tool_call_id?: string, tool_calls?: DebugToolCall[], + /** gemini3 thought_signature */ + signature?: string, debug_id?: string, input_tokens?: string, output_tokens?: string, diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/tool.ts b/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/tool.ts new file mode 100644 index 0000000000..13f72009fa --- /dev/null +++ b/frontend/packages/loop-base/api-schema/src/api/idl/prompt/domain/tool.ts @@ -0,0 +1,38 @@ +// Copyright (c) 2025 coze-dev Authors +// SPDX-License-Identifier: Apache-2.0 +export const PublicDraftVersion = "$PublicDraft"; +export interface Tool { + id?: string, + workspace_id?: string, + tool_basic?: ToolBasic, + tool_commit?: ToolCommit, + ext_infos?: { + [key: string | number]: string + }, +} +export interface ToolBasic { + name?: string, + description?: string, + latest_committed_version?: string, + created_by?: string, + updated_by?: string, + created_at?: string, + updated_at?: string, +} +export interface ToolCommit { + detail?: ToolDetail, + commit_info?: CommitInfo, +} +export interface CommitInfo { + version?: string, + base_version?: string, + description?: string, + committed_by?: string, + committed_at?: string, +} +export interface ToolDetail { + content?: string, + ext_infos?: { + [key: string | number]: string + }, +} \ No newline at end of file From 48701c738948b1989c2112d51ecb97900ed892af Mon Sep 17 00:00:00 2001 From: qihai Date: Wed, 15 Apr 2026 19:53:25 +0800 Subject: [PATCH 3/5] feat(api-schema): update --- .../api-schema/scripts/download-thrift.sh | 12 ++-- .../coze.loop.evaluation.eval_set.ts | 38 ++++++------ .../coze.loop.evaluation.eval_target.ts | 24 ++++++++ .../evaluation/coze.loop.evaluation.expt.ts | 27 ++++++-- .../src/api/idl/evaluation/domain/common.ts | 20 +++--- .../src/api/idl/evaluation/domain/eval_set.ts | 20 +++--- .../api/idl/evaluation/domain/eval_target.ts | 29 +++++++++ .../api/idl/evaluation/domain/evaluator.ts | 10 ++- .../src/api/idl/evaluation/domain/expt.ts | 48 +++++++++------ .../coze.loop.observability.trace.ts | 61 ++++++++++++++++--- .../idl/observability/domain/annotation.ts | 7 +++ .../observability/domain/export_dataset.ts | 10 +-- .../api/idl/observability/domain/filter.ts | 3 + .../src/api/idl/observability/domain/span.ts | 7 +++ .../src/api/idl/observability/domain/task.ts | 30 ++++++++- 15 files changed, 264 insertions(+), 82 deletions(-) diff --git a/frontend/packages/loop-base/api-schema/scripts/download-thrift.sh b/frontend/packages/loop-base/api-schema/scripts/download-thrift.sh index 46c78c7833..36b14fca8e 100755 --- a/frontend/packages/loop-base/api-schema/scripts/download-thrift.sh +++ b/frontend/packages/loop-base/api-schema/scripts/download-thrift.sh @@ -23,16 +23,16 @@ is_coze_loop_repo() { return 1 } -# Copy idl/thrift from local coze-loop repository -copy_from_local() { - echo "Detected coze-loop repository, copying from local idl/thrift..." +# Symlink idl/thrift from local coze-loop repository +link_from_local() { + echo "Detected coze-loop repository, creating symlink to local idl/thrift..." local REPO_ROOT="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" local LOCAL_IDL_DIR="$REPO_ROOT/idl/thrift" if [ -d "$LOCAL_IDL_DIR" ]; then mkdir -p "$OUTPUT_DIR" - cp -r "$LOCAL_IDL_DIR" "$OUTPUT_DIR/" - echo "Done: $OUTPUT_DIR/thrift (copied from local repository)" + ln -sf "$LOCAL_IDL_DIR" "$OUTPUT_DIR/thrift" + echo "Done: $OUTPUT_DIR/thrift -> $LOCAL_IDL_DIR (symlinked from local repository)" else echo "Error: Local idl/thrift directory not found at $LOCAL_IDL_DIR" exit 1 @@ -130,7 +130,7 @@ fi # Check if we are in the coze-loop repository and execute accordingly if is_coze_loop_repo; then - copy_from_local + link_from_local else download_from_remote fi diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_set.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_set.ts index dbd6132bc3..629619c731 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_set.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_set.ts @@ -1,11 +1,11 @@ // Copyright (c) 2025 coze-dev Authors // SPDX-License-Identifier: Apache-2.0 -import * as filter from './../data/domain/filter'; -export { filter }; -import * as dataset_job from './../data/domain/dataset_job'; -export { dataset_job }; -import * as dataset from './../data/domain/dataset'; -export { dataset }; +import * as data_filter from './../data/domain/filter'; +export { data_filter }; +import * as data_dataset_job from './../data/domain/dataset_job'; +export { data_dataset_job }; +import * as data_dataset from './../data/domain/dataset'; +export { data_dataset }; import * as common from './domain/common'; export { common }; import * as eval_set from './domain/eval_set'; @@ -32,10 +32,10 @@ export interface CreateEvaluationSetWithImportRequest { evaluation_set_schema?: eval_set.EvaluationSetSchema, /** 业务分类 */ biz_category?: eval_set.BizCategory, - source_type?: dataset_job.SourceType, - source: dataset_job.DatasetIOEndpoint, - fieldMappings?: dataset_job.FieldMapping[], - option?: dataset_job.DatasetIOJobOption, + source_type?: data_dataset_job.SourceType, + source: data_dataset_job.DatasetIOEndpoint, + fieldMappings?: data_dataset_job.FieldMapping[], + option?: data_dataset_job.DatasetIOJobOption, session?: common.Session, } export interface CreateEvaluationSetWithImportResponse { @@ -45,7 +45,7 @@ export interface CreateEvaluationSetWithImportResponse { export interface ParseImportSourceFileRequest { workspace_id: string, /** 如果 path 为文件夹,此处只默认解析当前路径级别下所有指定类型的文件,不嵌套解析 */ - file?: dataset_job.DatasetIOFile, + file?: data_dataset_job.DatasetIOFile, } export interface ParseImportSourceFileResponse { /** 文件大小,单位为 byte */ @@ -176,15 +176,15 @@ export interface BatchCreateEvaluationSetItemsRequest { skip_invalid_items?: boolean, /** 批量写入 items 如果超出数据集容量限制,默认不会写入任何数据;设置 partialAdd=true 会写入不超出容量限制的前 N 条 */ allow_partial_add?: boolean, - field_write_options?: dataset.FieldWriteOption[], + field_write_options?: data_dataset.FieldWriteOption[], } export interface BatchCreateEvaluationSetItemsResponse { /** key: item 在 items 中的索引 */ added_items?: { [key: string | number]: string }, - errors?: dataset.ItemErrorGroup[], - item_outputs?: dataset.CreateDatasetItemOutput[], + errors?: data_dataset.ItemErrorGroup[], + item_outputs?: data_dataset.CreateDatasetItemOutput[], } export interface UpdateEvaluationSetItemRequest { workspace_id: string, @@ -192,7 +192,7 @@ export interface UpdateEvaluationSetItemRequest { item_id: string, /** 每轮对话 */ turns?: eval_set.Turn[], - field_write_options?: dataset.FieldWriteOption[], + field_write_options?: data_dataset.FieldWriteOption[], } export interface UpdateEvaluationSetItemResponse {} export interface DeleteEvaluationSetItemRequest { @@ -219,7 +219,7 @@ export interface ListEvaluationSetItemsRequest { order_bys?: common.OrderBy[], item_id_not_in?: string[], /** item 过滤条件 */ - filter?: filter.Filter, + filter?: data_filter.Filter, } export interface ListEvaluationSetItemsResponse { items?: eval_set.EvaluationSetItem[], @@ -265,7 +265,7 @@ export interface GetEvaluationSetItemFieldResponse { field_data?: eval_set.FieldData } export interface UploadAttachmentDetail { - content_type?: dataset.ContentType, + content_type?: data_dataset.ContentType, /** 图片处理服务 id */ imagex_service_id?: string, /** @@ -287,7 +287,7 @@ export interface UploadAttachmentDetail { * 错误信息 * notice: 只返回图片相关的错误类型 */ - error_type?: dataset.ItemErrorType, + error_type?: data_dataset.ItemErrorType, err_msg?: string, } export interface ValidateEvaluationSetMultiPartDataRequest { @@ -295,7 +295,7 @@ export interface ValidateEvaluationSetMultiPartDataRequest { /** 可以是包含特定格式的多模态数据或单一的 url 链接 */ preview_data?: string[], /** 目前仅模态类型在当前接口有效 */ - store_option?: dataset.MultiModalStoreOption, + store_option?: data_dataset.MultiModalStoreOption, } export interface ValidateEvaluationSetMultiPartDataResponse { /** 根据校验结果中是否包含错误,判断数据是否合法 */ diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts index bd18a1b96f..2d323a133b 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.eval_target.ts @@ -26,6 +26,8 @@ export interface CreateEvalTargetParam { region?: eval_target.Region, /** 有环境限制需要填充这个字段 */ env?: string, + /** type=8时需填写,评测对象操作说明 */ + operation_instruction?: string, } export interface CreateEvalTargetResponse { id?: string, @@ -128,6 +130,15 @@ export interface BatchGetSourceEvalTargetsRequest { export interface BatchGetSourceEvalTargetsResponse { eval_targets?: eval_target.EvalTarget[] } +export interface GetSourceEvalTargetVersionRequest { + workspace_id: string, + source_target_id?: string, + source_target_version?: string, + target_type?: eval_target.EvalTargetType, +} +export interface GetSourceEvalTargetVersionResponse { + eval_target_version?: eval_target.EvalTargetVersion +} export interface ListSourceEvalTargetVersionsRequest { workspace_id: string, source_target_id: string, @@ -298,6 +309,19 @@ export const BatchGetSourceEvalTargets = /*#__PURE__*/createAPI({ + "url": "/api/evaluation/v1/eval_targets/get_source_version", + "method": "GET", + "name": "GetSourceEvalTargetVersion", + "reqType": "GetSourceEvalTargetVersionRequest", + "reqMapping": { + "query": ["workspace_id", "source_target_id", "source_target_version", "target_type"] + }, + "resType": "GetSourceEvalTargetVersionResponse", + "schemaRoot": "api://schemas/evaluation_coze.loop.evaluation.eval_target", + "service": "evaluationEvalTarget" +}); /** 搜索自定义评测对象 */ export const SearchCustomEvalTarget = /*#__PURE__*/createAPI({ "url": "/api/evaluation/v1/eval_targets/search_custom", diff --git a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts index 79ed9a9f5a..d45a45f089 100644 --- a/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts +++ b/frontend/packages/loop-base/api-schema/src/api/idl/evaluation/coze.loop.evaluation.expt.ts @@ -10,8 +10,8 @@ import * as coze_loop_evaluation_eval_target from './coze.loop.evaluation.eval_t export { coze_loop_evaluation_eval_target }; import * as eval_set from './domain/eval_set'; export { eval_set }; -import * as dataset from './../data/domain/dataset'; -export { dataset }; +import * as data_dataset from './../data/domain/dataset'; +export { data_dataset }; import * as base from './../../../base'; export { base }; import { createAPI } from './../../config'; @@ -24,6 +24,8 @@ export interface CreateExperimentRequest { desc?: string, eval_set_id?: string, target_id?: string, + /** 实验模板可见性,默认为空,可见 */ + visibility?: expt.Visibility, target_field_mapping?: expt.TargetFieldMapping, evaluator_field_mapping?: expt.EvaluatorFieldMapping[], item_concur_num?: number, @@ -43,6 +45,10 @@ export interface CreateExperimentRequest { }, expt_template_id?: string, item_retry_num?: number, + /** 试运行行数 */ + trial_run_item_count?: number, + /** 关联的智能评测会话ID */ + thread_id?: string, trigger_type?: expt.ExptTriggerType, session?: common.Session, } @@ -58,6 +64,8 @@ export interface SubmitExperimentRequest { desc?: string, eval_set_id?: string, target_id?: string, + /** 实验模板可见性,默认为空,可见 */ + visibility?: expt.Visibility, target_field_mapping?: expt.TargetFieldMapping, evaluator_field_mapping?: expt.EvaluatorFieldMapping[], item_concur_num?: number, @@ -74,6 +82,13 @@ export interface SubmitExperimentRequest { enable_weighted_score?: boolean, expt_template_id?: string, item_retry_num?: number, + /** 试运行行数 */ + trial_run_item_count?: number, + /** + * 智能评测相关 + * 关联的智能评测会话ID + */ + thread_id?: string, trigger_type?: expt.ExptTriggerType, time_range?: expt.TaskTimeRange, ext?: { @@ -128,6 +143,8 @@ export interface RunExperimentRequest { item_ids?: string[], expt_type?: expt.ExptType, item_retry_num?: number, + /** 试运行行数 */ + trial_run_item_count?: number, ext?: { [key: string | number]: string }, @@ -228,8 +245,8 @@ export interface InvokeExperimentResponse { added_items?: { [key: string | number]: number }, - errors?: dataset.ItemErrorGroup[], - item_outputs?: dataset.CreateDatasetItemOutput[], + errors?: data_dataset.ItemErrorGroup[], + item_outputs?: data_dataset.CreateDatasetItemOutput[], } export interface FinishExperimentRequest { workspace_id?: number, @@ -518,7 +535,7 @@ export const SubmitExperiment = /*#__PURE__*/createAPI