// Package main демонстрирует использование OpenRouter клиента. // Этот файл является примером и не включён в основной build. // Для запуска: go run examples/openrouter_example.go package main import ( "context" "fmt" "log" "os" "time" "github.com/fofanov/genaudiobookinfo/internal/domain" "github.com/fofanov/genaudiobookinfo/internal/infrastructure" ) func main() { // Получаем API ключ из переменной окружения apiKey := os.Getenv("OPENROUTER_API_KEY") if apiKey == "" { log.Fatal("Ошибка: установите переменную окружения OPENROUTER_API_KEY") } // Создаём клиент OpenRouter client := infrastructure.NewOpenRouterClient(infrastructure.OpenRouterConfig{ APIKey: apiKey, BaseURL: "https://openrouter.ai/api/v1", Timeout: 60 * time.Second, Model: "openai/gpt-3.5-turbo", // модель по умолчанию Prompt: "", // системный промпт (опционально) }) // Создаём контекст с таймаутом ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Пример 1: Простой запрос к GPT-3.5 fmt.Println("=== Пример 1: Простой запрос ===") simpleExample(ctx, client) fmt.Println("\n=== Пример 2: Анализ метаданных аудиокниги ===") audiobookExample(ctx, client) fmt.Println("\n=== Пример 3: Генерация описания книги ===") descriptionExample(ctx, client) } func simpleExample(ctx context.Context, client *infrastructure.OpenRouterClient) { req := &domain.LLMRequest{ Model: "openai/gpt-3.5-turbo", Messages: []domain.LLMMessage{ { Role: "system", Content: "Ты — полезный ассистент.", }, { Role: "user", Content: "Привет! Расскажи мне коротко, что такое аудиокнига?", }, }, Temperature: 0.7, MaxTokens: 200, } resp, err := client.GenerateCompletion(ctx, req) if err != nil { log.Printf("Ошибка запроса: %v\n", err) return } if len(resp.Choices) > 0 { fmt.Printf("Ответ: %s\n", resp.Choices[0].Message.Content) fmt.Printf("Использовано токенов: %d\n", resp.Usage.TotalTokens) } } func audiobookExample(ctx context.Context, client *infrastructure.OpenRouterClient) { // Пример анализа метаданных аудиокниги req := &domain.LLMRequest{ Model: "openai/gpt-4o-mini", Messages: []domain.LLMMessage{ { Role: "system", Content: "Ты — эксперт по литературе и аудиокнигам. Анализируй метаданные книг и предлагай улучшения.", }, { Role: "user", Content: `Проанализируй эти метаданные аудиокниги и предложи корректное название: Автор: Иванов Петр Сергеевич Название: Путешествие 01 Год: 2023 Предложи правильное форматирование автора (без отчества) и улучшенное название книги.`, }, }, Temperature: 0.3, MaxTokens: 300, } resp, err := client.GenerateCompletion(ctx, req) if err != nil { log.Printf("Ошибка запроса: %v\n", err) return } if len(resp.Choices) > 0 { fmt.Printf("Анализ:\n%s\n", resp.Choices[0].Message.Content) fmt.Printf("Модель: %s\n", resp.Model) fmt.Printf("Использовано токенов: %d\n", resp.Usage.TotalTokens) } } func descriptionExample(ctx context.Context, client *infrastructure.OpenRouterClient) { // Пример генерации описания по названию книги req := &domain.LLMRequest{ Model: "anthropic/claude-3-haiku", Messages: []domain.LLMMessage{ { Role: "system", Content: "Ты — литературный критик. Создавай краткие, но информативные описания книг.", }, { Role: "user", Content: `Создай краткое описание (2-3 предложения) для аудиокниги: Автор: Толстой Лев Название: Война и мир Жанр: Исторический роман`, }, }, Temperature: 0.7, MaxTokens: 250, } resp, err := client.GenerateCompletion(ctx, req) if err != nil { log.Printf("Ошибка запроса: %v\n", err) return } if len(resp.Choices) > 0 { fmt.Printf("Описание:\n%s\n", resp.Choices[0].Message.Content) fmt.Printf("Причина завершения: %s\n", resp.Choices[0].FinishReason) fmt.Printf("Токены (запрос/ответ): %d/%d\n", resp.Usage.PromptTokens, resp.Usage.CompletionTokens) } }