Skip to main content

A comprehensive Python library for interacting with LokisApi services

Project description

LokisApi Python Library

Python Version License PyPI Version

Профессиональная Python библиотека для взаимодействия с LokisApi - мощным API для генерации изображений и чат-комплетаций.

🚀 Возможности

  • Генерация изображений с помощью DALL-E моделей
  • Редактирование изображений с поддержкой DALL-E
  • Чат-комплетации с поддержкой GPT и Gemini моделей
  • Thinking режим для Gemini 2.5 моделей
  • Reasoning Effort для GPT-5 моделей
  • Стриминг ответов для реального времени
  • Автоматическое получение моделей из API с кэшированием
  • Умное управление моделями - фильтрация по категориям и возможностям
  • Полная поддержка асинхронности - синхронный и асинхронный клиенты
  • Конкурентное выполнение запросов для высокой производительности
  • Обработка изображений - кодирование, декодирование, изменение размера
  • Пакетная обработка изображений в асинхронном режиме
  • Расширенная обработка ошибок с детальными исключениями и лимитами
  • Простой и интуитивный API в стиле OpenAI
  • Полная совместимость с LokisApi endpoints
  • Поддержка всех моделей из вашего API без обновления библиотеки

📦 Установка

pip install lokisapi

Или из исходного кода:

git clone https://github.com/masezev/lokisapi-python.git
cd lokisapi-python
pip install -e .

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

Инициализация клиента

Синхронный клиент

from lokisapi import LokisApiClient

# Инициализация с вашим API ключом
client = LokisApiClient("YOUR_API_KEY")

Асинхронный клиент

from lokisapi import AsyncLokisApiClient

# Инициализация асинхронного клиента
async with AsyncLokisApiClient("YOUR_API_KEY") as client:
    # Ваш код здесь
    pass

Чат-комплетации

Синхронный режим

from lokisapi import ChatMessage, ChatRole

# Простой чат
messages = [
    ChatMessage(ChatRole.USER, "Привет! Как дела?")
]
response = client.chat(messages, model="gpt-5")
print(response.choices[0]['message']['content'])

Асинхронный режим

from lokisapi import ChatMessage, ChatRole

# Асинхронный чат
messages = [
    ChatMessage(ChatRole.USER, "Привет! Как дела?")
]
response = await client.chat(messages, model="gpt-5")
print(response.choices[0]['message']['content'])

Стриминг чат-комплетаций

Синхронный стриминг

# Стриминг ответов
messages = [ChatMessage(ChatRole.USER, "Расскажи историю")]
for chunk in client.chat(messages, model="gpt-5", stream=True):
    if chunk.choices[0].get('delta', {}).get('content'):
        print(chunk.choices[0]['delta']['content'], end='')

Асинхронный стриминг

# Асинхронный стриминг ответов
messages = [ChatMessage(ChatRole.USER, "Расскажи историю")]
async for chunk in await client.chat(messages, model="gpt-5", stream=True):
    if chunk.choices[0].get('delta', {}).get('content'):
        print(chunk.choices[0]['delta']['content'], end='')

Конкурентное выполнение (только асинхронный режим)

import asyncio

# Выполнение нескольких операций одновременно
async def concurrent_operations():
    async with AsyncLokisApiClient("YOUR_API_KEY") as client:
        # Создаем задачи
        models_task = client.list_models()
        chat_task = client.chat([ChatMessage(ChatRole.USER, "Привет!")], model="gpt-5")
        image_task = client.generate_image_simple("A beautiful landscape")
        
        # Выполняем все задачи одновременно
        models, response, image_response = await asyncio.gather(
            models_task, chat_task, image_task
        )
        
        print(f"Модели: {len(models)}")
        print(f"Чат: {response.choices[0]['message']['content']}")
        print(f"Изображение: {image_response.data[0]['url']}")

# Запуск
asyncio.run(concurrent_operations())

Генерация изображений

from lokisapi import ImageGenerationRequest, ImageSize, ImageQuality, ImageStyle

# Простая генерация
response = client.generate_image_simple(
    prompt="A beautiful sunset over mountains",
    size=ImageSize.SIZE_1024,
    quality=ImageQuality.HD,
    style=ImageStyle.VIVID
)
print(response.data[0]['url'])

# Расширенная генерация
request = ImageGenerationRequest(
    prompt="A futuristic city with flying cars",
    model="dall-e-3",
    size=ImageSize.SIZE_1024,
    quality=ImageQuality.HD,
    style=ImageStyle.VIVID
)
response = client.generate_image(request)

Редактирование изображений

from lokisapi import ImageEditRequest, encode_image_to_base64

# Кодируем изображение в base64
image_base64 = encode_image_to_base64("path/to/image.jpg")

# Редактируем изображение
response = client.edit_image_simple(
    image=image_base64,
    prompt="Add a rainbow to the sky",
    size=ImageSize.SIZE_1024
)
print(response.data[0]['url'])

Thinking режим (Gemini 2.5)

from lokisapi import THINKING_MODELS

# Использование Thinking режима
messages = [ChatMessage(ChatRole.USER, "Реши сложную математическую задачу")]
response = client.chat(
    messages=messages,
    model="gemini-2.5-pro",
    thinking=True,
    thinking_budget=2000
)
print(response.choices[0]['message']['content'])

# Модели с поддержкой Thinking
print(f"Models with Thinking: {THINKING_MODELS}")

Reasoning Effort (GPT-5)

from lokisapi import ReasoningEffort

# Использование Reasoning Effort
messages = [ChatMessage(ChatRole.USER, "Объясни квантовую физику")]
response = client.chat(
    messages=messages,
    model="gpt-5",
    reasoning_effort=ReasoningEffort.HIGH
)
print(response.choices[0]['message']['content'])

Автоматическое получение моделей

# Получить все доступные модели (автоматически кэшируются)
models = client.list_models()
for model in models:
    print(f"{model.id} - {model.owned_by}")

# Получить информацию о конкретной модели
model = client.get_model("gpt-5")
print(f"Model: {model.id}, Created: {model.created}")

# Получить модели по категориям
text_models = client.get_models_by_category("text")
image_models = client.get_models_by_category("image")
thinking_models = client.get_models_by_category("thinking")

# Получить модели с определенными возможностями
thinking_models = client.get_thinking_models()
image_models = client.get_image_models()
text_models = client.get_text_models()

# Информация о кэше
cache_info = client.get_models_cache_info()
print(f"Models cached: {cache_info['cached']}")
print(f"Cache age: {cache_info['age_seconds']} seconds")

# Принудительное обновление кэша
client.refresh_models_cache()

📚 Подробная документация

LokisApiClient

Основной класс для взаимодействия с LokisApi.

Конструктор

LokisApiClient(api_key: str, base_url: str = "https://lokisapi.online/v1", model_cache_duration: float = 3600)
  • api_key: Ваш API ключ LokisApi
  • base_url: Базовый URL API (по умолчанию: https://lokisapi.online/v1)
  • model_cache_duration: Длительность кэша моделей в секундах (по умолчанию: 3600 = 1 час)

Методы

chat(messages, model="gpt-5", temperature=1.0, max_tokens=None, stream=False)

Удобный метод для чат-комплетаций.

Параметры:

  • messages: Список сообщений ChatMessage
  • model: Модель для использования (по умолчанию: "gpt-5")
  • temperature: Температура сэмплирования (0.0-2.0)
  • max_tokens: Максимальное количество токенов
  • stream: Включить стриминг

Возвращает:

  • ChatCompletionResponse или Iterator[ChatCompletionChunk] при стриминге
generate_image_simple(prompt, size="1024x1024", model="dall-e-3")

Удобный метод для простой генерации изображений.

Параметры:

  • prompt: Промпт для генерации изображения
  • size: Размер изображения
  • model: Модель для использования

Возвращает:

  • ImageGenerationResponse
list_models(force_refresh=False)

Получить список всех доступных моделей (автоматически кэшируются).

Параметры:

  • force_refresh: Принудительно обновить кэш из API

Возвращает:

  • List[Model]
get_model(model_id, force_refresh=False)

Получить информацию о конкретной модели.

Параметры:

  • model_id: ID модели
  • force_refresh: Принудительно обновить кэш из API

Возвращает:

  • Model
get_thinking_models(force_refresh=False)

Получить список моделей с поддержкой Thinking (Gemini 2.5).

Возвращает:

  • List[str] - список ID моделей
get_image_models(force_refresh=False)

Получить список моделей для генерации изображений.

Возвращает:

  • List[str] - список ID моделей
get_text_models(force_refresh=False)

Получить список моделей для текстовых задач.

Возвращает:

  • List[str] - список ID моделей
get_models_by_category(category, force_refresh=False)

Получить модели по категории.

Параметры:

  • category: Категория ("text", "image", "thinking", "deprecated")
  • force_refresh: Принудительно обновить кэш из API

Возвращает:

  • List[Model]
refresh_models_cache()

Принудительно обновить кэш моделей из API.

clear_models_cache()

Очистить кэш моделей.

get_models_cache_info()

Получить информацию о состоянии кэша моделей.

Возвращает:

  • Dict[str, Any] - информация о кэше

Модели данных

ChatMessage

@dataclass
class ChatMessage:
    role: ChatRole  # system, user, assistant
    content: str

ImageGenerationRequest

@dataclass
class ImageGenerationRequest:
    prompt: str
    model: str = "dall-e-3"
    n: int = 1
    size: ImageSize = ImageSize.SIZE_1024
    quality: str = "standard"
    style: str = "vivid"

ChatCompletionRequest

@dataclass
class ChatCompletionRequest:
    messages: List[ChatMessage]
    model: str = "gpt-5"
    temperature: float = 1.0
    max_tokens: Optional[int] = None
    stream: bool = False
    top_p: float = 1.0
    frequency_penalty: float = 0.0
    presence_penalty: float = 0.0
    stop: Optional[Union[str, List[str]]] = None

Утилиты для работы с изображениями

Синхронные утилиты

from lokisapi import (
    encode_image_to_base64, decode_base64_to_image, 
    save_base64_image, resize_image_for_api, validate_image_size
)

# Кодирование изображения в base64
base64_image = encode_image_to_base64("path/to/image.jpg")

# Декодирование base64 в PIL Image
image = decode_base64_to_image(base64_image)

# Сохранение base64 изображения в файл
save_base64_image(base64_image, "output.png")

# Изменение размера изображения для API
resized_base64 = resize_image_for_api("large_image.jpg", (1024, 1024))

# Проверка размера изображения
is_valid = validate_image_size("1024x1024")  # True

Асинхронные утилиты и пакетная обработка

from lokisapi import (
    async_encode_image_to_base64, async_decode_base64_to_image,
    batch_encode_images, batch_process_images, batch_save_images
)

# Асинхронное кодирование изображения
base64_image = await async_encode_image_to_base64("path/to/image.jpg")

# Пакетное кодирование множества изображений
image_paths = ["image1.jpg", "image2.jpg", "image3.jpg"]
encoded_images = await batch_encode_images(image_paths)

# Пакетная обработка изображений (изменение размера)
processed_images = await batch_process_images(image_paths, (1024, 1024))

# Пакетное сохранение изображений
output_paths = ["output1.png", "output2.png", "output3.png"]
await batch_save_images(encoded_images, output_paths)

Утилиты для работы с моделями

from lokisapi import (
    format_model_info, get_supported_models, 
    estimate_tokens, validate_api_key_format
)

# Информация о модели
info = format_model_info("gpt-5")
print(f"Model: {info['name']}, Provider: {info['provider']}")

# Получение поддерживаемых моделей
text_models = get_supported_models("text")
image_models = get_supported_models("image")

# Оценка токенов
tokens = estimate_tokens("Hello, world!")  # Примерно 3-4 токена

# Проверка формата API ключа
is_valid = validate_api_key_format("sk-...")  # True

Исключения

Библиотека предоставляет расширенную систему исключений для обработки ошибок:

Основные исключения

  • LokisApiError: Базовое исключение для всех ошибок LokisApi
  • AuthenticationError: Ошибка аутентификации (неверный API ключ)
  • RateLimitError: Превышен лимит запросов
  • APIError: Общая ошибка API
  • ValidationError: Ошибка валидации входных данных
  • NetworkError: Сетевая ошибка (таймаут, соединение)

Специализированные исключения

  • ModelNotFoundError: Модель не найдена
  • ModelNotSupportedError: Модель не поддерживает запрашиваемую функцию
  • QuotaExceededError: Превышена квота (наследует от RateLimitError)
  • TokenLimitError: Превышен лимит токенов (наследует от RateLimitError)
  • RequestLimitError: Превышен лимит запросов (наследует от RateLimitError)
  • ServiceUnavailableError: Сервис временно недоступен
  • ImageProcessingError: Ошибка обработки изображения
from lokisapi import (
    LokisApiClient, AuthenticationError, RateLimitError, 
    QuotaExceededError, TokenLimitError, ModelNotFoundError
)

try:
    client = LokisApiClient("invalid-key")
    response = client.chat(messages)
except AuthenticationError as e:
    print(f"Ошибка аутентификации: {e}")
except QuotaExceededError as e:
    print(f"Превышена квота: {e}")
    if e.retry_after:
        print(f"Повторить через {e.retry_after} секунд")
except TokenLimitError as e:
    print(f"Превышен лимит токенов: {e}")
except ModelNotFoundError as e:
    print(f"Модель не найдена: {e.model_id}")
except RateLimitError as e:
    print(f"Превышен лимит: {e}")
    if e.retry_after:
        print(f"Повторить через {e.retry_after} секунд")

🎯 Примеры использования

Продвинутый чат с контекстом

from lokisapi import LokisApiClient, ChatMessage, ChatRole

client = LokisApiClient("YOUR_API_KEY")

# Создание диалога с системным сообщением
messages = [
    ChatMessage(ChatRole.SYSTEM, "Ты - полезный ассистент, который отвечает на русском языке."),
    ChatMessage(ChatRole.USER, "Объясни, что такое машинное обучение простыми словами.")
]

response = client.chat(messages, model="gpt-5", temperature=0.7)
print(response.choices[0]['message']['content'])

Пакетная генерация изображений

prompts = [
    "A serene mountain landscape at sunrise",
    "A bustling city street at night",
    "A peaceful garden with blooming flowers"
]

for i, prompt in enumerate(prompts):
    print(f"Generating image {i+1}/{len(prompts)}: {prompt}")
    response = client.generate_image_simple(prompt)
    print(f"Image URL: {response.data[0]['url']}")

Стриминг с сохранением в файл

messages = [ChatMessage(ChatRole.USER, "Напиши рассказ о роботе")]

with open("story.txt", "w", encoding="utf-8") as f:
    f.write("=== AI Story ===\n\n")
    
    for chunk in client.chat(messages, model="gpt-5", stream=True):
        if chunk.choices[0].get('delta', {}).get('content'):
            content = chunk.choices[0]['delta']['content']
            f.write(content)
            f.flush()

Пакетная генерация изображений

from lokisapi import ImageSize, ImageQuality, ImageStyle

prompts = [
    "A serene mountain landscape at sunrise",
    "A bustling city street at night", 
    "A peaceful garden with blooming flowers"
]

for i, prompt in enumerate(prompts, 1):
    print(f"Generating image {i}/{len(prompts)}: {prompt}")
    response = client.generate_image_simple(
        prompt=prompt,
        size=ImageSize.SIZE_1024,
        quality=ImageQuality.HD,
        style=ImageStyle.VIVID
    )
    print(f"Image URL: {response.data[0]['url']}")

Работа с Thinking режимом

# Сложная математическая задача с Thinking
messages = [ChatMessage(ChatRole.USER, "Реши уравнение: x² + 5x + 6 = 0")]
response = client.chat(
    messages=messages,
    model="gemini-2.5-pro",
    thinking=True,
    thinking_budget=2000
)
print(response.choices[0]['message']['content'])

Редактирование изображений

from lokisapi import encode_image_to_base64, ImageSize

# Загружаем и редактируем изображение
image_base64 = encode_image_to_base64("original_image.jpg")
response = client.edit_image_simple(
    image=image_base64,
    prompt="Add a beautiful sunset in the background",
    size=ImageSize.SIZE_1024
)
print(f"Edited image: {response.data[0]['url']}")

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

Переменные окружения

Вы можете использовать переменные окружения для настройки:

export LOKISAPI_API_KEY="your-api-key"
export LOKISAPI_BASE_URL="https://lokisapi.online/v1"
import os
from lokisapi import LokisApiClient

client = LokisApiClient(
    api_key=os.getenv("LOKISAPI_API_KEY"),
    base_url=os.getenv("LOKISAPI_BASE_URL", "https://lokisapi.online/v1")
)

Настройка таймаутов и повторных попыток

import requests
from lokisapi import LokisApiClient

# Создание клиента с кастомной сессией
session = requests.Session()
session.timeout = 30  # 30 секунд таймаут

client = LokisApiClient("YOUR_API_KEY")
client.session = session

🧪 Тестирование

# Установка зависимостей для разработки
pip install -e ".[dev]"

# Запуск тестов
pytest

# Проверка стиля кода
black lokisapi/
flake8 lokisapi/

# Проверка типов
mypy lokisapi/

📄 Лицензия

Этот проект лицензирован под MIT License - см. файл LICENSE для деталей.

🤝 Вклад в проект

Мы приветствуем вклад в развитие библиотеки! Пожалуйста:

  1. Форкните репозиторий
  2. Создайте ветку для вашей функции (git checkout -b feature/amazing-feature)
  3. Зафиксируйте изменения (git commit -m 'Add amazing feature')
  4. Отправьте в ветку (git push origin feature/amazing-feature)
  5. Откройте Pull Request

📞 Поддержка

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

Gemini модели (Google)

  • gemini-2.5-pro - Самая мощная модель с поддержкой Thinking
  • gemini-2.5-flash - Быстрая модель с поддержкой Thinking
  • gemini-2.5-flash-lite - Облегченная версия с поддержкой Thinking
  • gemini-2.0-flash - Быстрая модель без Thinking
  • gemini-2.0-flash-lite - Облегченная версия без Thinking

OpenAI модели

  • gpt-5 - Самая мощная модель с Reasoning Effort
  • gpt-5-mini - Компактная версия GPT-5
  • gpt-5-nano - Минимальная версия GPT-5
  • gpt-4.1 - Улучшенная версия GPT-4
  • gpt-4.1-mini - Компактная версия GPT-4.1
  • gpt-4.1-nano - Минимальная версия GPT-4.1
  • gpt-4-turbo - Быстрая версия GPT-4
  • gpt-4o - Мультимодальная модель
  • gpt-4o-mini - Компактная мультимодальная модель
  • o3 - Модель с рассуждениями
  • o3-mini - Компактная модель с рассуждениями
  • gpt-3.5-turbo - Быстрая и экономичная модель

Модели для изображений

  • dall-e-3 - Генерация и редактирование изображений

🆕 История изменений

v1.0.0 (2025-01-XX)

  • Первый релиз с полной поддержкой LokisApi
  • Чат-комплетации с поддержкой GPT и Gemini моделей
  • Генерация изображений с помощью DALL-E моделей
  • Редактирование изображений с поддержкой DALL-E
  • Thinking режим для Gemini 2.5 моделей
  • Reasoning Effort для GPT-5 моделей
  • Стриминг ответов для реального времени
  • Автоматическое получение моделей из API с кэшированием
  • Умное управление моделями - фильтрация по категориям и возможностям
  • Расширенная обработка ошибок с детальными исключениями и лимитами
  • Утилиты для работы с изображениями - кодирование, декодирование, изменение размера
  • Полная совместимость с LokisApi endpoints
  • Поддержка всех моделей без обновления библиотеки
  • Подробная документация и примеры использования

Сделано с ❤️ командой LokisApi

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lokisapi-1.0.4.tar.gz (47.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lokisapi-1.0.4-py3-none-any.whl (35.1 kB view details)

Uploaded Python 3

File details

Details for the file lokisapi-1.0.4.tar.gz.

File metadata

  • Download URL: lokisapi-1.0.4.tar.gz
  • Upload date:
  • Size: 47.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for lokisapi-1.0.4.tar.gz
Algorithm Hash digest
SHA256 fe14f5c1b3feb0e3774f660487dc0f81400e16868ce1a1e8b5c26e0d812b12f0
MD5 222cc2a99c0c91d3a2e5afbfb1a45002
BLAKE2b-256 560404914528244243af166f3ecb6fd6cf2e3b671c16b1e870f58601e1748526

See more details on using hashes here.

File details

Details for the file lokisapi-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: lokisapi-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 35.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for lokisapi-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 dcd13d8976af93f29a2809f6a0d53cd9d5c7d62db5fd861707411bbe1378c1bf
MD5 a128e703126d4acd538daf8356fa0177
BLAKE2b-256 b1efc9110afc033a6c33b27f3f85ae13354f3a1163d014a25b71f0359c35c03b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page