pentoshi007/clai

GitHub: pentoshi007/clai

一个终端 AI agent,能自主编辑文件、运行命令、执行构建调试与授权渗透测试,并通过多密钥轮换在免费 LLM 层级上持续运行。

Stars: 1 | Forks: 0

# clai `clai` 是一个具有主观能动性的 CLI。它不仅能描述该做什么——还能编辑文件、运行 shell 命令、扫描主机、获取 HTTP 证据、维护持久的任务计划,并在宣布成功前验证自己的工作。它完全在你的终端中运行,提供全屏控制台 UI(以及经典的单行 REPL 备选方案)。 两个特点让它非常适合日常使用: - **运行成本极低甚至免费。** 将它指向 Groq、Google Gemini、NVIDIA NIM、OpenRouter、Bynara、Kimchi 或本地的 Ollama——它们都有免费访问额度——并且 clai 会将它们堆叠使用。为每个提供商添加多个密钥;当其中一个触及速率限制时,它会自动轮换到下一个。 - **它很诚实。** 发现的结果需要真实的工具输出。构建在标记为“完成”之前会经过类型检查/运行。压缩和历史记录能保持长会话的连贯性,而不是凭空捏造进度。 ## 核心亮点 - **免费 tiers 优先。** 内置 12 家提供商,6 个云免费 tiers + 本地 Ollama。默认提供商是 NVIDIA NIM (`openai/gpt-oss-20b`),因此全新安装即可零成本运行。 - **多密钥智能切换。** 每个提供商最多支持 10 个密钥,具有*粘性*活跃密钥功能,并在遇到速率限制 / 认证 / 配额 / 瞬时错误 / 5xx / 空响应错误时进行循环轮换。可选的跨提供商回退和仅限免费过滤器。 - **基于范围的渗透测试。** 可选的授权范围,包含授权/排除的目标、允许的阶段、速率和并发上限、重定向和 DNS 重绑定逃逸检测,以及范围外标记——专为授权的渗透测试和漏洞赏金计划设计。 - **真正的构建与调试。** 搭建应用程序脚手架,进行精准的代码修改,安装包,运行构建/测试,将开发服务器作为后台作业启动,并在报告成功之前对其进行探测。 - **持久的计划。** `plan.create` / `task.update` 驱动一个实时的清单,该清单能在上下文压缩中保留下来,并可通过 `/history` 重新加载——agent 会逐项完成任务,绝不伪造完成状态。 - **原生 + 文本工具调用。** 在可用时使用提供商原生的函数调用,并带有文本围栏回退机制(`toolCalling: auto|native|text`)。 - **由你控制的安全门。** 每个操作都会被分类为安全 / 确认 / 阻止;删除操作在执行前总是需要预览确认;破坏性模式将被直接阻止。 ## 安装 ### macOS ``` brew tap pentoshi007/clai && brew install clai # 或 curl -fsSL https://raw.githubusercontent.com/pentoshi007/clai/main/install/install.sh | sh ``` ### Linux ``` curl -fsSL https://raw.githubusercontent.com/pentoshi007/clai/main/install/install.sh | sh ``` ### Windows ``` irm https://raw.githubusercontent.com/pentoshi007/clai/main/install/install.ps1 | iex # 或 scoop bucket add clai https://github.com/pentoshi007/clai && scoop install clai ``` ### npm / 从源码安装 ``` npm i -g @pentoshi/clai # 或 git clone https://github.com/pentoshi007/clai.git cd clai && npm install && npm run build && npm start ``` 需要 Node.js ≥ 20。在任何终端中输入 `clai` 即可启动。 ## 快速开始 从任何受支持的提供商处获取一个免费密钥,添加它,然后就可以开始了: ``` # 添加一个免费 key(以 Groq 为例;NVIDIA/Gemini/OpenRouter/Bynara/Kimchi 操作相同) clai set groq gsk_your_key_here # 启动全屏 agent console clai # 或者从 shell 执行 one-shot clai "explain what this repo does and find the entrypoint" clai --mode agent "add a /health endpoint to the Express app and run the tests" ``` 更喜欢完全本地和离线?指向 Ollama: ``` clai set ollama --url http://localhost:11434 clai use ollama ``` ## 在免费 tiers 上运行(并保持运行) 这是 clai 设计的核心:从免费 tiers 汇集计算能力,然后自动应对速率限制。 ### 支持的提供商 | 提供商 | 默认模型 | Tier | 环境变量 | |----------|---------------|------|---------| | NVIDIA NIM | `openai/gpt-oss-20b` | 免费 | `NVIDIA_API_KEY` | | Groq | `llama-3.3-70b-versatile` | 免费 | `GROQ_API_KEY` | | Google Gemini | `gemini-3.5-flash` | 免费 | `GEMINI_API_KEY` | | OpenRouter | `meta-llama/llama-3.3-70b-instruct:free` | 免费 | `OPENROUTER_API_KEY` | | Bynara | `mimo-v2.5-free` | 免费 | `BYNARA_API_KEY` | | Kimchi | `kimi-k2.6` | 免费 | `CASTAI_API_KEY` | | Ollama | `llama3.1:8b` | 本地 / 免费 | `OLLAMA_HOST` | | OpenAI | `gpt-5.4-mini` | 付费 | `OPENAI_API_KEY` | | Anthropic | `claude-3-5-haiku-latest` | 付费 | `ANTHROPIC_API_KEY` | | AgentRouter | `claude-opus-4-6` | 付费 | `AGENTROUTER_API_KEY` | | AWS Mantle | `anthropic.claude-haiku-4-5` | 付费 | `ANTHROPIC_API_KEY` | | Qwen Cloud | `qwen3.7-plus` | 付费 (DashScope) | `DASHSCOPE_API_KEY` | 一些“付费”提供商也会提供有限的免费额度——这里的 tier 标签反映了默认密钥通常能获得的服务。关闭 `freeOnly` 即可在回退机制中包含付费提供商。 ### 管理密钥 ``` clai set groq gsk_first_key # store a key (appends if one exists) clai set groq gsk_second_key # add another key for the same provider clai set gemini --from-env GEMINI_API_KEY echo "gsk_..." | clai set groq --stdin clai set ollama --url http://localhost:11434 clai keys # list providers + masked keys, active key marked ★ clai use groq # set active provider clai provider # interactive provider/model picker clai unset groq # remove ALL keys for a provider ``` 在控制台中,**`/set`** 会打开一个多行密钥编辑器:使用 `+` 添加行,移除行,点击 **Save** 保存,或点击 **Reset all** 全部重置。**`/keys`** 会以掩码形式列出它们;**`/unset`** 会清除某个提供商的信息。 ### 智能切换(它如何保持运行) - **多密钥轮换** —— 每个提供商最多支持 **10 个密钥**。最后一个成功使用的密钥具有*粘性*;发生失败时,clai 会循环轮换到下一个密钥。 - **触发切换的条件** —— HTTP 429(速率限制)、401/403(认证)、402 / 配额 / 账单文本、瞬时网络错误、500–504 错误以及空的补全响应。认证和配额错误会**立即**切换(无退避等待);速率限制则会先短暂退避。 - **跨提供商回退** *(可选)* —— `/fallback on` 允许 clai 在当前活跃提供商的密钥耗尽后,尝试其他已配置的提供商(仅在运行提供商的默认模型时有效)。 - **仅限免费模式** *(可选)* —— `/freeonly on` 会将付费云提供商从回退链中排除,因此你绝对不会意外产生消费。 - **静默状态** —— 一条非堆叠的状态行会显示发生了什么,例如 `switching groq key [2/4] …ab12 (rate limited)`。密钥始终会被掩码处理,仅显示最后 4 个字符。 ``` /freeonly on # stay on free tiers only /fallback on # allow other providers when the current one is exhausted ``` ## clai 的优势领域 ### 构建与调试 运行侦察的同一个 agent 也能交付代码。它会在编写之前进行探索,从 lockfile 中匹配你现有的技术栈,进行精准修改,并验证结果: - 搭建和扩展应用程序;用真正的功能替换初始样板代码(仅仅搭建脚手架会被视为未完成)。 - 精准的文件工具:`fs.edit`、`fs.replaceLines`、`fs.append`,以及多文件写入。 - 运行适用的检查——类型检查、构建、单元/集成测试——并在宣称成功之前修复失败项。 - 将开发服务器作为后台作业启动,持续输出日志直到准备就绪,探测 `localhost`,并报告 URL / 端口 / 作业 ID,同时保持服务器运行。 - 调试循环:重现 → 阅读实际错误 → 修复根本原因 → 重新验证(绝不会出现“已诊断但未修复”的情况)。 ``` clai --mode agent "convert this Vite React app to Next.js App Router, keep all features, run the build" clai --mode agent "this test is flaky — find the race and fix it" ``` ### 基于范围的渗透测试与漏洞赏金 clai 旨在执行真正的、经过授权的安全工作——而不是纸上谈兵。它遵循侦察优先的方法论,并让你在设定的边界内操作。 ``` recon / discovery → fingerprint stack → plan.create (kind=pentest) ↑ │ │ /implement (approve) │ ↓ └──── enumerate → exploit → post-ex → report (revise the plan as surface grows; keep completed tasks) ``` 1. **一次性授权**,然后可选择**定义范围** —— 授权目标、排除项、允许的阶段、速率/并发上限以及有效期。 2. **优先侦察**(只读发现无需计划):whois、DNS、`net.scan`、`net.context`、`http.fetch`、`pentest.recon`,以及 shell 工具如 `nmap`、`ffuf`、`nuclei`、`sqlmap`。 3. **分析真实证据**,然后根据实际的端口/服务/端点使用 `plan.create` 并设置 `kind=pentest` —— 随后暂停并等待你的批准。 4. `/implement` 并逐项执行任务;随着新攻击面的出现扩展计划,且不会清除已完成的工作。 5. **结构化报告** —— 包含标题、严重程度、证据、重现步骤、影响、补救措施 —— 以及诚实的残留/未测试说明。 **范围强制执行是动真格的,不是摆设。** 当启用范围限制时,clai 会根据你授权/排除的列表检查每个目标,强制执行令牌桶速率限制和并发上限,检测**离开范围的重定向**以及 **DNS 重绑定逃逸**,并标记范围外的主机而不是去触碰它们。为了进行本地开发验证,环回地址的 GET/HEAD 请求保持允许状态。范围限制是可选的:如果未定义范围,则范围限制功能将关闭。 ``` clai authorize-pentest AGREE clai scope new --targets lab.example.com,10.10.0.0/24 --exclude prod.example.com \ --phases recon,enumeration --max-rate 5 --max-concurrency 2 # 在 console 中:/scope show · /scope add · /scope clear ``` 专用侦察工具:`pentest.recon`(内置 whois/dns/nmap)、`pentest.webDiscover`(范围内的路径发现)、`pentest.apiEnumerate`(OpenAPI/Swagger)、`pentest.authCompare`(认证上下文差异比对)、`pentest.scanStatus`(持久化扫描检查点)。 ### 常规安全与系统管理工作流 日志分析、配置加固、打包、网络问题、截图或 PDF 报告的 OCR、快速 OSINT——所有这些都由同一个 agent 在同一个安全门控制下处理。 ## 模式与推理 三种模式,可随时通过斜杠命令、`Shift+Tab` 或 `clai --mode` 切换: | 模式 | 用途 | |------|-----| | **ask** | 回答问题、提供方法论并使用只读工具——不会进行任何修改或攻击。 | | **agent** | 执行操作:编辑、安装、扫描、验证、推进计划。 | | **plan** | 研究并设计持久的计划;在执行前使用 `/implement` 批准。 | **推理 / 思考**通过 `/variants`(别名 `/reasoning`)控制,接受 `on`、`off`、`none`、`minimal`、`low`、`medium`、`high` 或 `xhigh`。clai 仅向支持推理选项的模型发送这些指令——如果某个模型在运行时拒绝了这些指令,它会标记该模型,在不使用这些指令的情况下重试一次,并通知你(`… rejected reasoning options — retrying without them`),从而确保会话绝不会因为一个不受支持的旋钮而卡死。 ## 安全门 你掌握授权;clai 仍然会对每个操作的风险进行把关: | 级别 | 行为 | |-------|----------| | **safe** | 自动运行只读工作:`fs.read/list/search`、`sysinfo`、`dns.lookup`、`whois.lookup`、`http.fetch` GET、`web.search`/`web.fetch`、侦察扫描器。 | | **confirm** | 在执行修改操作前进行询问:文件写入/编辑、安装、移动、激进型/修改型 shell 操作。 | | **block** | 拒绝破坏性模式(`rm -rf /`、fork 炸弹、经典的渗透特征)和容易引发 SSRF 的抓取请求。 | 即使在允许所有操作的情况下,`fs.delete` 也总是会要求确认(带有可选的 `v` 预览)。`tool.batch` 会继承其子调用中最高的风险级别。使用 `/permissions` 选择默认的确认级别,并使用 `/allow` / `/disallow` 设置当前会话的工具白名单。 ## 终端 UI 默认采用全屏控制台:流式聊天、嵌套的工具卡片(包括 `tool.batch` 子调用)、文件 diff、实时的计划面板、选择器、历史记录以及安全的掩码密钥输入提示。当终端无法承载 UI 时,它会回退到经典的 REPL。 | 操作 | 按键 | |--------|-----| | 发送 / 换行 | `Enter` / `Shift+Enter` | | 中止当前轮次(保留结果) | `Esc` | | 中断 / 退出 | `Ctrl+C`(按两次退出) | | 循环切换模式 (ask→agent→plan) | `Shift+Tab` | | 计划面板 / 计划详情 | `Ctrl+H` / `Ctrl+P` | | 后台作业 | `Ctrl+J` | | 展开思考过程 / 工具输出 | `Ctrl+T` / `Ctrl+O` | | 搜索对话记录 | `Ctrl+R` | | 复制选中内容 | `Ctrl+Shift+C` | | 命令 / 提及文件 `/` · `@` | | 帮助 / 快捷键 | `Ctrl+G` | 工具卡片能清晰地显示命令/输入,并将长篇扫描的输出尾部保留在可展开的 OUTPUT 分页器中(支持搜索、复制、导出)。文件写入会显示 diff 预览。压缩卡片可在不丢失计划的情况下保留会话记忆,而 `/history` 可恢复完整的会话——提示词、工具结果以及匹配的计划——即使在中止或自动保存后也是如此。 ## 斜杠命令 | 命令 | 作用 | |---------|------| | `/ask` · `/agent` · `/plan` | 切换模式(plan = 设计后批准) | | `/implement` · `/discard` | 批准并执行或放弃当前计划 | | `/model [name\|#]` · `/provider [name]` · `/use ` | 选择模型 / 切换提供商 | | `/set [provider]` · `/unset [provider]` · `/keys` · `/info [provider]` | 管理 API 密钥并查看提供商信息 | | `/variants [level]` · `/reasoning [level]` | 思考 / 推理强度 | | `/freeonly [on\|off]` · `/fallback [on\|off]` | 仅限免费过滤器 · 跨提供商回退 | | `/search [provider]` · `/search-provider` | 选择网络搜索后端 | | `/scope [show\|add\|new\|clear]` | 授权范围 | | `/output [last\|id\|list]` | 打开完整的工具输出(也可使用 `Ctrl+O`) | | `/jobs` | 后台作业(也可使用 `Ctrl+J`) | | `/compact` · `/context` | 立即压缩历史记录 · 显示上下文大小 | | `/history` · `/save ` · `/new` · `/clear` · `/reset` | 会话生命周期 | | `/allow ` · `/disallow ` · `/permissions` | 工具权限 | | `/cwd ` | 更改工作目录 | | `/think` · `/thinking` | 显示上一次响应的思考过程 | | `/privacy [...]` | 隐私模式 · 清除历史记录/日志/产物 | | `/update` · `/help` · `/shortcuts` · `/clean` · `/exit` | 常规维护 | ## CLI 命令 ``` clai [prompt...] # interactive console, or one-shot with a prompt --mode --provider

--model -y/--yes --no-history --classic --ui clai set [key] # --from-env | --stdin | --url | --skip-ping clai unset # remove all keys for a provider clai keys # list providers with masked keys clai use # set active provider clai provider [provider] # switch provider or open picker clai model # set model for the active provider clai mode # set default mode clai search-provider clai config [key] [value] # print / get / set config clai doctor # check installed tools + provider config clai history [--show ] # list sessions / print one clai update # check for updates clai authorize-pentest AGREE # enable scan/attack tools (one-time ack) clai scope # engagement scope (new: --targets --exclude --phases # --name --note --expires --max-rate --max-concurrency) clai privacy ``` ## 内置工具 | 组别 | 工具 | |-------|-------| | **文件** | `fs.read` · `fs.list` · `fs.search` · `fs.write` · `fs.writeMany` · `fs.edit` · `fs.replaceLines` · `fs.append` · `fs.delete` | | **Shell 与作业** | `shell.exec` · `shell.start` · `shell.jobs` · `shell.tail` · `shell.stop` · `pkg.install` | | **网络** | `net.scan` (nmap) · `net.context` · `net.pingSweep` · `dns.lookup` · `whois.lookup` | | **HTTP / 网络** | `http.fetch` (原始证据) · `web.search` · `web.fetch` (可读内容) | | **渗透测试** | `pentest.recon` · `pentest.webDiscover` · `pentest.apiEnumerate` · `pentest.authCompare` · `pentest.scanStatus` | | **编排** | `tool.batch` (最多 20 次调用,`on_fail` 策略) · `tool.check` · `wordlist.find` | | **计划** | `plan.create` · `task.update` · `agent.handoff` | | **上下文** | `sysinfo` · `image.ocr` · `pdf.read` | ### tool.batch 失败策略 默认为 **continue** —— 一次失败的查询绝不会影响其他查询(非常适合侦察)。当后续工作依赖于早期工作的成功时,可选择启用快速失败或选择性取消: ``` {"name":"tool.batch","args":{ "on_fail":"cancel_pending", "calls":[ {"name":"net.scan","args":{"target":"lab.example"}}, {"name":"http.fetch","args":{"url":"https://lab.example/"}} ] }} ``` 包含多个独立工具块的顶层消息不会取消同级任务——当你需要特定的失败策略时,请使用 `tool.batch`。 ## 网络搜索 / OSINT | 提供商 | 密钥 | 环境变量 | |----------|-----|---------| | DuckDuckGo | 无(默认) | — | | Brave | 必需 | `BRAVE_SEARCH_API_KEY` | | Tavily | 必需 | `TAVILY_API_KEY` | ``` clai set brave bsx-... clai set tavily tvly-... clai search-provider tavily ``` 搜索提供商的密钥同样支持多密钥,并像模型提供商一样进行轮换。 ## 特定项目的上下文 在仓库中放置一个 `.clai/context.md` 文件,其内容会在每一轮对话中被注入——实验室拓扑结构、范围内的主机、技术栈假设、编码规范,或者任何 agent 在该项目中应始终知晓的信息。 ## 配置与隐私 ``` clai config # view config clai mode agent # default mode clai model # default model for the active provider /privacy on # private mode: don't persist this session /privacy clear-all # wipe history, logs, and artifacts ``` 配置文件存放在操作系统的用户配置目录下(例如 `~/.config/clai/`)。密钥在本地存储,并且仅以掩码形式显示。 ## 开发 ``` npm install npm run dev # run from source npm run typecheck npm run build npm test # full vitest suite npm run compile # native binaries (Bun) ``` ## 发布 基于 Tag 驱动的 CI(`.github/workflows/release.yml`):验证(类型检查 + 测试 + prompt 预算 + 发布检查) → 多平台二进制文件 → GitHub Release → npm `@pentoshi/clai` → Homebrew tap。 ``` # package.json 中的 "version" 是唯一的真相来源。 npm version 3.8.0 --no-git-tag-version npm run sync-version # refreshes version.generated.ts + install manifests + lockfile git commit -am "v3.8.0" && git push origin main git tag -a v3.8.0 -m "clai v3.8.0" && git push origin v3.8.0 ``` 机密信息:`NPM_TOKEN`,`TAP_GITHUB_TOKEN`。可选:`NPM_PROVENANCE=true`。 ## 架构 ``` clai/ ├─ src/ │ ├─ index.ts # CLI entry + subcommands │ ├─ agent/ # loop, plans, compaction, resume orientation, tool parsing │ ├─ llm/ # 12 providers, streaming, native tools, key rotation + fallback │ ├─ tools/ # fs, shell, net, http, web, pentest, batch, plan │ ├─ safety/ # risk classifier + engagement (scope) policy │ ├─ store/ # config, history, keys, plans, scope │ ├─ tui-v2/ # full-screen OpenTUI console (primary) │ ├─ app/ # session controllers, commands, events │ └─ prompts/ # agent methodology (embedded for the compiled binary) ├─ install/ · manifests/ └─ package.json ``` ## License MIT. **仅在你被授权测试的系统上使用。** clai 是操作员的工具:授权、范围和影响由你自行承担。agent 仅在你配置的门控和确认下执行操作——仅此而已。

标签:AI智能体, AI风险缓解, MITM代理, 代码辅助, 多模型集成, 密码管理, 暗色界面, 自动化任务, 自动化攻击