Ask Claude

macOS 上的原生聊天窗口,直接调用你本机已经登录好的 Claude 命令行来回答 —— 用你订阅套餐里的额度,不需要 API key,也不额外按量计费。 这个页面除了介绍它,本身也是一个能真聊的网页版,往下滑就能用。

桌面版零 API key 订阅额度 SwiftUI 原生 多轮记忆 MIT 开源 macOS 15+ · Apple Silicon

它替你解决什么

如果你已经装了 Claude Code 命令行、也已经登录,那你其实随时能问它任何问题 —— 但实际用起来会卡在三个地方:

你现在的做法卡在哪这个 app 怎么解
切到终端敲 claude -p "……" 要么占用你正在干活的那个终端标签页,要么新开一个再关掉;随手问一句的成本比问题本身还高 ⌘Tab 切到一个常驻的小窗口,敲完回车就走
等命令行返回 光标闪着,不知道是在连、在想,还是卡死了 三段实时状态 + 逐字流式出答案,模型名和耗时直接标在回答上方
想追问一句 再敲一遍命令就是全新上下文,得把前情重新贴一遍 自动接着上一轮的会话续聊;想重开按 ⌘N
换成网页版 / 第三方客户端 要么再登一次账号,要么要你自己去配一把 API key,然后按 token 另外付一份钱 它调的就是你终端里那个 claude,同一份登录、同一份额度、同一份账单(也就是没有额外账单)

一句话:把「随手问一句」的摩擦降到接近零,而且这一句不花额外的钱。

先试试:网页版聊天窗

多轮对话,Enter 发送、Shift+Enter 换行;回答里的 markdown 会真渲染成标题/列表/代码块。

Ask Claude · Web 额度查询中…
还没有消息。问一句试试 ——
比如「JSON 里的日期字段用什么格式最不容易出事?」
0 / 4000
用我自己的 API key(不受本站额度限制)

填了 key 之后,请求从你的浏览器直接发给 api.anthropic.com, 本站服务器完全不参与,也就不可能拿到你的 key。key 默认只存在当前页面的内存里, 刷新即消失;勾上「记住」才会写进这台设备的 localStorage,随时可以点「清除」抹掉。

当前:走本站额度

用自己的 key 时走 claude-sonnet-4-5,按你自己账户的用量计费; 浏览器直连需要该 key 允许浏览器端调用(请求已带 anthropic-dangerous-direct-browser-access 头)。

网页版是「让你先尝一口」的东西:它跑在作者的订阅上,所以必须限量。 这个 idea 的原意是复用本机订阅的桌面聊天窗 —— 真正想天天用, 就下载 Mac 版(用你自己的订阅、没有额度表), 或者在上面填自己的 key。

桌面版比网页版多什么

这一条网页版(本页)Mac 桌面版
额度来源作者的订阅,每 IP 每天 8 次;或你自己的 API key你本机已登录的 Claude 命令行 —— 你的订阅
额外花钱填自己 key 时按 token 计费不额外花钱
流式出字没有,等一整段回答逐字流式,带三段状态提示
多轮上下文把前几轮拼进这一次的输入里(受 4000 字符限制)命令行原生会话续聊,⌘N 重开
模型服务端定;自带 key 时为 claude-sonnet-4-5默认 opus,一条 defaults write
装它不用装,打开就用下载 .zip 或自己编

功能清单(桌面版)

以下每一条都对应源码里真实存在的实现,没有「规划中」。

提问与回答
  • 流式出字:回答边生成边渲染,不用盯着空窗口等
  • 三段进度:连接中 → 会话已建立,等待模型 → 「某模型 正在回答」
  • 回答带署名:每条回答上方标出实际使用的模型和本次耗时
  • 文字可选中复制,包括错误提示里的文字
  • 自动跟随滚动:答案在长,视口跟着往下走
多轮与会话
  • 接着上一轮问:首轮拿到命令行给的会话号,之后每轮自动带上它续聊
  • ⌘N 开新对话:清空消息并丢弃会话号,工具栏也有一个「New Chat」按钮
  • 同时只跑一个请求:上一句还没回完不会让你发下一句,避免两个会话互相串线
输入
  • 发送,⌥⏎ 换行
  • 输入框在 1–6 行之间自适应长高,贴长问题不会挤成一条缝
  • 请求进行中输入框禁用、发送按钮置灰,状态一眼可见
出错的时候
  • 横幅不是弹窗:错误显示在窗口顶部,可关闭,不打断你手上的动作
  • 找不到命令行时会告诉你怎么办:给出安装地址,以及指定二进制路径的那条命令原文
  • 单次回答上限 5 分钟:超时会终止进程并提示你重试或换个更短的问题,而不是让窗口一直吊着
  • 命令行非正常退出:把它自己的报错原文(截前 300 字)带到界面上,不吞掉
配置(都是可选的)
  • 默认模型 opus,一条 defaults write 换成别的
  • 自定义二进制路径:装在冷门位置也能用
  • 没配的话按 ~/.local/bin/opt/homebrew/bin/usr/local/bin$PATH 顺序自己找
体积与隐私
  • 纯 SwiftUI 单个小程序:没有 Electron、没有内嵌浏览器、没有后台常驻进程
  • 它自己不存任何聊天记录:会话由 Claude Code 命令行按你在终端里用它时同样的方式管理
  • MIT 协议开源,源码可读可改可自己编

怎么装桌面版

先确认三件事

系统macOS 15 或更高,Apple Silicon 机型
命令行已安装 Claude Code 命令行,且在终端里敲 claude 能正常工作(已登录)
账号一个 Claude 订阅(Pro / Max)
判断标准很简单:终端里 claude 能用,这个 app 就能用;终端里不能用,先把终端修好。 它没有独立的登录体系,也不打算有。

装:下载现成的

从发布页下载 AskClaude-<版本>-arm64.zip,解压后把 Ask Claude.app 拖进「应用程序」。

这个 app 用的是临时签名(没有花钱买 Apple 开发者证书),所以下载下来的副本会被系统隔离,首次打开会提示「已损坏」或直接拦下。清一次隔离标记即可:

xattr -cr "/Applications/Ask Claude.app"

或者右键点 app → 打开,然后在「系统设置 → 隐私与安全性」里放行。

装:自己编(装了 Xcode 的话)

git clone https://github.com/zengtianli/ask-claude.git
cd ask-claude
./build.sh --install

./build.sh 不带参数只产出 build/Ask Claude.app;带 --install 才会装进「应用程序」(没权限时自动退回用户目录下的 Applications)。自己编出来的不经过下载,不存在上面那个隔离问题。

两个可选项,都是系统级偏好设置,改完重开 app 生效:

# 换掉默认模型(默认 opus)
defaults write io.github.zengtianli.AskClaude model sonnet

# 你的 claude 二进制装在冷门位置时,直接指给它
defaults write io.github.zengtianli.AskClaude claudePath ~/bin/claude

桌面版到底替你敲了什么

它没有任何黑盒调用 —— 做的事就是替你拼一条 claude 命令并解析它的输出流。 下面这个小工具按源码里的同一套规则现场拼给你看,你可以把结果复制到终端里跑,结果是等价的。

等价的终端命令

    
app 内部传给进程的参数表

  

勾选「接着上一轮问」时用的是一个虚构的会话号做演示; 真实会话号由命令行在首轮返回,app 自己接住,不用你管。

它怎么找到 claude

  1. 你用 claudePath 指定的路径(如果指了,且那个文件确实可执行)
  2. ~/.local/bin/claude —— 官方安装脚本的默认位置
  3. /opt/homebrew/bin/claude —— Homebrew 或 npm 全局安装(Apple Silicon)
  4. /usr/local/bin/claude —— npm 全局安装(Intel 布局)或手动安装
  5. 最后才轮到 app 继承到的 $PATH 里逐个目录找

四条都落空时,界面上出现的不是「出错了」,而是一条带安装地址和补救命令的完整提示。

技术上怎么做的

桌面版是一层薄壳:一个 actor 负责起子进程、一个 @MainActor 的视图模型负责界面状态,中间只传三种事件(会话已建立 / 模型已确认 / 新增一段文字)。 子进程跑的是 claude -p --output-format stream-json --include-partial-messages --verbose, 输出按行解析:system/init 事件里取会话号,message_start 里取真实模型名, content_block_delta 里取增量文字,最后的 result 信封作为权威答案 —— 增量拼出来的文本只当兜底,这样即便命令行在发出结尾信封前挂掉,已经出来的内容也不会丢。

难的部分全在进程处理这一侧,而且每条都是踩出来的:GUI 应用继承的是 launchd 的精简 PATH, 所以要显式把常见安装目录塞回环境变量,否则命令行自己要调起的辅助进程会找不到; 管道写满 64KB 会双向死锁,所以 stdout 必须用可读性回调增量抽干、stderr 丢到并发队列上读完, 绝不能等进程退出后再去读管道;超时和用户取消这两条路径都要真正 terminate() 掉子进程, 并且分别落到「超时提示」和「静默」两种不同的收尾上。

网页版(本页)就是这个单文件 HTML 自己:没有构建工具、没有前端框架、不加载任何外部资源。 默认通道把你的输入 POST 给同源的 /api/llm,由服务端拿作者的订阅去问,因此必须限量; 填了自己的 key 之后改成浏览器直连 api.anthropic.com,本站不再参与。 markdown 渲染器也是本页自己写的一小段代码 —— 标题、粗体、行内代码、代码块、列表、引用、表格、链接 够用就行,绝不把 **## 原样甩给你看。

下载 / 源码

源码仓库(GitHub · MIT) 发布页 · 下载 .zip

公开仓是作者私有版本的单向快照,只在私有版发布新版时同步一次,日常提交不镜像 —— 所以它可能比作者本机那份略旧,但发布出来的每个版本都是可编译、可运行的完整源码。

哪些是合成的:页面上的示例问题、命令生成器里的那个会话号、以及所有出现在正文里的示范文本, 全部是虚构演示内容,不来自任何真实会话。
哪些是真的:上面那个聊天窗是真在调用模型 —— 默认通道打的是本站同源的 /api/llm(跑在作者自己的 Claude 订阅上,故限量);填了 key 则由你的浏览器直连 api.anthropic.com你的 key 与对话内容都不经过本站服务器。 本页不做任何服务端聊天记录留存,刷新页面对话即消失。
真实系统在哪:桌面版源码与发布包在上面的 GitHub 仓库;本页的命令生成器纯在你本机计算。