mcp/intro/BUILDER_EXAMPLES.md
package main
import (
"fmt"
"nofx/mcp"
)
func main() {
// 创建客户端
client := mcp.NewDeepSeekClientWithOptions(
mcp.WithAPIKey("sk-xxx"),
)
// 使用构建器创建请求
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are a helpful assistant").
WithUserPrompt("What is Go programming language?").
Build()
// 调用 API
result, err := client.CallWithRequest(request)
if err != nil {
panic(err)
}
fmt.Println(result)
}
// 传统方式(仍然可用)
result, err := client.CallWithMessages(
"You are a helpful assistant",
"What is Go?",
)
// 构建器方式(新API,功能更强大)
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are a helpful assistant").
WithUserPrompt("What is Go?").
Build()
result, err := client.CallWithRequest(request)
// 构建包含历史的多轮对话
request := mcp.NewRequestBuilder().
AddSystemMessage("You are a trading advisor").
AddUserMessage("Analyze BTC price").
AddAssistantMessage("BTC is currently in an upward trend...").
AddUserMessage("What's the best entry point?"). // 继续对话
WithTemperature(0.3). // 低温度,更精确
Build()
result, err := client.CallWithRequest(request)
// 假设你有保存的对话历史
history := []mcp.Message{
mcp.NewUserMessage("Hello"),
mcp.NewAssistantMessage("Hi! How can I help?"),
mcp.NewUserMessage("What's the weather?"),
mcp.NewAssistantMessage("It's sunny today"),
}
// 继续对话
request := mcp.NewRequestBuilder().
AddSystemMessage("You are helpful").
AddConversationHistory(history). // 添加历史
AddUserMessage("What about tomorrow?"). // 新问题
Build()
result, err := client.CallWithRequest(request)
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are a Go expert").
WithUserPrompt("Generate a HTTP server").
WithTemperature(0.2). // 低温度 = 更确定
WithTopP(0.1). // 低 top_p = 更聚焦
WithMaxTokens(2000).
AddStopSequence("```"). // 遇到代码块结束符停止
Build()
code, err := client.CallWithRequest(request)
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are a creative writer").
WithUserPrompt("Write a sci-fi story about AI").
WithTemperature(1.2). // 高温度 = 更创意
WithTopP(0.95). // 高 top_p = 更多样
WithPresencePenalty(0.6). // 避免重复主题
WithFrequencyPenalty(0.5). // 避免重复词汇
WithMaxTokens(4000).
Build()
story, err := client.CallWithRequest(request)
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are a quantitative analyst").
WithUserPrompt("Analyze BTC/USDT chart pattern").
WithTemperature(0.5). // 中等温度
WithMaxTokens(1500).
WithStopSequences([]string{"---", "END"}). // 多个停止序列
Build()
analysis, err := client.CallWithRequest(request)
// 定义工具参数 schema(JSON Schema 格式)
weatherParams := map[string]any{
"type": "object",
"properties": map[string]any{
"location": map[string]any{
"type": "string",
"description": "City name, e.g., Beijing, Shanghai",
},
"unit": map[string]any{
"type": "string",
"enum": []string{"celsius", "fahrenheit"},
},
},
"required": []string{"location"},
}
// 构建请求
request := mcp.NewRequestBuilder().
WithUserPrompt("北京今天天气怎么样?").
AddFunction(
"get_weather", // 函数名
"Get current weather", // 函数描述
weatherParams, // 参数定义
).
WithToolChoice("auto"). // 让 AI 自动决定是否调用
Build()
response, err := client.CallWithRequest(request)
// AI 可能返回 tool_calls,你需要执行函数并返回结果
// (具体实现取决于 AI provider 的响应格式)
// 定义多个工具
request := mcp.NewRequestBuilder().
WithUserPrompt("帮我查询北京天气,并计算100的平方根").
AddFunction("get_weather", "Get weather", weatherParams).
AddFunction("calculate", "Calculate math", calcParams).
AddFunction("search_web", "Search web", searchParams).
WithToolChoice("auto").
Build()
response, err := client.CallWithRequest(request)
// AI 会选择调用相应的工具
request := mcp.NewRequestBuilder().
WithUserPrompt("北京").
AddFunction("get_weather", "Get weather", weatherParams).
WithToolChoice(`{"type": "function", "function": {"name": "get_weather"}}`).
Build()
// AI 必须调用 get_weather 函数
// 预设参数:temperature=0.7, maxTokens=2000
request := mcp.ForChat().
WithSystemPrompt("You are a friendly chatbot").
WithUserPrompt("Hello!").
Build()
// 等价于
request := mcp.NewRequestBuilder().
WithSystemPrompt("You are a friendly chatbot").
WithUserPrompt("Hello!").
WithTemperature(0.7).
WithMaxTokens(2000).
Build()
// 预设参数:temperature=0.2, topP=0.1, maxTokens=2000
request := mcp.ForCodeGeneration().
WithUserPrompt("Generate a REST API in Go").
Build()
// 自动使用低温度和低 top_p,确保代码准确性
// 预设参数:
// temperature=1.2, topP=0.95, maxTokens=4000
// presencePenalty=0.6, frequencyPenalty=0.5
request := mcp.ForCreativeWriting().
WithSystemPrompt("You are a novelist").
WithUserPrompt("Write a fantasy story").
Build()
// 自动使用高温度和惩罚参数,增加创意和多样性
package main
import (
"fmt"
"log"
"nofx/mcp"
"os"
)
func main() {
// 创建客户端
client := mcp.NewDeepSeekClientWithOptions(
mcp.WithAPIKey(os.Getenv("DEEPSEEK_API_KEY")),
mcp.WithMaxRetries(5),
mcp.WithTimeout(60 * time.Second),
)
// 场景1: 市场分析(需要精确)
analysisRequest := mcp.NewRequestBuilder().
WithSystemPrompt("You are a professional quantitative trader").
WithUserPrompt("Analyze BTC/USDT 1H chart, current price $45,000").
WithTemperature(0.3). // 低温度,更精确
WithMaxTokens(1500).
Build()
analysis, err := client.CallWithRequest(analysisRequest)
if err != nil {
log.Fatal(err)
}
fmt.Println("=== Market Analysis ===")
fmt.Println(analysis)
// 场景2: 继续对话,询问入场点
followUpRequest := mcp.NewRequestBuilder().
AddSystemMessage("You are a professional quantitative trader").
AddUserMessage("Analyze BTC/USDT 1H chart, current price $45,000").
AddAssistantMessage(analysis). // 添加之前的回复
AddUserMessage("Based on your analysis, what's the best entry point?").
WithTemperature(0.3).
Build()
entryPoint, err := client.CallWithRequest(followUpRequest)
if err != nil {
log.Fatal(err)
}
fmt.Println("\n=== Entry Point Suggestion ===")
fmt.Println(entryPoint)
}
func reviewCode(client mcp.AIClient, code string) (string, error) {
request := mcp.ForCodeGeneration(). // 使用代码场景预设
WithSystemPrompt("You are a senior Go developer reviewing code").
WithUserPrompt(fmt.Sprintf("Review this code:\n\n```go\n%s\n```", code)).
WithMaxTokens(2000).
AddStopSequence("---END---").
Build()
return client.CallWithRequest(request)
}
func main() {
client := mcp.NewDeepSeekClientWithOptions(
mcp.WithAPIKey(os.Getenv("DEEPSEEK_API_KEY")),
)
code := `
func Add(a, b int) int {
return a + b
}
`
review, err := reviewCode(client, code)
if err != nil {
log.Fatal(err)
}
fmt.Println(review)
}
type ChatBot struct {
client mcp.AIClient
history []mcp.Message
}
func NewChatBot(client mcp.AIClient, systemPrompt string) *ChatBot {
return &ChatBot{
client: client,
history: []mcp.Message{
mcp.NewSystemMessage(systemPrompt),
},
}
}
func (bot *ChatBot) Chat(userMessage string) (string, error) {
// 添加用户消息到历史
bot.history = append(bot.history, mcp.NewUserMessage(userMessage))
// 构建请求(包含完整历史)
request := mcp.ForChat().
AddMessages(bot.history...).
Build()
// 调用 API
response, err := bot.client.CallWithRequest(request)
if err != nil {
return "", err
}
// 添加 AI 回复到历史
bot.history = append(bot.history, mcp.NewAssistantMessage(response))
return response, nil
}
func main() {
client := mcp.NewDeepSeekClientWithOptions(
mcp.WithAPIKey(os.Getenv("DEEPSEEK_API_KEY")),
)
bot := NewChatBot(client, "You are a friendly and helpful assistant")
// 对话1
resp1, _ := bot.Chat("What is Go?")
fmt.Println("User: What is Go?")
fmt.Println("Bot:", resp1)
// 对话2(带上下文)
resp2, _ := bot.Chat("What are its main features?")
fmt.Println("\nUser: What are its main features?")
fmt.Println("Bot:", resp2)
// 对话3(继续上下文)
resp3, _ := bot.Chat("Show me an example")
fmt.Println("\nUser: Show me an example")
fmt.Println("Bot:", resp3)
}
package main
import (
"encoding/json"
"fmt"
"nofx/mcp"
"os"
)
// 天气查询函数(模拟)
func getWeather(location string) string {
return fmt.Sprintf("Weather in %s: Sunny, 25°C", location)
}
func main() {
client := mcp.NewDeepSeekClientWithOptions(
mcp.WithAPIKey(os.Getenv("DEEPSEEK_API_KEY")),
)
// 定义工具
weatherParams := map[string]any{
"type": "object",
"properties": map[string]any{
"location": map[string]any{
"type": "string",
"description": "City name",
},
},
"required": []string{"location"},
}
// 第一步:发送带工具的请求
request := mcp.NewRequestBuilder().
WithUserPrompt("北京天气怎么样?").
AddFunction("get_weather", "Get current weather", weatherParams).
WithToolChoice("auto").
Build()
response, err := client.CallWithRequest(request)
if err != nil {
panic(err)
}
fmt.Println("AI Response:", response)
// 第二步:如果 AI 返回了 tool_call(实际需要解析 JSON 响应)
// 这里是示例,实际需要根据 provider 的响应格式解析
// toolCall := parseToolCall(response)
// weatherResult := getWeather(toolCall.Arguments.Location)
// 第三步:将工具结果返回给 AI
// followUp := mcp.NewRequestBuilder().
// AddConversationHistory(previousMessages).
// AddToolResult(toolCall.ID, weatherResult).
// Build()
//
// finalResponse, _ := client.CallWithRequest(followUp)
}
// Build() - 返回 error,需要处理
request, err := NewRequestBuilder().
WithUserPrompt("Hello").
Build()
if err != nil {
log.Fatal(err)
}
// MustBuild() - 如果失败会 panic,适用于确定不会错的场景
request := NewRequestBuilder().
WithSystemPrompt("You are helpful").
WithUserPrompt("Hello").
MustBuild() // 构建失败会 panic
// 创建基础构建器
baseBuilder := mcp.NewRequestBuilder().
WithSystemPrompt("You are a trading advisor").
WithTemperature(0.3)
// 为不同问题添加用户消息
question1 := baseBuilder.
AddUserMessage("Analyze BTC").
Build()
question2 := baseBuilder.
ClearMessages(). // 清空之前的消息
AddSystemMessage("You are a trading advisor").
AddUserMessage("Analyze ETH").
Build()
// ✅ 代码生成 - 使用 ForCodeGeneration
ForCodeGeneration().WithUserPrompt("Generate code")
// ✅ 聊天 - 使用 ForChat
ForChat().WithUserPrompt("Hello")
// ✅ 创意写作 - 使用 ForCreativeWriting
ForCreativeWriting().WithUserPrompt("Write a story")
// ✅ 自定义 - 使用 NewRequestBuilder
NewRequestBuilder().WithTemperature(0.6).WithUserPrompt("...")
// 旧 API(仍然可用)
result, err := client.CallWithMessages("system", "user")
// 迁移到新 API
request := mcp.NewRequestBuilder().
WithSystemPrompt("system").
WithUserPrompt("user").
Build()
result, err := client.CallWithRequest(request)
// 如果需要更多控制
request := mcp.NewRequestBuilder().
WithSystemPrompt("system").
WithUserPrompt("user").
WithTemperature(0.8). // 新功能
WithMaxTokens(2000). // 新功能
Build()
result, err := client.CallWithRequest(request)
更多信息请参考: