← 返回信息流
AI 资讯Hacker News·3 小时前

Skillscript:一种声明式沙盒语言,用于工具编排

原标题:Show HN: Skillscript – A declarative, sandboxed language for tool orchestration

速览

Skillscript是一种全新的声明式编程语言,采用沙盒化设计,旨在简化工具编排流程。开发者可以通过声明式语法安全地组合和调用各种工具,避免安全风险。该语言的出现有望提升开发者在构建复杂工作流时的效率与安全性。

AI 深度解读

背景

当前 AI 代理(agent)大多是瞬态的——每次执行例行任务时,都要从零开始通过自然语言推理来推导整个过程。例如,昨天总结过某个线程的代理,明天总结另一个线程时,会再次从头推理“如何总结线程”,在已知形状、已知输出格式、已知失败模式的流程上消耗昂贵的前沿推理能力。这种浪费在三个方向上成倍放大:成本(每次例行操作都经过系统中最昂贵的推理层)、延迟(每次操作都支付全部推理成本)、漂移(同一任务每次调用产生略微不同的结果,因为没有任何东西被固化下来)。

更深层的问题是:代理没有可以用来“写下自己”的基板。代理的能力部分由它们能做什么来定义,而目前“能做什么”完全以软性的、瞬态的推理形式在推理时存在。没有硬性的形式。没有地方让代理把学到的流程固化成一个便宜执行、便宜检查、便宜改进的物件。

当前大多数代理基础设施项目聚焦于“记忆”——情景回忆、检索增强上下文、对话摘要。这些项目回答的是“代理知道什么”,但没有以任何持久化、可执行、可检查的形式回答“代理能做什么”。Skillscript 旨在回答第二个问题。

核心内容

Skillscript 是一种声明式、沙盒化的语言,专门用于工具编排(tool orchestration)。它的核心理念是:代理就是代码,而 Skillscript 是代理用来编写自己的语言。这不是记忆意义上的回忆,不是提示模板,不是配置。而是严格意义上的代码——命名、类型化、可组合、可执行的工件,构成能力。

一个 skillscript 技能(skill)是一个声明式的配方,一个带有类型化操作依赖 DAG(有向无环图)的小程序——代理只需编写一次,运行时(runtime)可以多次触发。与典型的代理代码(如 Python 脚本、TypeScript 处理器)不同,Skillscript 是纯编排语言:它通过可替换的连接器契约(connector contracts)来组合对工具、模型和数据存储的调用。计算发生在工具中,协调发生在技能中。

例如,一个完整的、可运行的技能:

# Skill: hello
# Status: Approved
# Description: The canonical first-run example.
# Vars: WHO=world
Hello, ${WHO}!
Welcome to Skillscript.

这个技能的主体文本就是输出。没有目标文件、没有样板代码、没有 emit() 仪式:运行时将主体文本根据技能变量渲染后发布。同样的结构可以扩展到多阶段 DAG,用于分类输入、分派给 LLM、查询数据存储、条件分支、编排子代理,全部在同一个声明式语法中完成。

为什么不直接让代理写 Python?

Python 是图灵完备的,有成熟工具链,模型也写得很好。对于一次性探索性工作或需要计算密集的场景,Python 是正确的工具。但代理编写的持久化自动化有不同形状:

  • 代码由代理(而非人类)编写。
  • 代码自主运行——通过 cron 触发、事件触发——执行时无人类介入。
  • 工作本质是分派型:调用工具、分类结果、分支、调用另一个工具,而非算法计算。
  • 代码需要人类以人类节奏审计,尽管它是以代理节奏编写的。

对于这种形状,Python 的优势变成了劣势:

  • 图灵完备性成为负担。代理编写的脚本可以执行任何操作,包括代理没有意识到危险的操作(subprocess.run、任意网络调用、文件写入)。这些都没有门控。一个有 bug 的代理脚本的爆炸半径是整个主机。
  • 成熟工具链在作者不是人类时没有帮助。调试器和 REPL 是为人类迭代设计的,代理不那样迭代。
  • 直接执行放大失败。当代理把一个有问题的 Python 脚本部署到生产 cron 时,没有验证层。脚本在凌晨 3 点静默失败,人类第二天才发现。
  • 包生态系统成为无边界攻击面。能 pip install 任何东西的代理可以安装任何东西——包括供应链被污染的包。包生态系统假设采用前有人类审查,代理采用打破了这一假设。

Skillscript 的设计选择

Skillscript 刻意限制表达能力。它不是图灵完备的,不能 eval,不能 subprocess,不能导入任意代码。这种限制就是安全故事——在语言层面强制执行,而非仅仅是愿望。作为交换,它提供:

  • 沙盒化语法。语言只能做已配置的连接器所允许的事情。
  • 声明式可读性。技能是类型化分派的 DAG。人类阅读技能时,能精确看到哪些工具被调用、哪些数据写入发生、哪些模型提示被触发。同一份源码每次产生相同的审计图。
  • 连接器中介的能力。技能不导入包,而是调用连接器(connector)——有门控的工件,带有精选的工具表面。Python 并没有从系统中消失,而是从代理手中移到了连接器实现中(由采用者有意编写)。安全边界移到连接器边缘。
  • 准入前的静态验证。未通过 linter 的技能不能进入库。结构问题、缺失依赖、未声明变量、无确认门控的变更路径,在编写时就被捕获,而非凌晨 3 点。
  • 生效前的签名批准。在安全模式下,只有携带有效操作员签名的技能才能执行有副作用的操作。未经批准或篡改的技能无论以何种方式分派(CLI、cron、/event、MCP、组合)都是惰性的。批准采用 Ed25519 签名,由操作员侧应用并在每次执行时验证;运行时从不持有签名密钥。
  • 不对称成本。例行工作(分类、分派、转换)的成本是本地模型 token。前沿模型只保留给真正需要前沿判断的小部分工作。

与现有 Skills(Anthropic/OpenAI)的关系

Skills(Anthropic/OpenAI)是现有惯例,用于给代理提供命名、可复用的能力:手工编写的 markdown,将指令加载到模型上下文中。它们有效,而 Skillscript 与它们互补而非竞争。手工编写的问题在于

查看原文 →github.com