package ai import ( "bytes" "context" "encoding/json" "fmt" "io" "net/http" ) type anthropicProvider struct { apiKey string model string client *http.Client } func newAnthropic(apiKey, model string) *anthropicProvider { if model == "" { model = "claude-sonnet-4-6" } return &anthropicProvider{ apiKey: apiKey, model: model, client: &http.Client{}, } } func (p *anthropicProvider) Name() string { return "anthropic" } func (p *anthropicProvider) Summarize(ctx context.Context, prompt string) (string, error) { body := map[string]interface{}{ "model": p.model, "max_tokens": 4096, "messages": []map[string]string{ {"role": "user", "content": prompt}, }, } b, _ := json.Marshal(body) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "https://api.anthropic.com/v1/messages", bytes.NewReader(b)) if err != nil { return "", err } req.Header.Set("Content-Type", "application/json") req.Header.Set("x-api-key", p.apiKey) req.Header.Set("anthropic-version", "2023-06-01") resp, err := p.client.Do(req) if err != nil { return "", err } defer resp.Body.Close() raw, _ := io.ReadAll(resp.Body) if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("anthropic API error %d: %s", resp.StatusCode, raw) } var result struct { Content []struct { Text string `json:"text"` } `json:"content"` } if err := json.Unmarshal(raw, &result); err != nil { return "", err } if len(result.Content) == 0 { return "", nil } return result.Content[0].Text, nil } func (p *anthropicProvider) ListModels(_ context.Context) ([]string, error) { return []string{ "claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001", }, nil }