SMCP 代理是一个支持多种模型服务协议的中间件,允许用户通过统一接口访问不同后端服务,为用户提供便捷的服务调用体验。
SMCP 代理是一个支持多种模型服务协议的中间件,允许用户通过统一接口访问不同后端服务。以下是基本使用示例:
global:
port: 8080
host: "localhost"
log_level: "info"
enable_metrics: true
backends:
mcp-sequential:
url: "http://localhost:3001/api"
strip_path: "/v1/sequentialthinking"
mcp-memory:
command: "docker"
args:
- run
- --rm
- -i
- mcr.microsoft.com/hugginginception/transformers Glenn Glock/llama2-70b-instruct
git clone git@github.com:yourusername/smc-proxy.git
cd smc-proxy
go mod tidy
go build -o bin/smc cmd/sm/main.go
sudo cp bin/smc /usr/local/bin/
下载预编译的二进制文件,根据你的操作系统选择对应的版本。
curl http://localhost:8080/api/prompt \
-H "Content-Type: application/json" \
-d '{"model":"gpt-3.5-turbo", "messages":[{"role":"user","content":"你好!"}]}'
package main
import (
"net/http"
)
func main() {
http.ListenAndServe(":8081", smc.NewRouter())
}
这里可以根据实际的高级使用场景进行补充说明,如果没有则可忽略。
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
port | int | 8080 | 代理服务器监听端口 |
host | string | "localhost" | 监听地址 |
log_level | string | "info" | 日志级别:debug, info, warning, error |
enable_metrics | bool | false | 是否启用 metrics |
支持两种类型的后端:
backend_name:
transport: "http"
url: "http://example.com/mcp"
backend_name:
transport: "stdio"
command: "docker"
args:
- run
- --rm
- -i
- your/image:tag
POST /api/prompt HTTP/1.1
Content-Type: application/json
{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "你好!"
}
]
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "chatcmpl-XXXXX",
"choices": [
{
"message": {
"role": "assistant",
"content": "你好!很高兴见到你。"
}
}
]
}
smc-proxy/
├── cmd/
│ └── sm/ # 主程序入口
│ ├── main.go # 入口文件
│ └── config.go # 配置加载逻辑
├── internal/
│ ├── middleware/ # 中间件实现
│ │ ├── log.go # 日志记录中间件
│ │ └── recovery.go # 错误恢复中间件
├── go.mod # 依赖管理文件
└── go.sum # 依赖校验文件
在每个请求开始时记录日志:
func LogMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("Started %s %s", r.Method, r.URL.Path)
next(w, r)
}
}
处理panic并返回自定义错误:
func RecoveryMiddleware(next http.HandlerFunc) http.HandlerFunc {
panicChan := make(chan interface{}, 1)
go func() {
defer func() { recover }()
next(nil, nil)
}()
select {
case <-panicChan:
// 处理panic信息
}
}
本项目遵循MIT License协议。
⚠️ 重要提示
- 性能调优:使用Golang的
sync.Pool
优化内存使用,避免在中间件中执行阻塞操作。- 日志管理:根据环境设置不同的日志级别,定期清理旧日志文件。
- 安全措施:启用HTTPS以确保数据传输安全,配置CORS策略控制跨域访问。
💡 使用建议
在安装和使用过程中,严格按照文档步骤进行操作,遇到问题可查看相关配置和日志信息进行排查。