mcp/intro/README.md
一个灵活、可扩展的 AI 模型客户端库,支持 DeepSeek、Qwen 等多种 AI 提供商。
import "nofx/mcp"
// 创建客户端
client := mcp.NewClient(
mcp.WithDeepSeekConfig("sk-xxx"),
)
// 调用 AI
result, err := client.CallWithMessages("system prompt", "user prompt")
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
client := mcp.NewDeepSeekClientWithOptions(
mcp.WithAPIKey("sk-xxx"),
mcp.WithTimeout(60 * time.Second),
)
client := mcp.NewQwenClientWithOptions(
mcp.WithAPIKey("sk-xxx"),
mcp.WithMaxTokens(4000),
)
构建器模式支持多轮对话、精细参数控制、Function Calling 等高级功能。
// 使用构建器创建请求
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are helpful").
WithUserPrompt("What is Go?").
WithTemperature(0.8).
Build()
result, err := client.CallWithRequest(request)
// 构建包含历史的多轮对话
request := mcp.NewRequestBuilder().
AddSystemMessage("You are a trading advisor").
AddUserMessage("Analyze BTC").
AddAssistantMessage("BTC is bullish...").
AddUserMessage("What about entry point?"). // 继续对话
WithTemperature(0.3).
Build()
result, err := client.CallWithRequest(request)
// 代码生成(低温度、精确)
request := mcp.ForCodeGeneration().
WithUserPrompt("Generate a HTTP server").
Build()
// 创意写作(高温度、随机)
request := mcp.ForCreativeWriting().
WithUserPrompt("Write a story").
Build()
// 聊天(平衡参数)
request := mcp.ForChat().
WithUserPrompt("Hello").
Build()
// 定义工具
weatherParams := map[string]any{
"type": "object",
"properties": map[string]any{
"location": map[string]any{"type": "string"},
},
}
request := mcp.NewRequestBuilder().
WithUserPrompt("北京天气怎么样?").
AddFunction("get_weather", "Get weather", weatherParams).
WithToolChoice("auto").
Build()
result, err := client.CallWithRequest(request)
// 自定义日志器
mcp.WithLogger(customLogger)
// 自定义 HTTP 客户端
mcp.WithHTTPClient(customHTTP)
mcp.WithTimeout(60 * time.Second)
mcp.WithMaxRetries(5)
mcp.WithRetryWaitBase(3 * time.Second)
mcp.WithMaxTokens(4000)
mcp.WithTemperature(0.7)
// 快速配置 DeepSeek
mcp.WithDeepSeekConfig("sk-xxx")
// 快速配置 Qwen
mcp.WithQwenConfig("sk-xxx")
// 自定义配置
mcp.WithAPIKey("sk-xxx")
mcp.WithBaseURL("https://api.custom.com")
mcp.WithModel("gpt-4")
// 使用 Mock HTTP 客户端
mockHTTP := &MockHTTPClient{
Response: `{"choices":[{"message":{"content":"test"}}]}`,
}
client := mcp.NewClient(
mcp.WithHTTPClient(mockHTTP),
mcp.WithLogger(mcp.NewNoopLogger()), // 禁用日志
)
CallWithMessages (固定重试流程)
↓
call (固定调用流程)
↓
hooks (可重写的步骤)
├─ buildMCPRequestBody
├─ marshalRequestBody
├─ buildUrl
├─ setAuthHeader
├─ parseMCPResponse
└─ isRetryableError
// 公开接口(给外部使用)
type AIClient interface {
SetAPIKey(...)
SetTimeout(...)
CallWithMessages(...) (string, error)
}
// 内部钩子接口(供子类重写)
type clientHooks interface {
buildMCPRequestBody(...) map[string]any
buildUrl() string
setAuthHeader(...)
marshalRequestBody(...) ([]byte, error)
parseMCPResponse(...) (string, error)
isRetryableError(...) bool
}
所有旧 API 继续工作:
// ✅ 旧代码无需修改
client := mcp.New()
client.SetAPIKey("sk-xxx", "https://api.custom.com", "gpt-4")
dsClient := mcp.NewDeepSeekClient()
dsClient.SetAPIKey("sk-xxx", "", "")
// go.mod
module github.com/yourorg/yourproject
require github.com/yourorg/mcp v1.0.0
// main.go
import "github.com/yourorg/mcp"
client := mcp.NewClient(
mcp.WithDeepSeekConfig("sk-xxx"),
)
type CustomProvider struct {
*mcp.Client
}
// 重写特定钩子
func (c *CustomProvider) buildUrl() string {
return c.BaseURL + "/custom/endpoint"
}
func (c *CustomProvider) setAuthHeader(headers http.Header) {
headers.Set("X-Custom-Auth", c.APIKey)
}
type ZapLogger struct {
logger *zap.Logger
}
func (l *ZapLogger) Infof(format string, args ...any) {
l.logger.Sugar().Infof(format, args...)
}
func (l *ZapLogger) Debugf(format string, args ...any) {
l.logger.Sugar().Debugf(format, args...)
}
// 使用
client := mcp.NewClient(
mcp.WithLogger(&ZapLogger{zapLogger}),
)
type LogrusLogger struct {
logger *logrus.Logger
}
func (l *LogrusLogger) Infof(format string, args ...any) {
l.logger.Infof(format, args...)
}
func (l *LogrusLogger) Debugf(format string, args ...any) {
l.logger.Debugf(format, args...)
}
devClient := mcp.NewClient(
mcp.WithDeepSeekConfig("sk-xxx"),
mcp.WithLogger(&customLogger{}), // 详细日志
)
prodClient := mcp.NewClient(
mcp.WithDeepSeekConfig("sk-xxx"),
mcp.WithLogger(&zapLogger{}), // 结构化日志
mcp.WithTimeout(30*time.Second), // 超时保护
mcp.WithMaxRetries(3), // 重试保护
)
testClient := mcp.NewClient(
mcp.WithHTTPClient(mockHTTP),
mcp.WithLogger(mcp.NewNoopLogger()),
)
欢迎提交 Issue 和 Pull Request!
MIT License