让 AI 真正运行 SAS 代码,而不只是写出来

任何模型都能生成 SAS 代码。但如果无法执行,就没人知道它是否真的可用。Jenner 开放的 Run API 为智能体补上了闭环的另一半:运行程序、读取真实的输出与真实的错误、修好之后再运行一次——无需 SAS 授权,也无需本地安装。

匿名访问完全不需要 API 密钥。

生成代码只是简单的那一半

只会写 SAS、写完就停下的助手,交给您的只是看起来正确的东西。宏能否正常解析、合并是否取到了您预期的变量、PROC MEANS 返回的是 19 行还是 0 行——在程序真正运行之前,这些都无从得知。

过去,运行它意味着需要一份 SAS 授权和一次安装,而这恰恰是智能体所不具备的。Run API 解除了这一限制:一次 HTTP 调用即可执行代码,并返回模型真正能够推理的结构化结果。

闭环

生成、检查、运行、迭代——全流程机器可读。

1

生成

模型编写 SAS——一个 DATA 步、一个 PROC、一个宏。不需要任何特殊处理:Jenner 接受标准 SAS 语法,助手本来就会写的代码就是能够运行的代码。

2

检查

将脚本 POST 到 /v1/validate 即可只做解析检查。诊断信息会直接返回而不执行任何代码,因此智能体可以在浪费一次运行之前发现语法错误。

3

运行

将脚本连同任意 CSV 或 Parquet 输入 POST 到 /v1/run。Jenner 会在沙箱容器中执行,并返回列表输出、NOTE/WARNING/ERROR 日志、退出码,以及程序生成的每个数据集和文件。

4

迭代

日志和诊断信息是结构化的反馈,而不是一张截图。智能体读取真实的错误、修改真实的那一行,然后再次运行——无需人工介入即可闭环。

实际效果

对公开 API 的真实请求。无需密钥,无需配置。

运行脚本,拿回列表输出

请求
curl -X POST https://api.jenneranalytics.com/v1/quick \
  --data-binary @analysis.sas
响应
                          The MEANS Procedure

 Variable        N           Mean        Std Dev
 -----------------------------------------------
 bmi            19     17.8420103      1.4625169
 -----------------------------------------------

在浪费一次运行之前发现错误

这段代码缺少一个分号。仅做解析的调用会直接指出问题,智能体便可以修好后继续。

有错误的 SAS 代码
data demo;
  set sashelp.class      /* <- missing semicolon */
  bmi = weight / (height**2) * 703;
run;
POST /v1/validate
{
  "valid": false,
  "diagnostics": [
    { "severity": "error",
      "message": "Unexpected token: Eq, expected Semi" }
  ]
}

读取模型能够推理的结果

一次完整运行会返回列表输出、日志、退出码,以及程序生成的每个数据集及其行数,让智能体可以确认自己确实拿到了数据,而不是凭空假设。

POST /v1/run
{
  "run_id": "r_c8679761197f4f9d8a3bc021...",
  "status": "ok",
  "exit_code": 0,
  "output":   "...formatted listing tables...",
  "log":      "NOTE: PROC MEANS statement used.",
  "datasets": [ { "name": "demo", "row_count": 19 } ],
  "files":    [],
  "diagnostics": [],
  "duration_ms": 412,
  "jenner_version": "..."
}

端点

基础 URL https://api.jenneranalytics.com/v1

端点用途
POST/v1/run执行脚本,可附带数据输入。以 JSON 返回输出、日志、退出码、数据集、文件和诊断信息。
POST/v1/run/stream与 /v1/run 相同,但以 Server-Sent Events 流式返回,程序仍在运行时日志就会陆续到达。
POST/v1/quick一行命令即可搞定。传入原始脚本,返回纯文本列表输出——回答“这段 SAS 能跑吗?”的最快方式。
POST/v1/validate仅做解析的语法检查。返回诊断信息但不执行代码。宏不会展开,因此大量使用宏的失败仅供参考。
GET/v1/run/{run_id}获取已完成的运行、其文件,或数据集的预览与下载。结果保留一小时,且需要该次运行的访问令牌。

访问方式

无需密钥即可开始。需要更高上限时再添加。

等级身份验证速率限制超时时间
匿名无需密钥每个 IP 1,000 次请求/小时30 秒
Free邮箱注册1,500 次请求/小时60 秒
ProAPI 密钥10,000 次请求/小时5 分钟
EnterpriseAPI 密钥自定义自定义

与您已在使用的工具协同工作

您的 AI 工具

  • Anthropic 的 Claude Code
  • Claude Desktop
  • OpenAI 的 Codex
  • ChatGPT
  • 任何能发起 HTTP 请求的系统

或在 Jenner 内部使用

  • 协作式网页工作区
  • macOS 桌面应用
  • 原生 Jupyter 内核

它们背后是同一套执行引擎,因此智能体通过 API 验证过的代码,在有人打开时表现完全一致。

常见问题

不需要。匿名请求完全不需要密钥,按 IP 限流为每小时 1,000 次请求,执行超时 30 秒。这足以让智能体在真实代码上测试和迭代。免费密钥可以提高上限,专业版或企业版密钥可以进一步提高。

不需要。API 会在我们基础设施上的沙箱容器中执行代码。无需 SAS 授权、无需本地安装,模型所在的宿主环境也无需准备任何东西。

可以。/v1/run 接受与脚本一同提交的可重复输入文件,格式为 CSV 或 Parquet。程序生成的数据集会附带行数以及预览或下载链接一并返回,因此智能体可以查看结果,而不是靠猜。

每次运行都会返回退出码、完整的 NOTE/WARNING/ERROR 日志和结构化诊断信息。失败是显式且机器可读的,因此智能体能够分辨程序是跑通了还是没跑通——而这正是只生成代码的工作流所缺少的信号。

一小时。每次运行都会返回一个仅限该次运行的访问令牌;GET 端点需要它,它与您的 API 密钥相互独立。

让您的智能体有办法检验自己的成果

开始使用无需密钥,也永远不需要 SAS 授权。