Библиотека для работы с языковыми моделями
Project description
LLM Service
Библиотека для упрощенного использования LLM
Библиотека предоставляет упрощенный интерфейс для работы с различными LLM моделями, автоматический подсчет токенов и стоимости запросов, а также удобную интеграцию с существующими проектами. Создана на основе Langchain, являясь практичной оберткой для стандартизации взаимодействия с моделями.
Основные возможности:
- Простой и понятный интерфейс для работы с LLM моделями
- Автоматический подсчет стоимости запросов
- Поддержка асинхронного API
- Мониторинг использования токенов
- Расчет затрат в USD с учетом текущего курса валюты по ЦБ РФ
Установка:
pip install universal-llm-service
Использование:
Перед началом нужно создать экземпляр модели, langchain - подобный:
Если в langchain мы создаем такой экземпляр:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model='gpt-4o-mini',
api_key='sk-proj-1234567890',
temperature=0,
)
То здесь мы должны создавать такой:
from llm.constructor import BaseLLM
llm = 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?')
if __name__ == "__main__":
asyncio.run(main())
result- ответ модели (строка)
Структурированный вывод:
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)
if __name__ == '__main__':
asyncio.run(main())
result- ответ модели (запрошенная Pydantic схема)
Потоковый вывод:
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())
result = llm.astream(message='Расскажи теорему Пифагора')
async for chunk in result:
print(chunk, end='', flush=True)
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())
async with llm.astream_mgr(message='Расскажи теорему Пифагора') as stream:
async for chunk in stream:
print(chunk, end='', flush=True)
if __name__ == '__main__':
asyncio.run(main())
Подробнее о возможностях:
-
get_llm_config- получает конфиг для LLM модели, можно увидеть в примерах, имена полей должны совпадать с именами полей при инициализации моделей для Langchain. -
llm.ainvoke- метод принимает как отдельно системный промпт или сообщение, так и историю полность. Параметры принимаются как в стиле langchain так и в виде словарей. Перед отправкой любого сообщения в LLM отрабатывает класс подготовки контекста - PrepareChat: Класс для подготовки чата в формате Langchain для модели.
- Данный класс всегда отдает список сообщений в формате Langchain.
- Если был отправлен только системный промпт, то после него добавляется пустое сообщение пользователя. Иначе некоторые модели не хотят работать с единственным системным промптом.
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.counter.model_registry.usd_rate- курс валюты в USD.
Запуск локально (для разработки):
Установка зависимостей
pip install -r requirements.txt
Создать файл .env на основе шаблона .env.template и вписать ключи
Запуск примеров:
python -m example.simple # Пример обычного общения с LLM
python -m example.structured # Пример общения с LLM со структурированным выводом
python -m example.stream # Пример общения с LLM в режиме стрима
python -m example.stream_mgr # Пример общения с LLM в режиме стрима через контекстный менеджер
TODO:
- Добавить популярные модели для использования
- Добавить подсчет токенов для стримминговой передачи
Список поддерживаемых моделей:
| Модели | Обычный режим | Стриминговый режим | Режим структурированного ответа |
|---|---|---|---|
| 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file universal_llm_service-1.0.13.tar.gz.
File metadata
- Download URL: universal_llm_service-1.0.13.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90f335dcdf8dfe4f4ae46eb46c5a39471f2b17daa5a1ff7d02117fa2aab26f32
|
|
| MD5 |
7eadc214f9133f3b1c887721926e4b61
|
|
| BLAKE2b-256 |
13c1b55242b9c51ba031b089669e35106cdeb7e1f5bc0dd428c639258d4cc15c
|
File details
Details for the file universal_llm_service-1.0.13-py3-none-any.whl.
File metadata
- Download URL: universal_llm_service-1.0.13-py3-none-any.whl
- Upload date:
- Size: 2.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9440f9831e712111208b1844b29c72751551e479804d99872eaf144b9e17e462
|
|
| MD5 |
61ca48bd453d35c9a61493c5b33988a0
|
|
| BLAKE2b-256 |
2c235a6d83970b5d82c76340ddf5d378f22dc21217f8d6b247b9808423e0d4e3
|