cynative/cynative
GitHub: cynative/cynative
Cynative 是一个默认只读、本地运行的 AI 研究 agent,用前沿模型对云基础设施、代码仓库和运行时进行交叉验证的深度分析。
Stars: 88 | Forks: 14
# Cynative - 针对基础设施的深度研究 agent
[](https://github.com/cynative/cynative/actions/workflows/ci.yaml)
[](https://github.com/cynative/cynative/releases/latest)
[](LICENSE)
**向你的基础设施提出任何问题。** Cynative 在你的代码、云和 runtime 中运行前沿模型——将 GitHub、GitLab、AWS、GCP、Azure 和 Kubernetes 作为一个系统进行推理——并返回经过验证的答案。
```
cynative "what in my cloud is publicly exposed that shouldn't be?"
```
它在一个临时的 sandbox 中编写并运行代码,并行查询你的 API,因此一个问题可以扇出到你的整个技术栈。每一个发现都会被交叉检查并追溯到其源头。
与编程 agent 和 MCP server 不同,它在构造上天生就是**只读的**:每一次调用在附加凭证*之前*都会被门控和授权——你可以放心地将其指向生产环境。
## 快速开始
安装并设置一个 LLM:
```
brew install cynative/tap/cynative
export CYNATIVE_LLM_PROVIDER=anthropic
export CYNATIVE_LLM_MODEL=claude-opus-4-8
export ANTHROPIC_API_KEY=...
```
然后给它任何研究任务——它会自动获取你 shell 中已有的凭证:
```
cynative -p "which IAM roles can escalate to admin?"
cynative -p "high-risk cloud permissions, trace each to the PR where it was granted"
cynative -p "cloud credentials leaked in source code and their current blast radius"
cynative "live cloud resources absent from IaC - drift" # starts an interactive session
```
## 它的特别之处
- **🔗 代码到 runtime**:将 GitHub、GitLab、AWS、GCP、Azure 和 Kubernetes 作为一个系统进行推理
- **🏠 自主可控**:使用你自己的模型在本地运行,完全在你的环境中
- **🚦 动作门控**:根据只读策略授权每一次调用
- **🧪 Sandbox**:生成并运行代码以进行大规模研究
- **✅ 有据可查**:交叉检查并验证每一个发现
## 带 MCP 的编程 agent 做不到这点吗?
| | 编程 agent + MCP | Cynative |
|---|---|---|
| 吞吐量 | 每次调用执行一个动作 | 编写在 sandbox 中运行的代码,并发扇出调用——消耗的 token 更少,获得答案更快 |
| 发现结果 | 未经验证的输出 | Verifier 会根据实时证据交叉检查每一个发现 |
| 只读 | 可选的读取过滤 | 默认开启,失败即关闭——将所需的 IAM 操作与安全审计策略进行比对检查。`secretsmanager:GetSecretValue` 是一种 IAM *读取*操作:过滤器会允许它,而 `SecurityAudit` 会阻止它 |
| 凭证 | 环境原有状态,保持不变 | STS 会话范围限定为只读——AWS 也会强制执行此边界 |
| 影响范围 | 你的 shell,任何网络 | 研究代码在 sandbox 中运行,无主机访问权限,网络被锁定到你映射的服务 |
| 密钥 | 按原样发送给模型 | 在发送给模型之前,已从工具输出中脱敏 |
| 供应链 | 使用你的凭证运行的第三方 MCP 和技能 | 单个开源二进制文件,内置 connector |
| 审计跟踪 | 分散的会话日志,尽力而为 | 每次工具调用的失败即关闭 JSONL 日志——如果无法记录,则中止运行 |
## 安装方式
**Homebrew**(macOS / Linux - 推荐):
```
brew install cynative/tap/cynative
```
**安装脚本**(macOS / Linux - 会根据 release 的 `checksums.txt` 验证下载文件的 SHA-256,失败即关闭):
```
curl -fsSL https://raw.githubusercontent.com/cynative/cynative/main/install.sh | sh
```
**Windows**(Scoop):
```
scoop bucket add cynative https://github.com/cynative/scoop-bucket
scoop install cynative
```
-target /` 进行安装(或双击)。这些包已经过签名、公证并被 **staple**——首次运行时不会出现 Gatekeeper 提示。原始的 `cynative_Darwin_*.tar.gz` 归档文件保留用于脚本/CI;处于隔离状态的 tarball 二进制文件首次 GUI 启动时需要联网进行在线公证检查(终端/`install.sh`/Homebrew 使用不受影响)。
**Linux / Windows(手动):** 从 [发布页面](https://github.com/cynative/cynative/releases) 下载预编译的二进制文件和 `checksums.txt`,验证 SHA-256,然后将二进制文件放入你的 `PATH` 中。单一静态二进制文件,无依赖。
## LLM 提供商
Cynative 通过内置的 [Bifrost](https://github.com/maximhq/bifrost) SDK 与 LLM 通信,并开箱即支持 23+ 家 AI 提供商(OpenAI、Anthropic、Azure OpenAI、Amazon Bedrock、Google Vertex/Gemini、Cohere、Mistral、Groq、Ollama、vLLM 等)。从 [docs/providers/README.md](docs/providers/README.md) 中选择一个,并按照该提供商的指南进行操作。
## 如何运行
不带参数运行 `cynative` 会开启一个交互式会话(支持使用方向键进行完整的行编辑和历史记录查看);运行 `cynative "任务"` 会执行该任务然后保持交互状态;`-p` / `--print` 会非交互式地运行单个任务并退出——适用于脚本和管道(例如 `cat main.tf | cynative -p "审查此 Terraform 配置是否有错误"`)。
Cynative 使用你 shell 中已有的凭证调用你的技术栈——它不保留单独的凭证存储。**请始终提供所需的最低权限、只读凭证**。
**审批:** 每次工具调用都会等待单次按键:`y` 运行一次,`a` 会清除该会话中针对*该工具*的所有后续调用(脚本在运行前仍会打印),其他任何按键都会拒绝。在没有控制终端的情况下,请使用 `--auto-approve`。
**任务中途停止:** 当任务正在运行时,按一次 **Esc** 或 **Ctrl-C** 可优雅地停止它(agent 会完成任何已经在运行的调用,然后停止并打印 `⏸ 已停止`)。当 agent 遇到重复的工具错误或拒绝时,它会自动停止,总结其遇到的阻碍,并要求提供缺失的信息。
Cynative 会向 **stderr** 打印一个简短的操作页脚(耗时、token 使用量)——重定向 stdout(`cynative -p "..." > out.txt`)可以保持捕获到的答案纯净。`--version` 会打印版本、提交、构建日期、Go 版本和平台。
`CYNATIVE_MAX_TOTAL_TOKENS` | 0(无限制) | 每个会话的 token 上限,由主循环、任务 sub-agent、常驻 verifier 和交互式跟进共享。 | | `max_iterations`
`CYNATIVE_MAX_ITERATIONS` | 32 | 每轮主循环调用工具的最大迭代次数。 | | `max_subagent_iterations`
`CYNATIVE_MAX_SUBAGENT_ITERATIONS` | 10 | 任务 sub-agent 内部的最大迭代次数。 | | `max_consecutive_failures`
`CYNATIVE_MAX_CONSECUTIVE_FAILURES` | 5 | 触发停止并总结之前的连续无进展工具调用次数(0 表示禁用)。 | | `sandbox_max_concurrency`
`CYNATIVE_SANDBOX_MAX_CONCURRENCY` | 16 | sandbox 内并发工具调用的最大数量。 | 发现验证(`verify_findings` 工具)会产生额外的模型调用——在任何产生发现的运行中都要为此预留预算。
## Connector
在 shell 中的凭证之上,Cynative 在三个层面强制执行只读权限:
- **网络** - 每个请求的主机都被固定到其映射的服务和区域,并且在连接之前会验证解析后的 IP——你的 agent 只能到达你的基础设施,除此之外哪儿也去不了。
- **动作门控** - 每个操作都会被解析为其所需的 IAM 操作(源自提供商自身的 API 定义),然后在附加任何凭证之前根据只读策略进行授权:`SecurityAudit`(AWS),`roles/viewer`(GCP),`Reader`(Azure)。覆盖率随着云 API 的增长而跟踪,并且门控会对其归类为写入的任何内容采取失败即关闭策略。对于 Kubernetes,策略是集群自身在 runtime 获取的 `view` RBAC 角色,并按请求强制执行。GitHub 和 GitLab 默认是只读的;在工作流需要的情况下,`connectors.{github,gitlab}.permissions` 设置可以允许在特定类别上进行写入,并在附加 token 之前按请求强制执行。即使在只读模式下,GitHub 的 secret-scanning endpoint 也会保持阻止状态,GitLab 的 GraphQL API 也会被拒绝。
- **凭证 (AWS)** - 对于代入角色身份,凭证会通过 STS `AssumeRole` 重新分发,范围限定为受管策略(默认为 `SecurityAudit`),因此 AWS IAM 也会强制执行此边界。IAM 用户和 root 身份使用其基础凭证运行,并受上述动作门控的限制。
Cynative 可连接 AWS、GCP、Azure、EKS/GKE/AKS、自管理的 Kubernetes、GitHub 和 GitLab。有关凭证发现、加固、限制和特定于 connector 的示例,请参阅 [docs/connectors/README.md](docs/connectors/README.md)。
## 代码执行与工具编排
对于批量工作——比如“检查每个公开的 S3 bucket”、“列出每个区域中的 EKS 集群”——Cynative 可以在 sandbox 中编写并运行 JavaScript,而不是一次发出一个工具调用。Agent 的工具(例如 `http_request`)作为 **async** JavaScript 函数暴露出来,因此它可以在代码中对调用进行循环、过滤和链接——并通过内置的 `mapConcurrent(items, fn, limit)` 助手(对于较小的固定集合则使用 `await Promise.all([...])`)并发运行独立的调用。
只有脚本 `console.log` 的内容才会返回给模型,从而保持研究的高效和 token 节约。
```
// Discover regions, then list EKS clusters in every region concurrently,
// following pagination - only the summary returns to the model.
const r = await http_request({
method: "GET",
url: "https://ec2.us-east-1.amazonaws.com/?Action=DescribeRegions&Version=2016-11-15",
auth_provider: "aws", aws_auth: { service: "ec2", region: "us-east-1" },
});
const regions = [...r.body.matchAll(/([^<]+)<\/regionName>/g)].map((m) => m[1]);
const all = await mapConcurrent(regions, async (region) => {
const clusters = [];
let token = null;
do {
const url = `https://eks.${region}.amazonaws.com/clusters` +
(token ? `?nextToken=${encodeURIComponent(token)}` : "");
const resp = await http_request({
method: "GET", url,
auth_provider: "aws", aws_auth: { service: "eks", region },
});
const body = JSON.parse(resp.body);
clusters.push(...body.clusters);
token = body.nextToken;
} while (token);
return { region, clusters };
});
console.log(JSON.stringify(all.filter((x) => x.clusters.length > 0), null, 2));
```
- **Async 并发**:工具函数返回 Promise——`await` 它们,使用 `mapConcurrent(items, fn, limit)`(有界、保序)对多个资源进行扇出,或者对于较小的固定集合使用 `await Promise.all([...])`。
- **结构化响应**:`http_request` 解析为 `{ status, statusText, headers, body }`;`body` 是原始字符串——对于 JSON API 使用 `JSON.parse(resp.body)`,对于 XML 则直接读取。
- **Sandbox 隔离**:脚本只能调用 Cynative 暴露的工具——它本身没有网络、文件系统或包访问权限。
- **你可以看到整个脚本**:每次 `code_execution` 调用都会在运行前完整展示以供审批(使用 `--auto-approve` 跳过;使用 `-v` 流式传输每个内部调用)。
- **会话内有状态**:在交互式会话期间,保存在 `globalThis` 上的值调用之间持久存在;顶层的 `let`/`const`/`var`/`function` 则限定于单次调用。
- **边界限制**:脚本在超时限制(默认为 120 秒)和输出大小上限下运行。
## 审计日志
每次工具调用都会记录到持久化的 JSONL 审计日志中(`~/.cynative/audit.log`,默认开启)。该日志采用失败即关闭机制:如果无法记录某次调用,则运行中止。
工具结果在写入之前会进行脱敏,但审批提示参数会按原样存储——该日志可能包含敏感值。它只能由运行 Cynative 的用户读取。轮转和保留期限是可配置的。
在 `~/.cynative/config.yaml` 的 `audit:` 下进行配置,或通过环境变量:
| 键 | 环境变量 | 默认值 |
|---|---|---|
| `audit.enabled` | `CYNATIVE_AUDIT_ENABLED` | `true` |
| `audit.path` | `CYNATIVE_AUDIT_PATH` | `~/.cynative/audit.log` |
| `audit.max_size_mb` | `CYNATIVE_AUDIT_MAX_SIZE_MB` | `100` |
| `audit.retention_days` | `CYNATIVE_AUDIT_RETENTION_DAYS` | `30` |
| `audit.compress` | `CYNATIVE_AUDIT_COMPRESS` | `false` |
## 贡献
欢迎贡献——包括新的 connector、provider、评估数据集以及各个方面的改进。请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解开发设置、`make check` 门控和 PR 约定,并参阅 [SECURITY.md](SECURITY.md) 报告漏洞。
## 许可证
Apache-2.0 许可证。完整文本请参见 [LICENSE](LICENSE)。
更新、卸载、Windows 详情、版本固定和手动下载
**更新 / 卸载** | 方法 | 更新 | 卸载 | |---|---|---| | Homebrew | `brew upgrade cynative` | `brew uninstall cynative` | | 安装脚本 | 重新运行单行命令 | `curl -fsSL https://raw.githubusercontent.com/cynative/cynative/main/install.sh \| sh -s -- --uninstall` | | Scoop | `scoop update cynative` | `scoop uninstall cynative` | **Windows(PowerShell 脚本):** `irm https://raw.githubusercontent.com/cynative/cynative/main/install.ps1 | iex`;卸载命令为 `& ([scriptblock]::Create((irm https://raw.githubusercontent.com/cynative/cynative/main/install.ps1))) -Uninstall`。 **安装脚本选项:** 使用 `CYNATIVE_VERSION=v1.0.0` 固定版本;使用 `CYNATIVE_INSTALL_DIR` 更改目标目录(默认为 `~/.local/bin`,无需 `sudo`)。如果安装了 `gh`,脚本会检查 GitHub release 证明(默认为咨询性质);设置 `CYNATIVE_REQUIRE_ATTESTATION=1` 可使检查失败变为致命错误。对于高完整性安装,请从不可变 tag 而不是 `main` 获取脚本。 **macOS(手动):** 从 [发布页面](https://github.com/cynative/cynative/releases) 下载 `cynative_Darwin_arm64.pkg`(Apple Silicon)或 `cynative_Darwin_x86_64.pkg`(Intel),并使用 `sudo installer -pkg快速示例
``` # Google Vertex export CYNATIVE_LLM_PROVIDER=vertex export CYNATIVE_LLM_MODEL=gemini-3.1-pro-preview export CYNATIVE_LLM_VERTEX_PROJECT_ID=my-gcp-project export CYNATIVE_LLM_VERTEX_REGION=global # CI / 无 gcloud: export GOOGLE_APPLICATION_CREDENTIALS=/path/to/sa.json # OpenAI export CYNATIVE_LLM_PROVIDER=openai export CYNATIVE_LLM_MODEL=gpt-5.5 export OPENAI_API_KEY=sk-... # Amazon Bedrock - AWS credential chain export CYNATIVE_LLM_PROVIDER=bedrock export CYNATIVE_LLM_MODEL=anthropic.claude-opus-4-8 export CYNATIVE_LLM_BEDROCK_REGION=us-east-1 # Azure OpenAI - 通过 env 设置 endpoint,无需 YAML export CYNATIVE_LLM_PROVIDER=azure export CYNATIVE_LLM_MODEL=my-gpt-5.5-prod-deployment export AZURE_OPENAI_API_KEY=... export CYNATIVE_LLM_AZURE_ENDPOINT=https://my-resource.openai.azure.com # 本地 Ollama export CYNATIVE_LLM_PROVIDER=ollama export CYNATIVE_LLM_MODEL=nemotron-cascade-2 export CYNATIVE_LLM_OLLAMA_URL=http://localhost:11434 ```高级 YAML
对于多密钥负载均衡、自定义重试行为、代理配置或任何其他 Bifrost 功能,请编写一个 YAML 文件: ``` llm: provider: openai model: gpt-5.5 api_key: env.OPENAI_API_KEY network_config: # common fields shown; see schemas.NetworkConfig for the full set base_url: https://my-proxy.example.com/v1 default_request_timeout_in_seconds: 60 max_retries: 3 extra_headers: x-tenant: prod ``` 请参阅 [docs/providers/](docs/providers/) 获取每个受支持提供商的配置参考。用于无人值守运行的资源与成本控制
**资源与成本控制:** 对于无人值守、计划内或长周期的运行——接入 cron、CI 或任何触发器——请明确限制工作量。关键配置项(配置键 / 环境变量): | 配置键 / 环境变量 | 默认值 | 效果 | | --- | --- | --- | | `max_total_tokens``CYNATIVE_MAX_TOTAL_TOKENS` | 0(无限制) | 每个会话的 token 上限,由主循环、任务 sub-agent、常驻 verifier 和交互式跟进共享。 | | `max_iterations`
`CYNATIVE_MAX_ITERATIONS` | 32 | 每轮主循环调用工具的最大迭代次数。 | | `max_subagent_iterations`
`CYNATIVE_MAX_SUBAGENT_ITERATIONS` | 10 | 任务 sub-agent 内部的最大迭代次数。 | | `max_consecutive_failures`
`CYNATIVE_MAX_CONSECUTIVE_FAILURES` | 5 | 触发停止并总结之前的连续无进展工具调用次数(0 表示禁用)。 | | `sandbox_max_concurrency`
`CYNATIVE_SANDBOX_MAX_CONCURRENCY` | 16 | sandbox 内并发工具调用的最大数量。 | 发现验证(`verify_findings` 工具)会产生额外的模型调用——在任何产生发现的运行中都要为此预留预算。
标签:AI智能体, EVTX分析, 人工智能, 基础设施审计, 多云管理, 日志审计, 用户模式Hook绕过