Repository navigation
[犀牛鸟-F1]:YOLO-Master Studio —— FastAPI 独立任务引擎与 React 作业管理平台 - #299
Conversation
- Refactor job dispatch layer into dynamic TaskHandlerRegistry pattern - Implement JobDispatcherStateMachine with strict lifecycle and exception safety - Deliver 4 concrete task handlers: diagnose, predict, train, and export - Enforce fail-closed security: path whitelisting, shell blocking, and isolation - Add comprehensive test suite (86 passed) and ensure 100% ruff compliance
- Refactor job dispatch layer into dynamic TaskHandlerRegistry pattern - Implement JobDispatcherStateMachine with strict lifecycle and exception safety - Deliver 4 concrete task handlers: diagnose, predict, train, and export - Enforce fail-closed security: path whitelisting, shell blocking, and isolation - Add comprehensive test suite (86 passed) and ensure 100% ruff compliance - Align all module documentation to standard technical English
- Implement SystemDoctorSkill and PredictSkill exposing standard tool metadata - Enforce fail-closed security and schema translation to JobDispatcherStateMachine - Add 15 unit tests covering skills execution, validation, and security rejection - Fix singleton registry state pollution in test_handlers_framework with backup/restore fixtures - Achieve 101/101 test suite pass rate with 100% ruff compliance
- Deliver JobsManager with thread-safe lifecycle and non-blocking polling - Build Gradio Jobs Tab UI with submission forms, live log stream, and artifacts preview - Fix non-reentrant lock self-deadlock in cancel_job and isolate mock events - Complete standalone manual verification (diagnose, predict, security violation)
…i18n (P0-Complete)
- Replace literal '作业' with standard AI engineering term '任务' across UI labels and alerts - Refine device hints and artifact tab labels - Update doctests and regression assertions to lock new terminology
… and fix recent jobs sorting
- core/security.py: translate mixed Chinese/English docstrings (sanitize_env_dict, sanitize_log_text) to Google-style English - docs/reports/f1-evaluation-report: serve Instrument Sans / JetBrains Mono via Google Fonts and echarts/mermaid via jsDelivr CDN instead of vendored .ttf and .min.js files - untrack vendored binary/JS assets (git rm --cached) and add .gitignore rules to prevent re-committing them
…ables with official spec
|
整体做得不错,测试覆盖和安全边界都比较扎实。几个问题说一下: PR 太大了,27K 行 90 个文件,review 起来很吃力,建议拆成核心引擎、FastAPI 服务、前端、文档几个分别提。 另外日志轮询、API 分页、GPU 健康检查这些可以后面再补,不着急。Skills 和 Agent 集成到 Studio 平台的事也可以作为后续规划。 |
|
根据之前的 review 反馈,我正在将这个较大的 PR 拆分为多个更小、可独立审查的 PR,以降低 review 成本。 目前的拆分进度:
后续 PR 提交后,我会持续更新这里的关联链接。 PR #299 保留作为完整实现和历史讨论的参考。感谢之前的审查与建议! |
|
感谢合并 #299!也注意到您通过 #314 对原 F1 平台进行了主线集成和冲突处理。 我重新检查了当前主线:#299 的 FastAPI、前端及 F1 Runtime 已经落地,之前拆分的 Studio Core/Runtime(#310、#312、#313)也已合并。目前生产 FastAPI 仍使用 我此前已经完成了新版 FastAPI Service(原计划 PR4)的独立实现和验证。 现在想明确一下后续架构方向:是否打算以 Studio Runtime 作为最终统一的执行内核,旧 F1 实现暂时保留兼容,待验证后逐步清理? 如果已有其他集成安排,我也会相应调整后续 PR 的范围。 |
是的,目前打算以 Studio Runtime 作为最终统一的执行内核,后续逐步更新 |
1. 任务目标与完成度
超出基础要求的工程化增强
交付物与证据入口
main_engine.py、api/v1/jobs.py、f1/api/v1/jobs.py、core/schema.py、docs/api/job_schema.jsonfrontend/、web/、app.pytests/f1/、tests/api/、docs/f1_security_test_report.mddocs/f1_user_manual.mdf1/README.md、f1/RUNTIME_LIFECYCLE.md、f1/handlers/README.md、f1/handlers/USAGE.md2. 改动摘要与运行架构
本 PR 基于官方冻结 Baseline,将原先与 UI 耦合较紧的任务执行与状态管理能力收敛为独立的 F1 异步任务平台,并完成统一任务协议、生命周期治理、安全边界、FastAPI 服务化与多前端接入。
核验区间:
Tencent/YOLO-Master main @ 2026-08-21 23:59:59 UTC+8acce839c7e895d6b179de7f7093fa879e237cc7bab57103f48c19889b5aec8a8b698759fc2de0043实际运行架构
FastAPI 服务内的单例
JobsManager是生产任务状态、排队、取消、超时、本地持久化与 terminal publication 的唯一生命周期所有者。任务计算本身运行在 spawn 子进程中,因此这里的架构约束是:
而不是整个 Studio 只有一个操作系统进程。
Gradio 不再维护第二套生产 worker 或 job 状态,而是通过
StudioJobsApiClient调用统一 REST API;f1/ui/jobs_tab.py中相关 manager 路径仅保留用于兼容。3. 核心机制
3.1 生命周期与终态所有权
统一任务类型:
trainvalpredictexportdiagnose统一任务状态:
pendingrunningcompletedfailedcancelledworker 内部由
JobDispatcherStateMachine驱动:用户取消由
JobsManager统一协调:CANCELLED / USER_CANCELLED;202 cancel_requested;终态保护规则:
JobsManager仅在任务仍为非终态时接受 worker completionstatus / result / errorrunning后开始计算,不包含 pending queue 等待时间3.2 队列、Worker 与并发控制
21100429ManagedWorker使用独立 spawn 子进程执行具体任务当前调度属于静态资源槽位模型,暂不包含:
3.3 日志、产物与持久化
持久化
实时日志
Live Logs 使用 HTTP cursor 增量读取,支持:
终态保护规则:
status / result / error不会被迟到 worker completion 覆盖任务产物
3.4 安全边界
执行前安全校验
服务端在任务进入执行链前统一强制:
allow_shell = falsepath_whitelisted = truemodel、data、output分别按 server-owned trusted roots 校验job_id凭据脱敏
结构化脱敏覆盖:
进程树治理
上述机制用于取消、关闭与孤儿进程回收,属于生命周期治理,不构成每任务 OS 安全沙箱。
3.5 服务与前端交付
服务入口
FastAPI Task Engine 可独立启动:
启动后提供:
/health前端结构
frontend/:无需 Node 构建的验证控制台,挂载到/web/:React + TypeScript + Vite 控制台源码web/dist存在时,React 控制台挂载到/consoleStudioJobsApiClient使用同一 FastAPI 后端start_studio.py提供 FastAPI + Gradio 组合启动入口CI 覆盖
当前 CI 覆盖:
4. 测试与 CI 证据
4.1 Windows / Python 3.12
执行:
结果:
Windows 下 11 个 skip 均为需要系统符号链接创建权限的测试场景。
3 个 warning 包括:
.pytest_cache写入权限 warning4.2 F1 Smoke
合计:
Smoke 覆盖快速执行、dry-run、协议、安全守卫及 GPU 执行路径等基础验证场景。
4.3 其他本地检查
React / TypeScript 源码已通过 lint 与类型检查。
4.4 Ubuntu / Python 3.10
最新 source branch CI:
ab57103f48c19889b5aec8a8b698759fc2de0043success测试结果:
Linux 环境实际执行了 Windows 因权限跳过的 symlink / broken-symlink 边界测试。
Windows 本地验证与 Ubuntu CI 共同覆盖了当前实现的主要跨平台行为。
5. 机制验证与边界实验
5.1 终态所有权
覆盖三种终态:
completedfailedcancelled并分别注入迟到的成功与失败 worker completion:
验证结果:
该实验验证了
JobsManager对任务终态的统一裁决能力。5.2 实时日志
已验证:
因此,终态 metadata 与日志流保持明确边界:终态状态与结果不会被迟到 completion 覆盖,日志则继续承担任务可观测性职责。
5.3 安全负向验证
覆盖场景包括:
allow_shell=truepath_whitelisted=false..traversaljob_id上述非法输入均被拒绝,或在进入受控日志、错误与持久化表面前完成脱敏。
6. 可复现性
6.1 基准与验证版本
官方 Baseline 固定为:
Baseline 用于定义本 PR 的官方对照起点。
当前自动化验证证据对应的 source branch 提交为:
验证提交用于关联具体测试结果,不作为长期固定的“最终 HEAD”。
6.2 独立 FastAPI Engine
启动:
启动后提供:
6.3 FastAPI + Gradio 组合启动
该入口同时启动 FastAPI Task Engine 与 Gradio 客户端,Gradio 通过
StudioJobsApiClient使用统一 REST 后端。6.4 F1 / API 测试
6.5 REST 端到端验证
仓库提供:
用于在 FastAPI Engine 已启动的情况下验证 REST 调用链,包括:
/health6.6 自动化验证
CI workflow:
当前复现证据由以下内容共同构成:
7. Agent 兼容边界
本 PR 聚焦 F1 任务平台,不重构既有正式
agent/runtime。正式 Agent 继续使用自身的 dispatcher、handlers 与异步任务机制;F1 则通过 FastAPI、
JobsManager、worker 与 F1 handlers 管理 Studio Job,两套运行时保持明确边界。Agent 的
yolo.ui.launch仍可启动app.py,其中 Jobs 界面通过StudioJobsApiClient调用 F1 REST API。因此二者的集成关系是:该关系属于 UI / API 层集成,不表示 Agent dispatcher 与 F1 dispatcher / handlers 共用同一运行时。
f1/skills.py同时保留 F1-native direct-call adapter,可直接复用 F1 dispatcher / handlers,作为 F1 能力的独立调用入口。8. 已知局限
单机运行与本地持久化
当前采用单 API 服务进程与单生命周期所有者,任务状态使用本地 JSON best-effort 持久化;暂不支持多节点调度、分布式 durable queue、任务断点恢复、优先级与自动重试。
静态资源调度与 HTTP 日志轮询
CPU / GPU 并发槽位由配置确定,不根据实时负载或显存动态调整;Live Logs 当前采用 HTTP cursor polling,不提供 WebSocket / SSE。
面向受信部署环境的安全边界
当前未提供认证、RBAC、租户隔离或每任务 OS sandbox。Windows Job Object 与 Linux process-group / subreaper 用于任务进程生命周期治理,不等同于强安全隔离。
前端交付方式
仓库提供 React + TypeScript + Vite 源码,
web/dist由部署方构建后挂载到/console;零构建控制台仍可直接通过/使用。部分结果展示与环境复现仍可完善
OBB / classification 的部分指标展示尚未完全覆盖;运行依赖尚未全面锁定,ONNX export 当前仍存在 legacy exporter deprecation warning。
9. 结果
本 PR 完成了 P0 / P1 要求,并选择 FastAPI + React 前后端分离 路线完成 P2。
围绕统一异步任务平台,进一步形成了以下工程能力:
train / val / predict / export / diagnose统一任务协议JobsManager单一生命周期所有权与终态保护最终运行链路收敛为:
由此将原本分散在界面侧的任务提交、状态、日志、产物与生命周期管理,收敛为独立、统一且可验证的 F1 异步任务平台。