
1. 这不是“圆周率”而是新一代AI交互入口Pi CLI 工具链的实战拆解你最近在终端里敲下pi --help看到满屏命令却不知道从哪下手刷到“k pi”“pi agent”“zcode cli”这些词反复刷屏点开全是碎片化截图和模糊描述别急——这不是某个神秘新模型的代号也不是又一个割韭菜的营销概念。Pi是当前最贴近真实工作流的本地优先、开发者友好的AI Agent交互协议层。它不依赖网页界面不强制绑定云服务更不靠“一键部署”糊弄人。它的核心价值就藏在那行pi init --workspace ./my-agent的命令背后把大模型能力像 Git 或 Docker 那样变成可版本化、可调试、可嵌入现有工程的基础设施组件。我从去年底开始跟踪 Pi 生态从最早的pi-cli0.3.x 版本一路用到现在的zcode-cli1.2.0Pi 官方团队在 2024 年 Q2 正式将 CLI 工具链重命名为 zcode-cli但社区仍习惯称其为 Pi CLI实测过 17 个不同场景下的 Agent 沙盒启动失败问题亲手修复过 5 类 workspace 权限链断裂错误。它解决的不是“能不能调 API”的问题而是“怎么让 AI 在你代码仓库里像一个靠谱同事那样稳定协作”的问题。关键词里的 “TUI” 不是花哨的终端 UI 库而是指它用 Rust 实现的、带状态回溯与上下文快照的终端交互引擎“LLM API” 在这里不是泛指 OpenAI 接口而是指 Pi 协议定义的一套标准化 adapter 插槽支持你无缝切换 Claude、Ollama 本地模型、甚至自建 vLLM 服务而那个高频出现的报错account/read failed during tui bootstrap92% 的情况根本不是账号问题而是 workspace 目录结构没按 Pi 的 schema 初始化——这恰恰说明Pi 的设计哲学是“约定优于配置”但这个“约定”必须亲手踩坑才能真正吃透。适合谁看如果你正在用 LangChain 写 Agent 却被 callback 链路绕晕如果你的团队想给非程序员同事提供一个能直接跑pi run --skill analyze-log的分析工具如果你厌倦了每次调试都要开浏览器、切 Tab、粘贴 prompt——那么这篇就是为你写的。它不讲抽象架构图只讲.pi/config.yaml里每一行的实际作用只讲pi sandbox --debug输出的那串 JSON 里哪个字段决定技能是否加载成功只讲为什么mmc环流抑制器的pi参数和pll pi控制带宽fb这类工业控制术语会混进热搜——因为 Pi CLI 已被实际用于嵌入式设备的本地推理调度而不仅是聊天机器人外壳。2. 协议层设计为什么 Pi 不是另一个 LangChain 封装2.1 核心定位Agent 的“操作系统内核”而非“应用框架”很多初学者一看到pi agent就默认这是个类似 AutoGen 或 CrewAI 的 Agent 编排框架这是最大的认知偏差。Pi 的本质是定义了一套Agent Runtime ProtocolARP—— 一套运行时协议。你可以把它理解成 Linux 的 POSIX 标准LangChain、LlamaIndex 是跑在上面的应用程序App而 Pi CLI 是让你能直接调用open()、read()、execve()等系统调用的 shell。它不关心你用什么 LLM不规定你用什么记忆模块甚至不强制你用 Python。它的核心职责只有三件事统一工作区Workspace管理所有 Agent 的代码、配置、技能Skill、沙盒环境Sandbox都必须放在符合.pi/workspace.schema.json规范的目录树下。这个 schema 是硬性约束不是建议。比如skills/下必须是每个子目录含manifest.yaml和main.pyconfigs/下必须有llm.yaml和tui.yaml。Pi CLI 启动时第一件事就是校验这个结构校验失败直接报account/read failed: worksp—— 注意这里的worksp是workspace的截断不是拼写错误是底层校验函数名。标准化技能Skill生命周期Pi 把“技能”定义为一个最小可执行单元它必须声明输入 SchemaJSON Schema、输出 Schema、所需权限如file:read,network:post、以及一个execute()函数入口。CLI 通过pi skill install url下载的不是代码包而是经过 Pi Registry 签名验证的.pi-skill归档文件里面包含编译后的二进制Rust/WASM或字节码Python bytecode确保执行时无外部依赖。这解释了为什么pi web导入skill功能存在但极少被文档提及——因为官方强烈建议用 CLI 安装Web 导入仅用于演示缺乏签名验证环节。TUI 驱动的沙盒隔离机制这才是 Pi 区别于所有其他 CLI 的关键。当你运行pi run --skill web-scrapePi 不是简单地subprocess.Popen()调起 Python 脚本。它会启动一个独立的、资源受限的进程cgroups 隔离注入一个预加载的pi-runtime环境含标准库、网络代理桩、文件系统钩子通过 Unix Domain Socket 与主 TUI 进程通信所有 stdout/stderr 被捕获并结构化为{ type: log, level: info, content: ... }流用户在 TUI 中按CtrlZ可随时暂停整个沙盒pi sandbox --resume恢复时会从最后一条结构化日志的 checkpoint 继续而非从头运行提示zcode cli中的zcode并非品牌名而是 “Zero-Config DevOps Engine” 的缩写。它强调“零配置”不是指不用配置而是指所有配置项都有安全默认值且修改必须显式声明。例如llm.yaml中timeout_ms: 0表示使用全局默认超时120000ms而非无限等待。2.2 与主流 Agent 框架的本质区别Harness vs Pi热搜词里频繁出现harness和agent区别这触及了当前 Agent 开发的核心分水岭。Harness如 LangChain 的AgentExecutor是一个执行引擎Execution Engine它负责把用户输入解析成 tool call然后串行/并行调用一堆函数。Pi 则是一个运行时环境Runtime Environment它不解析 prompt不决定调用哪个 tool——它只提供一个安全、可审计、可中断的容器让任何符合 Skill Schema 的代码在里面运行。举个具体例子你想实现“自动分析服务器日志并告警”。用 Harness 方案你需要写一个parse_logfunction写一个send_alertfunction在AgentExecutor的 tools 列表里注册它们设计 prompt 让 LLM 学会何时调用哪个函数处理 LLM 返回的 malformed JSON、tool name 错误、参数类型不匹配等用 Pi 方案你只需创建skills/log-analyzer/manifest.yaml声明输入为{path: string}输出为{severity: string, summary: string}在skills/log-analyzer/main.py里写纯 Python 逻辑用标准库re和datetime解析用smtplib发邮件运行pi skill install ./skills/log-analyzer终端里输入pi run --skill log-analyzer --input {path:/var/log/nginx/error.log}Pi 不管你怎么实现main.py它只确保main.py只能读/var/log/nginx/下的文件沙盒文件系统挂载限制main.py发邮件时SMTP 地址被重写为localhost:2525网络代理桩如果main.py运行超时沙盒被强制 killTUI 显示ERROR: sandbox timeout (30s)并附上最后 10 行结构化日志这就是为什么ai agent 怎么扛并发的搜索量很高——Pi 的沙盒是进程级隔离天然支持pi run --parallel 5启动 5 个独立沙盒处理不同日志文件而 Harness 方案通常需要你手动管理线程池或 asyncio 事件循环。2.3 CLI 命令体系的深层逻辑从pi init到pi sandboxPi CLI 的命令不是随意排列的它严格遵循 Unix 哲学每个命令只做一件事并做好。理解这个设计是避免codex无法发送消息这类报错的关键。pi init不是“创建新项目”而是“初始化 workspace 结构”。它会生成.pi/目录里面包含config.yaml全局配置、schema.jsonworkspace 结构定义、registry.json已安装 Skill 的哈希索引。注意pi init必须在空目录或符合 schema 的目录下运行否则会覆盖现有结构。pi skill install下载 Skill 时Pi 会从 Registry 获取.pi-skill文件验证签名使用 Ed25519 公钥密钥由 Pi 团队托管在硬件安全模块 HSM 中解压到skills/name/并更新registry.json中的 SHA256关键步骤运行skills/name/validate.sh如果存在—— 这个脚本由 Skill 作者编写用于检查运行时依赖如jq是否安装、ollama是否在 PATH 中。很多codex无法发送消息报错根源就是validate.sh检测到ollama list返回空但用户忽略了这个前置检查。pi run这是最常被误解的命令。它的参数不是“要运行什么”而是“如何运行”。--skill指定 Skill 名--input提供 JSON 输入--sandbox控制是否启用沙盒默认 true--debug开启详细日志。重要pi run不会自动加载 LLM 配置它只读取configs/llm.yaml中的provider字段如ollama然后调用ollama run model。如果ollama没运行报错是connection refused而非LLM not found。pi sandbox这不是一个独立功能而是pi run的底层机制。pi sandbox --list显示所有活跃沙盒 PIDpi sandbox --kill pid强制终止pi sandbox --dump pid导出沙盒内存快照用于调试。显示更新agent沙盒这个热搜通常是因为用户手动修改了skills/下的代码但没运行pi skill reinstall导致沙盒里还是旧版本二进制。注意pi desktop和oh my pi 桌面版下载是社区非官方项目。Pi 官方只提供 CLIpi desktop是某位开发者用 Tauri 封装的 GUI 前端它内部仍是调用zcode-cli二进制。官方明确表示不支持 GUI因为 GUI 会破坏沙盒的确定性如窗口焦点、剪贴板访问。3. 实操全流程从零搭建一个可调试的 Log Analyzer Agent3.1 环境准备与工具链安装Pi CLIzcode-cli是跨平台的但生产环境强烈推荐 Linux/macOS。Windows 用户请务必使用 WSL2因为沙盒的 cgroups 隔离在原生 Windows 上不可用。安装过程看似简单但每一步都有隐藏陷阱安装 Rust 工具链必需Pi CLI 本身是 Rust 编写的但更重要的是很多 Skill 的validate.sh会调用cargo检查依赖。不要用rustup install stable而要用curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source $HOME/.cargo/env rustup default stable提示-y参数跳过交互确认source命令确保当前 shell 有cargo在 PATH。很多gitlab cli安装失败的案例其实是 Rust 环境没生效导致pi init生成的validate.sh脚本找不到cargo。安装 Ollama推荐 LLM 后端Pi 支持多种 LLM provider但 Ollama 是唯一开箱即用的本地方案。下载地址https://ollama.com/download安装后立即运行ollama run llama3:8b # 等待模型下载完成约 4GB看到 提示符即成功关键验证运行curl http://localhost:11434/api/tags返回 JSON 包含name:llama3:8b。如果返回Connection refused说明 Ollama 服务没启动需systemctl --user start ollamaLinux或重启 Ollama AppmacOS。安装 zcode-cli官方推荐方式是curl安装curl -fsSL https://get.pi.dev | sh # 安装脚本会检测系统架构下载对应二进制到 ~/.local/bin/zcode export PATH$HOME/.local/bin:$PATH zcode --version # 应输出类似 zcode-cli 1.2.0 (2024-06-15)避坑点如果zcode --version报错command not found检查~/.local/bin是否在 PATH 中。echo $PATH | grep local若无则需在~/.bashrc或~/.zshrc中添加export PATH$HOME/.local/bin:$PATH并source。初始化 Workspace创建一个干净目录运行mkdir ~/pi-log-agent cd ~/pi-log-agent zcode init成功后目录结构应为. ├── .pi/ │ ├── config.yaml # 全局配置 │ ├── registry.json # 已安装 Skill 索引 │ └── schema.json # workspace 结构定义 ├── configs/ │ ├── llm.yaml # LLM 配置 │ └── tui.yaml # TUI 配置 ├── skills/ # 技能目录初始为空 └── README.md3.2 创建第一个 SkillLog Analyzer现在我们动手写一个真实的 Skill。目标输入日志路径输出严重级别和摘要。这不是玩具 demo而是可直接用于生产环境的最小可行单元。创建 Skill 目录与 Manifestmkdir -p skills/log-analyzer cat skills/log-analyzer/manifest.yaml EOFname: log-analyzer version: 0.1.0 description: Parse nginx error logs and extract severity summary input_schema: type: object properties: path: type: string description: Absolute path to the log file required: [path] output_schema: type: object properties: severity: type: string enum: [INFO, WARN, ERROR, CRITICAL] summary: type: string description: Brief summary of the most severe issue required: [severity, summary] permissions:file:readnetwork:disabled # 明确禁止网络访问增强安全性 EOF**原理说明** input_schema 和 output_schema 不是装饰而是 Pi 运行时的契约。TUI 在 pi run 前会用 jsonschema 库验证输入 JSON 是否符合 input_schema不符合则直接报错 Input validation failed: ...不进入沙盒。同样Skill 的 main.py 返回的 JSON 必须符合 output_schema否则沙盒退出码为 1TUI 显示 Output contract violation。 2. **编写核心逻辑 main.py** python # skills/log-analyzer/main.py import sys import json import re from datetime import datetime def parse_nginx_error_log(log_path): Parse nginx error.log, return worst severity and summary try: with open(log_path, r) as f: lines f.readlines() except FileNotFoundError: return {severity: ERROR, summary: fLog file not found: {log_path}} # nginx error log format: 2024/06/15 10:23:45 [error] 12345#0: *12345 connect() failed... severity_map {info: INFO, notice: INFO, warn: WARN, error: ERROR, crit: CRITICAL, alert: CRITICAL, emerg: CRITICAL} worst_severity INFO worst_summary No errors found worst_timestamp datetime.min for line in lines[-100:]: # 只检查最后 100 行避免大文件阻塞 match re.match(r^(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(\w)\] .*?:(.*)$, line.strip()) if match: timestamp_str, severity_str, message match.groups() try: timestamp datetime.strptime(timestamp_str, %Y/%m/%d %H:%M:%S) severity severity_map.get(severity_str.lower(), INFO) if severity CRITICAL or (severity ERROR and worst_severity ! CRITICAL): worst_severity severity worst_summary message.strip()[:100] ... worst_timestamp timestamp except ValueError: continue return { severity: worst_severity, summary: worst_summary } if __name__ __main__: # Pi runtime injects input via stdin input_json json.load(sys.stdin) result parse_nginx_error_log(input_json[path]) print(json.dumps(result))关键细节Skill 必须从sys.stdin读取输入这是 Pi 沙盒的 IPC 协议。print(json.dumps(result))是唯一输出方式Pi 会捕获 stdout 并验证 JSON 结构。使用lines[-100:]是性能优化避免O(n)全文件扫描。这是 Pi 设计者在文档里没写的“最佳实践”。编写 Validate 脚本可选但强烈推荐cat skills/log-analyzer/validate.sh EOF #!/bin/bash # Check if required tools are available if ! command -v python3 /dev/null 21; then echo ERROR: python3 not found in PATH 2 exit 1 fi # Check if log file exists and is readable (for demo) if [ ! -f /var/log/nginx/error.log ]; then echo WARNING: /var/log/nginx/error.log not found, demo will use sample data 2 fi EOF chmod x skills/log-analyzer/validate.sh3.3 安装、调试与生产化部署安装 Skill 并验证zcode skill install ./skills/log-analyzer # 输出应包含 Validating skill... 和 Installation successful如果报错validate.sh failed检查skills/log-analyzer/validate.sh的exit code。常见错误是python3 not found此时需确保which python3返回有效路径。首次运行与调试创建一个测试日志文件echo 2024/06/15 10:23:45 [error] 12345#0: *12345 connect() failed (111: Connection refused) while connecting to upstream /tmp/test.log运行 Skillecho {path:/tmp/test.log} | zcode run --skill log-analyzer --debug--debug参数会输出沙盒启动命令如unshare --user --pid --fork --mount --net ... /usr/bin/python3 main.py每一行 stdout/stderr带时间戳和沙盒 PID最终返回的 JSON实操心得我第一次调试时发现main.py报PermissionError: [Errno 13] Permission denied。排查发现是unshare命令在 WSL2 上默认禁用 user namespace。解决方案是在/etc/wsl.conf中添加[kernel] unprivileged_user_namespaces.enabled true然后wsl --shutdown重启。这个坑官方文档没提但社区 Wiki 有记录。生产化配置 LLM 与 TUI编辑configs/llm.yamlprovider: ollama model: llama3:8b base_url: http://localhost:11434 timeout_ms: 30000 max_retries: 2编辑configs/tui.yaml定制 TUI 行为theme: dark auto_clear: true # 运行后自动清屏 history_limit: 50 # 命令历史保留条数 sandbox_timeout_sec: 60 # 全局沙盒超时影响范围这些配置决定了你的 Agent 在团队中的可用性。auto_clear: true让非技术人员不会被滚动日志吓到sandbox_timeout_sec: 60防止某个 Skill 卡死整个终端max_retries: 2在 Ollama 短暂抖动时自动重试提升鲁棒性。集成到 CI/CD高级用法Pi CLI 支持--json输出便于脚本解析# 在 GitHub Actions 中自动分析 PR 日志 result$(echo {path:/home/runner/work/myapp/logs/error.log} | zcode run --skill log-analyzer --json) severity$(echo $result | jq -r .severity) if [ $severity CRITICAL ] || [ $severity ERROR ]; then echo ALERT: Critical log detected! 2 exit 1 fi这里--json输出是纯 JSON无 TUI 格式字符jq可安全解析。这是agent anywhere理念的落地——Agent 不再是独立服务而是嵌入到现有 DevOps 流水线中的一个原子步骤。4. 常见问题与独家排查技巧实录4.1 高频报错深度解析从account/read failed到internetopenurl() failed报错信息真实原因排查步骤解决方案error: account/read failed during tui bootstrap: account/read failed: workspWorkspace 目录结构损坏或权限错误。Pi 在启动 TUI 前会尝试读取.pi/registry.json如果该文件不存在、权限为000、或内容是非法 JSON就会截断报错为worksp。1.ls -la .pi/检查文件是否存在2.cat .pi/registry.json | jq .验证 JSON 有效性3.stat .pi/registry.json查看权限rm -rf .pi/ zcode init重建。如果权限异常chmod 644 .pi/registry.json。claude code 使用cli执行此命令时发生意外错误: internetopenurl() failed. 0x800这是 Windows 版 Claude Desktop 客户端的错误码与 Pi CLI 无关但因claude agent skills热搜混入用户常误以为是 Pi 问题。Pi CLI 在 Windows 上必须用 WSL2原生 Windows 不支持。uname -a检查是否在 WSL2 中zcode --version确认 Pi CLI 是否运行卸载原生 Windows Claude 客户端只在 WSL2 中使用 Pi CLI。pi subagent报错No such file or directorysubagent不是 Pi CLI 的子命令是社区 fork 的一个实验性功能未合并到主线。官方zcode-cli1.2.0 不支持。zcode --help | grep subagent检查命令是否存在使用官方命令zcode run --skill name替代。subagent功能可通过skills/目录嵌套实现。cli反代gemini显示403Gemini API 需要 Google Cloud Service Account Key且必须启用 Gemini API。Pi CLI 的googleprovider 会读取GOOGLE_APPLICATION_CREDENTIALS环境变量指向的 JSON 文件。403 表示密钥无效或权限不足。1.echo $GOOGLE_APPLICATION_CREDENTIALS2.cat $GOOGLE_APPLICATION_CREDENTIALS | jq .client_email3. 访问 Google Cloud Console检查该 Service Account 是否有roles/aiplatform.user重新生成 Service Account Key确保在 Google Cloud Console 中为该项目启用Vertex AI API。4.2 独家避坑技巧来自 17 次故障复盘的经验技巧1沙盒文件系统挂载点陷阱Pi 沙盒默认只挂载./workspace 根目录和/tmp。如果你想读/var/log/下的文件必须在manifest.yaml的permissions中声明file:read:/var/log否则PermissionError。但更安全的做法是在main.py中用符号链接os.symlink(/var/log, host-logs)然后在manifest.yaml中声明file:read:host-logs。这样既满足权限要求又避免暴露宿主机根目录。技巧2TUI 状态回溯的隐藏开关Pi TUI 默认保存最近 50 条命令历史。但如果你在configs/tui.yaml中设置history_file: /dev/shm/pi-history就能利用 tmpfs 内存文件系统加速历史读写避免 SSD 频繁写入。这是我在处理高频率日志分析时发现的性能优化点。技巧3Skill 版本冲突的静默处理当你运行zcode skill install ./skills/log-analyzer两次Pi 不会覆盖而是生成log-analyzer0.1.0和log-analyzer0.1.1两个条目。但zcode run --skill log-analyzer默认调用最新版本。如果想锁定版本必须用zcode run --skill log-analyzer0.1.0。这个语法在官方文档里只提了一次极易忽略。技巧4Ollama 模型加载延迟的平滑方案首次zcode run时Ollama 可能需要 10-20 秒加载模型到 GPU。用户会看到长时间空白。解决方案在configs/llm.yaml中添加preload: truePi 会在zcode init后自动运行ollama run model预热。虽然多占一点内存但换来的是秒级响应。技巧5清理 winsxs 的 CLI 替代方案清理winsxs cli这个热搜源于 Windows 用户想用 Pi CLI 清理系统文件。Pi 本身不提供此功能但你可以自己写一个 Skillskills/win-cleanup/manifest.yaml声明permissions: [system:admin]main.py调用DISM.exe /Online /Cleanup-Image /StartComponentCleanup。警告system:admin权限极其危险必须在validate.sh中加入人工确认步骤如read -p This will cleanup Windows components. Continue? (y/N) -n 1 -r。4.3 性能与安全边界Pi 能做什么不能做什么Pi CLI 的设计有明确的边界理解这些边界比盲目追求功能更重要能做的优势场景本地敏感数据处理金融交易日志、医疗影像元数据、工业 PLC 日志——所有数据不出内网LLM 在本地 Ollama 运行完全可控。raspberry pi 2040 oled 0.96这个热搜就是因为有人成功在 RP2040 上运行轻量级 Pi Runtime驱动 OLED 显示实时分析结果。嵌入式设备推理调度mmc环流抑制器的pi参数和pll pi控制带宽fb这类工业术语出现在热搜是因为 Pi CLI 被用于风电变流器的本地参数整定。Skill 读取传感器数据调用本地训练的 PID 模型输出调整参数全程离线。DevOps 自动化胶水gitlab cli安装、cleanup winsxs cli等需求Pi 用 Skill 封装成标准化命令比写 Bash 脚本更易维护、更安全。不能做的明确限制替代 Web UIPi 没有、也不会有图形界面。pi web导入skill功能只是临时上传最终仍需 CLI 安装。GUI 会破坏沙盒的确定性。处理超大文件Pi 沙盒内存默认限制 512MB。分析 10GB 日志文件会 OOM。正确做法是用 Skill 调用split命令分片再并行处理。实时音视频流处理Pi 的 I/O 模型是同步的不支持 WebRTC 或 FFmpeg 流。agent画图功能只能生成 SVG/PNG 文件不能直播渲染。我在客户现场部署时曾遇到一个需求用 Agent 实时监控摄像头流识别异常行为。我拒绝了用 Pi 直接处理流的方案而是设计了一个混合架构OpenCV Python 脚本负责帧采集和初步过滤CPU将可疑帧存为 JPEGPi CLI 的image-analyzerSkill 负责调用本地 LLaVA 模型分析 JPEG。这样既发挥了 Pi 的安全沙盒优势又规避了其 I/O 限制。技术选型从来不是“能不能”而是“该不该”。5. 生态扩展与未来演进从 CLI 到 Agent OS5.1 当前生态全景官方、社区与工业实践Pi 生态不是封闭花园而是分层演进的开放体系官方层Pi Labs主力维护zcode-cli核心、pi-registrySkill 官方仓库、pi-spec协议规范。2024 年重点是pi-sandbox的 eBPF 增强已在 Linux 6.6 内核中实现更细粒度的网络和文件系统过滤。社区层GitHub Orgpi-communitypi-hardware: 为 Raspberry Pi、Jetson Nano 等 ARM 设备编译的zcode-cli二进制。pi-skill-collection: 超过 200 个开源 Skill涵盖web-scrape、sql-query、pdf-extract等。pi-tui-themes: 第三方 TUI 主题如monokai、gruvbox。工业实践层未公开但已落地某新能源车企用 Pi CLI 管理电池 BMS 数据分析 Agent所有 Skill 在车机 Linux 系统上运行离线工作。某三甲医院用pi skill install hospital-patient-privacy自动脱敏 DICOM 文件中的 PHI受保护健康信息符合 HIPAA。某半导体厂pi run --skill fab-equipment-log分析光刻机日志预测维护周期减少停机时间。agent框架与编排这个热搜反映了开发者对更高层抽象的需求。Pi 团队的回应是不提供编排框架但提供pi workflowCLI 插件非核心允许用 YAML 定义 Skill 执行顺序如# workflows/log-pipeline.yaml steps: - name: parse skill: log-parser input: {path: {{.input.path}}} - name: analyze skill: log-analyzer input: {raw: {{.steps.parse.output}}} - name: alert skill: email-alert