package context import ( "context" "fmt" "strings" "github.com/edgeai/gateway/internal/adapter" "github.com/edgeai/gateway/pkg/api" ) // AdapterSummaryGenerator 使用 adapter 调用 LLM 生成对话摘要。 type AdapterSummaryGenerator struct { adapter adapter.ModelAdapter model string maxTokens int temperature float64 } // NewAdapterSummaryGenerator 创建基于 adapter 的摘要生成器。 // model 为实际模型名(如 qwen2:latest),maxTokens 限制摘要长度。 func NewAdapterSummaryGenerator(adp adapter.ModelAdapter, model string, maxTokens int) *AdapterSummaryGenerator { temp := 0.3 return &AdapterSummaryGenerator{ adapter: adp, model: model, maxTokens: maxTokens, temperature: temp, } } // GenerateSummary 调用 LLM 对历史消息生成摘要。 func (g *AdapterSummaryGenerator) GenerateSummary(ctx context.Context, messages []api.Message) (string, error) { if len(messages) == 0 { return "", nil } // 构建摘要请求的 prompt prompt := buildSummaryPrompt(messages) req := &adapter.ChatRequest{ RequestID: "summary-" + fmt.Sprintf("%d", len(messages)), Model: g.model, Messages: prompt, MaxTokens: g.maxTokens, Temperature: &g.temperature, Stream: false, } resp, err := g.adapter.ChatCompletion(ctx, req) if err != nil { return "", fmt.Errorf("summary generation failed: %w", err) } return resp.Content, nil } // buildSummaryPrompt 构建用于生成摘要的消息列表。 func buildSummaryPrompt(messages []api.Message) []api.Message { // 将历史消息拼接为文本 var sb strings.Builder for _, m := range messages { role := m.Role content, _ := m.Content.(string) sb.WriteString(fmt.Sprintf("%s: %s\n", role, content)) } return []api.Message{ { Role: "system", Content: "你是一个对话摘要助手。请将以下对话历史压缩为简洁的摘要," + "保留关键信息、用户意图和重要结论。摘要不超过200字。", }, { Role: "user", Content: fmt.Sprintf("请总结以下对话历史:\n\n%s", sb.String()), }, } }