feat: add claudecode with oauth to AI providers

This commit is contained in:
2026-04-21 16:27:58 +02:00
parent 985768f400
commit f2bb88f040
12 changed files with 267 additions and 32 deletions

View File

@ -9,15 +9,18 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o tradarr ./cmd/server
FROM debian:bookworm-slim
# Chromium pour le scraping Bloomberg
# Chromium pour le scraping Bloomberg + Node.js pour Claude Code CLI
RUN apt-get update && apt-get install -y \
chromium \
chromium-driver \
ca-certificates \
fonts-liberation \
libnss3 \
nodejs \
npm \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
rm -rf /var/lib/apt/lists/* && \
npm install -g @anthropic-ai/claude-code
WORKDIR /app
COPY --from=builder /app/tradarr .

View File

@ -0,0 +1,52 @@
package ai
import (
"bytes"
"context"
"fmt"
"os/exec"
"strings"
)
type claudeCodeProvider struct {
model string
}
func newClaudeCode(model string) *claudeCodeProvider {
if model == "" {
model = "claude-sonnet-4-6"
}
return &claudeCodeProvider{model: model}
}
func (p *claudeCodeProvider) Name() string { return "claudecode" }
func (p *claudeCodeProvider) Summarize(ctx context.Context, prompt string, _ GenOptions) (string, error) {
var stdout, stderr bytes.Buffer
cmd := exec.CommandContext(ctx, "claude", "-p", prompt, "--model", p.model)
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
fmt.Printf("[claudecode] stdout len=%d stderr=%q err=%v\n", stdout.Len(), stderr.String(), err)
if err != nil {
msg := strings.TrimSpace(stderr.String())
if msg == "" {
msg = strings.TrimSpace(stdout.String())
}
if msg == "" {
msg = err.Error()
}
return "", fmt.Errorf("claude cli: %s", msg)
}
return strings.TrimSpace(stdout.String()), nil
}
func (p *claudeCodeProvider) ListModels(_ context.Context) ([]string, error) {
return []string{
"claude-opus-4-7",
"claude-sonnet-4-6",
"claude-haiku-4-5-20251001",
}, nil
}

View File

@ -27,6 +27,8 @@ func NewProvider(name, apiKey, model, endpoint string) (Provider, error) {
return newGemini(apiKey, model), nil
case "ollama":
return newOllama(endpoint, model), nil
case "claudecode":
return newClaudeCode(model), nil
default:
return nil, fmt.Errorf("unknown provider: %s", name)
}

View File

@ -0,0 +1,3 @@
ALTER TABLE ai_providers DROP CONSTRAINT IF EXISTS ai_providers_name_check;
ALTER TABLE ai_providers ADD CONSTRAINT ai_providers_name_check
CHECK (name IN ('openai', 'anthropic', 'gemini', 'ollama'));

View File

@ -0,0 +1,3 @@
ALTER TABLE ai_providers DROP CONSTRAINT IF EXISTS ai_providers_name_check;
ALTER TABLE ai_providers ADD CONSTRAINT ai_providers_name_check
CHECK (name IN ('openai', 'anthropic', 'gemini', 'ollama', 'claudecode'));