Metadata-Version: 2.4
Name: universal-llm-service
Version: 0.1.1
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: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
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

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

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

## Установка:
```sh
pip install git+https://github.com/DenisShahbazyan/LLM_Service.git
```

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

### Обычный диалог с 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:
- Добавить популярные модели для использования
- Добавить подсчет токенов для стримминговой передачи

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