Files
GenAudioBookInfo/examples/openrouter_example.go
Dmitriy Fofanov 402ce7f4f1 Функция: реализованы консольный логгер и презентер для обработки аудиокниг
- Добавлен ConsoleLogger для подробного логирования этапов обработки аудиокниг в консоли.

- Введен ConsolePresenter для форматированного вывода результатов сканирования в консоль.

- Создан ProcessAudioBooksUseCase для обработки полного конвейера обработки аудиокниг, включая сканирование папок, извлечение метаданных, поиск торрентов и запись результатов.

- Реализована проверка LLM для улучшения метаданных.

- Добавлена ​​обработка ошибок и логирование на всех этапах обработки.
2026-02-20 00:35:43 +03:00

147 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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)
}
}