Skip to content

cc CLI 自然语言驱动 — 管理手机其他 App + 数据

状态:v0.1 设计稿(2026-05-20)。

要解决的问题:用户说自然语言就能让 cc 去拉数据 / 控 app / 查信息 / 触发 hub ingest,而不必记 30+ 个子命令。技术 spine 是端侧小 LLM(1.5-3B)做 intent 解析 + 既有 cc 命令栈作为 action 执行层 + 隐私 gate 保护敏感操作。

关联文档

  • 父:Personal_Data_Hub_Android_Standalone_Cc.md(Plan A 主架构,本文档是其 NL 层细节)
  • 同源思路:Personal_Data_Hub_Architecture.md §AnalysisEngine(已有 NL → query-parser → vault facts → LLM 模式,本文档把它从 Q&A 扩展到 Action)
  • 已有 cc NL skill:.claude/skills/cc-cli/SKILL.md(per memory [[cc-cli-nl-skill]],Claude Code 内已有的 cc 命令自然语言入口;本文档是在用户手机里的同思路实现)

范围:Android 优先(Plan A 落地路径)。桌面端同思路可复用 — 已有 cc-cli SKILL 通过 Claude Code 做 NL 解析,但桌面 v1 优先保留外部 LLM;手机端必须自包含。


1. 背景

1.1 既有 NL 入口 vs 缺口

入口NL 解析执行层范围
Claude Code cc-cli SKILLClaude(用户付费)Bash 调 cc通用 cc 命令;不在手机里
桌面 PDH AnalysisEngine askOllama qwen2.5:7bvault 查询(read-only)只解析查询;不触发 ingest / action
Android in-app terminal(既有 Phase 2.5)❌ 无用户手打 cc必须记命令
Cc NL Phone App Manager(本文档)端侧 llama.rn 1.5-3Bcc android / cc hub / cc nl完整覆盖 query + ingest + control

核心缺口:手机用户在通勤路上想说"看看上周和我妈通话多久",目前路径是 (1) 进 cc terminal → (2) 想起 cc hub ask 命令 → (3) 输入 → (4) 等响应。NL 入口把 1-3 合一。

1.2 为什么不直接复用桌面 AnalysisEngine?

AnalysisEngine 是 Q&A only — 输入问题,输出答案 + citation。它不会触发任何操作(ingest / register / unregister / app launch)。本文档要的是:

用户 NL → intent classifier → {query | ingest | control | action} → 路由

                    {query: AnalysisEngine.ask}
                    {ingest: cc hub ingest <adapter>}
                    {control: cc android app launch / cc android a11y click}
                    {action: cc android root exec / cc workflow run}

即"先决定意图,再调对应 cc 子命令"。AnalysisEngine 只是 query 这一分支的实现。

1.3 为什么必须端侧 LLM?

选项评估
远程云 LLM 解析 NL违背"数据回归个人"哲学 — 用户的 NL 已可能含敏感片段("上周和我妈通话"暴露关系图)
规则正则解析中文短语变体爆炸;"昨天微信" / "昨天的微信" / "前一天微信" / "yesterday wechat" 全要写
端侧 1.5B 小 LLM解析能力足够(intent classification + slot filling);离线可用;隐私无外泄
桌面 LLM 解析(手机 RPC)与 Plan B 冲突 — 本设计文档为 Plan A 服务,必须本机自包含

结论:端侧 LLM 必选。准确率不足靠"规则 fast-path"补足(§4.3)。


2. 目标 & 非目标

2.1 目标

#验收
G1cc nl "<中文/英文 NL>" 顶层命令,将 NL 解析为 cc 子命令并执行cc nl "拉昨天的通讯录" → 解析为 cc android contacts pull --since <ms> → 执行 → 返回 SyncReport
G24 大 intent 类别识别准确率 ≥ 85%(query / ingest / control / action)单测 50 条 fixture phrases / 实测命中率 ≥ 85%
G3时间词 fast-path — "昨天" / "上周" / "今天" / "上个月" / "去年" 等高频时间表达走正则不走 LLM单测覆盖 10+ 时间表达式
G4实体(adapter 名 / app 名 / 联系人名)的 NER — LLM 输出 JSON slot,cc 端 fuzz-match 到注册 adapter 列表"拉抖音" → adapter=social-douyin;"看京东订单" → adapter=shopping-jd
G5高敏感 action 强制二次确认(destroy / unregister / app launch / root exec / a11y click)NL "删 vault" → 解析为 destroy → 弹 confirm dialog "你确定吗?"
G6用户语言纠错 / 二次澄清回路 — 若 intent 不明 / slot 缺失 LLM 输出 clarify,cc 端追问一句"看 xx" → LLM clarify "你想看哪个 app 的数据?我支持: 微信/QQ/淘宝..."
G7NL 历史 + 上下文记忆 — 最近 5 条 cc nl 输入存 session memory,支持代词指代("再来一次" / "改成上周")"拉昨天微信" → "改成上周" → 解析为 wechat + since=lastweek
G8隐私 gate — 端侧 LLM 始终视为 local;若 LLM 调用走远程 API(用户切了),解析路径不变但 cc 提示 user "正在用远程模型解析你的指令"UI: warning banner

2.2 非目标(defer 到 v0.2+)

  • 多轮对话 — v0.1 单轮 query / clarify-一次。多轮真正像聊天的留给 [[managed-agents-phase-h]] 那一支。
  • 语音输入 — Android 语音 → 文字 → cc nl 这步走 Android 系统 SpeechRecognizer,不在本文档
  • 跨设备 NL — 用户在桌面说 "查我手机里的抖音" → 走桌面 cc 远控 → Plan B 路径。本文档只覆盖手机本机。
  • 大模型 14B+ — 1.5-3B 够用;14B 留给重型分析(不是 NL 解析)。
  • NL 触发自定义 cc 命令 — v0.1 只覆盖白名单 cc 命令(cc hub / cc android / cc llm / cc workflow run),不让 LLM 自由组合 shell 命令(命令注入风险)。

3. Open Questions

OQ-1: NL 解析层和 cc command 层之间的协议

A. LLM 直接输出 cc 命令字符串(cc hub ingest wechat --since <ms>),cc 把它当 bash 执行。简单但有命令注入风险。

B. LLM 输出结构化 JSON {intent, adapter, action, params},cc 内部映射到子命令调用。安全。

推荐:B。隔离 LLM 输出与 shell 执行。

OQ-2: 不识别的 NL 如何兜底

A. 直接报错 "我没听懂"。

B. 走 AnalysisEngine.ask 兜底(当作 Q&A) — 大多无法分类的 NL 其实是问题。

推荐:B。Q&A 是 80% NL 输入的真实意图。

OQ-3: 端侧 LLM 模型选择

A. qwen2.5:1.5b-instruct(Q4_K_M ~1GB)— 中文优秀。

B. phi-3.5-mini(~2GB)— 英文优秀,中文一般。

C. Llama-3.2-3B(~2GB)— 平衡。

推荐:A 默认(用户基数主要中文)+ C 可选

OQ-4: NL 命令历史持久化

A. 不持久化(每次 fresh)。

B. session memory 内存(cc 进程生命周期)。

C. 持久化到 ~/.chainlesschain/nl-history.jsonl — 用户可 cc nl history 翻阅。

推荐:B+C 混合 — B 优先(性能),C 后台异步落盘


4. NL 解析 Pipeline

4.1 整体流程

用户输入 NL

┌──────────────────────────────────────────────────────┐
│ Stage 1: 规则 fast-path                              │
│   - 时间词正则提取 (昨天/上周/今天/...)             │
│   - 高频短语直接命中 (cc nl "health" → cc hub health)│
│   - 设备命令直查 (cc nl "list app" → cc android app │
│                                       list)         │
└──────────────────────────────────────────────────────┘
   ↓ (未命中)
┌──────────────────────────────────────────────────────┐
│ Stage 2: 端侧 LLM intent classification              │
│   System prompt: "你是 cc CLI 命令解析器。把用户的   │
│     自然语言解析成 JSON: {intent, adapter?, action?,│
│     since?, until?, target?, params}. 4 类 intent:  │
│     query/ingest/control/action. 输出仅 JSON。"     │
│   User: "拉昨天的微信记录"                          │
│   LLM 输出: {"intent":"ingest","adapter":"wechat",  │
│              "since":"yesterday"}                    │
└──────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────┐
│ Stage 3: slot 验证 + 实体规范化                      │
│   - "yesterday" → Date.now()-86400000                │
│   - "微信" → adapter="wechat" (fuzz match 注册列表) │
│   - 检查 adapter 在当前设备能力清单内(§5 PlanA)   │
└──────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────┐
│ Stage 4: 隐私 / 高敏 gate                            │
│   - intent=action + target=destroy → confirm dialog │
│   - adapter 在 P5 (root) 路径且无 root → 拒 + 提示  │
│   - LLM 非本地时整体 gate(继承 AnalysisEngine 规则)│
└──────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────┐
│ Stage 5: 路由到 cc 子命令                            │
│   {intent:'query'}   → cc hub ask "<原 NL>"          │
│   {intent:'ingest'}  → cc hub ingest <adapter>       │
│                         --since <ms>                 │
│   {intent:'control'} → cc android app launch <pkg>   │
│                       / cc android a11y click ...   │
│   {intent:'action'}  → cc android root exec / cc    │
│                       workflow run / cc hub destroy │
└──────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────┐
│ Stage 6: 执行 + 反馈                                 │
│   - 流式回显进度(复用既有 cc stream)              │
│   - 错误透传 + LLM 自然语言重述("我尝试拉微信但你 │
│     的设备没 root,无法访问其它 app 数据")         │
└──────────────────────────────────────────────────────┘

4.2 4 类 Intent + 路由表

Intent触发短语示例路由命令高敏
query"我昨天买了啥" / "上周和谁聊得多" / "最近一笔大额支出"cc hub ask "<原 NL>"(走 AnalysisEngine)
ingest"拉昨天的微信" / "同步最近的通讯录" / "把支付宝账单导进去"cc hub ingest <adapter> [--since <ms>]否(已注册 adapter 的话)
control"打开微信" / "切到抖音" / "点这个按钮" / "返回桌面"cc android app launch <pkg> / cc android a11y click <node>
action"删 vault" / "停掉所有 adapter" / "退出登录淘宝" / "执行截图工作流"cc hub destroy --confirm / cc android root exec / cc workflow run <name>是(强 confirm)

4.3 规则 fast-path(Stage 1)

类型模式路由
时间词`昨天前天
健康检查`health健康
Adapter 列表`所有 adapteradapter 列表
帮助`help帮助
退出`quitexit

4.4 端侧 LLM Prompt 模板

[system]
你是 ChainlessChain cc CLI 命令解析器。把用户的中文/英文自然语言指令解析成 JSON。

输出格式(仅 JSON,无 markdown 包装):
{
  "intent": "query" | "ingest" | "control" | "action" | "clarify",
  "adapter": "<adapter 名 or null>",
  "appPkg": "<Android package or null>",
  "since": "<ISO date or null>",
  "until": "<ISO date or null>",
  "params": {},
  "rationale": "<一句话解释你为什么这么分类>"
}

支持的 adapter(必须 fuzz-match 到这个列表,不能编造):
  email-imap, alipay-bill, system-data,
  shopping-taobao, shopping-jd, shopping-meituan,
  travel-amap, travel-baidu-map, travel-ctrip, travel-12306,
  ai-chat-history-deepseek (...8 vendor...),
  social-bilibili, social-weibo, social-douyin, social-xiaohongshu,
  messaging-qq, messaging-telegram, messaging-whatsapp,
  wechat

支持的 Android package(必须从 cc android app list 拉到的列表,由 cc 端注入到 prompt):
\{\{INSTALLED_PKG_LIST\}\}

如果你无法确定 intent 或缺关键 slot,输出 {"intent":"clarify","rationale":"<追问内容>"}。

[user]
\{\{USER_NL\}\}

[assistant]
(JSON)

4.5 Stage 3 实体规范化细节

LLM 输出规范化结果
"wechat" / "微信" / "WeChat"adapter = wechat(用 Levenshtein ≤ 2 fuzz)
"taobao" / "淘宝" / "淘宝订单"adapter = shopping-taobao
"yesterday" / "昨天"since = Date.now() - 86400000
"last week" / "上周" / "上一周"since = 周一 0:00
"this month" / "本月"since = 月初
不在注册列表的 adaptererror: "我不认识这个数据源,cc 当前支持: ..."

4.6 Stage 4 高敏 action 矩阵

Action风险UI 行为
cc hub destroy极高弹 confirm dialog 显示 "你将永久删除 X 条事件 / Y 个联系人 / Z MB 数据" — 用户必须输 yes
cc hub unregister <name>confirm "解绑 Email 账号 X?"
cc android root exec极高confirm 显示完整 shell 命令
cc android a11y clickconfirm "点击屏幕节点 "<text>"?"
cc android app launch直接执行 + log
cc hub ingest直接执行 + progress
cc hub ask直接执行

5. cc 实现层

5.1 新文件清单

文件职责LOC 估
packages/cli/src/commands/nl.js顶层 cc nl 命令入口 + Stage 1-6 编排300
packages/cli/src/lib/nl/fast-path.jsStage 1 规则匹配150
packages/cli/src/lib/nl/llm-classifier.jsStage 2 LLM prompt 构造 + JSON parse200
packages/cli/src/lib/nl/normalizer.jsStage 3 实体规范化(adapter / time / pkg)250
packages/cli/src/lib/nl/gate.jsStage 4 隐私/高敏 gate100
packages/cli/src/lib/nl/router.jsStage 5 路由到 cc 子命令200
packages/cli/src/lib/nl/history.js历史持久化 + 代词指代解析150
packages/cli/src/lib/nl/__tests__/*.test.js6 个测试文件 / ≥ 60 tests

总新增:~1350 LOC + 6 test file。

5.2 数据流(cc nl 单次调用)

javascript
// packages/cli/src/commands/nl.js (伪代码)
async function ccNl(userNl) {
  // Stage 1
  const fast = tryFastPath(userNl);
  if (fast) return router.execute(fast);

  // Stage 2
  const llmJson = await llmClassifier.classify(userNl, {
    installedPkgs: await cachedInstalledPkgs(),
    registeredAdapters: await hub.listAdapters(),
    history: history.recent(5),
  });

  if (llmJson.intent === 'clarify') {
    print(llmJson.rationale);
    const followup = await readLine('>>> ');
    return ccNl(`${userNl}\n${followup}`); // recursive 一次
  }

  // Stage 3
  const normalized = normalizer.normalize(llmJson);

  // Stage 4
  const gateResult = gate.check(normalized);
  if (gateResult.requireConfirm) {
    const ok = await confirm(gateResult.message);
    if (!ok) return;
  }
  if (gateResult.blocked) {
    return print(gateResult.reason);
  }

  // Stage 5
  const cmd = router.toCommand(normalized);
  history.append({ userNl, cmd, ts: Date.now() });

  // Stage 6
  await execute(cmd, { stream: true });
}

5.3 路由表实现(关键)

javascript
// router.toCommand({intent:'ingest', adapter:'wechat', since: 1716000000000})
// → returns: ['cc', 'hub', 'ingest', 'wechat', '--since', '1716000000000']

const ROUTES = {
  query: (n) => ['cc', 'hub', 'ask', n._originalNl],
  ingest: (n) => [
    'cc', 'hub', 'ingest', n.adapter,
    ...(n.since ? ['--since', String(n.since)] : []),
    ...(n.until ? ['--until', String(n.until)] : []),
  ],
  control: (n) => {
    if (n.appPkg && n.action === 'launch')
      return ['cc', 'android', 'app', 'launch', n.appPkg];
    if (n.action === 'a11y-click' && n.params?.nodeId)
      return ['cc', 'android', 'a11y', 'click', n.params.nodeId];
    throw new Error('Unsupported control action');
  },
  action: (n) => {
    // 高敏,gate 已 confirm 过
    if (n.action === 'destroy')
      return ['cc', 'hub', 'destroy', '--confirm'];
    if (n.action === 'root-exec' && n.params?.cmd)
      return ['cc', 'android', 'root', 'exec', n.params.cmd];
    if (n.action === 'workflow-run' && n.params?.name)
      return ['cc', 'workflow', 'run', n.params.name];
    throw new Error('Unsupported action');
  },
};

5.4 历史 + 代词指代

javascript
// history.recent(5) 返回最近 5 条
// 用户输入 "改成上周" → LLM 看到 history 后理解 "改成上周" 是修改上一次 ingest 的 since 参数
// LLM prompt 加 history block:
//
// 最近的 cc nl 上下文(最新在最后):
//   1. "拉昨天的微信" → ingest wechat since=2026-05-19
//   2. (当前)"改成上周"
//
// LLM 输出应该: {intent:'ingest', adapter:'wechat', since:'2026-05-13'}

6. Sub-Phase 拆分

Sub-Phase主题关键产出测试工时
N1cc nl 顶层命令骨架 + 规则 fast-path Stage 1cc nl "health" 直接 cc hub healthunit ≥ 150.5d
N2端侧 LLM classifier Stage 2LLM JSON 输出 + parse 错误 fallbackunit ≥ 10 fixture phrases / mock LLM1d
N3Normalizer Stage 3 (adapter / time / pkg fuzz)"微信" → "wechat" / "昨天" → msunit ≥ 201d
N4Gate Stage 4 + 高敏 confirmdestroy 弹 confirm 拦截unit ≥ 100.5d
N5Router Stage 5 + 4 intent 路由全 4 intent 路由到对应 cc 命令unit ≥ 16 (4 intent × 4 happy/error)1d
N6历史 + 代词指代"再来一次" / "改成上周"unit ≥ 80.5d
N7clarify 回路(v0.1 仅 1 跳)缺 slot 时追问 + 二次输入unit ≥ 50.5d
N8真机 E2E 8 场景见 §7真机 Xiaomi 24115RA8EC0.5d

总工时:~5d。本文档与 Plan A 串行(依赖 LlamaRn 已落 — Plan A Sub-Phase A3)。


7. 真机 E2E 8 场景

#NL期望 cc 命令验收
N-E1"我有几个联系人"cc hub ask "我有几个联系人"返回正确数字
N-E2"拉昨天的通讯录"cc hub ingest system-data --since <ms>SyncReport ingested ≥ 0
N-E3"上周和谁通话最多"cc hub ask "..."返回 top-N 列表
N-E4"打开抖音"cc android app launch com.ss.android.ugc.awemeActivity 启动
N-E5"删 vault"confirm dialog → 用户 cancel → 不执行vault 保留
N-E6"拉微信"(非 root 设备)gate 拒 + 提示 "需要 root"友好错误
N-E7"拉微信"(rooted 设备)confirm root exec → 用户 yes → cc android root execSyncReport
N-E8"改成上周"(紧接 N-E2 后)继承 system-data + since=上周SyncReport

8. Forward-looking Traps

  1. LLM 输出非 JSON / markdown 包装的 JSON — 1.5B 模型有概率包 ``````json ... ````或加废话。Mitigation: parse 失败时 regex 抠最近的` 块;3 次失败兜底走 AnalysisEngine.ask(当 Q&A)。

  2. adapter 名 fuzz-match 假阳性 — "小红"匹配到 social-xiaohongshu。Mitigation: 用 token-overlap 而非 substring;阈值 ≥ 0.6;ambiguous 时走 clarify。

  3. 时间词歧义 — "上周末" / "周六" / "上个工作日" — 模糊定义。Mitigation: 仅支持枚举集(昨天/前天/今天/明天/上周/本周/上月/本月/上一年/本年),其它走 LLM + clarify。

  4. 代词指代多层嵌套 — "再来一次但改成上周再加抖音" — 多 slot 改写 LLM 失败率高。Mitigation: v0.1 单 slot 改写支持;多 slot 走 clarify "你说的是: ingest wechat since=last-week + ingest douyin since=last-week 吗?"

  5. 命令注入 — LLM 输出 raw shell 字符串 — LLM 输出 cc hub ask "; rm -rf $HOME"。Mitigation: 严格 JSON 路由(§5.3),LLM 输出直接进 shell;所有参数 spawn execFile 不 shell。

  6. history 跨敏感会话泄漏 — 用户在公共场合 cc nl history 暴露之前问过的"我妈生日"。Mitigation: history 命令默认问 LLM "是否含敏感词",含则提示用户独立窗口查看 + 可选 PIN gate。

  7. 端侧 LLM 中文 token 化慢 — 1.5B 模型中文 tok/s 比英文低 30%。Mitigation: 接受;如真机测出 > 10s 单 query 体验差,切 3B 模型。

  8. NL 命令 ambiguous 时 clarify 嵌套循环 — clarify 后用户答的更模糊。Mitigation: 最多 2 跳 clarify;第三跳直接 cc --help + 短语集。

  9. history 持久化文件污染 cc CInl-history.jsonl.chainlesschain/,cc CI 默认会 cleanup 此目录可能跨测污染。Mitigation: 路径用 separate .chainlesschain/nl/history.jsonl;CI test 用 tmpdir。

  10. 远程 API key 用户偷换为云 LLM 解析 — 用户设 cc llm provider anthropic 后跑 cc nl 时解析也走 anthropic,敏感 NL 出墙。Mitigation: cc nl 默认强制端侧 LLM(不读 cc llm provider);想用云 LLM 解析 NL 走 cc nl --llm anthropic 显式 opt-in + warning。

  11. NER 必须知道当前注册 adapter 列表 — LLM prompt 含 注入;列表过长 → context window 撑爆。Mitigation: ≤ 30 个 pkg 全注入;> 30 时只注入用户最近用过的 + 仍可 "list app" 走 fast-path 拿全列表。

  12. 用户期望 NL 直接修改 cc config — "把模型换成 3B" → 这是 cc config 改而非 cc hub/android。Mitigation: v0.1 加第 5 类 intent config,路由到 cc config set <key> <value>,但限制白名单 key(llm.provider / llm.model / etc)。


9. 端侧 LLM 模型分发

9.1 模型清单(v0.1)

模型量化大小tok/s (Snapdragon 8 Gen 3)用途
qwen2.5-1.5b-instructQ4_K_M~1.1GB~25默认 NL 解析
qwen2.5-3b-instructQ4_K_M~2.1GB~12高级 NL 解析(v0.2)

9.2 分发路径

  • APK 不内置(避免体积膨胀,per Plan A trap 12)
  • 首次 cc nl / cc llm pull qwen2.5-1.5b 触发下载
  • CDN: https://models.chainlesschain.com/<model>.gguf + SHA-256 校验
  • 离线设备:用户在桌面下载 → SAF 拖入 /sdcard/Download/qwen2.5-1.5b.ggufcc llm import <path>

10. 与既有 cc-cli SKILL 的关系

桌面 Claude Code 已有 cc-cli SKILL(per memory [[cc-cli-nl-skill]])— 用户在 Claude Code 里说"列我所有 skill",Claude 通过 cc --help 动态发现命令并调用。本文档与之互补不重叠

维度cc-cli SKILL(Claude Code 桌面)Cc NL Phone App Manager(手机)
LLM 来源Claude(用户已付费)端侧 llama.rn
触发场景用户在 Claude Code 对话窗口里说话用户在 Android cc terminal 或 NL UI 里说话
命令发现cc --help 动态端侧 prompt 注入 adapter / pkg 列表
隐私看 Claude 服务条款端侧 100% 本机
上下文记忆Claude session(对话)cc nl history.jsonl

长期可考虑 Claude Code 用 cc-cli SKILL 调远控手机的 cc nl(Plan B 路径),即"桌面 NL → cc remote → 手机 cc nl"。v1 范围外。


11. 决策结论

问题:"用 cc CLI 自然语言管理手机其他 app 和数据"

:技术上可行。Pipeline = 端侧小 LLM (intent classifier) + 既有 cc 命令栈作为执行层 + 4 类 intent 路由 + 隐私 gate。

核心条件

  1. ⏳ Plan A LlamaRn 落地(依赖 Personal_Data_Hub_Android_Standalone_Cc.md Sub-Phase A3)
  2. ⏳ 新增 cc nl 顶层命令 + 6 lib/nl/* 模块 (~5d)
  3. ✅ 既有 cc 命令栈、AnalysisEngine、AdapterRegistry 零改动复用

总工程~5d 在 Plan A LlamaRn 落地之后串行。

强约束

  • 端侧 LLM 模型 1.5-3B 范围;APK 不内置,走 CDN on-demand
  • 高敏 action 强制 confirm(不让 LLM 自动 destroy / root exec / a11y click)
  • 命令注入防护严格 JSON 路由(不让 LLM 输出 raw shell)

下一步:(1) 用户 align 是否做;(2) 若做,等 Plan A Sub-Phase A3 (LlamaRn) 落地后启 N1。

基于 MIT 许可发布