ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CLI-Anything × AnyGen:构建云异步内容生成任务的 Agent 原生 CLI 编排指南

CLI-Anything × AnyGen:构建云异步内容生成任务的 Agent 原生 CLI 编排指南 CLI-Anything × AnyGen构建云异步内容生成任务的 Agent 原生 CLI 编排指南【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything导读本文围绕 CLI-Anything 仓库中 AnyGen 模块的架构分析文档讲解如何将 AnyGen 云端异步内容生成服务PPT、DOCX、SmartDraw 图表、网页、故事书、数据分析报告封装为面向 AI Agent 的状态化命令行工具。读完本文你将掌握 AnyGen REST API 的任务全生命周期调用方式、cli-anything-anygen的安装配置与命令用法、.anygen-task.json本地持久化机制以及结合仓库源码理解其轮询、下载、文件校验和会话撤销等底层实现。一、AnyGen 与 CLI-Anything 的整体架构定位AnyGen 是一个云端异步内容生成平台通过 REST API 提供专业幻灯片PPT、文档DOCX、网站、故事书、图表SmartDraw和数据分析报告等生成能力。与仓库中大多数面向本地 GUI 的目标软件不同AnyGen 没有可调用的本地软件本体——所有渲染均在服务端完成CLI 只是负责提交任务、轮询状态并下载生成文件的编排层。在 ANYGEN.md 中给出了其服务端与 CLI 的整体协作架构云端一侧由 Slide / Doc / SmartDraw / Website / Storybook / Data Analysis 六类内容引擎承载生成能力中间由 Task Orchestration Layer异步队列、状态跟踪、文件存储统一调度最外层通过基于 OpenAPI 3.1 的 REST API/v1/openapi/tasks等端点对客户端开放CLI 一侧则是基于 Click 的命令行加 REPL 的cli-anything-anygen支持 JSON 与人类可读两种输出。┌──────────────────────────────────────────────────┐ │ AnyGen Cloud Service │ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ │ │ Slide │ │ Doc │ │ SmartDraw │ │ │ │ Engine │ │ Engine │ │ Engine │ │ │ └────┬─────┘ └────┬─────┘ └────────┬─────────┘ │ │ ┌────┘ ┌─────────┘ ┌─────────────┘ │ │ │ ┌────┴────┐ ┌─────┴─────┐ ┌───────────────┐ │ │ │ │ Website │ │ Storybook │ │ Data Analysis │ │ │ │ │ Engine │ │ Engine │ │ Engine │ │ │ │ └────┬────┘ └─────┬─────┘ └───────┬───────┘ │ │ │ │ │ │ │ │ ┌───────┴─────────────┴───────────────┴───────┐ │ │ │ Task Orchestration Layer │ │ │ │ Async queue · status tracking · file store │ │ │ └──────────────────┬──────────────────────────┘ │ │ │ │ │ ┌──────────────────┴──────────────────────────┐ │ │ │ REST API (OpenAPI 3.1) │ │ │ │ POST /v1/openapi/tasks │ │ │ │ GET /v1/openapi/tasks/:id │ │ │ │ POST /v1/openapi/files/upload │ │ │ │ POST /v1/openapi/tasks/prepare │ │ │ └──────────────────┬──────────────────────────┘ │ └─────────────────────┼────────────────────────────┘ │ HTTPS Bearer sk-… ┌────────────┴─────────────┐ │ cli-anything-anygen │ │ Click CLI REPL │ │ JSON / human output │ └──────────────────────────┘二、CLI 策略为什么需要一个结构化 HTTP 客户端由于 AnyGen 是纯云端服务cli-anything-anygen本质上是封装 AnyGen OpenAPI 的结构化 HTTP 客户端由以下几个部分组成requestsPython HTTP 库承担所有 API 调用轮询循环Polling loop任务创建后按可配置间隔默认 3 秒最长 20 分钟轮询GET /v1/openapi/tasks/:id直到状态变为completed或failed文件下载任务完成后下载生成文件PPTX、DOCX、HTML、SVG、PDF 等到本地路径文件上传通过POST /v1/openapi/files/upload上传参考资料换取file_token用于创建任务Prepare多轮对话POST /v1/openapi/tasks/prepare支持在创建任务前进行多轮需求澄清。为什么 Agent 需要 CLI 包装器文档在 ANYGEN.md 的 Why a CLI Wrapper? 一节给出了四条核心理由Agent 无法直接编排多步骤 HTTP 工作流认证 → 上传 → prepare → 创建 → 轮询 → 下载CLI 提供单条task run命令即可编排完整生命周期结构化的--json输出便于 Agent 解析任务 ID、状态与文件路径REPL 支持对任务类型与参数进行交互式探索。从源码看这一设计贯穿整个命令树全局--json开关在 anygen_cli.py 中被解析后置为模块级状态所有命令的结果统一经output()函数输出——JSON 模式下用json.dumps(data, indent2, defaultstr)输出可解析的结构人类模式下则递归打印嵌套字典/列表。三、安装与 API Key 配置cli-anything-anygen由 setup.py 定义包名为cli-anything-anygen安装后提供cli-anything-anygen控制台命令同时支持python3 -m cli_anything.anygen方式运行。依赖为click8.0.0、requests2.28.0、prompt-toolkit3.0.0要求 Python 3.10。# 源码方式安装在 anygen/agent-harness 目录内 pip install -e . # 安装运行时依赖 pip install requests click prompt_toolkitAPI Key 的三种配置来源按优先级认证信息解析实现在 anygen_backend.py 的get_api_key()中按以下优先级依次解析--api-keyCLI 选项优先级最高ANYGEN_API_KEY环境变量配置文件~/.config/anygen/config.json。# 方式一CLI 选项单次命令生效 cli-anything-anygen --api-key sk-xxx task status task_xxx # 方式二环境变量 export ANYGEN_API_KEYsk-xxx # 方式三写入配置文件推荐配置保存时会 chmod 0600 保护权限 cli-anything-anygen config set api_key sk-xxx值得注意的源码细节get_api_key()中CLI 参数优先于环境变量、环境变量优先于配置文件而最终发送请求时_make_auth_token()见 anygen_backend.py会自动为不以Bearer 开头的 key 补上前缀统一放入Authorization请求头。配置文件写盘时使用chmod(0o600)收紧权限config set/get在回显 API Key 时会做掩码处理仅显示前 10 位避免密钥泄露到终端日志。若最终仍未找到 key_require_api_key()会抛出带三种配置指引的RuntimeError。四、支持的 Operation 类型与命令映射VALID_OPERATIONS定义在 anygen_backend.py与文档一致共 7 类其中仅slide、doc、smart_draw三种在任务完成后返回可下载文件其余以任务 URL 交付。OperationAPI ValueOutput FormatDownloadable FileSlides / PPTslidePPTXYesDocuments / DOCXdocDOCXYesSmartDrawsmart_drawdrawio / excalidrawYesGeneral / Chatchat—No (task URL)Storybookstorybook—No (task URL)Data Analysisdata_analysis—No (task URL)Websitewebsite—No (task URL)Agent 动作到 CLI 命令的映射ANYGEN.md 中整理了一张Agent 想做什么 → 敲什么命令的速查表是编写 Agent 技能skill时的命令级契约Agent ActionCLI CommandCreate a slide decktask create --operation slide --prompt ... -o task.jsonCreate a documenttask create --operation doc --prompt ... -o task.jsonDraw a diagramtask create --operation smart_draw --prompt ... -o task.jsonFull workflow (create→poll→download)task run --operation slide --prompt ... --output ./Check task statustask status task-idPoll until completiontask poll task-id [--output ./]Download result filetask download task-id --output ./Download thumbnailtask thumbnail task-id --output ./Upload a reference filefile upload pathMulti-turn requirement analysistask prepare --message ... [--save conv.json]Configure API keyconfig set api_key sk-xxxView configurationconfig get [key]View task historysession historyUndo last operationsession undo命令实现上task、file、config、session四组 Click 命令组定义于 anygen_cli.py其中--operation参数使用click.Choice(VALID_OPERATIONS, case_sensitiveFalse)做输入校验--ratio限定为16:9/4:3。不指定任何子命令时自动进入 REPL。五、REST API 细节端点、请求体与状态响应Base URL:https://www.anygen.ioAuth:Bearer tokensk-…经Authorization请求头传递。端点一览MethodEndpointDescriptionPOST/v1/openapi/tasksCreate a new generation taskGET/v1/openapi/tasks/:idQuery task status and metadataPOST/v1/openapi/files/uploadUpload a reference file →file_tokenPOST/v1/openapi/tasks/prepareMulti-turn requirement analysisCreate Task 请求体{ auth_token: Bearer sk-xxx, operation: slide, prompt: Create a quarterly business review presentation, language: en-US, slide_count: 10, template: business, ratio: 16:9, export_format: pptx, file_tokens: [tk_abc123], files: [] }从 anygen_backend.py 的create_task()可看到请求体组装的几个隐藏行为operation会先校验是否在VALID_OPERATIONS内style参数并不单独入体而是以追加段落的方式拼进promptf{prompt}\n\nStyle requirement: {style}即风格要求会被当作提示词的一部分交给生成引擎language、export_format、file_tokens为通用可选参数有值才加入 bodyslide_count、template、ratio仅在operation slide时才生效从 CLI 与 API 两层都做了约束请求体中的files字段是 legacy 的 base64 内嵌方式encode_file()见 anygen_backend.py会按扩展名推断 MIME 类型pdf/png/jpg/gif/txt/doc/docx/ppt/pptx并做 base64 编码——现代用法推荐改用file_tokens引用预上传文件创建请求超时 30 秒返回{task_id, task_url}。Task 状态响应{ task_id: task_xxx, status: completed, progress: 100, output: { file_url: https://..., file_name: presentation.pptx, thumbnail_url: https://..., task_url: https://www.anygen.io/task/task_xxx, slide_count: 10, word_count: 2500 } }query_task()见 anygen_backend.py对状态查询端点发起GET并返回完整任务字典CLI 层的task status命令会从中抽取task_id/status/progress若已完成则附带file_name与task_url。六、本地任务持久化.anygen-task.json为了让 CLI 具备历史与回放history and replay能力每次创建/轮询/下载都会把任务元数据持久化到本地格式即文档所述的.anygen-task.json{ version: 1.0, task_id: task_xxx, operation: slide, prompt: Create a quarterly business review presentation, status: completed, created_at: 2026-03-09T12:00:00Z, completed_at: 2026-03-09T12:01:23Z, output: { file_url: https://..., file_name: presentation.pptx, task_url: https://www.anygen.io/task/task_xxx }, local_file: ./output/presentation.pptx, metadata: { file_size: 2048576 } }源码层面的实现位于 core/task.py记录并非散落在任务目录而是统一存入~/.cli-anything-anygen/tasks/task_id.jsonTASK_HISTORY_DIR。每个函数职责清晰create_task()写初始记录status 为pending含created_at与task_urlquery_task()/poll_task()回填最新status/progress轮询完成时补completed_atdownload_file()回填local_file与metadata.file_sizelist_task_records(limit, status_filter)按修改时间倒序列出本地缓存记录支持按状态过滤——对应task list命令。version: 1.0字段为后续格式演进预留了兼容空间。七、端到端实战从上传素材到拿回成品文件综合 README.md 与源码下面是一条完整可复制的实战链路。1. 配置 API Keycli-anything-anygen config set api_key sk-xxx2. 上传参考资料拿到 file_tokencli-anything-anygen file upload ./quarterly_data.pdf # Output: ✓ Uploaded: quarterly_data.pdf → token: tk_abc123file upload的底层实现在 anygen_backend.py以 multipart/form-data 方式POST /v1/openapi/files/upload超时 60 秒成功返回{file_token, filename, file_size}路径不存在会抛FileNotFoundError。3. 多轮需求澄清可选但强烈推荐# 第一轮提交需求AnyGen 会追问澄清问题 cli-anything-anygen task prepare --message I need a quarterly review slide deck --save conv.json # AnyGen asks clarifying questions... # 第二轮补充关键信息并回灌上下文 cli-anything-anygen task prepare --message Focus on revenue growth, 10 slides --input conv.json --save conv.json # Status: ready, suggested operation: slidetask prepare的 CLI 实现anygen_cli.py支持--file-token可重复、--input conv.json载入既有对话、--save conv.json保存会话。API 请求体包含auth_token、messages结构为[{role, content:[{type:text/file, ...}]}]与可选的file_tokens超时放宽到 120 秒以容纳多轮推理。响应中的suggested_task_params会直接建议operation等建参Agent 可据此自动续接创建任务。4. 一条命令走完全流程create → poll → downloadcli-anything-anygen task run \ --operation slide \ --prompt Quarterly business review... \ --file-token tk_abc123 \ --slide-count 10 \ --style business formal \ --output ./output/5. 或按需分步执行# 只创建拿到任务 ID cli-anything-anygen task create --operation doc --prompt Technical design document # Task ID: task_xxx # 轮询直到完成并在完成后自动下载到 ./output/ cli-anything-anygen task poll task_xxx --output ./output/ # ✓ Downloaded: ./output/presentation.pptx (2,048,576 bytes) # 单独下载结果文件 / 缩略图 cli-anything-anygen task download task_xxx --output ./output/ cli-anything-anygen task thumbnail task_xxx --output ./output/ # 查看本地任务历史 cli-anything-anygen task list --limit 20 --status completed6. Agent 消费JSON 输出模式cli-anything-anygen --json task status task_xxx cli-anything-anygen --json task list --limit 5Create Task 参数完整表ParameterShortDescriptionRequired--operation-oOperation type (slide/doc/smart_draw/chat/...)Yes--prompt-pContent descriptionYes--language-lzh-CN / en-USNo--slide-count-cNumber of PPT pages (slide only)No--template-tPPT template (slide only)No--ratio-r16:9 / 4:3 (slide only)No--export-format-fpptx/image/thumbnail/docx/drawio/excalidrawNo--file-tokenFile token from upload (repeatable)No--style-sStyle preferenceNo八、渲染管线服务端异步模型与轮询原理对 AnyGen 而言渲染发生在服务端CLI 负责编排。文档将其分为五步校验 operation 类型与 prompt携带认证头向 AnyGen API 提交任务POST以 3 秒间隔轮询GET /v1/openapi/tasks/:id最长 20 分钟完成后经 output 中的file_url下载文件保存到本地并校验文件完整性大小 0、格式正确。轮询的核心实现在 anygen_backend.py 的poll_task()模块常量POLL_INTERVAL 3、MAX_POLL_TIME 1200与文档描述完全对应每次轮询比对progress变化并通过on_progress(status, pct)回调输出进度遇到failed状态会抛出携带服务端error信息的RuntimeError超过max_time则抛TimeoutError。渲染缺口评估低Low文档评估本模块的渲染缺口为Low理由如下所有渲染均在服务端完成CLI 只是一个薄编排层无需本地滤镜翻译或格式转换风险集中在网络问题与 API 可用性上唯一的例外SmartDraw 生成的 drawio/excalidraw 若需转 PNG可能依赖本地 Chromium 渲染。九、文件下载与完整性校验不轻信任何一个字节AnyGen CLI 在拿到生成文件后并不是简单落盘了事而是叠加了一层完整性验证。下载逻辑在download_file()anygen_backend.py中先确认任务确为completed、存在file_url再流式写入目标目录遇到同名文件时自动追加_1、_2序号避免覆盖。缩略图则固定命名为thumbnail_task_id.png。校验器在 core/export.py 的verify_file()按魔数与结构判断格式PPTX/DOCX/XLSX检查 ZIP 魔数PK\x03\x04再确认 zip 内含[Content_Types].xml以判定为合法 OOXML否则标记为普通 ZIPPDF检查%PDF-头部PNG检查\x89PNG\r\n\x1a\n魔数SVG / drawio / XML读取文本并检测svg标签或 XML 声明JSON实际执行json.load验证可解析性。该函数会被 E2E 测试直接调用作为下载物确实是合法 OOXML/ZIP的证据链。十、Session 会话机制与 REPL为误操作留一条退路除了任务记录CLI 还维护一份命令会话每次task create/poll/download/run、file upload都会在 core/session.py 中被Session.record()记录为一条HistoryEntrycommand、args、result、timestamp并自动持久化到~/.cli-anything-anygen/session.json。session status # 查看历史条数、可 undo/redo 状态 session history --limit 20 # 查看最近命令 session undo # 撤销上一条操作 session redo # 重做被撤销的操作两个值得称道的源码细节撤销/重做是双向栈undo()将历史栈顶弹出并推入redo_stackredo()反之新record()会清空 redo 栈符合标准编辑器语义写盘带进程锁_locked_save_json()利用fcntl.flock独占锁实现原子化写文件在无fcntl的平台自动降级避免多进程并发写坏 session.json——详见 core/session.py。交互场景下直接运行cli-anything-anygen进入 REPL基于 prompt_toolkit可用help列出全部可用命令或在提示符中输入与命令行相同的子命令如task run ...。十一、测试覆盖计划Mock 单测 真实 E2E 双轨文档将测试策略划分为两层对应仓库中的两个测试文件1. 单元测试test_core.py—— Mock HTTP无需真实 API覆盖点包括task create/status/poll 的参数构造配置加载API key 来自 env / 文件 / CLI 选项的优先级轮询逻辑超时、重试、状态迁移JSON 输出格式基于任务历史的 session undo/redo错误处理认证失败、限流、服务端错误文件上传参数校验。2. E2E 测试test_full_e2e.py—— 真实 API需要ANYGEN_API_KEY覆盖点包括完整工作流create task → poll → download → verify fileslide 与 doc 操作产出可下载文件文件格式校验PPTX 是合法 ZIPDOCX 是合法 OOXML通过_resolve_cli进行 CLI 子进程调用错误场景非法 operation、空 prompt、坏 API key。从 test_full_e2e.py 源码看E2E 用pytest.mark.skipif(not API_KEY)在未配置 key 时自动跳过_resolve_cli()优先查找已安装命令找不到时回退到python3 -m cli_anything.anygen.anygen_cli方便开发环境直接跑。测试会对下载文件断言大小 1000 字节并调用verify_file()校验格式。运行方式# 单元测试Mock HTTP无需 API key python3 -m pytest cli_anything/anygen/tests/test_core.py -v # E2E 测试需 ANYGEN_API_KEY ANYGEN_API_KEYsk-xxx python3 -m pytest cli_anything/anygen/tests/test_full_e2e.py -v # 全部测试 python3 -m pytest cli_anything/anygen/tests/ -v十二、面向 Agent 的设计考量与使用边界CLI 的 Agent 原生agent-native设计可归结为三点有状态的本地记录任务与命令历史都落在~/.cli-anything-anygen/下tasks/*.jsonsession.json配合session undo/redoAgent 具备可回放、可回滚的容错能力机器可读输出全局--json使任何命令的输出都能被 Agent 直接解析错误也以{error: ..., type: ...}结构化返回见handle_error装饰器随包分发的技能文档仓库在 skills/SKILL.md 提供描述命令组与用法的 agent skill 元数据便于接入 LLM 工具注册。最后需要明确边界本 CLI 的正确性高度依赖 AnyGen 云端服务的可用性与 API 契约稳定性生成质量与耗时由服务端引擎决定若需要把 SmartDraw 结果本地渲染为 PNG 类位图还需另行准备 Chromium 环境。在使用前请通过 AnyGen 控制台anygen.io/home → Setting → Integration申请sk-格式的 API Key并妥善保管——源码中对其回显做了掩码、写盘做了 0600 权限Agent 在透传 key 时也应注意同样的安全策略。本文基于 ANYGEN.md 写成实现细节分别以 anygen_backend.py、core/task.py、core/export.py、core/session.py、anygen_cli.py 与两个测试文件为准。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表