Every model, as a subagent. ask hands a task to a coding agent you already use and gives you its answer. Follow it up in the same conversation, run many at once, or give one its own git worktree.

Get askRead the source

One binary, no language runtime. Linux and macOS.

Hand it a task. Name a model and ask. The answer comes back on stdout, with a line saying what ran, how long it took and what it cost. Here three models take the same question. Follow one up by its name and it carries on from its answer, this time allowed to write.

  • Claude Code claude:opus-5.5

    ask -m claude:opus-5.5 "Why does the login test fail?"

    ask login-test-fail · ok · Opus 5.5 · 48.0s · 31.0k in · 812 out · $0.09

    The test signs its token with a fixed date that has passed, so login rejects it as expired.

  • Codex codex:gpt-6.1-sol

    ask -m codex:gpt-6.1-sol "Why does the login test fail?"

    ask login-test-fail-2 · ok · GPT-6.1 Sol · 41.2s · 28.4k in · 640 out · $0.07

    The fixture hardcodes the token’s expiry, and that date is now in the past. Login is right to refuse it; the test is stale.

  • OpenCode opencode:glm-5.3-flash

    ask -m opencode:glm-5.3-flash "Why does the login test fail?"

    ask login-test-fail-3 · ok · GLM 5.3 Flash · 22.6s · 33.1k in · 905 out · $0.01

    An expired token. The fixture sets a literal expiry date, and that date has gone by.

Run many at once. A batch is a list of tasks, on one model or several. ask runs four at a time unless you say otherwise, and prints every answer as one JSON array. Give each task its own git worktree and their changes can’t collide.

ask batch -j 4 tasks.json

ask summarize-public-api-src · 20/20 ok · 2:04 · 512.9k in · 15.1k out · $1.42

  • Claude Code claude:opus-5.5

    • api18.1s
    • race37.5s
    • errors31.9s
    • types28.6s
  • Codex codex:gpt-6.1-sol

    • tests44.0s
    • deps26.3s
    • auth22.4s
    • logs14.9s
  • OpenCode opencode:glm-5.3-flash

    • retry12.6s
    • docs9.8s
    • todo15.2s
    • cache11.7s
  • Pi pi:qwen-3.8-flash

    • perf16.4s
    • lint8.9s
    • config13.5s
    • i18n19.8s
  • Gemini CLI gemini:gemini-3.1-pro

    • schema33.2s
    • routes24.7s
    • build41.0s
    • a11y27.3s

Every run is named and recorded. ask names a run after its prompt, and the name works wherever a run is asked for: ask show prints one again, ask stop stops one, and a follow-up takes the name over. Each keeps a fixed id too. The runs you make on this page are at the top.

RunStatusTaskModelTime
summarize-public-api-srch4v9qe20/20 okSummarize the public API in src/.20 tasks
login-test-failk3f9a2okWhy does the login test fail?Opus 5.548.0s
login-test-fail-2w6pd0rokWhy does the login test fail?GPT-6.1 Sol41.2s
login-test-fail-3t2xn8cokWhy does the login test fail?GLM 5.3 Flash22.6s
tests-flakyp81c0d2/3 okWhich tests are flaky, and why?3 tasks
find-bugs-internal-runsx7d2e1stoppedresume: ask batch --resume find-bugs-internal-runs5 tasks

Make it yours. ask stays small, and you add to it with executables in ~/.ask, in any language.