- Добавлен ConsoleLogger для подробного логирования этапов обработки аудиокниг в консоли. - Введен ConsolePresenter для форматированного вывода результатов сканирования в консоль. - Создан ProcessAudioBooksUseCase для обработки полного конвейера обработки аудиокниг, включая сканирование папок, извлечение метаданных, поиск торрентов и запись результатов. - Реализована проверка LLM для улучшения метаданных. - Добавлена обработка ошибок и логирование на всех этапах обработки.
147 lines
4.9 KiB
Go
147 lines
4.9 KiB
Go
// 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)
|
||
}
|
||
}
|