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

Uploaded Python 3

File details

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

File metadata

  • Download URL: universal_llm_service-1.0.20.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.20.tar.gz
Algorithm Hash digest
SHA256 c8107ac29c8a7c2fd7f6c7fbd7e0c7c00587d5906af76a0a94a9c2fb8fbeaa87
MD5 891b2a8303d0987ce83aee42101ece3f
BLAKE2b-256 a06c5ab3e68bfddebf625ac29d3dcb54963fdb623b7de18663bf0f5a73468d7c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for universal_llm_service-1.0.20-py3-none-any.whl
Algorithm Hash digest
SHA256 450fab2a88bf6f384ba8ce05231251f646dd1d6e3d9650bcd091b6812fa1ff1b
MD5 97b9ae979c1f10f9439479931148cac0
BLAKE2b-256 36752e85d3f2cbc6438abadbb658e761fa1ca184bf34b9c0a6fcd10ba8b3a785

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