ai-api-proxy 是一个高性能、可扩展的 API 代理服务器,旨在为国内用户提供稳定、快速的 OpenAI 和 Anthropic 等外部 API 服务的直连访问。通过反向代理、限流、安全认证等功能,ai-api-proxy 简化了与外部 API 的交互,提升了安全性和系统稳定性,适用于各种规模的应用场景。
- 多 API 支持:支持 OpenAI、Anthropic 等多种外部 API 的代理。
- 高性能反向代理:基于 Go 语言的高效反向代理实现,确保低延迟和高吞吐量。
- 安全认证:支持 API 密钥认证,确保只有授权用户才能访问代理服务。
- 限流机制:内置灵活的限流策略,防止滥用和保护后端服务。
- 请求体限制:控制请求体的最大大小,防止过大请求影响服务稳定性。
- 日志管理:集成日志记录功能,支持日志文件和标准输出记录。
- 自动化部署:提供 Dockerfile,简化部署流程,支持容器化部署。
- 健康检查:内置健康检查接口,方便监控和运维。
- 配置灵活:通过配置文件轻松调整服务参数,适应不同的使用场景。
- 编程语言:Go 1.23.2
- Web 框架:Go 标准库
net/http
,Gin - 限流库:ulule/limiter
- 日志库:Logrus
- 配置管理:Viper
- 容器化:Docker
- 持续集成:GitHub Actions
-
克隆仓库
git clone https://github.com/你的用户名/ai-api-proxy.git cd ai-api-proxy
-
配置 Docker 环境
确保
config.yaml
已正确配置。可以参考以下示例:server_port: "3001" rate_limit: "100-M" fixed_request_ip: "" max_request_body_size_mb: 50 log_dir: "logs" log_name: "app.log" log_level: "info" path_map: { "/openai/": "https://api.openai.com", "/anthropic/": "https://api.anthropic.com", }
-
构建并运行 Docker 容器
docker build -t ai-api-proxy:latest . docker run -d --restart=always \ --name ai-api-proxy \ -v $(pwd)/config.yaml:/app/config.yaml \ -v $(pwd)/logs:/app/logs \ --network my-network \ ai-api-proxy:latest
-
克隆仓库
git clone https://github.com/你的用户名/ai-api-proxy.git cd ai-api-proxy
-
安装依赖
go mod download
-
配置应用
编辑
config.yaml
,参考上文 Docker 部署中的示例。 -
运行应用
go run ./cmd/proxy
config.yaml
是应用的主要配置文件,包含以下字段:
server_port
: 服务器监听的端口号(默认"3001"
)。rate_limit
: 请求限流策略,格式为"100-M"
表示每分钟最多100次请求。fixed_request_ip
: 固定请求 IP,用于隐藏原始客户端 IP(默认为空,表示不固定)。max_request_body_size_mb
: 请求体最大允许大小,单位为 MB(默认50
)。log_dir
: 日志文件存放目录(默认"logs"
)。log_name
: 日志文件名称(默认"app.log"
)。log_level
: 日志记录级别(支持debug
,info
,warn
,error
,默认"info"
)。path_map
: 路径映射,定义了代理的前缀路径与目标 API 的对应关系。
示例:
server_port: "3001"
rate_limit: "100-M"
fixed_request_ip: ""
max_request_body_size_mb: 50
log_dir: "logs"
log_name: "app.log"
log_level: "info"
path_map: {
"/openai/": "https://api.openai.com",
"/anthropic/": "https://api.anthropic.com",
}
所有请求必须包含有效的 API 密钥,可以通过 Authorization
或 x-api-key
头进行传递。
示例:
GET /openai/v1/engines HTTP/1.1
Host: your-domain.com
Authorization: your-api-key
应用内置了限流机制,默认每分钟最多允许 100 次请求。可在 config.yaml
中通过 rate_limit
字段进行调整。
示例:
rate_limit: "200-M" # 每分钟最多200次请求
假设你已经配置好 path_map
并运行了代理服务器,以下是如何通过代理访问 OpenAI API 的示例:
curl -H "Authorization: your-api-key" https://your-domain.com/openai/v1/engines
ai-api-proxy/
├── cmd/
│ └── proxy/
│ └── main.go # 应用入口
├── internal/
│ ├── config/
│ │ ├── config.go # 配置加载
│ │ └── config_test.go # 配置测试
│ ├── middleware/
│ │ └── middleware.go # 中间件实现
│ └── proxy/
│ ├── reverse_proxy.go # 反向代理逻辑
│ └── reverse_proxy_test.go # 反向代理测试
├── pkg/
│ └── logger/
│ └── logger.go # 日志初始化
├── config.yaml # 配置文件
├── Dockerfile # Docker 构建文件
├── entrypoint.sh # Docker 入口脚本
├── Makefile # 构建脚本
├── go.mod
├── go.sum
├── README.md # 项目说明
├── .gitignore
├── .dockerignore
└── .github/
└── workflows/
└── docker-image.yml # GitHub Actions CI 配置
-
安装 Go
下载并安装 Go 1.23.2 或更高版本。参考 Go 官方安装指南。
-
克隆仓库
git clone https://github.com/你的用户名/ai-api-proxy.git cd ai-api-proxy
-
安装依赖
go mod download
- 遵循 Effective Go 规范。
- 代码风格统一,建议使用
gofmt
格式化代码。 - 使用有意义的变量和函数命名,注重代码可读性。
- 遵循 Go 的最佳实践,避免常见的陷阱和反模式。
- 编写充分的注释,特别是在复杂或不直观的逻辑部分。
-
运行所有测试
go test ./...
-
运行特定测试
go test ./internal/proxy -run TestNewOpenAIReverseProxy_InvalidURL
-
测试覆盖率
go test ./... -cover
欢迎各类贡献,无论是提出问题、报告 bug、建议新功能,还是提交代码。请按照以下步骤进行:
-
Fork 本仓库
在 GitHub 上点击 "Fork" 按钮,将仓库复制到你的账户下。
-
创建新分支
git checkout -b feature/你的功能
-
提交更改
git commit -m "添加了新的功能"
-
推送到远程分支
git push origin feature/你的功能
-
创建 Pull Request
在 GitHub 上发起 Pull Request,描述你的更改内容和原因。
请确保所有新功能都配有相应的测试,并且通过现有测试。我们会对 Pull Request 进行审查,并在必要时提供反馈。
本项目使用 GitHub Actions 进行持续集成和持续部署。CI/CD 流程包括:
- 代码检出:使用
actions/checkout
检出代码。 - 构建 Docker 镜像:使用 Dockerfile 构建镜像。
- 运行测试:执行所有单元测试,确保代码质量。
- 推送镜像:将构建好的镜像推送到 Docker Hub 或其他镜像仓库。
你可以在 .github/workflows/docker-image.yml
中查看和自定义 CI/CD 配置。
项目提供了 Dockerfile
以支持容器化部署。你可以使用 Docker Compose 或 Kubernetes 进行容器编排,进一步提升系统的可伸缩性和可靠性。
示例 Kubernetes 部署配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-api-proxy
spec:
replicas: 3
selector:
matchLabels:
app: ai-api-proxy
template:
metadata:
labels:
app: ai-api-proxy
spec:
containers:
- name: ai-api-proxy
image: your-docker-username/ai-api-proxy:latest
ports:
- containerPort: 3001
volumeMounts:
- name: config
mountPath: /app/config.yaml
subPath: config.yaml
- name: logs
mountPath: /app/logs
volumes:
- name: config
configMap:
name: ai-api-proxy-config
- name: logs
persistentVolumeClaim:
claimName: ai-api-proxy-logs
---
apiVersion: v1
kind: Service
metadata:
name: ai-api-proxy-service
spec:
type: LoadBalancer
selector:
app: ai-api-proxy
ports:
- protocol: TCP
port: 80
targetPort: 3001
- 认证与授权:仅允许拥有有效 API 密钥的用户访问代理服务,确保服务的安全性。
- 输入验证:对所有输入进行严格验证,防止注入攻击和其他恶意请求。
- 日志监控:记录所有请求和错误,便于监控和审计。
- 依赖管理:定期更新依赖库,修复已知的安全漏洞。
- HTTPS 支持:建议在生产环境中使用 HTTPS 保障数据传输的安全性。
编辑 config.yaml
中的 path_map
字段,添加或修改路径前缀与目标 API 地址的映射关系。例如:
path_map: {
"/openai/": "https://api.openai.com",
"/anthropic/": "https://api.anthropic.com",
"/newapi/": "https://api.newservice.com",
}
在 config.yaml
中修改 rate_limit
字段,按照 ulule/limiter 的格式进行配置。例如,将限流调整为每分钟200次请求:
rate_limit: "200-M"
默认情况下,日志文件保存在项目根目录下的 logs
文件夹中,文件名为 app.log
。你可以在 config.yaml
中通过 log_dir
和 log_name
字段自定义日志路径和文件名。
本项目采用 MIT 许可证 进行许可。详情请参阅 LICENSE 文件。
感谢所有为 ai-api-proxy 项目贡献代码、报告问题和提出建议的开发者和用户。您的支持是我们不断前进的动力!
如果您在使用过程中有任何问题或建议,欢迎提交 Issue 或参与讨论。