Model or dataset
MayDay-wpf/snow-cli avatar
MayDay-wpf/snow-cli

snow-ai: a terminal coding agent that speaks four model APIs at once

Agentic coding in your terminal,Simultaneously compatible with OpenAI, Gemini, and Claude.运行在终端的 AI 编程智能体,同时兼容 Deepseek、OpenAI、Gemini和Claude。

1,061 stars83 forksTypeScriptNOASSERTION

At a glance

What is it?
Snow CLI (npm package snow-ai) is a TypeScript terminal agent that connects to OpenAI, Gemini, Claude and DeepSeek through one interface. The multi-provider routing is the interesting part; the licence file is the part to check before you commit.
Who is it for?
Adopt snow-ai if you already pay for more than one model API and want a single terminal client that can switch between them, or if you need an agent with hooks, sub-agents and headless invocation wired together. Do not adopt it if your procurement process requires an OSI-approved licence identifier, because the repository reports NOASSERTION and the npm badge points at a LICENSE file the supplied material does not reproduce.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem is provider lock-in at the client layer, not at the model layer

Most terminal coding agents are built around one vendor's API shape. If you want Claude for refactors and DeepSeek for bulk edits because the token economics differ, you either run two agents with two configs or you write glue. Snow CLI's stated position is that it is simultaneously compatible with OpenAI, Gemini and Claude, with DeepSeek named in the Chinese description. That is a client-side abstraction claim, not a model-quality claim. The intended user is someone who already holds keys for more than one provider and wants one terminal, one set of keyboard shortcuts, one hook system and one session history across all of them. It is a worse fit for a team standardised on a single provider and a single billing account, because the compatibility layer buys you nothing and adds configuration surface. The README also documents a third-party relay configuration path, which suggests the maintainers expect users to route through intermediary endpoints rather than hitting vendor APIs directly. That is a meaningful design assumption: relays are a common pattern in this space, and the project treats them as a first-class setup rather than a workaround.

What the repository layout tells you about the architecture

The primary language is TypeScript and the package is distributed through npm as snow-ai, with the binary invoked as snow. The documentation tree is the clearest map of the internals. There are separate guides for sub-agent configuration, hooks, MCP configuration, LSP configuration, skills, sensitive commands, and an SSE service mode. Reading that list, the shape is a single terminal process that hosts a tool-calling loop, spawns sub-agents, and exposes itself over HTTP in at least one mode. The SSE service mode document mentions an SSE server startup, API endpoints, a tool confirmation flow and permissions, which implies the agent can be driven by something other than the interactive TUI. Headless mode is documented separately for command line quick conversations, session management and third-party tool integration. So there are three entry surfaces: interactive terminal, headless one-shot, and an SSE server. The command injection mode document describes executing commands directly inside messages with its own security mechanisms, which is the mechanism behind the sensitive command protection guide. I cannot confirm from the supplied material how provider differences are normalised, whether it is a message-format adapter per provider or a lowest-common-denominator schema. That distinction matters if you rely on provider-specific features such as prompt caching or structured output, and the README does not settle it.

Installation and first configuration

The install path is a single global npm package. The README gives this example:

npm install -g snow-ai

After installation, run:

snow

The README points to docs/usage/en/01.Installation%20Guide.md for system requirements, update and uninstall steps, and IDE extension installation, and to docs/usage/en/02.First%20Time%20Configuration.md for API configuration, model selection and basic settings. Those two files are where the actual setup detail lives; the README itself only gives the install command and the launch command. Node is a listed dependency via the npm node badge, but the supplied material does not state a minimum version, so check the installation guide rather than assuming. Windows users get an explicit recommendation: PowerShell 7 or later plus Windows Terminal, installable with winget install Microsoft.PowerShell and winget install Microsoft.WindowsTerminal. The README also recommends the JetBrains Maple Mono NF font, which is cosmetic. For relay setups, docs/usage/en/16.Third-Party%20Relay%20Configuration.md covers Claude Code relay, Codex relay and custom headers. The README lists one relay station, ccapi, and states plainly that these are mutual recommendation partnerships rather than commercial sponsorships, and that any relay providing a tutorial and a test account can join. Treat that as a disclosure, not an endorsement.

Hooks, sub-agents and skills are the real configuration surface

The feature that separates this from a thin chat wrapper is the automation layer. The hooks guide is annotated in the README with additionalContext inject, beforeSubAgentStart, and type:context, all tied to issue #194. The sub-agent guide is annotated with project Markdown agents, also #194. Skills have their own guide covering skill creation, tool restrictions and Claude Code Skills compatibility. MCP configuration is documented for managing external services and enabling or disabling them. LSP configuration covers a language server config file, language server installation, and something the README calls the ACE tool with definition and outline operations. Taken together, the agent is designed to be extended at four points: hooks for lifecycle interception, sub-agents for delegation, skills for packaged capabilities, and MCP for external tools. The trade-off is that each of these is a file format you now maintain. A hooks configuration that injects context before a sub-agent starts is a small program with no test harness described in the supplied material. If you adopt the hooks system, you are taking on the job of reviewing and versioning those files yourself. The README does not describe a dry-run mode for hooks, and I cannot confirm one exists.

Where it is the wrong tool

Three cases stand out. First, licence-sensitive environments. The repository metadata reports NOASSERTION, and the npm licence badge points at a LICENSE file in the repository that the supplied material does not reproduce. NOASSERTION is what GitHub reports when it cannot match a licence file to a known template. That is not the same as saying there is no licence; it means the automated classifier failed. But for a team that gates dependencies on an SPDX identifier, this is a blocker until a human reads the file. I am not giving legal advice here; the point is procedural. Second, single-provider teams. The multi-provider routing is the headline feature, and if you only hold one key you are paying the configuration cost of a capability you do not use. Third, anyone who needs a stable plugin API. The release cadence visible in the supplied material is three releases in six days, v0.8.29 on 2026-08-19 through v0.8.31 on 2026-08-25. Version 0.8.x with that cadence means interfaces can move between patch releases. The README annotations tying hooks and sub-agent features to issue #194 suggest those specific surfaces were still being shaped recently.

The alternative depends on which axis you care about

If your reason for looking at snow-ai is the multi-provider routing, the alternative approach is a thin local proxy that speaks one API shape and translates to the others, with a single-provider agent on top. That keeps the agent simple and puts the translation in one place you can test independently. Snow CLI instead builds compatibility into the agent itself, which means provider switching is a session-level action rather than a process-level one. If your reason is the automation layer, the alternative is a general-purpose agent framework where you write the terminal UI yourself. That gives you a supported extension API and a test story, at the cost of building the terminal experience. The README's own framing puts Snow CLI closer to the second category than the first: the volume of documentation for hooks, sub-agents, skills, MCP and LSP describes an opinionated product, not a library. The relay station section is the clearest signal of intended deployment. A tool that documents third-party relay configuration prominently is aimed at users who route around vendor endpoints, which is a different operational posture from a tool that assumes direct API keys.

Upgrade cost and what to check before committing

Upgrades are npm global installs, and the README defers update and uninstall steps to the installation guide. The cost is not the upgrade command; it is what your configuration files depend on. Hooks, sub-agents, skills, MCP servers and LSP settings are all separate documents with their own schemas, and any of them can change between 0.8.x releases. Before adopting, read LICENSE to resolve the NOASSERTION status. Then read docs/usage/en/07.Hooks%20Configuration.md and docs/usage/en/05.Sub-Agent%20Configuration.md, because those two define what runs on your machine outside the model call. Then read docs/usage/en/06.Sensitive%20Commands%20Configuration.md, which describes sensitive command protection and custom command rules; combined with command injection mode, this is the boundary between the agent suggesting a command and the agent running it. If you plan to drive it from scripts, read the headless mode and SSE service mode guides together, since they describe two different programmatic entry points with different confirmation semantics. The project is actively maintained as of the last push on 2026-08-25, and the release notes exist for each version listed, which at least gives you a changelog to read before upgrading.

Editorial conclusion

Adopt snow-ai if you already pay for more than one model API and want a single terminal client that can switch between them, or if you need an agent with hooks, sub-agents and headless invocation wired together. Do not adopt it if your procurement process requires an OSI-approved licence identifier, because the repository reports NOASSERTION and the npm badge points at a LICENSE file the supplied material does not reproduce. Before installing, read LICENSE and docs/usage/en/07.Hooks%20Configuration.md, since hooks execute your own commands and are the highest-risk configuration surface in the project.

Official sources

  1. Issues
  2. MayDay-wpf/snow-cli on GitHub
  3. README
  4. Releases
Community notes

Community notes