mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 21:51:58 +00:00
03c18c4d78
一、文案(前端约 1600 处,后端传到界面的约 880 处) - 术语统一:工作流层面用「运行」(继续运行、重新运行、试运行),节点和工具层面用「执行」,不再用「跑」; 总时长 / 执行时长 / 等待审批;服务端;助手;Agent;token;工作流;固定版本;模型接入;系统提示;批准 / 驳回;受管级别 - 口语改书面:取不到、没取回来、读不懂、连不上、多半、照样、兜底、揉成这类说法改成「无法 / 未能 / 失败 / 请」;去掉拟人写法 - 不再露出实现细节:界面上不写 checkpoint、同一拍、哈希(凭证处除外),不写改版历史(「以前…」「老数据」); 报错、校验、门禁、自动修复里裸写的配置键名和枚举值换成界面上的中文标签,由新的 backend/app/engine/labels.py 统一提供; 发布弹窗里结论句的选项不再是 off / require_citation - 同一件事只留一种说法:生成阶段文案、出具档位说明、画布锁定提示各合成一份 - 去掉界面上的工业场景示例(MES、ERP、「张工」「王工」)和真实产品名,换成通用示例 二、说错的提示(都有测试证明) - 数据库测连接失败时的专用提示以前从不出现(按报错文字全等比较,永远比不上):改为按错误类型判断,不再拼出重复的前缀 - 「设置 → 供应商」改指「设置 → 模型接入」;「在设置里建数据源」改指「数据」页 - 缺少 API Key、模型接入已停用的报错不再夹英文,写明去哪里填 - 两处原因说错(「这种引用在后续版本支持」「这一版还不支持」)改成真实原因 - 节点说明里不准确的说法改正:代码节点在 microVM 或系统沙箱中执行;报告撰写、口径卡的说明不再说过头 - 导出的证据 CSV 里两列同名,第三列改为「片段编号」 三、前后端对齐 - 前端按后端原文识别日志、报错的地方,新旧两种写法都认得(历史运行里存的是旧文字),逐条补了新旧原文的核对 - 后端交回模型的原指令放进单独的 for_model 字段,前端在解析响应时去掉,不会显示到界面上 四、检查 - 检查脚本里按原文匹配的断言改成新文案;改完会变成永远成立的反向断言逐条修正,并做了变异验证 - 新增 check-copy(静态扫描前端界面字符串和后端上界面的文案):再出现「跑」「后端」「多半」「令牌」、 界面上的 Copilot、裸写的配置键名、半角标点等就报错;确需保留的写进 scripts/copy-allow.json 并注明理由
57 lines
3.4 KiB
JavaScript
57 lines
3.4 KiB
JavaScript
// 冒烟测试:真开一个浏览器,跑一遍「打开画布 → 选模板 → 运行 → 看高亮」。
|
||
// 依赖 frontend 里的 playwright-core,并复用系统已装的 Chrome,不额外下载浏览器。
|
||
//
|
||
// 和 check-* 不同,这一个是真的发起运行(模型换成演示模型,不花钱),会在库里留下一条
|
||
// 运行记录;只打印、截图,不断言。所以它不在 check-all 里,要人看着跑。
|
||
// 默认连 5273;对别的实例跑时带上地址:AGENTLAB_WEB=http://localhost:<前端端口> node scripts/e2e-check.mjs
|
||
import { chromium } from '../frontend/node_modules/playwright-core/index.mjs'
|
||
const WEB = process.env.AGENTLAB_WEB ?? 'http://localhost:5273'
|
||
const browser = await chromium.launch({
|
||
executablePath: process.env.CHROME_PATH ?? '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
||
args: ['--no-sandbox'] })
|
||
const page = await browser.newPage({ viewport: { width: 1680, height: 1000 } })
|
||
const errs = []
|
||
page.on('pageerror', e => errs.push(e.message))
|
||
page.on('console', m => m.type() === 'error' && errs.push(m.text()))
|
||
|
||
await page.goto(`${WEB}/studio`, { waitUntil: 'networkidle' })
|
||
await page.waitForSelector('.react-flow__node', { timeout: 15000 })
|
||
|
||
// 切到「最小问答」模板,用演示模型运行,验证画布实时高亮
|
||
await page.getByRole('button', { name: /批量处理|最小问答|工作流/ }).first().click()
|
||
await page.waitForTimeout(600)
|
||
const row = page.locator('text=① 最小问答').first()
|
||
if (await row.count()) { await row.click(); await page.waitForTimeout(900) }
|
||
|
||
console.log('当前图节点数:', await page.locator('.react-flow__node').count())
|
||
|
||
// 选中 llm 节点,把模型改成演示模型,避免这次验证花真钱
|
||
await page.locator('.react-flow__node').nth(1).click()
|
||
await page.waitForTimeout(500)
|
||
// 演示模型的 label 取自后端 providers/catalog.py 的 MOCK_MODELS(seed 时写进接入的 models)。
|
||
// 2026-09 前建的库里,这个接入存的还是旧 label「Mock(不花钱,用来试编排)」,对那种库跑时这一下选不中
|
||
const modelSel = page.locator('select').filter({ hasText: /默认|演示模型|Claude/ }).first()
|
||
if (await modelSel.count()) { await modelSel.selectOption({ label: '演示模型(无需 API Key)' }).catch(()=>{}) }
|
||
await page.screenshot({ path: '/tmp/shot-inspector.png' })
|
||
|
||
// 回到运行面板,填输入并运行
|
||
await page.getByRole('button', { name: '运行', exact: true }).first().click()
|
||
await page.waitForTimeout(300)
|
||
const ta = page.locator('aside textarea').first()
|
||
await ta.fill('可视化 agent 编排解决了什么问题?')
|
||
await page.getByRole('button', { name: /^运行$/ }).last().click()
|
||
|
||
// 等到有节点进入运行态,抓一张"正在跑"的画面
|
||
await page.waitForSelector('.node-running, .node-done', { timeout: 20000 }).catch(()=>{})
|
||
await page.waitForTimeout(1200)
|
||
await page.screenshot({ path: '/tmp/shot-running.png' })
|
||
console.log('运行中高亮节点:', await page.locator('.node-running').count(), '已完成:', await page.locator('.node-done').count())
|
||
|
||
await page.waitForTimeout(6000)
|
||
await page.screenshot({ path: '/tmp/shot-done.png' })
|
||
console.log('完成后 done 节点:', await page.locator('.node-done').count())
|
||
const timeline = await page.locator('aside').last().innerText()
|
||
console.log('--- 右侧面板文本 ---'); console.log(timeline.slice(0, 700))
|
||
console.log('--- 错误 ---'); console.log(errs.slice(0,6).join('\n') || '(无)')
|
||
await browser.close()
|