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.23.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.23-py3-none-any.whl (2.0 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: universal_llm_service-1.0.23.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.23.tar.gz
Algorithm Hash digest
SHA256 7171dab4385d30e2c1efedf06f1e8e4323a2ebec3040bd855bc5feaec7b7fe4d
MD5 ce78273812cb0673c1c301c4e8a24154
BLAKE2b-256 5be7f35f39c7e0afc84b965e824d0c78dcef699bd4f05ba9910c505ea5b7052c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for universal_llm_service-1.0.23-py3-none-any.whl
Algorithm Hash digest
SHA256 1b040dfe4daaff1c2c099afcac7524cff9345b5067612158f146fa6408a95c53
MD5 5c32d80d5f20307d0039617ca6a06c56
BLAKE2b-256 0cd4898b2dc3905a700c07cf431ba0db1e04c5bfd884b398e3cf41dd2f8252bc

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