Skip to main content

Библиотека для работы с языковыми моделями

Project description

LLM Service

PyPI version Build Status Python Versions License

(Актуальный README в github, обычно я забываю его обновить при релизе...)

Библиотека для упрощенного использования LLM

Библиотека предоставляет упрощенный интерфейс для работы с различными LLM моделями, автоматический подсчет токенов и стоимости запросов, а также удобную интеграцию с существующими проектами. Создана на основе Langchain, являясь практичной оберткой для стандартизации взаимодействия с моделями.

Основные возможности:

  • Простой и понятный интерфейс для работы с LLM моделями
  • Автоматический подсчет стоимости запросов
  • Поддержка асинхронного API
  • Мониторинг использования токенов
  • Расчет затрат в USD с учетом текущего курса валюты по ЦБ РФ
  • Тест соединения (работает так: пытается получить список моделей, если получает - возвращает True)
  • Премодерация промпта (пока такую возможность дает только openai)

Установка:

# Через uv
uv add universal-llm-service

# Через pip
pip install universal-llm-service

# Через poetry
poetry add universal-llm-service

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

Перед началом нужно создать экземпляр модели, langchain - подобный:

Если в langchain мы создаем такой экземпляр:

from langchain_openai import ChatOpenAI

gpt_4o_mini = ChatOpenAI(
    model='gpt-4o-mini',
    api_key='sk-proj-1234567890',
    temperature=0,
)

То здесь мы должны создавать такой:

from llm.constructor import BaseLLM

gpt_4o_mini = BaseLLM(
    model='gpt-4o-mini',
    api_key='sk-proj-1234567890',
    temperature=0,
)

И его передаем при создании LLMService. Имена полей должны совпадать.

Обычный диалог с LLM:

import asyncio
from llm import LLMService

from llm_config import gpt_4o_mini


async def main():
    llm = await LLMService.create(gpt_4o_mini.to_dict())
    result = await llm.ainvoke(message='Сколько будет 2 + 2?')
    print(result)  # Ответ от llm
    print(llm.usage)  # Использование в токенах и деньгах
    print(llm.usd_rate)  # Курс доллара
    print(llm.chat_json)  # Весь чат в json


if __name__ == "__main__":
    asyncio.run(main())

Структурированный вывод:

import asyncio

from pydantic import BaseModel, Field

from llm_config import gpt_4o_mini
from llm import LLMService


class RelatedConceptOutput(BaseModel):
    """Новый термин и его сила связи с исходным термином."""

    title: str = Field(..., description='Название термина')
    length: int = Field(..., description='Сила связи')


class RelatedConceptListOutput(BaseModel):
    """Новые термины и их сила связи с исходным термином."""

    concepts: list[RelatedConceptOutput]


SYSTEM_PROMPT = (
    'Тебе дано понятие школьной программы: "Молекула". Сгенерируй ровно "5" понятий '
    'школьной программы, наиболее близких к этому понятию.'
)


async def main() -> None:
    llm = await LLMService.create(gpt_4o_mini.to_dict())
    structured_llm = await llm.with_structured_output(RelatedConceptListOutput)
    result = await structured_llm.ainvoke(message=SYSTEM_PROMPT)
    print(result)  # Ответ от llm
    print(structured_llm.usage)  # Использование в токенах и деньгах
    print(structured_llm.usd_rate)  # Курс доллара
    print(structured_llm.chat_json)  # Весь чат в json (тут не работает)


if __name__ == '__main__':
    asyncio.run(main())

Потоковый вывод:

import asyncio


from example.llm_config import gpt_4o_mini  # noqa: F401
from llm.service import LLMService


async def main() -> None:
    llm = await LLMService.create(gpt_4o_mini.to_dict())
    stream = await llm.astream(message='Кратко расскажи что такое Python')
    async for chunk in stream:
        print(chunk, end='', flush=True)
    print('\n\n')
    print(stream.full_text)  # Полный текст стрима
    print(llm.usage)  # Использование в токенах и деньгах
    print(llm.usd_rate)  # Курс доллара
    print(llm.chat_json)  # Весь чат в json


if __name__ == '__main__':
    asyncio.run(main())

Подробнее о возможностях:

  • llm.ainvoke и llm.stream - методы принимают как отдельно системный промпт или сообщение, так и историю полность. Параметры принимаются как в стиле langchain так и в виде словарей. Перед отправкой любого сообщения в LLM отрабатывает класс подготовки контекста - PrepareChat: Класс для подготовки чата в формате Langchain для модели.
  1. Данный класс всегда отдает список сообщений в формате Langchain.
  2. Если был отправлен только системный промпт, то после него добавляется пустое сообщение пользователя. Иначе некоторые модели не хотят работать с единственным системным промптом.
  • llm.usage.all_input_tokens - общее количество отправленных токенов с момента инициализации
  • llm.usage.all_output_tokens - общее количество полученных токенов с момента инициализации
  • llm.usage.last_input_tokens - количество отправленных токенов за последний вызов
  • llm.usage.last_output_tokens - количество полученных токенов за последний вызов

  • llm.usage.all_input_spendings - общие расходы в USD при отправке с момента инициализации
  • llm.usage.all_output_spendings - общие расходы в USD при получении с момента инициализации
  • llm.usage.last_input_spendings - расходы в USD при отправке за последний вызов
  • llm.usage.last_output_spendings - расходы в USD при получении за последний вызов

  • llm.usd_rate - курс валюты в USD.

Запуск локально (для разработки):

Установка зависимостей

uv sync

Создать файл .env на основе шаблона .env.template и вписать ключи

Запуск примеров:

python -m example.simple  # Пример обычного общения с LLM
python -m example.structured  # Пример общения с LLM со структурированным выводом
python -m example.stream  # Пример общения с LLM в режиме стрима

Список поддерживаемых моделей:

Все модели OpenRouter

Модели Обычный режим Стриминговый режим Режим структурированного ответа
gpt-5 + Verified org only +
gpt-5-mini + Verified org only +
gpt-5-nano + + +
gpt-5-chat-latest + + +
gpt-4.1 + + +
gpt-4.1-mini + + +
gpt-4.1-nano + + +
gpt-4.5-preview + + +
gpt-4o-mini + + +
gpt-4o + + +
o3-2025-04-16 + + +
o4-mini-2025-04-16 + + +
GigaChat + + +
GigaChat-2 + + +
GigaChat-Pro + + +
GigaChat-2-Pro + + +
GigaChat-Max + + +
GigaChat-2-Max + + +
claude-3-5-haiku-latest + + +
claude-3-7-sonnet-latest + + +
claude-opus-4-0 + + +
claude-sonnet-4-0 + + +
gemini-2.0-flash-001 + + +
gemini-2.5-flash + + +
gemini-2.5-pro-preview-06-05 + + +
grok-3-mini + + +
grok-3 + + +
grok-3-fast + + +
deepseek-chat + + +
deepseek-reasoner + + +
gpt-oss-120b. + + -
qwen-3-32b + + +
llama-4-scout-17b-16e-instruct + + +
llama-4-maverick-17b-128e-instruct + + +

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

universal_llm_service-1.0.19.tar.gz (2.1 MB view details)

Uploaded Source

Built Distribution

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

universal_llm_service-1.0.19-py3-none-any.whl (2.0 MB view details)

Uploaded Python 3

File details

Details for the file universal_llm_service-1.0.19.tar.gz.

File metadata

  • Download URL: universal_llm_service-1.0.19.tar.gz
  • Upload date:
  • Size: 2.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for universal_llm_service-1.0.19.tar.gz
Algorithm Hash digest
SHA256 6c17354c5f13d69dd1a0bbc5b2785a8e19ba457772881ddb9980cb53d161fbc3
MD5 8b6cdde4c0d841c88176e25aad09b426
BLAKE2b-256 611a78ba9a30b511fae81f4a60f177b81d91f39ac47584b3500f3b22e1d0732d

See more details on using hashes here.

File details

Details for the file universal_llm_service-1.0.19-py3-none-any.whl.

File metadata

File hashes

Hashes for universal_llm_service-1.0.19-py3-none-any.whl
Algorithm Hash digest
SHA256 06877c0808509d6ccb8fa8f7dcfce36ba4da04ca13f421b2de9de70a9e5ac8f2
MD5 76628a23bc1789d8cd0db8075e4d84c0
BLAKE2b-256 fb5369176bb5c46cd825dc4e089c4bdb16fcc94d33fd7e6bfea74767d6004273

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