qwencli

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 10, 2025 License: MIT Imports: 20 Imported by: 0

README

go-qwen-cli

Go клиентская библиотека для Qwen AI API с OAuth 2.0 аутентификацией.

Возможности

  • OAuth 2.0 аутентификация - Device Flow с PKCE для безопасной авторизации
  • Автоматическое обновление токенов - Фоновый worker предотвращает истечение токенов
  • Потоковая и непотоковая генерация - Поддержка как streaming, так и обычных запросов
  • OpenAI совместимость - Совместимый слой для легкой миграции с OpenAI API
  • Мультимодальность - Поддержка текста и изображений
  • Конфигурируемое логирование - Встроенный интерфейс Logger для интеграции с вашей системой логирования
  • Паттерн опций - Гибкая конфигурация через функциональные опции

Установка

go get github.com/Genry72/go-qwen-cli

Быстрый старт

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/Genry72/go-qwen-cli"
)

func main() {
	// Создаем клиент с конфигурацией по умолчанию
	client, err := qwencli.NewQwenClient()
	if err != nil {
		log.Fatal(err)
	}
	defer client.Close()

	// Генерируем текст
	ctx := context.Background()
	response, err := client.GenText(ctx, "Привет, Qwen!")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(response)
}

Аутентификация

Библиотека использует OAuth 2.0 Device Flow для авторизации. При первом запуске:

  1. Библиотека выведет URL для авторизации
  2. Перейдите по ссылке и введите код
  3. После авторизации credentials сохранятся локально
Расположение credentials

Credentials ищутся в следующих местах (в порядке приоритета):

  1. Переменная окружения QWEN_CREDENTIALS_PATH
  2. ./data/qwen_auth.json (текущая директория)
  3. ~/.qwen/oauth_creds.json (домашняя директория)

Использование

Простая генерация текста
client, _ := qwencli.NewQwenClient()
defer client.Close()

response, err := client.GenText(context.Background(), "Расскажи анекдот")
if err != nil {
	log.Fatal(err)
}
fmt.Println(response)
Потоковая генерация (Streaming)
messages := []qwencli.Message{
	{
		Role: "user",
		Content: []qwencli.MessageContent{
			{Type: "text", Text: "Напиши короткую историю"},
		},
	},
}

ctx := context.Background()
resultChan, errChan := client.GenerateContentStream(ctx, messages, qwencli.ModelQwen3CoderPlus)

for {
	select {
	case text, ok := <-resultChan:
		if !ok {
			fmt.Println() // Новая строка после завершения
			return
		}
		fmt.Print(text)
	case err := <-errChan:
		log.Fatal(err)
	}
}
OpenAI совместимость
import openai "github.com/sashabaranov/go-openai"

req := openai.ChatCompletionRequest{
	Model: qwencli.ModelQwen3CoderPlus,
	Messages: []openai.ChatCompletionMessage{
		{Role: "user", Content: "Привет!"},
	},
}

response, err := client.GenerateContentOpenAI(context.Background(), req)
if err != nil {
	log.Fatal(err)
}
fmt.Println(response.Choices[0].Message.Content)
Работа с изображениями
messages := []qwencli.Message{
	{
		Role: "user",
		Content: []qwencli.MessageContent{
			{Type: "text", Text: "Что на этом изображении?"},
			{
				Type: "image_url",
				ImageURL: struct {
					URL string `json:"url"`
				}{URL: "data:image/png;base64,iVBORw0KG..."},
			},
		},
	},
}

response, err := client.GenerateContent(ctx, messages, qwencli.ModelQwen3CoderPlus)

Конфигурация

Использование кастомного логгера
logger := qwencli.NewDefaultLogger(true) // true = включить debug логи

client, err := qwencli.NewQwenClient(
	qwencli.WithLogger(logger),
)
Кастомный путь к credentials
client, err := qwencli.NewQwenClient(
	qwencli.WithCredentialsPath("/custom/path/creds.json"),
)
Выбор модели по умолчанию
client, err := qwencli.NewQwenClient(
	qwencli.WithDefaultModel(qwencli.ModelQwen3CoderFlash),
)
Отключение фонового обновления токенов
client, err := qwencli.NewQwenClient(
	qwencli.WithBackgroundRefresh(false),
)
Полная кастомизация
logger := qwencli.NewDefaultLogger(true)

client, err := qwencli.NewQwenClient(
	qwencli.WithLogger(logger),
	qwencli.WithCredentialsPath("/custom/path/creds.json"),
	qwencli.WithDefaultModel(qwencli.ModelQwen3CoderFlash),
	qwencli.WithTimeout(30 * time.Second),
	qwencli.WithBackgroundRefresh(true),
	qwencli.WithRefreshInterval(10 * time.Minute),
)

Доступные модели

  • qwencli.ModelQwen3CoderPlus - Модель Qwen 3 Coder Plus для сложных задач
  • qwencli.ModelQwen3CoderFlash - Быстрая модель Qwen 3 Coder Flash для простых задач

Примеры

Больше примеров доступно в директории examples/:

Обработка ошибок

Библиотека предоставляет кастомные типы ошибок:

import "errors"

client, err := qwencli.NewQwenClient()
if err != nil {
	if errors.Is(err, qwencli.ErrCredentialsNotFound) {
		fmt.Println("Credentials не найдены. Запустите device flow авторизацию")
	}
	log.Fatal(err)
}

Доступные ошибки:

  • ErrCredentialsNotFound - Файл с credentials не найден
  • ErrInvalidCredentials - Невалидные credentials
  • ErrTokenExpired - Токен истек
  • ErrAuthenticationFailed - Ошибка аутентификации
  • ErrRefreshTokenFailed - Ошибка обновления токена
  • ErrDeviceFlowFailed - Ошибка device flow авторизации
  • ErrAPIRequestFailed - Ошибка API запроса

API Reference

Полная документация доступна на pkg.go.dev.

Требования

  • Go 1.21 или выше
  • Активный аккаунт Qwen AI

Лицензия

MIT License - см. LICENSE для деталей.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Changelog

См. CHANGELOG.md для истории изменений.

Documentation

Overview

Package qwencli предоставляет Go клиент для Qwen AI API с OAuth 2.0 аутентификацией.

Библиотека поддерживает как потоковую (streaming), так и непотоковую генерацию текста, автоматическое обновление токенов и предоставляет совместимый с OpenAI интерфейс для легкой интеграции с существующим кодом.

Аутентификация

Библиотека использует OAuth 2.0 device flow с PKCE для аутентификации. Credentials хранятся локально и автоматически обновляются при необходимости.

Базовое использование

Простой пример создания клиента и генерации текста:

client, err := qwencli.NewQwenClient()
if err != nil {
	log.Fatal(err)
}
defer client.Close()

ctx := context.Background()
response, err := client.GenText(ctx, "Привет, Qwen!")
if err != nil {
	log.Fatal(err)
}
fmt.Println(response)

Потоковая генерация (Streaming)

Для получения ответа в реальном времени используйте GenerateContentStream:

messages := []qwencli.Message{
	{
		Role: "user",
		Content: []qwencli.MessageContent{
			{Type: "text", Text: "Расскажи короткую историю"},
		},
	},
}

ctx := context.Background()
resultChan, errChan := client.GenerateContentStream(ctx, messages, qwencli.ModelQwen3CoderPlus)

for {
	select {
	case text, ok := <-resultChan:
		if !ok {
			return
		}
		fmt.Print(text)
	case err := <-errChan:
		log.Fatal(err)
	}
}

Конфигурация

Используйте паттерн опций для кастомной конфигурации:

logger := qwencli.NewDefaultLogger(true)
client, err := qwencli.NewQwenClient(
	qwencli.WithLogger(logger),
	qwencli.WithCredentialsPath("/custom/path/creds.json"),
	qwencli.WithDefaultModel(qwencli.ModelQwen3CoderFlash),
)

Совместимость с OpenAI

Библиотека предоставляет методы, совместимые с OpenAI API:

openAIReq := openai.ChatCompletionRequest{
	Model: qwencli.ModelQwen3CoderPlus,
	Messages: []openai.ChatCompletionMessage{
		{Role: "user", Content: "Привет!"},
	},
}

response, err := client.GenerateContentOpenAI(ctx, openAIReq)

Больше примеров доступно в директории examples/.

Index

Constants

View Source
const (
	QWEN_OAUTH_BASE_URL        = "https://chat.qwen.ai"
	QWEN_OAUTH_DEVICE_CODE_URL = QWEN_OAUTH_BASE_URL + "/api/v1/oauth2/device/code"
	QWEN_OAUTH_TOKEN_URL       = QWEN_OAUTH_BASE_URL + "/api/v1/oauth2/token"
	QWEN_OAUTH_CLIENT_ID       = "f0304373b74a44d2b584a3fb70ca9e56"
	QWEN_OAUTH_SCOPE           = "openid profile email model.completion"
	TOKEN_REFRESH_BUFFER_MS    = 30 * 1000 // 30 секунд буфер
)

OAuth константы

View Source
const (
	// ModelQwen3CoderPlus - модель Qwen 3 Coder Plus для сложных задач программирования
	ModelQwen3CoderPlus = "qwen3-coder-plus"

	// ModelQwen3CoderFlash - быстрая модель Qwen 3 Coder Flash для простых задач
	ModelQwen3CoderFlash = "qwen3-coder-flash"
)

Variables

View Source
var (
	// ErrCredentialsNotFound возвращается когда файл с credentials не найден
	ErrCredentialsNotFound = errors.New("credentials file not found")

	// ErrInvalidCredentials возвращается когда credentials невалидны или повреждены
	ErrInvalidCredentials = errors.New("invalid credentials")

	// ErrTokenExpired возвращается когда токен истек и не может быть обновлен
	ErrTokenExpired = errors.New("token expired")

	// ErrAuthenticationFailed возвращается при неудачной аутентификации
	ErrAuthenticationFailed = errors.New("authentication failed")

	// ErrRefreshTokenFailed возвращается когда не удается обновить токен
	ErrRefreshTokenFailed = errors.New("failed to refresh token")

	// ErrDeviceFlowFailed возвращается при неудачной авторизации через device flow
	ErrDeviceFlowFailed = errors.New("device flow authorization failed")

	// ErrAPIRequestFailed возвращается при неудачном API запросе
	ErrAPIRequestFailed = errors.New("API request failed")
)

Functions

func ConvertQwenResponseToOpenAI

func ConvertQwenResponseToOpenAI(qwenResp *QwenChatCompletionResponse) *openai.ChatCompletionResponse

ConvertQwenResponseToOpenAI преобразует ответ от Qwen API в формат OpenAI API. Используется для обеспечения совместимости с OpenAI SDK и существующим кодом.

Types

type Candidate

type Candidate struct {
	Index        int                    `json:"index"`                   // Индекс варианта ответа
	Message      QwenAPIResponseMessage `json:"message"`                 // Сообщение с ответом
	FinishReason string                 `json:"finish_reason,omitempty"` // Причина завершения генерации (stop, length, etc.)
}

Candidate структура кандидата ответа. Представляет один вариант ответа от модели.

type ClientOption

type ClientOption func(*Config)

ClientOption - функция для настройки Config

func WithBackgroundRefresh

func WithBackgroundRefresh(enabled bool) ClientOption

WithBackgroundRefresh включает или отключает фоновое обновление токенов

func WithBaseURL

func WithBaseURL(baseURL string) ClientOption

WithBaseURL устанавливает базовый URL для API

func WithClientID

func WithClientID(clientID string) ClientOption

WithClientID устанавливает кастомный OAuth client ID

func WithCredentialsPath

func WithCredentialsPath(path string) ClientOption

WithCredentialsPath устанавливает путь к файлу credentials

func WithDefaultModel

func WithDefaultModel(model string) ClientOption

WithDefaultModel устанавливает модель по умолчанию

func WithLogger

func WithLogger(logger Logger) ClientOption

WithLogger устанавливает кастомный логгер

func WithRefreshInterval

func WithRefreshInterval(interval time.Duration) ClientOption

WithRefreshInterval устанавливает интервал проверки токенов

func WithTimeout

func WithTimeout(timeout time.Duration) ClientOption

WithTimeout устанавливает таймаут для HTTP запросов

type Config

type Config struct {
	// ClientID - OAuth client ID для авторизации
	ClientID string

	// OAuthBaseURL - базовый URL для OAuth авторизации
	OAuthBaseURL string

	// TokenRefreshBuffer - буфер времени (в миллисекундах) для обновления токена до истечения
	TokenRefreshBuffer int64

	// CredentialsPath - путь к файлу с OAuth credentials
	CredentialsPath string

	// BaseURL - базовый URL для API запросов
	BaseURL string

	// DefaultModel - модель по умолчанию для генерации
	DefaultModel string

	// Timeout - таймаут для HTTP запросов
	Timeout time.Duration

	// Logger - интерфейс логгера для вывода сообщений
	Logger Logger

	// EnableBackgroundRefresh - включить фоновое обновление токенов
	EnableBackgroundRefresh bool

	// RefreshCheckInterval - интервал проверки токенов для фонового обновления
	RefreshCheckInterval time.Duration
}

Config содержит настройки конфигурации для Qwen клиента

func DefaultConfig

func DefaultConfig() *Config

DefaultConfig возвращает конфигурацию по умолчанию

type Content

type Content struct {
	Role  string `json:"role"`  // Роль отправителя сообщения (user, assistant, system)
	Parts []Part `json:"parts"` // Части сообщения (текст или медиа контент)
}

Content структура для содержимого сообщения. Используется в более старом формате API, сейчас используется Message.

func ConvertMessagesToContents

func ConvertMessagesToContents(messages []Message) []Content

ConvertMessagesToContents преобразует массив Message в формате OpenAI API в массив Content в формате Qwen API. Эта функция используется для конвертации сообщений перед отправкой запроса в Qwen API. Функция обрабатывает как текстовые, так и изображения, преобразуя их в соответствующий формат Qwen.

type DefaultLogger

type DefaultLogger struct {
	// EnableDebug - включить отладочные сообщения
	EnableDebug bool
	// contains filtered or unexported fields
}

DefaultLogger - простой логгер, который выводит сообщения в stdout/stderr

func NewDefaultLogger

func NewDefaultLogger(enableDebug bool) *DefaultLogger

NewDefaultLogger создает новый экземпляр DefaultLogger

func (*DefaultLogger) Debug

func (l *DefaultLogger) Debug(msg string, args ...interface{})

Debug выводит отладочное сообщение (только если EnableDebug = true)

func (*DefaultLogger) Error

func (l *DefaultLogger) Error(msg string, args ...interface{})

Error выводит сообщение об ошибке

func (*DefaultLogger) Info

func (l *DefaultLogger) Info(msg string, args ...interface{})

Info выводит информационное сообщение

func (*DefaultLogger) Warn

func (l *DefaultLogger) Warn(msg string, args ...interface{})

Warn выводит предупреждающее сообщение

type DeviceAuthorizationResponse

type DeviceAuthorizationResponse struct {
	DeviceCode              string `json:"device_code"`
	UserCode                string `json:"user_code"`
	VerificationURI         string `json:"verification_uri"`
	VerificationURIComplete string `json:"verification_uri_complete"`
	ExpiresIn               int    `json:"expires_in"`
	Interval                int    `json:"interval"`
}

DeviceAuthorizationResponse представляет ответ от device authorization endpoint

type DeviceTokenResponse

type DeviceTokenResponse struct {
	AccessToken  string `json:"access_token"`
	RefreshToken string `json:"refresh_token"`
	TokenType    string `json:"token_type"`
	ExpiresIn    int64  `json:"expires_in"`
	ResourceURL  string `json:"resource_url"`
}

DeviceTokenResponse представляет ответ от device token endpoint

type GenerationConfig

type GenerationConfig struct {
	Temperature     float64 `json:"temperature,omitempty"`     // Температура генерации (0.0-1.0), контролирует случайность
	MaxOutputTokens int     `json:"maxOutputTokens,omitempty"` // Максимальное количество токенов в ответе
	TopP            float64 `json:"topP,omitempty"`            // Nucleus sampling параметр
	TopK            int     `json:"topK,omitempty"`            // Top-K sampling параметр
}

GenerationConfig структура для конфигурации генерации. Позволяет настроить параметры генерации текста.

type ImageData

type ImageData struct {
	MimeType string // MIME тип изображения
	Data     string // Данные изображения в base64
}

ImageData структура для данных изображения. Упрощенная структура для работы с изображениями.

type InlineData

type InlineData struct {
	MimeType string `json:"mimeType"` // MIME тип данных (например, "image/png")
	Data     string `json:"data"`     // Данные в base64 кодировке
}

InlineData структура для inline данных (например, изображений). Используется для передачи медиа контента в base64 формате.

type Logger

type Logger interface {
	// Debug выводит отладочное сообщение
	Debug(msg string, args ...interface{})

	// Info выводит информационное сообщение
	Info(msg string, args ...interface{})

	// Warn выводит предупреждающее сообщение
	Warn(msg string, args ...interface{})

	// Error выводит сообщение об ошибке
	Error(msg string, args ...interface{})
}

Logger - интерфейс для логирования, позволяет пользователям использовать свой логгер

type Message

type Message struct {
	Role    string           `json:"role"`    // Роль отправителя: "user", "assistant" или "system"
	Content []MessageContent `json:"content"` // Массив содержимого сообщения, может содержать текст и/или изображения
}

Message представляет сообщение в истории чата в формате, совместимом с OpenAI API. Используется для передачи сообщений пользователя и ассистента в API запросах. Структура содержит роль (user, assistant, system) и массив содержимого.

func ConvertOpenAIMessagesToMessages

func ConvertOpenAIMessagesToMessages(openaiMessages []openai.ChatCompletionMessage) []Message

ConvertOpenAIMessagesToMessages преобразует массив openai.ChatCompletionMessage (внешняя библиотека OpenAI) в массив Message (внутренний формат). Эта функция используется для конвертации сообщений, полученных из OpenAI API, во внутренний формат, совместимый с остальной частью приложения. Поддерживает как простые текстовые сообщения, так и мультимедийные сообщения (с изображениями).

type MessageContent

type MessageContent struct {
	Type     string `json:"type"`           // Тип содержимого: "text" или "image_url"
	Text     string `json:"text,omitempty"` // Текстовое содержимое (используется при Type="text")
	ImageURL struct {
		URL string `json:"url"` // URL изображения в формате data:image/... (используется при Type="image_url")
	} `json:"image_url,omitempty"`
}

MessageContent представляет содержимое сообщения в формате, совместимом с OpenAI API. Используется для передачи текста или изображений в сообщениях. Может содержать либо текст (type="text"), либо URL изображения (type="image_url").

type NoOpLogger

type NoOpLogger struct{}

NoOpLogger - пустой логгер, который ничего не выводит (используется по умолчанию)

func (*NoOpLogger) Debug

func (l *NoOpLogger) Debug(msg string, args ...interface{})

Debug не выводит ничего

func (*NoOpLogger) Error

func (l *NoOpLogger) Error(msg string, args ...interface{})

Error не выводит ничего

func (*NoOpLogger) Info

func (l *NoOpLogger) Info(msg string, args ...interface{})

Info не выводит ничего

func (*NoOpLogger) Warn

func (l *NoOpLogger) Warn(msg string, args ...interface{})

Warn не выводит ничего

type OAuthCredentials

type OAuthCredentials struct {
	AccessToken  string `json:"access_token"`           // Токен доступа для API запросов
	RefreshToken string `json:"refresh_token"`          // Токен для обновления access token
	TokenType    string `json:"token_type"`             // Тип токена (обычно "Bearer")
	ExpiryDate   int64  `json:"expiry_date"`            // Время истечения токена в миллисекундах (Unix timestamp * 1000)
	ResourceURL  string `json:"resource_url,omitempty"` // Базовый URL для API запросов
}

OAuthCredentials структура для хранения OAuth учетных данных. Используется для сохранения и загрузки токенов аутентификации из файла.

type OauthConfig

type OauthConfig struct {
	OauthClientId     string `json:"oauthClientId"`     // Идентификатор OAuth клиента
	OauthClientSecret string `json:"oauthClientSecret"` // Секрет OAuth клиента
}

OauthConfig структура для OAuth конфигурации. Используется для хранения параметров OAuth авторизации.

type OnboardUserRequest

type OnboardUserRequest struct {
	TierId   string `json:"tierId"`  // Идентификатор уровня доступа
	Project  string `json:"project"` // Идентификатор проекта
	Metadata struct {
		IdeType     string `json:"ideType"`     // Тип IDE
		Platform    string `json:"platform"`    // Платформа
		PluginType  string `json:"pluginType"`  // Тип плагина
		DuetProject string `json:"duetProject"` // Проект Duet
	} `json:"metadata"`
}

OnboardUserRequest структура для запроса регистрации пользователя. Используется при onboarding новых пользователей.

type OnboardUserResponse

type OnboardUserResponse struct {
	Done     bool `json:"done"` // Флаг завершения операции
	Response struct {
		Project struct {
			Id string `json:"id"` // Идентификатор созданного проекта
		} `json:"project"`
	} `json:"response"`
}

OnboardUserResponse структура ответа регистрации пользователя. Содержит результат операции onboarding.

type Part

type Part struct {
	Text       string      `json:"text,omitempty"`       // Текстовое содержимое
	InlineData *InlineData `json:"inlineData,omitempty"` // Встроенные данные (изображения, файлы)
}

Part структура для части сообщения. Может содержать либо текст, либо inline данные (например, изображения).

type ProjectDiscoveryRequest

type ProjectDiscoveryRequest struct {
	Project  string `json:"project"` // Идентификатор проекта
	Metadata struct {
		IdeType     string `json:"ideType"`     // Тип IDE
		Platform    string `json:"platform"`    // Платформа
		PluginType  string `json:"pluginType"`  // Тип плагина
		DuetProject string `json:"duetProject"` // Проект Duet
	} `json:"metadata"`
}

ProjectDiscoveryRequest структура для запроса обнаружения проекта. Используется в специфических API методах для работы с проектами.

type ProjectDiscoveryResponse

type ProjectDiscoveryResponse struct {
	Project      interface{} `json:"project"` // Информация о проекте
	AllowedTiers []struct {
		Id        string `json:"id"`        // Идентификатор уровня
		IsDefault bool   `json:"isDefault"` // Является ли уровень по умолчанию
	} `json:"allowedTiers"` // Доступные уровни доступа
}

ProjectDiscoveryResponse структура ответа обнаружения проекта. Содержит информацию о найденном проекте и доступных уровнях.

type QwenAPIResponseMessage

type QwenAPIResponseMessage struct {
	Role    string `json:"role"`    // Роль отправителя (обычно "assistant")
	Content string `json:"content"` // Сгенерированный текст
}

QwenAPIResponseMessage структура сообщения в ответе. Содержит сгенерированный текст и метаданные.

type QwenAuthenticator

type QwenAuthenticator struct {
	// contains filtered or unexported fields
}

QwenAuthenticator структура для аутентификации с использованием OAuth

func LoadOAuthCredentialsFromCurrentDir

func LoadOAuthCredentialsFromCurrentDir(logger Logger) (*QwenAuthenticator, error)

LoadOAuthCredentialsFromCurrentDir загружает OAuth учетные данные из текущей директории

func LoadOAuthCredentialsFromHome

func LoadOAuthCredentialsFromHome(logger Logger) (*QwenAuthenticator, error)

LoadOAuthCredentialsFromHome загружает OAuth учетные данные из домашней директории

func NewQwenAuthenticator

func NewQwenAuthenticator(credsPath string, logger Logger) (*QwenAuthenticator, error)

NewQwenAuthenticator создает новый экземпляр аутентификатора Qwen

func (*QwenAuthenticator) GetAccessToken

func (q *QwenAuthenticator) GetAccessToken() string

GetAccessToken возвращает текущий access token

func (*QwenAuthenticator) GetAuthenticatedClient

func (q *QwenAuthenticator) GetAuthenticatedClient() (*http.Client, error)

GetAuthenticatedClient возвращает HTTP клиент с аутентификацией

func (*QwenAuthenticator) GetResourceURL

func (q *QwenAuthenticator) GetResourceURL() string

GetResourceURL возвращает базовый URL для API запросов

type QwenChatCompletionRequest

type QwenChatCompletionRequest struct {
	Model          string             `json:"model"`                     // Название модели (ModelQwen3CoderPlus или ModelQwen3CoderFlash)
	Messages       []Message          `json:"messages"`                  // Массив сообщений в диалоге
	Temperature    float64            `json:"temperature,omitempty"`     // Температура генерации (0.0-2.0)
	MaxTokens      int                `json:"max_tokens,omitempty"`      // Максимальное количество токенов в ответе
	Stream         bool               `json:"stream,omitempty"`          // Включить потоковую передачу ответа
	StreamOptions  *QwenStreamOptions `json:"stream_options,omitempty"`  // Опции для потоковой передачи
	TopP           float64            `json:"top_p,omitempty"`           // Nucleus sampling параметр
	TopK           int                `json:"top_k,omitempty"`           // Top-K sampling параметр
	SafetySettings []SafetySetting    `json:"safety_settings,omitempty"` // Настройки безопасности контента
	Tools          interface{}        `json:"tools,omitempty"`           // Определения инструментов для function calling
	ToolChoice     interface{}        `json:"tool_choice,omitempty"`     // Выбор использования инструментов
}

QwenChatCompletionRequest структура для запроса к Qwen API в формате OpenAI. Совместима с OpenAI Chat Completion API.

type QwenChatCompletionResponse

type QwenChatCompletionResponse struct {
	Id                string        `json:"id"`                           // Уникальный идентификатор запроса
	Object            string        `json:"object"`                       // Тип объекта (обычно "chat.completion")
	Created           int64         `json:"created"`                      // Время создания в Unix timestamp
	Model             string        `json:"model"`                        // Использованная модель
	Choices           []QwenChoice  `json:"choices"`                      // Массив вариантов ответов
	Usage             UsageMetadata `json:"usage,omitempty"`              // Статистика использования токенов
	SystemFingerprint string        `json:"system_fingerprint,omitempty"` // Fingerprint системы
}

QwenChatCompletionResponse структура ответа от Qwen API в формате OpenAI. Совместима с OpenAI Chat Completion Response.

type QwenChatCompletionStreamChoice

type QwenChatCompletionStreamChoice struct {
	Index        int                    `json:"index"`         // Индекс варианта
	Delta        QwenAPIResponseMessage `json:"delta"`         // Дельта (частичное содержимое)
	FinishReason *string                `json:"finish_reason"` // Причина завершения (null до последнего чанка)
}

QwenChatCompletionStreamChoice структура выбора в потоковом ответе. Представляет частичный фрагмент ответа в потоковом режиме.

type QwenChatCompletionStreamResponse

type QwenChatCompletionStreamResponse struct {
	Id                string                           `json:"id"`                           // Уникальный идентификатор запроса
	Object            string                           `json:"object"`                       // Тип объекта ("chat.completion.chunk")
	Created           int64                            `json:"created"`                      // Время создания в Unix timestamp
	Model             string                           `json:"model"`                        // Использованная модель
	Choices           []QwenChatCompletionStreamChoice `json:"choices"`                      // Массив вариантов с частичными ответами
	Usage             *UsageMetadata                   `json:"usage,omitempty"`              // Статистика использования (в финальном чанке)
	SystemFingerprint string                           `json:"system_fingerprint,omitempty"` // Fingerprint системы
}

QwenChatCompletionStreamResponse структура потокового ответа. Используется для SSE (Server-Sent Events) потоковой передачи.

type QwenChoice

type QwenChoice struct {
	Index        int                    `json:"index"`         // Индекс варианта
	Message      QwenAPIResponseMessage `json:"message"`       // Сообщение с ответом
	FinishReason string                 `json:"finish_reason"` // Причина завершения (stop, length, tool_calls, etc.)
}

QwenChoice структура выбора в ответе. Представляет один вариант ответа в непотоковом режиме.

type QwenClient

type QwenClient struct {
	// contains filtered or unexported fields
}

QwenClient структура для работы с Qwen API

func NewQwenClient

func NewQwenClient(opts ...ClientOption) (*QwenClient, error)

NewQwenClient создает новый клиент для работы с Qwen API с возможностью конфигурации через опции

func (*QwenClient) Close

func (q *QwenClient) Close() error

Close корректно завершает работу QwenClient и останавливает фоновое обновление токенов. Рекомендуется вызывать этот метод с использованием defer после создания клиента.

func (*QwenClient) GenText

func (q *QwenClient) GenText(ctx context.Context, msg string) (string, error)

GenText реализует простой интерфейс для генерации текста: GenText(ctx context.Context, msg string) (string, error). Это удобный метод для быстрой генерации ответа на текстовое сообщение.

func (*QwenClient) GenerateContent

func (q *QwenClient) GenerateContent(ctx context.Context, messages []Message, model string) (*QwenChatCompletionResponse, error)

GenerateContent генерирует контент с помощью Qwen API (непотоковый метод). Возвращает полный ответ после завершения генерации.

func (*QwenClient) GenerateContentOpenAI

func (q *QwenClient) GenerateContentOpenAI(ctx context.Context, openAIReq openai.ChatCompletionRequest) (*openai.ChatCompletionResponse, error)

GenerateContentOpenAI генерирует контент с помощью Qwen API в формате OpenAI (непотоковый метод). Обеспечивает совместимость с OpenAI API интерфейсом.

func (*QwenClient) GenerateContentStream

func (q *QwenClient) GenerateContentStream(ctx context.Context, messages []Message, model string) (<-chan string, <-chan error)

GenerateContentStream универсальная функция для потоковой обработки текстовых и изображений запросов к Qwen API. Эта функция использует Server-Sent Events (SSE) для получения данных в реальном времени. Для надежной обработки потока используется bufio.Scanner, который читает ответ построчно.

Возвращает два канала: resultChan для получения фрагментов текста и errChan для ошибок. Каналы закрываются автоматически по завершении потока.

func (*QwenClient) GenerateContentStreamOpenAI

func (q *QwenClient) GenerateContentStreamOpenAI(ctx context.Context, openAIReq openai.ChatCompletionRequest) (<-chan openai.ChatCompletionStreamResponse, <-chan error)

GenerateContentStreamOpenAI обеспечивает совместимость с форматом OpenAI API. Принимает запрос в формате OpenAI и возвращает каналы для потокового ответа.

func (*QwenClient) HealthCheck

func (q *QwenClient) HealthCheck(ctx context.Context) error

HealthCheck проверяет доступность API и валидность токена. Выполняет простой запрос к /models endpoint для проверки аутентификации.

type QwenResponse

type QwenResponse struct {
	Candidates    []Candidate   `json:"choices"`         // Варианты ответов от модели
	UsageMetadata UsageMetadata `json:"usage,omitempty"` // Метаданные использования токенов
}

QwenResponse структура ответа от Qwen API. Используется в более старом формате API.

type QwenStreamOptions

type QwenStreamOptions struct {
	IncludeUsage bool `json:"include_usage,omitempty"` // Включить информацию об использовании токенов в поток
}

QwenStreamOptions опции для потокового ответа. Позволяет настроить параметры SSE потока.

type SafetySetting

type SafetySetting struct {
	Category  string `json:"category"`  // Категория безопасности
	Threshold string `json:"threshold"` // Порог фильтрации
}

SafetySetting структура для настроек безопасности. Позволяет контролировать фильтрацию контента по различным категориям.

type SimpleLogger

type SimpleLogger struct{}

SimpleLogger - минималистичный логгер без префиксов и временных меток

func NewSimpleLogger

func NewSimpleLogger() *SimpleLogger

NewSimpleLogger создает новый экземпляр SimpleLogger

func (*SimpleLogger) Debug

func (l *SimpleLogger) Debug(msg string, args ...interface{})

Debug выводит отладочное сообщение

func (*SimpleLogger) Error

func (l *SimpleLogger) Error(msg string, args ...interface{})

Error выводит сообщение об ошибке

func (*SimpleLogger) Info

func (l *SimpleLogger) Info(msg string, args ...interface{})

Info выводит информационное сообщение

func (*SimpleLogger) Warn

func (l *SimpleLogger) Warn(msg string, args ...interface{})

Warn выводит предупреждающее сообщение

type TokenRefresher

type TokenRefresher struct {
	// contains filtered or unexported fields
}

TokenRefresher обрабатывает фоновое обновление токенов для предотвращения истечения во время API вызовов

func NewTokenRefresher

func NewTokenRefresher(authenticator *QwenAuthenticator) *TokenRefresher

NewTokenRefresher создает новый token refresher для заданного authenticator

func (*TokenRefresher) StartBackgroundRefresh

func (tr *TokenRefresher) StartBackgroundRefresh()

StartBackgroundRefresh запускает процедуру фонового обновления токенов

func (*TokenRefresher) StopBackgroundRefresh

func (tr *TokenRefresher) StopBackgroundRefresh()

StopBackgroundRefresh останавливает процедуру фонового обновления токенов

type UsageMetadata

type UsageMetadata struct {
	PromptTokens     int `json:"prompt_tokens"`     // Количество токенов в промпте
	CompletionTokens int `json:"completion_tokens"` // Количество токенов в ответе
	TotalTokens      int `json:"total_tokens"`      // Общее количество токенов
}

UsageMetadata структура метаданных использования токенов. Содержит информацию о количестве использованных токенов.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL