Metadata-Version: 2.4
Name: universal-llm-service
Version: 0.1.2
Summary: Библиотека для работы с языковыми моделями
Author-email: Денис Шахбазян <otbephncb@gmail.com>
Project-URL: Homepage, https://github.com/DenisShahbazyan/LLM_Service
Project-URL: Bug Tracker, https://github.com/DenisShahbazyan/LLM_Service/issues
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: MIT License
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: aiohttp==3.11.18
Requires-Dist: langchain==0.3.25
Requires-Dist: langchain-openai==0.3.17
Requires-Dist: langchain-gigachat==0.3.10
Requires-Dist: langchain-anthropic==0.3.13
Requires-Dist: tiktoken==0.9.0
Dynamic: license-file

# LLM Service

[![PyPI version](https://img.shields.io/pypi/v/universal-llm-service.svg)](https://pypi.org/project/universal-llm-service/)
[![Build Status](https://github.com/DenisShahbazyan/LLM_Service/actions/workflows/publish.yml/badge.svg)](https://github.com/DenisShahbazyan/LLM_Service/actions)
[![Python Versions](https://img.shields.io/pypi/pyversions/universal-llm-service.svg)](https://pypi.org/project/universal-llm-service/)
[![License](https://img.shields.io/pypi/l/universal-llm-service.svg)](https://github.com/DenisShahbazyan/LLM_Service/blob/master/LICENSE)

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

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

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

## Установка:
```sh
pip install universal-llm-service
```

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

### Обычный диалог с LLM:
```py
import asyncio
from llm import LLMService

from llm_config import get_llm_config


async def main():
    llm = await LLMService.create(get_llm_config('gpt-4o-mini'))
    result = await llm.ainvoke(message='Сколько будет 2 + 2?')


if __name__ == "__main__":
    asyncio.run(main())
```
- `result` - ответ модели (строка)

### Структурированный вывод:
```py
import asyncio

from pydantic import BaseModel, Field

from llm_config import get_llm_config
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(get_llm_config('gpt-4o-mini'))
    structured_llm = await llm.with_structured_output(RelatedConceptListOutput)
    result = await structured_llm.ainvoke(message=SYSTEM_PROMPT)


if __name__ == '__main__':
    asyncio.run(main())
```
- `result` - ответ модели (запрошенная Pydantic схема)

## Подробнее о возможностях:
- `get_llm_config` - получает конфиг для LLM модели, можно увидеть в примерах, имена полей должны совпадать с именами полей при инициализации моделей для Langchain.

- `llm.ainvoke` - метод принимает как отдельно системный промпт или сообщение, так и историю полность. Параметры принимаются как в стиле 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.counter.model_registry.usd_rate` - курс валюты в USD.

## Запуск локально (для разработки):
Установка зависимостей
```sh
pip install -r requirements.txt
```

Запуск примеров:
```sh
python -m example.simple_example  # Пример обычного общения с LLM
python -m example.structured_example  # Пример общения с LLM со структурированным выводом
```

## TODO:
- Добавить популярные модели для использования
- Добавить подсчет токенов для стримминговой передачи

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