---
name: "ant-ling-api"
description: "帮用户接入蚂蚁百灵 Ling Studio（单文件自包含版）：先问用户选网页版对话还是 API 接入，再按分支走完全流程。网页版含登录指引与功能简介；API 含控制台创建 key、OpenAI 兼容调用与验证，附可选 CLI。"
---

# 蚂蚁百灵 Ling Studio 接入

> **本文件自包含全部内容**（操作手册 + 注册/登录走查 + 模型计费备注 + 可选 CLI 源码），无外部文件依赖，两种用法：
> - **发给 AI 助手**：把本文件的网址发给你的 AI 助手（ZCode / Claude Code 等），说「按这个文件帮我接入蚂蚁百灵」即可；
> - **安装为常驻技能**：把本文件内容另存为 `~/.zcode/skills/ant-ling-api/SKILL.md`（Claude Code 为 `~/.claude/skills/ant-ling-api/SKILL.md`）。
>
> 网页版在 https://chat.ant-ling.com/chat ，背后是 Ling 大模型；API 与 OpenAI 格式兼容。

## 入口选择（先问，再动手）
触发后首先让用户二选一，用简短选项呈现，不要长篇解释：
- A. 网页版对话 —— 在 chat.ant-ling.com 上直接聊天
- B. API 接入 —— 拿 key，用 OpenAI 兼容格式在代码/工具里调用

选定后再走对应分支。不要两条路混着讲。

## 路线 A：网页版对话
1. 打开 https://chat.ant-ling.com/chat （页面标题「蚂蚁百灵 Ant Ling - 百试·百灵」）。无需登录即可浏览完整聊天界面：
   - 左侧栏：对话、Agent（NEW）、探索、历史会话；底部有帮助文档、通过 API 接入、登录注册
   - 主区域：模型选择器（默认 Ling-3.1-flash）、模板卡片（热点侦察站/交互设计大师/产品小助手）、输入框
   - 右侧面板：系统提示词、工具、模型配置（temperature、top_k、top_p、思考深度）
2. **发消息必须登录**。登录只有两种方式（2026-10-09 实测）：
   - 手机号 + 短信验证码（含滑块人机验证）；
   - 点「登录遇到问题？」切换为邮箱 + 邮箱验证码。

   具体流程：在输入框输入内容点发送 → 弹出「请登录后使用」对话框 → 手机号：输入手机号 → 滑块人机验证（显示「正在验证…」）→ 输入短信验证码 → 勾选「我已阅读并同意 服务条款 和 隐私政策」→ 点「登录 / 注册」（表单未填完时按钮禁用）。
   没有密码登录，没有扫码登录，无匿名试用。
   **验证码必须用户本人收、本人填，绝不索取；登录这一步只能用户自己完成。**
3. 登录后即可正常对话。

## 路线 B：API 接入
### 拿 key
1. 先完成路线 A 的登录（API 控制台同样要求登录）。
2. 进 API 控制台 https://chat.ant-ling.com/open （或登录后点侧边栏「通过 API 接入」）→ 授权管理 → 创建令牌，得到 `sk-studio-...` 开头的 key。
   - 控制台内还有：钱包（总余额、今日剩余免费额度）、兑换免额包、开发票、费用明细、去充值（充值走支付宝小程序云的云钱包）。
3. key 只存用户指定的安全位置（建议 `~/.config/ant-ling/api_key`，600 权限），绝不在聊天记录、日志、记忆里复述原文。

### 调用（OpenAI 兼容）
- `OPENAI_BASE_URL=https://api.ant-ling.com/v1`
- Header：`Authorization: Bearer <API_KEY>`

验证 key 有效：
```bash
curl -s https://api.ant-ling.com/v1/models -H "Authorization: Bearer $KEY"
```

对话测试：
```bash
curl -s https://api.ant-ling.com/v1/chat/completions \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"model":"Ling-3.1-flash","messages":[{"role":"user","content":"你好"}],"max_tokens":50}'
```

### 可选 CLI（用户要命令行工具时再用）
让助手把下方源码存为工作目录下的 `ling.py` 并 `chmod +x ling.py`（key 来自 `ANT_LING_API_KEY` 环境变量或 `~/.config/ant-ling/api_key` 文件）：
```bash
python3 ling.py models              # 列出可用模型
python3 ling.py chat "你的问题"      # 发起对话（--model 可换模型）
```

```python
#!/usr/bin/env python3
"""百灵 Ling API 最小 CLI：models / chat。

API key 来源（按顺序）：ANT_LING_API_KEY 环境变量，
或 ~/.config/ant-ling/api_key 文件（建议 600 权限）。
"""
import sys
import os
import json
import urllib.request
from pathlib import Path

API_BASE = os.environ.get("ANT_LING_BASE_URL", "https://api.ant-ling.com/v1")
DEFAULT_MODEL = "Ling-3.1-flash"


def get_key():
    k = os.environ.get("ANT_LING_API_KEY")
    if k and k.strip():
        return k.strip()
    p = Path.home() / ".config" / "ant-ling" / "api_key"
    if p.exists():
        return p.read_text().strip()
    sys.exit("找不到 API key：设置 ANT_LING_API_KEY 环境变量，或写入 ~/.config/ant-ling/api_key")


def call(method, path, payload=None):
    data = json.dumps(payload).encode("utf-8") if payload is not None else None
    req = urllib.request.Request(
        API_BASE + path, data=data, method=method,
        headers={"Authorization": "Bearer " + get_key(),
                 "Content-Type": "application/json"},
    )
    with urllib.request.urlopen(req, timeout=120) as resp:
        return json.loads(resp.read().decode("utf-8"))


def cmd_models():
    d = call("GET", "/models")
    for m in d.get("data", []):
        print(m.get("id"))


def cmd_chat(args):
    import argparse
    ap = argparse.ArgumentParser(prog="ling.py chat")
    ap.add_argument("prompt", help="要问的内容")
    ap.add_argument("--model", default=DEFAULT_MODEL, help="模型名")
    ap.add_argument("--max-tokens", type=int, default=1000)
    ap.add_argument("--temperature", type=float, default=0.4)
    a = ap.parse_args(args)
    d = call("POST", "/chat/completions", {
        "model": a.model,
        "messages": [{"role": "user", "content": a.prompt}],
        "temperature": a.temperature,
        "max_tokens": a.max_tokens,
    })
    m = d["choices"][0]["message"]
    print(m.get("content") or m.get("reasoning_content") or "")


def main():
    if len(sys.argv) < 2 or sys.argv[1] not in ("models", "chat"):
        sys.exit('用法: ling.py models | ling.py chat "问题" [--model 模型名]')
    if sys.argv[1] == "models":
        cmd_models()
    else:
        cmd_chat(sys.argv[2:])


if __name__ == "__main__":
    main()
```

## Operating Rules
1. 返回的 message 含 `content` 与 `reasoning_content` 两个字段；`content` 可能为 null，取不到时回退读 `reasoning_content`。
2. Ling 无联网/实时数据能力：问天气、股价等实时信息会明确拒绝编造，不要把「拒绝」当故障。这是优点，不是 bug。
3. 计费按量、无最低消费；`Ling-3.1-flash` 有限时免费（2026-10-09 文档口径，最新以 https://developer.ant-ling.com/zh-CN/docs/ 为准）。也支持经 OpenRouter、ZenMux 等第三方平台调用。
4. 遇到 401/403 先检查 key 是否真的被带上（header 拼写、`Bearer ` 前缀），再怀疑 key 本身。

## 模型与计费备注（2026-10-09 实测，最新以官方文档为准）
### /v1/models 实测返回（11 个）
- Ling-3.1-flash（默认，限时免费 2 周）
- Ling-3.0-flash（限时 2.5 折）、Ling-3.0-flash-VL（限时 2.8 折，多模态）
- Ling-3.0-tiny、Ling-2.6-1T、Ling-2.6-flash、Ling-2.5-1T
- Ring-2.5-1T、Ring-2.6-1T
- Ming-3.0-asr-tiny（语音识别）
- AntAngelMed（医疗）

### 实测特性
- OpenAI 兼容：`OPENAI_BASE_URL=https://api.ant-ling.com/v1`
- chat/completions 返回的 message 含 `content` + `reasoning_content`；小 max_tokens 时 `content` 可能为 null
- 无联网/实时数据：问天气等实时信息会明确拒绝编造并指引查询渠道
- 自述能力：多语言文本理解生成（对话/翻译/摘要）、多模态（图像/音频）、编程辅助、知识问答与推理；不做医疗/法律/金融确定性建议
- 接口文档（公开，无需登录）：https://developer.ant-ling.com/zh-CN/docs/
