Skip to content

myysophia/cli-agent

Repository files navigation

CLI Gateway

一个极简的 Go HTTP 网关服务,将 HTTP 请求桥接到多种 AI CLI 工具。通过统一的 HTTP 接口调用各种 CLI 的无头模式,让任何支持 HTTP 的应用(Web 应用、移动端、IoT 设备等)都能使用这些 CLI 的强大能力。

系统架构图

集成dify,实现多轮对话Agent.

集成bisheng,实现多轮对话Agent.

核心特性

  • 🌐 通用 HTTP 接口:任何能发起 HTTP 请求的客户端都可以使用
  • 🚀 流式输出支持:支持 SSE (Server-Sent Events) 实时流式响应
  • 🔌 多 CLI 集成:统一接口调用 Claude、Codex、Cursor、Gemini、Qwen 等
  • 🛠️ MCP 工具链:支持 WebFetch、Playwright 等扩展工具
  • 📦 开箱即用:无需复杂配置,快速部署到任何环境

支持的 CLI 工具

CLI 说明 模型示例
claude Anthropic Claude Code CLI claude-sonnet-4, 支持第三方 API
codex OpenAI Codex CLI gpt-5.1
cursor Cursor Agent CLI auto, gpt-5, sonnet-4
gemini Google Gemini CLI gemini-2.5-pro, gemini-2.5-flash
qwen 阿里 Qwen Code CLI qwen3-max

功能特性

CLI 调用功能

  • 提供 HTTP POST 接口 /invoke/chat 接收对话请求
  • 自动将对话历史转换为 CLI 的 prompt 格式
  • 支持系统提示词(system prompt)
  • 支持 5 种 CLI 工具(Claude、Codex、Cursor、Gemini、Qwen)

Release Notes 功能

  • 📋 API 接口:获取各 CLI 工具的版本更新信息
    • GET /release-notes - 获取所有 CLI 的 release notes
    • GET /release-notes/{cli_name} - 获取指定 CLI 的 release notes
  • 🎨 HTML 可视化界面/release-notes/view
    • 标签式界面,支持搜索和过滤
    • Markdown 渲染,自动链接 GitHub issues/PRs
    • 版本对比,显示本地版本和最新版本
  • 🔄 自动刷新:定时从外部源获取最新数据(默认 1 小时)
  • 💾 缓存机制:内存缓存 + 文件持久化
  • 只显示正式版本:自动过滤 alpha、beta、nightly、preview 等版本

Admin UI 后台管理

  • 🧭 统一入口/v1/admin(默认)
  • 🔐 Token 认证:仅支持 Token 访问(Header / Query / Cookie)
  • 🧩 内置前端:Next.js 静态导出,Go embed 内置资源
  • 🔧 可选外部静态目录:通过 ADMIN_UI_STATIC_DIR 指定本地构建产物

Cursor Agent CI 集成

  • 🤖 自动化测试:使用 Cursor Agent CLI 进行 AI 驱动的代码分析
  • 📊 定时运行:每天自动运行测试任务
  • 🔧 MCP 工具支持:集成 filesystem、fetch 等 MCP 服务器
  • 📝 测试报告:自动生成并上传测试报告

详细配置请查看:Cursor Agent CI 指南

项目结构

cli-agent/
├── cmd/
│   └── server/
│       └── main.go               # 主入口
├── internal/                     # 私有应用代码
│   ├── cli/                      # CLI 工具接口和实现
│   │   ├── interface.go         # CLI 接口定义
│   │   ├── factory.go           # CLI 工厂
│   │   ├── claude.go            # Claude CLI 实现
│   │   ├── cursor.go            # Cursor CLI 实现
│   │   ├── codex.go             # Codex CLI 实现
│   │   ├── gemini.go            # Gemini CLI 实现
│   │   └── qwen.go              # Qwen CLI 实现
│   ├── handler/                  # HTTP 处理器
│   │   ├── handler.go           # 通用处理器
│   │   ├── claude.go            # Claude 处理器
│   │   ├── release_notes_handler.go  # Release Notes API 处理器
│   │   ├── config.go            # 配置管理
│   │   └── types.go             # 类型定义
│   └── release_notes/            # Release Notes 功能模块
│       ├── *_fetcher.go         # 各 CLI 的数据获取器
│       ├── cache.go             # 缓存层
│       ├── storage.go           # 持久化存储
│       ├── service.go           # 核心服务
│       ├── types.go             # 类型定义
│       └── *_test.go            # 测试文件(含 Property-Based Tests)
├── web/
│   └── templates/
│       └── release_notes.html   # Release Notes 查看器
├── configs/                      # 配置文件
│   ├── configs.json             # 当前配置
├── scripts/                      # 工具脚本
├── docs/                         # 文档
│   ├── CHANGELOG.md             # 更新日志
│   └── SKILLS.md                # 技能文档
├── data/                         # 数据文件
├── logs/                         # 日志文件
└── .kiro/specs/                  # 功能规格文档
  • 支持 Claude Skills(访问本地文件和目录)
  • 支持 MCP 工具调用(WebFetch、Playwright 等)
  • 支持会话管理(session_id 和 resume)
  • 调用 CLI 无头模式获取响应
  • 返回 JSON 格式的结果
  • 支持多配置 profile 管理
  • 自动日志记录(按日期分文件)

使用场景

  • 🌐 Web 应用集成:为前端应用提供 AI 能力,支持实时流式响应
  • 📱 移动端接入:iOS/Android 应用通过 HTTP 调用 AI 服务
  • 🤖 工作流平台:Dify、n8n、Zapier 等低代码平台的自定义节点
  • 🔧 自动化脚本:CI/CD、定时任务、批处理中调用 AI
  • 🏠 IoT 设备:智能家居、边缘计算设备的 AI 接口
  • 🧪 本地开发测试:快速搭建本地 AI API 服务进行原型验证
  • 📊 数据处理管道:ETL 流程中的智能数据分析和转换

前置要求

  1. Go 环境: Go 1.16 或更高版本
  2. CLI 工具: 至少安装并配置好以下一种 CLI:
    • claude - Anthropic Claude Code CLI
    • codex - OpenAI Codex CLI
    • cursor-agent - Cursor Agent CLI
    • gemini - Google Gemini CLI
    • qwen - 阿里 Qwen Code CLI

快速开始

1. 构建项目

# 初始化 Go module(如果还没有)
go mod init claude-cli-gateway

# 构建可执行文件
go build -o claude-cli-gateway

2. 启动服务

# 方式一:使用启动脚本(推荐)
./start.sh                    # 默认端口 8080
./start.sh -p 3000           # 自定义端口 3000
./start.sh --skip-admin-ui   # 跳过 Admin UI 构建

# 方式二:使用环境变量
PORT=9000 ./start.sh         # 端口 9000
ADMIN_UI_BUILD=0 ./start.sh  # 跳过 Admin UI 构建

# 方式三:直接运行
./claude-cli-gateway           # 使用配置文件或默认端口
./claude-cli-gateway -c ./configs/configs.json  # 指定 configs.json 路径
PORT=3000 ./claude-cli-gateway  # 环境变量指定端口

服务将在 http://localhost:8080 启动(或你指定的端口)。

端口配置优先级: 环境变量 > 配置文件 > 默认值(8080)

详细配置请查看:端口配置指南

Admin UI 启动与构建

  • Admin UI 默认挂载在 http://localhost:8080/v1/admin
  • start.sh 默认会执行 ./scripts/build-admin-ui.sh 并重新构建 Go 二进制
  • 如需跳过 Admin UI 构建,可使用 --skip-admin-uiADMIN_UI_BUILD=0

Admin UI 配置管理 API

Admin UI 提供配置查询与热加载接口(已脱敏,不会回传敏感值)。

  • GET /v1/admin/api/config:获取当前 configs.json(脱敏)
  • POST /v1/admin/api/config:更新配置并热加载(完整 JSON)
  • POST /v1/admin/api/config/reload:从磁盘重新加载配置

注意:serverrelease_notesadmin_ui.base_path/static_dir 等变更仍需重启生效。

MCP 配置管理(Cursor)

Admin UI 支持管理 Cursor/Claude MCP 配置。

Cursor(默认读取 ~/.cursor/mcp.json):

  • GET /v1/admin/api/mcp/cursor:获取 MCP Servers 列表(env 脱敏)
  • POST /v1/admin/api/mcp/cursor:新增 MCP Server
  • PUT /v1/admin/api/mcp/cursor/{name}:更新 MCP Server
  • DELETE /v1/admin/api/mcp/cursor/{name}:删除 MCP Server

Claude(默认读取 ~/.claude/settings.json):

  • GET /v1/admin/api/mcp/claude:获取 MCP Servers 列表(env 脱敏)
  • POST /v1/admin/api/mcp/claude:新增 MCP Server
  • PUT /v1/admin/api/mcp/claude/{name}:更新 MCP Server
  • DELETE /v1/admin/api/mcp/claude/{name}:删除 MCP Server

支持通过环境变量指定路径:

ADMIN_MCP_CURSOR_PATH=/path/to/mcp.json
CURSOR_MCP_PATH=/path/to/mcp.json
ADMIN_MCP_CLAUDE_PATH=/path/to/settings.json
CLAUDE_MCP_PATH=/path/to/settings.json

Docker 部署

镜像默认使用 configs/configs.json 作为配置文件,建议通过挂载自定义配置覆盖。 镜像内置安装 Claude Code、Codex 与 Cursor Agent(最新版本)。

构建镜像

docker build -t dify-cli-gateway:local .

运行容器

# 挂载自定义配置文件(推荐)
docker run --rm -p 8080:8080 \
  -v "$(pwd)/configs.json:/app/configs.json:ro" \
  dify-cli-gateway:local

# 仅使用环境变量(不提供 configs.json)
docker run --rm -p 8080:8080 \
  -e PORT=8080 \
  dify-cli-gateway:local

MCP 与 Skills 挂载

容器内默认使用以下路径读取 MCP 配置:

  • Cursor Agent: /home/app/.cursor/mcp.json
  • Claude CLI: /home/app/.claude/settings.json
  • Codex CLI: /home/app/.codex/config.toml

容器内已安装 MCP 运行时依赖:

  • uv/uvx(用于 mcp-server-fetchmcp-server-filesystem 等)
  • python3
  • nodejs/npx(用于 @playwright/mcp 等)

建议把主机配置目录挂载进去,并把 Skills 目录也挂载到 /app 下:

docker run --rm -p 8080:8080 \
  -v "$(pwd)/configs.json:/app/configs.json:ro" \
  -v "$HOME/.cursor:/home/app/.cursor:ro" \
  -v "$HOME/.cursor-agent:/home/app/.cursor-agent:ro" \
  -v "$HOME/.claude:/home/app/.claude:ro" \
  -v "$HOME/.codex:/home/app/.codex:ro" \
  -v "$(pwd)/skills:/app/skills:ro" \
  dify-cli-gateway:local

configs.jsonskills 字段中请使用容器内路径,例如:/app/skills/app/reporter

为防止泄露敏感信息,网关会自动屏蔽包含 configs.json 的 skills 路径(例如 ./app)。 请将 skills 指向更精确的子目录(如 /app/skills/app/reporter/app/docs)。

GitHub Actions 自动构建镜像

默认推送到 ghcr.io/<owner>/<repo>,需要在仓库设置中开启 Packages 写权限。

3. 测试接口

使用 curl 测试:

curl -X POST http://localhost:8080/invoke \
  -H "Content-Type: application/json" \
  -d '{
    "system": "你是一个有帮助的助手",
    "messages": [
      {"role": "user", "content": "什么是 Go 语言?"}
    ]
  }'

预期响应:

{
  "answer": "Go 是 Google 开发的一种静态类型、编译型编程语言..."
}

API 文档

POST /invoke

调用 Claude CLI 获取模型响应(适用于多轮对话)。

请求格式:

{
  "profile": "配置名称(可选,默认使用 configs.json 中的 default)",
  "cli": "CLI 工具名称(可选,'claude' 或 'codex')",
  "system": "系统提示词(可选)",
  "messages": [
    {"role": "user", "content": "用户消息"},
    {"role": "assistant", "content": "助手回复"},
    {"role": "user", "content": "用户继续提问"}
  ]
}

字段说明:

  • profile (string, 可选): 指定使用的配置 profile(如 "cursor", "gemini", "codex")
  • cli (string, 可选): CLI 工具名称("claude", "codex", "cursor", "gemini", "qwen")
  • system (string, 可选): 系统提示词,用于设定 AI 的行为和角色
  • messages (array, 必需): 对话历史消息列表
    • role (string): 消息角色,可选值 "user""assistant"
    • content (string): 消息内容

成功响应 (200 OK):

{
  "answer": "{\"session_id\":\"xxx\",\"user\":\"问题\",\"codex\":\"回答内容\"}"
}

POST /chat

简化的聊天接口(推荐使用),支持流式和非流式输出。

请求格式:

{
  "profile": "配置名称(可选)",
  "cli": "CLI 工具名称(可选)",
  "prompt": "你的问题",
  "system": "系统提示词(可选)",
  "session_id": "会话ID(可选,用于继续对话)",
  "new_session": false,
  "allowed_tools": ["WebFetch", "playwright"],
  "permission_mode": "bypassPermissions",
  "stream": false
}

字段说明:

  • profile (string, 可选): 指定使用的配置 profile
  • cli (string, 可选): CLI 工具名称("claude", "codex", "cursor", "gemini", "qwen")
  • prompt (string, 必需): 用户问题或指令
  • system (string, 可选): 系统提示词
  • session_id (string, 可选): 会话 ID,用于继续之前的对话
  • new_session (boolean, 可选): 是否创建新会话(默认 false)
  • allowed_tools (array, 可选): 允许使用的 MCP 工具列表
  • permission_mode (string, 可选): 权限模式("bypassPermissions" 自动授权)
  • stream (boolean, 可选): 是否启用流式输出(默认 false)

非流式响应 (200 OK):

{
  "answer": "{\"session_id\":\"xxx\",\"user\":\"问题\",\"codex\":\"回答内容\"}"
}

流式响应 (SSE 格式):

stream: true 时,响应为 Server-Sent Events (SSE) 流:

Content-Type: text/event-stream

data: {"type":"start","session_id":"xxx"}

data: {"type":"content","text":"这是"}

data: {"type":"content","text":"流式"}

data: {"type":"content","text":"输出"}

data: {"type":"done"}

流式输出示例:

# 使用 curl 接收流式输出
curl -N -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "写一首诗",
    "stream": true
  }'

错误响应:

  • 400 Bad Request: JSON 格式错误

    {"error": "Invalid JSON request body"}
  • 405 Method Not Allowed: 使用了非 POST 方法

    {"error": "Method not allowed"}
  • 500 Internal Server Error: Claude CLI 执行失败

    {"error": "claude CLI execution failed: ..."}

配置说明

基本配置

  • 端口: 8080
  • Claude CLI 工具: WebSearch(固定启用)
  • 输出格式: JSON
  • 日志: 自动记录到 logs/ 目录,按日期分文件(如 logs/2025-11-18.log

多配置支持

网关支持多个 Claude API 配置(MiniMax、智谱 GLM、Kimi 等),通过 configs.json 文件管理。

配置文件格式

创建 configs.json 文件(敏感信息请改为 .env 变量占位符):

{
  "profiles": {
    "minimax": {
      "name": "MiniMax",
      "env": {
        "ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
        "ANTHROPIC_AUTH_TOKEN": "${MINIMAX_ANTHROPIC_AUTH_TOKEN}",
        "ANTHROPIC_MODEL": "MiniMax-M2"
      }
    },
    "glm": {
      "name": "智谱 GLM",
      "env": {
        "ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic",
        "ANTHROPIC_AUTH_TOKEN": "${GLM_ANTHROPIC_AUTH_TOKEN}"
      }
    },
    "qwen": {
      "name": "阿里百炼 Qwen",
      "cli": "claude",
      "env": {
        "ANTHROPIC_API_KEY": "${QWEN_ANTHROPIC_API_KEY}",
        "ANTHROPIC_BASE_URL": "https://dashscope.aliyuncs.com/apps/anthropic",
        "ANTHROPIC_MODEL": "qwen3-max",
        "ANTHROPIC_SMALL_FAST_MODEL": "qwen-flash"
      }
    }
  },
  "default": "minimax"
}

支持自动加载项目根目录的 .env 文件(不会覆盖已存在的环境变量)。

可通过环境变量指定配置文件路径:

CONFIG_PATH=/path/to/configs.json ./start.sh

配置字段说明

  • name: Profile 的显示名称
  • cli: 使用的 CLI 工具("claude", "codex", "cursor", "gemini", "qwen")
  • model: 模型名称(可选,如 "gpt-5.1", "sonnet-4", "gemini-2.5-pro")
  • allowed_tools: 允许使用的 MCP 工具列表(可选,仅 Claude CLI 支持)
  • skills: Claude Skills 列表(可选,仅 Claude CLI 支持)
    • 可以是目录路径或文件路径
    • Claude 会读取这些路径下的内容作为上下文
    • 支持多个 skill 路径
  • env: 环境变量配置
    • ANTHROPIC_API_KEYANTHROPIC_AUTH_TOKEN: API 密钥
    • ANTHROPIC_BASE_URL: API 端点地址
    • ANTHROPIC_MODEL: 默认模型
    • ANTHROPIC_SMALL_FAST_MODEL: 快速模型(可选)

workflow_session 配置(可选)

用于将 workflow_run_id 映射到 session_id 并支持并发安全。推荐在多实例部署时启用 Redis。

{
  "workflow_session": {
    "mapping_ttl_minutes": 1440,
    "lock_ttl_ms": 120000,
    "lock_wait_timeout_ms": 120000,
    "lock_retry_interval_ms": 200,
    "redis": {
      "addr": "127.0.0.1:6379",
      "username": "",
      "password": "",
      "db": 0,
      "dial_timeout_ms": 5000,
      "read_timeout_ms": 3000,
      "write_timeout_ms": 3000,
      "pool_size": 10
    }
  }
}
  • mapping_ttl_minutes: 映射保活时间(分钟)
  • lock_ttl_ms: 锁 TTL(毫秒),需覆盖创建会话耗时
  • lock_wait_timeout_ms: 获取锁失败后的最大等待(毫秒)
  • lock_retry_interval_ms: 等待期间轮询间隔(毫秒)
  • redis: Redis 连接配置

Redis 不可用时会自动回退到进程内存存储(仅对单实例有效)。

admin_ui 配置(可选)

用于启用内置 Admin UI,建议使用 Token 保护访问。

{
  "admin_ui": {
    "enabled": true,
    "token": "your-admin-token",
    "base_path": "/v1/admin",
    "static_dir": "",
    "cache_max_age_seconds": 3600
  }
}
  • enabled: 是否启用后台 UI(可选,未设置时会根据 token 自动开启)
  • token: 访问 Token(必填,空则强制禁用)
  • base_path: 路由前缀(默认 /v1/admin
  • static_dir: 本地静态资源目录(可选,优先于 embed)
  • cache_max_age_seconds: 静态资源缓存秒数(默认 3600)

支持环境变量覆盖:

ADMIN_UI_ENABLED=true
ADMIN_UI_TOKEN=your-admin-token
ADMIN_UI_BASE_PATH=/v1/admin
ADMIN_UI_STATIC_DIR=/path/to/admin-ui/out
ADMIN_UI_CACHE_MAX_AGE=3600

Claude Skills 配置示例

Claude Skills 允许 Claude 访问本地文件和目录,提升回复质量。例如,让 Claude 读取你的研究报告:

{
  "profiles": {
    "qwen-with-reports": {
      "name": "Qwen with Research Reports",
      "cli": "claude",
      "skills": [
        "./reporter",
        "./docs/research"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "your-api-key",
        "ANTHROPIC_BASE_URL": "https://dashscope.aliyuncs.com/apps/anthropic",
        "ANTHROPIC_MODEL": "qwen3-max"
      }
    }
  }
}

使用 Skills

# Claude 会自动读取 ./reporter 目录下的文件作为上下文
curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "根据研究报告,总结最新的技术趋势",
    "profile": "qwen-with-reports"
  }'

Skills 说明

  • Skills 路径可以是相对路径或绝对路径
  • 支持目录(会递归读取)和单个文件
  • Claude 会将这些文件内容作为上下文,提升回复的准确性
  • 适合场景:研究报告、文档库、代码库等

原生 CLI 配置示例

以下是各种原生 CLI 工具的配置示例:

{
  "profiles": {
    "codex": {
      "name": "OpenAI Codex (GPT-5.1)",
      "cli": "codex",
      "env": {}
    },
    "cursor": {
      "name": "Cursor Agent",
      "cli": "cursor",
      "model": "auto",
      "env": {}
    },
    "cursor-gpt5": {
      "name": "Cursor Agent (GPT-5)",
      "cli": "cursor",
      "model": "gpt-5",
      "env": {}
    },
    "gemini": {
      "name": "Google Gemini",
      "cli": "gemini",
      "env": {}
    },
    "gemini-pro": {
      "name": "Gemini 2.5 Pro",
      "cli": "gemini",
      "model": "gemini-2.5-pro",
      "env": {}
    },
    "qwen-cli": {
      "name": "Qwen Code CLI",
      "cli": "qwen",
      "env": {}
    }
  },
  "default": "cursor"
}

使用示例

# 使用 Cursor Agent
curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{"prompt": "写一个 Python 快速排序", "profile": "cursor"}'

# 使用 Gemini
curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{"prompt": "解释量子计算", "profile": "gemini-pro"}'

# 使用 Codex
curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{"prompt": "分析这段代码", "profile": "codex"}'

# 使用 Qwen CLI
curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{"prompt": "你好", "profile": "qwen-cli"}'

注意

  • 各 CLI 需要预先在本地配置好认证
  • Codex: codex login
  • Cursor: cursor-agent login
  • Gemini: 使用 Google 账号认证
  • Qwen: 使用阿里云账号认证

使用不同配置

在请求中指定 profile 字段:

# 使用 MiniMax
curl -X POST http://localhost:8080/invoke \
  -H "Content-Type: application/json" \
  -d '{
    "profile": "minimax",
    "system": "你是一个助手",
    "messages": [{"role": "user", "content": "你好"}]
  }'

# 使用智谱 GLM
curl -X POST http://localhost:8080/invoke \
  -H "Content-Type: application/json" \
  -d '{
    "profile": "glm",
    "system": "你是一个助手",
    "messages": [{"role": "user", "content": "你好"}]
  }'

# 不指定 profile,使用默认配置
curl -X POST http://localhost:8080/invoke \
  -H "Content-Type: application/json" \
  -d '{
    "system": "你是一个助手",
    "messages": [{"role": "user", "content": "你好"}]
  }'

http 多轮会话

❯ curl -s -X POST http://localhost:8081/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"今天的全球财经快讯哪些指的关注","profile":"cursor"}'
{"answer":"{\"session_id\":\"fb6e56b6-552b-418b-9f3b-c695353e3a80\",\"user\":\"今天的全球财经快讯哪些指的关注\",\"response\":\"我来帮你获取今天的全球财经快讯。根据今天的全球财经快讯,以下几条新闻特别值得关注:\\n\\n## 🔴 重点关注\\n\\n### 1. **OpenAI数据中心合作伙伴累积千亿美元债务**\\n- OpenAI的数据中心合作伙伴(软银、甲骨文、CoreWeave等)已借贷至少**300亿美元**\\n- Blue Owl Capital等公司还依赖与OpenAI的交易偿还约**280亿美元**贷款\\n- 银行集团正洽谈**380亿美元**新贷款给甲骨文和Vantage\\n- **影响**:AI基础设施建设的高额债务风险值得警惕\\n\\n### 2. **印度卢比创历史新低**\\n- 印度卢比兑美元跌至**89.4812**,触及纪录低点\\n- **影响**:新兴市场货币压力,可能影响全球资金流向\\n\\n### 3. **日本财政扩张**\\n- 日本内阁批准**1170亿美元**额外预算\\n- 2025财年国债发行规模提高**6.3万亿日元**\\n- **影响**:日本持续扩大财政刺激,或影响日元走势\\n\\n### 4. **韩国政局动荡**\\n- 韩国前国家情报院院长因紧急戒严事件被起诉\\n- **影响**:地缘政治风险,可能影响韩国市场稳定性\\n\\n## 📊 中国市场动态\\n\\n- **ETF成交活跃**:两市ETF成交额超**3500亿元**\\n- **板块表现**:\\n  - 电网设备板块走强(伊戈尔涨停)\\n  - 商业航天板块拉升(航天发展触及涨停)\\n  - 福建板块持续走强\\n\\n## 🏭 科技动态\\n\\n- **6G技术**:中信科移动完成IMT-2030推进组四项6G无线技术测试\\n- **新能源电池**:3D复合集流体技术精准适配固态电池应用场景\\n\\n**建议重点关注**:AI基础设施投资风险、新兴市场货币波动以及日本财政扩张对全球利率的影响。\"}"}

cli-agent on  main [!?] via 🐹 v1.24.1 on ☁️  (eu-central-1) took 30s 
❯ 

cli-agent on  main [!+?] via 🐹 v1.24.1 on ☁️  (eu-central-1) 
❯ curl -s -X POST http://localhost:8081/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"推荐A股固态电池相关股票","profile":"cursor","session_id":"fb6e56b6-552b-418b-9f3b-c695353e3a80"}'
{"answer":"{\"session_id\":\"fb6e56b6-552b-418b-9f3b-c695353e3a80\",\"user\":\"推荐A股固态电池相关股票\",\"response\":\"我来帮你分析A股固态电池相关的股票。让我先查询几家重点公司的信息和走势。让我直接用股票代码查询这些固态电池概念股:虽然查询工具暂时无法获取实时数据,但我可以根据行业分析为你推荐A股固态电池相关的重点股票:\\n\\n## 🔋 A股固态电池概念股推荐\\n\\n### 一、**龙头企业**\\n\\n#### 1. **宁德时代(300750)** ⭐⭐⭐⭐⭐\\n- **优势**:动力电池绝对龙头,布局全固态电池研发\\n- **技术**:已发布凝聚态电池(半固态),能量密度500Wh/kg\\n- **推荐理由**:资金实力雄厚,技术储备深厚,产业链话语权强\\n\\n#### 2. **赣锋锂业(002460)** ⭐⭐⭐⭐⭐\\n- **优势**:全球锂资源龙头,固态电池先行者\\n- **技术**:已建成第一代固态锂电池生产线,与多家车企合作\\n- **推荐理由**:上游资源+固态电池双重属性,业务协同性强\\n\\n### 二、**技术突破型**\\n\\n#### 3. **卫蓝新能(688226)** ⭐⭐⭐⭐\\n- **优势**:专注固态电池的科创板公司\\n- **技术**:固态电解质技术领先,已批量供应蔚来ET7\\n- **推荐理由**:纯正固态电池标的,技术路线清晰\\n\\n#### 4. **孚能科技(688567)** ⭐⭐⭐⭐\\n- **优势**:软包电池技术优势明显\\n- **技术**:布局半固态及全固态电池研发\\n- **推荐理由**:软包技术路线更适合固态化\\n\\n### 三、**材料供应商**(今日快讯重点)\\n\\n#### 5. **三孚新科(688359)** ⭐⭐⭐⭐\\n- **优势**:刚发布3D复合集流体新品(今日新闻)\\n- **技术**:3D复合集流体精准适配固态电池应用\\n- **推荐理由**:**催化剂明确**,技术创新获行业认可\\n\\n#### 6. **当升科技(300073)** ⭐⭐⭐\\n- **优势**:正极材料龙头\\n- **技术**:高镍三元材料适配高能量密度固态电池\\n- **推荐理由**:材料端受益于固态电池产业化\\n\\n#### 7. **天赐材料(002709)** ⭐⭐⭐\\n- **优势**:电解液龙头,布局固态电解质\\n- **技术**:研发硫化物固态电解质\\n- **推荐理由**:从液态向固态转型的材料供应商\\n\\n### 四、**产业链配套**\\n\\n#### 8. **珈伟新能(300317)** ⭐⭐⭐\\n- **优势**:储能+固态电池双布局\\n- **技术**:与中科院合作开发固态电池\\n- **推荐理由**:小市值弹性大\\n\\n#### 9. **国轩高科(002074)** ⭐⭐⭐\\n- **优势**:磷酸铁锂+半固态电池\\n- **技术**:360Wh/kg半固态电池已装车\\n- **推荐理由**:技术路线稳健,成本控制能力强\\n\\n## 📊 投资策略建议\\n\\n### 🎯 **短期(1-3个月)**\\n**推荐:三孚新科(688359)**\\n- 理由:今日发布新品,有明确催化剂,市场关注度高\\n- 风险:科创板波动大,注意止损\\n\\n### 📈 **中期(3-6个月)**\\n**推荐:卫蓝新能(688226)+ 孚能科技(688567)**\\n- 理由:固态电池产业化加速,纯正标的受益明显\\n- 风险:新能源车销量波动影响\\n\\n### 🏆 **长期(6-12个月)**\\n**推荐:宁德时代(300750)+ 赣锋锂业(002460)**\\n- 理由:龙头地位稳固,技术储备充足,长期受益产业升级\\n- 风险:估值较高,注意回调风险\\n\\n## ⚠️ 风险提示\\n\\n1. **技术风险**:固态电池尚未大规模产业化,技术路线存在不确定性\\n2. **市场风险**:新能源车行业竞争加剧,补贴退坡\\n3. **估值风险**:概念股估值普遍偏高,警惕泡沫\\n4. **产业化进度**:全固态电池商业化可能要到2027-2030年\\n\\n## 💡 操作建议\\n\\n- **建议分散配置**:龙头(40%) + 技术突破型(30%) + 材料商(30%)\\n- **关注催化剂**:产品发布、订单公告、技术突破新闻\\n- **仓位控制**:建议不超过总仓位的20-30%\\n- **止损策略**:单只个股跌破10%及时止损\\n\\n**今日特别关注**:三孚新科3D复合集流体新品发布,短期可能有交易性机会!\"}"}

日志功能

服务启动后会自动:

  • 创建 logs/ 目录
  • 按日期生成日志文件(格式:YYYY-MM-DD.log
  • 同时输出到控制台和文件
  • 记录所有请求、响应和性能指标

查看日志:

# 查看今天的日志
cat logs/$(date +%Y-%m-%d).log

# 实时监控日志
tail -f logs/$(date +%Y-%m-%d).log

# 查看所有日志文件
ls -lh logs/

集成示例

Web 前端集成

使用 Fetch API(流式输出):

const response = await fetch('http://localhost:8080/chat', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({
        prompt: "写一首关于代码的诗",
        stream: true
    })
});

const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
    const {done, value} = await reader.read();
    if (done) break;
    
    const chunk = decoder.decode(value);
    const lines = chunk.split('\n');
    
    for (const line of lines) {
        if (line.startsWith('data: ')) {
            const data = JSON.parse(line.slice(6));
            if (data.type === 'content') {
                console.log(data.text); // 实时显示输出
            }
        }
    }
}

使用 EventSource(SSE):

// 注意:EventSource 不支持 POST,需要后端支持 GET 或使用 fetch
const eventSource = new EventSource('http://localhost:8080/chat?prompt=你好&stream=true');

eventSource.onmessage = (event) => {
    const data = JSON.parse(event.data);
    if (data.type === 'content') {
        document.getElementById('output').innerText += data.text;
    }
};

移动端集成

iOS (Swift):

let url = URL(string: "http://localhost:8080/chat")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let body: [String: Any] = [
    "prompt": "你好",
    "stream": false
]
request.httpBody = try? JSONSerialization.data(withJSONObject: body)

URLSession.shared.dataTask(with: request) { data, response, error in
    if let data = data {
        let result = try? JSONDecoder().decode(ChatResponse.self, from: data)
        print(result?.answer ?? "")
    }
}.resume()

Android (Kotlin):

val client = OkHttpClient()
val json = JSONObject()
    .put("prompt", "你好")
    .put("stream", false)

val request = Request.Builder()
    .url("http://localhost:8080/chat")
    .post(json.toString().toRequestBody("application/json".toMediaType()))
    .build()

client.newCall(request).execute().use { response ->
    val result = JSONObject(response.body?.string() ?: "")
    println(result.getString("answer"))
}

工作流平台集成

Dify 自定义节点:

  1. 在 Dify 中添加 HTTP 请求节点
  2. 配置 URL: http://localhost:8080/chat
  3. 方法: POST
  4. 请求体: {"prompt": "{{input}}", "profile": "cursor"}

n8n 集成:

  1. 添加 HTTP Request 节点
  2. Method: POST
  3. URL: http://localhost:8080/chat
  4. Body: JSON
  5. 启用 stream: true 可获得实时响应

Python 脚本集成

非流式请求:

import requests

response = requests.post('http://localhost:8080/chat', json={
    "prompt": "如何用 Python 读取文件?",
    "system": "你是一个编程助手"
})

print(response.json()['answer'])

流式请求:

import requests
import json

response = requests.post(
    'http://localhost:8080/chat',
    json={"prompt": "写一首诗", "stream": True},
    stream=True
)

for line in response.iter_lines():
    if line:
        line = line.decode('utf-8')
        if line.startswith('data: '):
            data = json.loads(line[6:])
            if data['type'] == 'content':
                print(data['text'], end='', flush=True)

Shell 脚本集成

批量处理:

#!/bin/bash

# 批量翻译文件
for file in *.txt; do
    content=$(cat "$file")
    curl -X POST http://localhost:8080/chat \
        -H "Content-Type: application/json" \
        -d "{\"prompt\": \"翻译成英文: $content\"}" \
        | jq -r '.answer' > "${file%.txt}_en.txt"
done

定时任务:

# crontab -e
# 每天早上 9 点生成日报
0 9 * * * curl -X POST http://localhost:8080/chat \
    -H "Content-Type: application/json" \
    -d '{"prompt":"生成今日工作计划"}' \
    | jq -r '.answer' | mail -s "Daily Report" user@example.com

开发说明

核心组件

  1. HTTP Handler (handler.go): 处理 HTTP 请求,解析 JSON,返回响应
  2. CLI 接口 (cli/interface.go): 定义统一的 CLI 运行接口
  3. CLI 工厂 (cli/factory.go): 根据类型创建对应的 CLI 实例
  4. CLI 实现 (cli/*.go): 各 CLI 工具的具体实现

添加新 CLI 支持

项目采用接口模式,添加新 CLI 只需:

  1. cli/ 目录创建新文件(如 newcli.go
  2. 实现 CLIRunner 接口:
    type CLIRunner interface {
        Name() string
        Run(opts *RunOptions) (string, error)
    }
  3. cli/factory.go 中注册新 CLI

故障排查

服务无法启动

  • 检查端口 8080 是否被占用
  • 确认 Go 环境已正确安装

Claude CLI 调用失败

  • 确认 claude 命令可在终端中直接运行
  • 检查 Claude CLI 是否已完成认证
  • 查看错误响应中的详细信息

JSON 解析错误

  • 确认请求的 Content-Type 为 application/json
  • 检查 JSON 格式是否正确
  • 确保 messages 数组不为空

MCP 工具集成

网关支持调用 MCP (Model Context Protocol) 工具,让 AI 能够访问网页、操作浏览器等。

配置 MCP 工具

Claude CLI MCP 配置 (~/.claude/settings.json):

{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    }
  }
}

Codex CLI MCP 配置 (~/.codex/config.toml):

[mcp]
enabled = true

[mcp_servers.playwright]
command = "npx"
args = ["@playwright/mcp@latest"]

使用 MCP 工具

示例 1:使用 Playwright 抓取网页

curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "profile": "codex",
    "prompt": "访问 https://www.hangjianet.com/news?page=1 获取前3条新闻的标题和日期",
    "allowed_tools": ["playwright"],
    "permission_mode": "bypassPermissions"
  }'

示例 2:使用 WebFetch 获取网页内容

curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "profile": "claude-mirror",
    "prompt": "获取 https://example.com 的内容并总结",
    "allowed_tools": ["WebFetch"],
    "permission_mode": "bypassPermissions"
  }'

可用的 MCP 工具:

  • WebFetch: 获取网页内容(Claude CLI 内置)
  • WebSearch: 网络搜索(Claude CLI 内置)
  • playwright: 浏览器自动化(需要配置 Playwright MCP)
  • fetch: 网页抓取(需要配置 fetch MCP)

注意事项:

  • 使用 allowed_tools 指定允许的工具列表
  • 使用 permission_mode: "bypassPermissions" 自动授权工具使用
  • Codex CLI 的 Playwright 工具功能更强大,推荐用于网页抓取
  • Claude CLI 的 WebFetch 可能有网络限制

会话管理

网关支持会话管理,可以继续之前的对话。

创建新会话:

curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A股今天表现如何?",
    "new_session": true
  }'

继续会话(使用返回的 session_id):

curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "美国白宫今天都发生了什么新闻?",
    "session_id": "xxx-xxx-xxx"
  }'

Dify 工作流集成(自动管理会话):

curl -X POST http://localhost:8080/chat \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "你好",
    "workflow_run_id": "dify-workflow-123"
  }'

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

内置 CLI 安装说明

Dockerfile 默认安装(均为最新版本):

  • Claude Code CLI(claude): npm install -g @anthropic-ai/claude-code
  • Codex CLI(codex): npm install -g @openai/codex
  • Cursor Agent CLI(cursor-agent): curl https://cursor.com/install -fsS | bash

About

一个极简的 Go HTTP 网关服务,将 HTTP 请求桥接到 Claude CLI。通过 HTTP 接口调用 Claude CLI 的无头模式,让任何支持 HTTP 的应用都能使用 Claude CLI 的能力。

Topics

Resources

Stars

Watchers

Forks

Contributors