Flower CLI 的 JSON 输出:用 flwr run / list / stop 命令驱动自动化集成的完整指南
Flower CLI 的 JSON 输出用 flwr run / list / stop 命令驱动自动化集成的完整指南【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower本文基于 Flower 官方文档 how-to-use-cli-json-output.rst 展开讲解 Flower 命令行工具flwr如何通过--format json选项将flwr run、flwr list、flwr stop三个核心命令的输出结构化为 JSON供脚本、CI 流水线和其他工具消费。读完本文你将掌握每个命令 JSON 输出的完整字段结构含错误情况下的输出约定、该功能在 SuperLink Control API 上的工作原理以及本地模拟场景address :local:下的适用边界并可直接在自动化场景中复制使用这些命令。适用前提JSON 输出依赖 SuperLink Control API根据原文档的说明JSON 输出目前仅对通过 SuperLink Control API 操作的命令可用。这包括两种场景远程 SuperLink如通过 SuperLink 连接配置指向的远端服务本地模拟场景中SuperLink 连接配置里标记为address :local:的托管本地 SuperLink。从源码看:local:是一个魔法地址值定义在 constant.py 中LOCAL_SUPERLINK_ADDRESS_MAGIC_VALUE :local:。当 CLI 读到该地址时init_http_client_from_connection会先调用 local_superlink.py 中的ensure_local_superlink在本地按需拉起一个 SuperLink 进程默认 HTTP API 端口为 39091可通过环境变量FLWR_LOCAL_SUPERLINK_HTTP_API_PORT调整随后所有 Control API 请求都会落到127.0.0.1上的这个本地实例——因此本地模拟与远程 SuperLink 在 CLI 这一侧走的是同一条 Control API 路径这也是二者都能输出 JSON 的原因。命令内部统一通过 utils.py 中的cli_output_handler上下文管理器处理输出格式。该管理器读取--format参数取值default或json由 constant.py 中CliOutputFormat类定义在 JSON 模式下会将stdout/stderr重定向到内存缓冲区从而保证程序运行期间的人类可读提示进度条、日志等不会污染 JSON 输出。flwr run 的 JSON 输出flwr run用于提交一个 Flower App 的运行。对本地 AppCLI 会先在本地构建 FABFlower App Bundle再经由 Control API 的StartRun请求启动运行。默认非 JSON输出大致如下$ flwr run . local --stream Starting local SuperLink on 127.0.0.1:39091... Successfully started run 1859953118041441032 ...加上--format json后返回结构化 JSON$ flwr run . local --format json { success: true, run-id: 1859953118041441032, fab-id: flwrlabs/myawesomeapp, fab-name: myawesomeapp, fab-version: 1.0.0, fab-hash: 014c8eb3, fab-filename: flwrlabs.myawesomeapp.1-0-0.014c8eb3.fab }flwr run的 JSON 输出包含以下字段success命令成功时为truerun-id已提交的 run IDfab-idFlower App 标识符fab-nameFlower App 名称fab-versionFlower App 版本fab-hashFAB 的短哈希前 8 位fab-filename构建出的 FAB 文件名。若命令失败JSON 输出将包含success: false与error-message字段。源码级实现payload 是如何拼装的在 run.py 中run命令定义--format选项Literal[default, json]默认CliOutputFormat.DEFAULT大小写不敏感主流程在cli_output_handler上下文内执行构建 FAB 并计算哈希对本地 App 调用build_fab_from_disk(app)随后用hashlib.sha256(fab_bytes).hexdigest()计算完整哈希并从 App 配置中提取fab-id与fab-version提交 StartRun 请求通过control_client.StartRun(req)向 SuperLink 发送StartRunRequest包含 FAB 的 proto 序列化、运行配置覆盖、联邦 ID 等组装 JSON payloadpayload 始终包含success、run-id、federation-id若 SuperLink 返回了note还会带上note字段。只有当运行的是本地 App而非account/app形式的远程 App时才追加fab-id、fab-name由fab-id取/后的部分、fab-version、fab-hashfab_hash[:8]即短哈希和fab-filename这五个 FAB 元数据字段——这正是文档示例中fab-hash只有 8 位的原因输出print_json_to_stdout(payload)将 JSON 直接写到sys.__stdout__绕开输出重定向确保即使 stdout 被捕获也能正常打印。从源码结构看对于远程 Appflwr run account/appJSON 输出中不会出现 FAB 相关字段此时使用空值占位的Fab脚本解析时应以fab-id等字段是否出现作为判断依据而非假定其必然存在。flwr list 的 JSON 输出flwr list从当前 SuperLink 连接查询运行列表。默认输出是一个带 Run ID、Federation、App、Status、Elapsed、Status Changed 列的终端表格。$ flwr list Listing all runs... ┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Run ID ┃ Federation ┃ App ┃ Status ┃ Elapsed ┃ Status Changed ┃ ┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩ │ 1859953118041441032 │ none/default │ flwrlabs/myawesomeapp1.0.0 │ finished:completed │ 55s │ 2024-12-16 11:13:28Z │ ├──────────────────────┼───────────────┼─────────────────────────────────┼────────────────────┼─────────┼──────────────────────┤ │ 14200740657011601420 │ none/default │ flwrlabs/myawesomeapp1.0.0 │ running │ 9s │ 2024-12-16 12:18:39Z │ └──────────────────────┴───────────────┴─────────────────────────────────┴────────────────────┴─────────┴──────────────────────┘加上--format json$ flwr list --format json { success: true, runs: [ { run-id: 1859953118041441032, federation-id: none/default, fab-id: flwrlabs/myawesomeapp, fab-name: myawesomeapp, fab-version: 1.0.0, fab-hash: 014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3, status: finished:completed, status-details: N/A, elapsed: 55.0, pending-at: 2024-12-16 11:12:33Z, starting-at: 2024-12-16 11:12:33Z, running-at: 2024-12-16 11:12:33Z, finished-at: 2024-12-16 11:13:28Z, network-traffic: { inbound-bytes: 12345, outbound-bytes: 6789, total-bytes: 19134 }, compute-time: { serverapp-seconds: 5.2, clientapp-seconds: 42.7, total-seconds: 47.9 } }, { run-id: 14200740657011601420, federation: none/default, fab-id: flwrlabs/myawesomeapp, fab-name: myawesomeapp, fab-version: 1.0.0, fab-hash: 014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3014c8eb3, status: running, status-details: N/A, elapsed: 9.0, pending-at: 2024-12-16 12:18:39Z, starting-at: 2024-12-16 12:18:39Z, running-at: 2024-12-16 12:18:39Z, finished-at: N/A, network-traffic: { inbound-bytes: 4567, outbound-bytes: 2345, total-bytes: 6912 }, compute-time: { serverapp-seconds: 0.6, clientapp-seconds: 8.1, total-seconds: 8.7 } } ] }说明上方示例忠实保留了原文档中的字段写法从 ls.py 的_to_json实现看当前代码对每条 run 统一输出federation-id键文档示例中第二条出现的federation为笔误解析脚本建议以federation-id为准。runs数组中每条记录包含run-idrun IDfederation-id联邦 IDfab-id/fab-name/fab-version/fab-hashFlower App 元数据注意此处fab-hash为完整 SHA-256 十六进制串与flwr run输出中的短哈希不同status当前运行状态如pending、starting、running、finished:completedstatus-details额外的状态详情文本无详情时为N/Aelapsed已运行时间秒pending-at/starting-at/running-at/finished-atrun 各阶段时间戳ISO 8601、UTCnetwork-traffic入站、出站与总字节数compute-timeServerApp、ClientApp 及总计算时间秒。单条运行详情视图要返回某个 run 的详情视图可指定--run-id$ flwr list --run-id 1859953118041441032 --format json返回结构相同顶层successruns数组只是runs中只有一条记录。源码级实现从 Control API 到 JSONflwr list的实现位于 ls.py核心链路为参数校验--run-id与--limit互斥同时提供会抛ValueError查询_list_runs通过stub.ListRuns(ListRunsRequest(limitlimit))拉取运行列表_display_one_run则以ListRunsRequest(run_idrun_id)查询单条格式化proto 响应经run_from_proto转为Run对象再由 run_utils.py 的format_runs按pending_at倒序整理为RunRow数据类。elapsed的计算规则是running_at到finished_at若已结束或到 SuperLink 返回的当前时间之差未进入running状态的 run 其elapsed为 0序列化_to_json将RunRow列表包装为{success: True, runs: [...]}其中total-bytes与total-seconds由代码现场相加得出而非来自 SuperLink 字段。默认表格视图中状态颜色finished:completed绿、finished:failed红、finished:stopped黄、starting/running蓝由_get_status_style决定这些展示逻辑不影响 JSON 输出但可用于理解status字段的取值形态状态:子状态。flwr stop 的 JSON 输出flwr stop按 run ID 停止一个已提交或正在运行的 run。默认输出$ flwr stop 1859953118041441032 Stopping run ID 1859953118041441032... Run 1859953118041441032 successfully stopped.加上--format json$ flwr stop 1859953118041441032 --format json { success: true, run-id: 1859953118041441032 }若命令失败JSON 输出同样包含success: false与error-message。实现见 stop.pystop命令通过stub.StopRun(StopRunRequest(run_idrun_id))向 SuperLink 发送停止请求当响应success为真时打印成功提示JSON 模式下额外输出{success: true, run-id: ...}否则抛出click.ClickException由统一错误处理转成 JSON 错误输出。错误输出约定success 与 error-message三个命令共享同一套错误输出机制这对编写健壮的自动化脚本至关重要。在 utils.py 中cli_output_handler作为上下文管理器工作进入时若为 JSON 模式调用redirect_output将sys.stdout、sys.stderr以及 Flower 日志控制台的输出流全部重定向到一个StringIO缓冲区——因此命令执行过程中的任何人类可读信息如 Starting local SuperLink on 127.0.0.1:39091...都不会混入 JSON退出时恢复输出若执行过程中发生异常且处于 JSON 模式则调用 logger.py 的print_json_error输出形如{ success: false, error-message: 被捕获的控制台信息\n异常信息 }print_json_error还会通过_remove_emojis剥除消息中的 emoji保证错误消息在程序化处理时干净可读。此外utils.py 的flwr_cli_exc_handler专门处理 Control API 层的传输与业务错误网络不可达会给出 Connection to the SuperLink is unavailable... 提示401 未授权会提示执行flwr loginSuperLink 返回的结构化 Flower 错误含错误码与消息会被格式化为对用户友好的文本。这些异常在 JSON 模式下同样最终落入error-message字段。因此自动化脚本可以只依赖一个解析约定解析 stdout 的 JSON先检查success字段为false时读取error-message。在自动化场景中的使用要点结合源码与文档可以在脚本中这样组织调用以 Python 为例的示意逻辑均基于上述实现提交flwr run app-path superlink-name --format json从返回 JSON 提取run-id用于后续轮询与停止若需本地 App 指纹可同时校验fab-hash与fab-filename轮询周期性执行flwr list --run-id run-id --format json注意--limit与--run-id不可同时使用检查runs[0].status进入finished:completed/finished:failed/finished:stopped即终态elapsed字段用于估算运行时长finished-at为N/A表示尚未结束止损超时或人工干预时执行flwr stop run-id --format json以success字段确认结果资源观测flwr list的 JSON 中network-trafficinbound/outbound/total 字节数与compute-timeServerApp、ClientApp 及总秒数可直接用于运行成本统计——从 run_utils.py 的RunRow定义看inbound 包含 SuperNode 到 SuperLink 的流量outbound 包含 SuperLink 到 SuperNode 的流量。两点适用边界提醒与原文档 note 一致JSON 输出当前仅覆盖经由 SuperLink Control API 操作的命令即远程 SuperLink 与address :local:的本地模拟场景且--format取值仅default与json两种大小写不敏感。小结--format json让flwr run、flwr list、flwr stop三个命令返回可被程序稳定解析的结构化输出成功与失败共用success字段失败时附带error-message三条命令的输出分别锚定在 run.py、ls.py、stop.py统一由 utils.py 的cli_output_handler/print_json_to_stdout/print_json_error保障stdout 只有 JSON的契约本地模拟:local:通过ensure_local_superlink自动拉起本地 SuperLink 后走相同的 Control API 路径因此与远程场景的输出结构一致原文档完整内容与字段说明见 how-to-use-cli-json-output.rstSuperLink 连接的配置文件读取逻辑可参考 flower_config.py 中的read_superlink_connection。【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MySQL JDBC Statement关闭异常深度解析与四级防御

MySQL JDBC Statement关闭异常深度解析与四级防御

1. 问题本质:这不是Bug,是MySQL在严格执行连接生命周期管理“Mysql异常 No operations allowed after statement closed” 这条报错,我在过去八年带过的二十多个Java后端项目里,平均每个季度至少要处理三次。它不是MySQL服务器抛出…

2026/9/18 11:08:47 阅读更多 →
如何读懂Miles启动脚本:4步拆解train_args组装与execute_train提交流程

如何读懂Miles启动脚本:4步拆解train_args组装与execute_train提交流程

如何读懂Miles启动脚本:4步拆解train_args组装与execute_train提交流程 【免费下载链接】miles Miles is an enterprise-facing reinforcement learning framework for LLM and VLM post-training, forked from and co-evolving with slime. 项目地址: https://gi…

2026/9/17 8:33:59 阅读更多 →
操作系统课后习题答案解析:PV操作、页面置换与银行家算法代码验证

操作系统课后习题答案解析:PV操作、页面置换与银行家算法代码验证

简介:这份《计算机操作系统教程》左万利、王英第四版课后习题答案,面向正在学习操作系统课程、准备期末考试或考研复习的高校学生,用于核对课后重点习题的解题过程与结论。整包仅含 1 个 doc 文档,约 4.21MB,内容按章节…

2026/9/17 8:33:59 阅读更多 →

最新新闻

汇川PLC Modbus RTU调试避坑指南:高低位转换与现场故障排查

汇川PLC Modbus RTU调试避坑指南:高低位转换与现场故障排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 11:09:27 阅读更多 →
【ComfyUI】HiresFix 二次采样基础文生图

【ComfyUI】HiresFix 二次采样基础文生图

今天给大家演示一个基于 ComfyUI 的双阶段生成与放大工作流,该流程通过加载不同的核心模型,结合提示词与负面提示的文本编码,先生成初始图像,再利用潜空间放大与二次采样实现高分辨率、细节更丰富的最终输出。 工作流的设计重点在于用分层模型和节点组合,让生成画面在质量…

2026/9/18 11:09:27 阅读更多 →
用推理芯片做部署,TaoToken 让 Codex 调 GPT

用推理芯片做部署,TaoToken 让 Codex 调 GPT

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 11:09:27 阅读更多 →
【ComfyUI】HiresFix + ESRGAN 基础文生图

【ComfyUI】HiresFix + ESRGAN 基础文生图

今天给大家演示一个基于 DreamShaper 模型 的 ComfyUI 工作流,它以文本生成图像为核心,同时配合双重采样与高质量超分辨率放大处理,实现了既具备艺术氛围又拥有清晰细节的画面。 该工作流的亮点在于通过两次图像生成与潜空间的解码/再编码衔接,结合 RealESRGAN 超分辨模型完…

2026/9/18 11:09:27 阅读更多 →
多点多链分布式存储跨域交叉验证的自适应技术构想

多点多链分布式存储跨域交叉验证的自适应技术构想

最近在梳理存储系统的数据完整性校验方案时,我一直在想一个问题:现有的周期全量校验,成本怎么会高到这个程度?一次跨地域的校验风暴能吃掉整整一个带宽冗余,而平时节点数据烂在磁盘里可能几个月都没人发现。这种情况在…

2026/9/18 11:09:26 阅读更多 →
华为OD面试全流程实录:从机试到定级薪资的完整复盘

华为OD面试全流程实录:从机试到定级薪资的完整复盘

前阵子我记录了一次华为OD研发岗位的面试过程,从投简历到拿offer前后差不多一个月。整个过程走下来,最大的感受是:OD的面试流程比想象中正规很多,机试、技术面、主管面、HR面一个环节不少,难度和考察深度也接近正式社招…

2026/9/18 11:08:26 阅读更多 →

日新闻

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

Matlab手写逻辑回归:从数学原理到多变量概率预测模型实现

很多朋友第一次看到"逻辑回归"这四个字,第一反应就是——这玩意儿是个回归模型吧?我当年也是在Matlab里跑完一段代码,看着输出的0.73、0.86这种概率值,才回过神来:这家伙其实是披着回归外衣的分类神器&#…

2026/9/18 0:00:28 阅读更多 →
高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

高值医用耗材研报PDF:用Python完成字段抽取、清洗与趋势预测

简介:这份报告是2023-2028年高值医用耗材行业调研及发展前景趋势预测报告,面向医疗器械企业管理者、投资机构、行业研究人员及关注政策变化的从业者,用于把握行业监管动向、市场格局与未来趋势。报告以PDF格式呈现,共1个文件、整体…

2026/9/18 0:00:28 阅读更多 →
三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

三维高斯场赋能世界模型:几何语义蒸馏与机器人决策实战

先把我自己的背景交代一下:我之前在搞具身智能和机器人导航相关的项目,很长一段时间里都被“环境表示”这件事卡着。传统做法是用点云或者网格做几何建模,语义信息另外再跑分割模型,两套东西各管各的,时间一长就会发现…

2026/9/18 0:00:28 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →