gigaserve


Namegigaserve JSON
Version 0.2.3 PyPI version JSON
download
home_pagehttps://github.com/ai-forever/gigaserve
SummaryNone
upload_time2024-09-09 13:59:49
maintainerNone
docs_urlNone
authorLangChain
requires_python<4.0,>=3.8.1
licenseLangServe
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # GigaServe πŸ¦œοΈπŸ“ = LangServe + GigaChat

GigaServe β€” это python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая позволяСт Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π° сСрвСрС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈ runnable-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ GigaChain с прСдоставлСниСм ΠΊ Π½ΠΈΠΌ доступа Ρ‡Π΅Ρ€Π΅Π· REST API.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° GigaServe ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° с [FastAPI](https://fastapi.tiangolo.com/) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… [Pydantic](https://docs.pydantic.dev/latest/).

## ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ возмоТности:

- АвтоматичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ схСм Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° основС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GigaChain. Π‘Ρ…Π΅ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса ΠΊ API ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….
- Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° API-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ с JSONSchema ΠΈ Swagger.
- Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚Ρ‹ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ мноТСства ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… запросов Π½Π° ΠΎΠ΄Π½ΠΎΠΌ сСрвСрС `/invoke`, `/batch` ΠΈ `/stream`.
- Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚ `/stream_log` для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ всСх ΠΈΠ»ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… шагов Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ/Π°Π³Π΅Π½Ρ‚Π°.
- **Π½ΠΎΠ²ΠΎΠ΅** ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° эндпоинта  `/stream_events` (с вСрсии 0.0.40), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ, Ρ‚Π°ΠΊ позволяСт Π½Π΅ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ `/stream_log`.
- Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ пСсочница `/playground` с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ дСмонстрациСй ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… шагов.
- ИспользованиС ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… open-source Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ FastAPI, Pydantic, uvloop ΠΈ asyncio.
- ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ SDK, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ сСрвСру GigaServe Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ runnable-интСрфСйсу ΠΈΠ»ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ HTTP API.

### ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ

- Колбэки ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ для событий, происходящих Π½Π° сСрвСрС.
- OpenAPI-спСцификация Π½Π΅ гСнСрируСтся, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Pydantic V2. Π­Ρ‚ΠΎ связанно с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Fast API Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ [смСшиваниС пространств ΠΈΠΌΠ΅Π½ pydantic v1 ΠΈ v2](https://github.com/tiangolo/fastapi/issues/10360). ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π½ΠΈΠΆΠ΅.

## Установка {#ustanovka}

Для ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ установки ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

```bash
pip install "gigaserve[all]"
```

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄:

```sh
# Команда установки ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
pip install "gigaserve[client]"

# Команда установки сСрвСра
pip gigaserve "langserve[server]"
```

## GigaChain CLI πŸ› οΈ

GigaChain CLI β€” это ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, которая ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ быстро Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ GigaServe. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

```sh
gigachain app new ../path/to/directory
```

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с GigaChain CLI всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

```sh
pip install -U gigachain-cli
```

## ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅

Для управлСния зависимостями GigaServe ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `poetry`.
ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± это инструмСнтС Π² [ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ](https://python-poetry.org/docs/).

### 1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ gigachain cli.

```sh
langchain app new my-app
```

### 2. Π—Π°Π΄Π°ΠΉΡ‚Π΅ runnable-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° add_routes.

ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„Π°ΠΉΠ» `server.py`.

```sh
add_routes(app. NotImplemented)
```

### 3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `poetry` для добавлСния сторонних ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

```sh
poetry add [package-name] // e.g `poetry add langchain-openai`
```

### 4. Π—Π°Π΄Π°ΠΉΡ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды.

НапримСр:

```sh
export OPENAI_API_KEY="sk-..."
```

### 5. ЗапуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

```sh
poetry run langchain serve --port=8100
```

## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Для быстрого старта GigaServe ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ [ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ GigaChain](https://github.com/ai-forever/gigachain/blob/master/templates/README.md).

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² шаблонов Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² [Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ](https://github.com/ai-forever/gigaserve/tree/main/examples).

| ОписаниС                                                                                                                                                                                                                                                           | Бсылки                                                                                                                                                                                                                           |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **LLMs** ΠŸΡ€ΠΈΠΌΠ΅Ρ€ нСбольшого прилоТСния, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ с модСлями OpenAI ΠΈ Anthropic. ДСмонстрируСт Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ.                                                                                                                                              | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/llm/server.py), [client](https://github.com/ai-forever/gigaserve/blob/main/examples/llm/client.ipynb)                                                       |
| **Π Π΅Ρ‚Ρ€ΠΈΠ²Π΅Ρ€** ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт доступ ΠΊ Ρ€Π΅Ρ‚Ρ€ΠΈΠ²Π΅Ρ€Ρƒ.                                                                                                                                                                                                | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/retrieval/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/retrieval/client.ipynb)                                           |
| **Π Π°Π·Π³ΠΎΠ²ΠΎΡ€Π½Ρ‹ΠΉ Ρ€Π΅Ρ‚Ρ€ΠΈΠ²Π΅Ρ€** [Π Π°Π·Π³ΠΎΠ²ΠΎΡ€Π½Ρ‹ΠΉ Ρ€Π΅Ρ‚Ρ€ΠΈΠ²Π΅Ρ€](https://python.langchain.com/docs/expression_language/cookbook/retrieval#conversational-retrieval-chain) Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GigaServe                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/conversational_retrieval_chain/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/conversational_retrieval_chain/client.ipynb) |
| **АгСнт** Π±Π΅Π· **истории Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°**, основанный Π½Π° [инструмСнтах OpenAI](https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent)                                                                                                            | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/agent/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/agent/client.ipynb)                                                   |
| **АгСнт** с **историСй Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°**, основанный Π½Π° [инструмСнтах OpenAI](https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent)                                                                                                               | [server](https://github.com/ai-forever/gigaserve/blob/main/examples/agent_with_history/server.py), [client](https://github.com/ai-forever/gigaserve/blob/main/examples/agent_with_history/client.ipynb)                         |
| [RunnableWithMessageHistory](https://python.langchain.com/docs/expression_language/how_to/message_history) имплСмСнтация Ρ‡Π°Ρ‚Π° с историСй Π½Π° бэкСндС. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСссий с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° `session_id`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.                                                                    | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence/client.ipynb)                   |
| [RunnableWithMessageHistory](https://python.langchain.com/docs/expression_language/how_to/message_history) имплСмСнтация Ρ‡Π°Ρ‚Π° с историСй Π½Π° бэкСндС. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСссий с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² `conversation_id`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΈ `user_id`. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ `user_id` Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ АутСнтификация. | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence_and_user/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence_and_user/client.ipynb) |
| [Configurable Runnable](https://python.langchain.com/docs/expression_language/how_to/configure). Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Ρ€Π΅Ρ‚Ρ€ΠΈΠ²Π΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½Π·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ названия индСкса Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹.                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_retrieval/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_retrieval/client.ipynb)                 |
| [Configurable Runnable](https://python.langchain.com/docs/expression_language/how_to/configure). ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ настраиваСмыС поля ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ для Π½ΠΈΡ….                                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_chain/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_chain/client.ipynb)                         |
| **APIHandler** ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `APIHandler` вмСсто `add_routes`. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ эндпоинты. Π₯ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ примСнСниями FastAPI, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.                                                        | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/api_handler_examples/server.py)                                                                                                                             |
| **LCEL ΠΏΡ€ΠΈΠΌΠ΅Ρ€** ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ LCEL Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ словаря.                                                                                                                                                                                          | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/passthrough_dict/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/passthrough_dict/client.ipynb)                             |
| **АутСнтификация** с `add_routes`: ΠŸΡ€ΠΎΡΡ‚Π°Ρ аутСнтификация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎ всСм эндпоинтам прилоТСния. НС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСсколькими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/global_deps/server.py)                                                                                                                                 |
| **АутСнтификация** с `add_routes`: ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, основанный Π½Π° зависимостях ΠΏΡƒΡ‚ΠΈ. НС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСсколькими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.                                                                                                                    | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/path_dependencies/server.py)                                                                                                                           |
| **АутСнтификация** с `add_routes`: Π Π°Π±ΠΎΡ‚Π° с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ аутСнтификация для эндпоинтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с OpenAPI Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ.                                                                                 | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/client.ipynb)     |
| **АутСнтификация** с `APIHandler`: Π Π°Π±ΠΎΡ‚Π° с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ аутСнтификация, которая дСмонстрируСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ поиска Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.                                                                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/client.ipynb)                             |
| **Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹** Π Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с пСсочницСй (Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‡Π°Ρ‚).                                                                                                                                                                              | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/widgets/chat/tuples/server.py)                                                                                                                              |
| **Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹** Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° для пСсочницы GigaServe.                                                                                                                                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/client.ipynb)                               |

## ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния

### Π‘Π΅Ρ€Π²Π΅Ρ€

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ‡Π°Ρ‚-ΠΌΠΎΠ΄Π΅Π»ΠΈ GigaChat ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… LLM, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡˆΡƒΡ‚ΠΊΡƒ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ (`topic`) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠ΄Π΅Π»ΠΈ Anthropic.

```python
#!/usr/bin/env python
from fastapi import FastAPI
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import GigaChat, ChatAnthropic, ChatOpenAI

from langserve import add_routes

app = FastAPI(
  title="GigaChain Server",
  version="1.0",
  description="ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ API-сСрвСр, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ runnable-интСрфСйсы GigaChain",
)

add_routes(
    app,
    GigaChat(credentials=<Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅>),
    path="/gigachat",
) 

add_routes(
    app,
    ChatOpenAI(),
    path="/openai",
)

add_routes(
    app,
    ChatAnthropic(model="claude-3-haiku-20240307"),
    path="/anthropic",
)

model = ChatAnthropic()
prompt = ChatPromptTemplate.from_template("расскаТи ΡˆΡƒΡ‚ΠΊΡƒ ΠΎ {topic}")
add_routes(
    app,
    prompt | model,
    path="/joke",
)

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="localhost", port=8000)
```

### ДокумСнтация

БгСнСрированная OpenAPI-докумСнтация ΠΊ сСрвСру, Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, доступна ΠΏΠΎ адрСсу:

```sh
curl localhost:8000/docs
```

ΠŸΡ€ΠΈ этом, адрСс `localhost:8000` Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ 404, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ `@app.get("/")`.

> [!NOTE]
> ΠŸΡ€ΠΈ использовании pydantic v2 [докумСнтация Π½Π΅ гСнСрируСтся](#Ρ€Π°Π±ΠΎΡ‚Π°-с-pydantic) для эндпоинтов `/invoke`, `/batch`, `/stream` ΠΈ `stream_log`.

### ΠšΠ»ΠΈΠ΅Π½Ρ‚

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° основС Python SDK:

```python
from langchain.schema import SystemMessage, HumanMessage
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnableMap
from langserve import RemoteRunnable

openai = RemoteRunnable("http://localhost:8000/openai/")
anthropic = RemoteRunnable("http://localhost:8000/anthropic/")
joke_chain = RemoteRunnable("http://localhost:8000/joke/")

# Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²

joke_chain.invoke({"topic": "ΠΏΠΎΠΏΡƒΠ³Π°ΠΈ"})

# Асинхронный Π²Ρ‹Π·ΠΎΠ²
await joke_chain.ainvoke({"topic": "ΠΏΠΎΠΏΡƒΠ³Π°ΠΈ"})

prompt = [
    SystemMessage(content='Π’Π΅Π΄ΠΈ сСбя ΠΊΠ°ΠΊ кошка ΠΈΠ»ΠΈ ΠΏΠΎΠΏΡƒΠ³Π°ΠΉ.'),
    HumanMessage(content='ΠŸΡ€ΠΈΠ²Π΅Ρ‚!')
]

# ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° astream
async for msg in anthropic.astream(prompt):
    print(msg, end="", flush=True)

prompt = ChatPromptTemplate.from_messages(
    [("system", "РасскаТи ΠΌΠ½Π΅ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΎ {topic}")]
)

# ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ собствСнных Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ
chain = prompt | RunnableMap({
    "openai": openai,
    "anthropic": anthropic,
})

chain.batch([{ "topic": "ΠΏΠΎΠΏΡƒΠ³Π°ΠΈ" }, { "topic": "кошки" }])
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° TypeScript (для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° трСбуСтся LangChain.js вСрсии 0.0.166 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅):

```typescript
import { RemoteRunnable } from "@langchain/core/runnables/remote";

const chain = new RemoteRunnable({
  url: `http://localhost:8000/joke/`,
});
const result = await chain.invoke({
  topic: "кошки",
});
```

ΠšΠ»ΠΈΠ΅Π½Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ `requests`:

```python
import requests

response = requests.post(
    "http://localhost:8000/joke/invoke/",
    json={'input': {'topic': 'кошки'}}
)
response.json()
```

ИспользованиС cURL:

```sh
curl --location --request POST 'http://localhost:8000/joke/invoke' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "input": {
            "topic": "кошки"
        }
    }'
```

## Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚Ρ‹

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π° сСрвСр Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹Π΅ эндпоинты для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с runnable-интСрфСйсами:

```python
...
add_routes(
    app,
    runnable,
    path="/my_runnable",
)
```

Бписок эндпоинтов:

- `POST /my_runnable/invoke` β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ runnable-интСрфСйс для Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…;
- `POST /my_runnable/batch` β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ runnable-интСрфСйс для Π½Π°Π±ΠΎΡ€Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…;
- `POST /my_runnable/stream` β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ;
- `POST /my_runnable/stream_log` β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… шагов ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ;
- `POST /my_runnable/astream_events` - Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ событий, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ, Π² Ρ‚ΠΎΠΌ числС для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… шагов;
- `GET /my_runnable/input_schema` β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ JSON-схСму Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… runnable-интСрфСйса;
- `GET /my_runnable/output_schema` β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ JSON-схСму Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… runnable-интСрфСйса;
- `GET /my_runnable/config_schema` β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ JSON-схСму ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ runnable-интСрфСйса;

> [!NOTE]
> Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² соотвСтствии с интСрфСйсом [LangChain Expression Language (LCEL)](https://python.langchain.com/docs/expression_language/interface) β€” DSL для создания Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ.

## ΠŸΠ΅ΡΠΎΡ‡Π½ΠΈΡ†Π°

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° пСсочницы доступна ΠΏΠΎ адрСсу `/my_runnable/playground`.
На Π½Π΅ΠΉ прСдставлСн простой интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ runnable-интСрфСйса ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запрос ΠΊ Π½Π΅ΠΌΡƒ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΈ дСмонстрациСй ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… шагов.

<p align="center">
<img src="https://github.com/ai-forever/gigaserve/assets/3205522/5ca56e29-f1bb-40f4-84b5-15916384a276" width="50%"/>
</p>

### Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹

ΠŸΠ΅ΡΠΎΡ‡Π½ΠΈΡ†Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ [Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹](#playground-widgets) ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для тСстирования Π²Π°ΡˆΠΈΡ… Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

ΠšΡ€ΠΎΠΌΠ΅ этого, Ссли Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ, пСсочница прСдоставляСт Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ссылкой Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.

### ОбмСн ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ

In addition, for configurable runnables, the playground will allow you to configure the
runnable and share a link with the configuration:

<p align="center">
<img src="https://github.com/ai-forever/gigaserve/assets/3205522/86ce9c59-f8e4-4d08-9fa3-62030e0f521d" width="50%"/>
</p>


## ΠŸΠ΅ΡΠΎΡ‡Π½ΠΈΡ†Π° для Ρ‡Π°Ρ‚Π°

GigaServe ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ пСсочницы с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ‡Π°Ρ‚Π°, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ адрСсу `/my_runnable/playground/`.
Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅ΠΉ пСсочницы Π² этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ runnable-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… схСма Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ прСдставлСна Π² Π²ΠΈΠ΄Π΅ словаря ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ:

- Π»ΠΈΠ±ΠΎ содСрТит ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΡŽΡ‡ со списком сообщСний Ρ‡Π°Ρ‚Π°. a single key, and that key's value must be a list of chat messages;
- Π»ΠΈΠ±ΠΎ содСрТит Π΄Π²Π° ΠΊΠ»ΡŽΡ‡Π°: ΠΎΠ΄ΠΈΠ½ со списком сообщСний Ρ‡Π°Ρ‚Π°, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ с самым послСдним сообщСниСм.

РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

Π’Π°ΠΊΠΆΠ΅, runnable-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ `AIMessage` ΠΈΠ»ΠΈ строку.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ пСсочницу Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ `playground_type="chat"` ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡƒΡ‚ΠΈ:

```python
# ОбъявлСниС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "Π’Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ, ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Воля."),
        MessagesPlaceholder(variable_name="messages"),
    ]
)

chain = prompt | ChatAnthropic(model="claude-2")


class InputChat(BaseModel):
    """Π’Π²ΠΎΠ΄ для эндпоинта Ρ‡Π°Ρ‚Π°."""

    messages: List[Union[HumanMessage, AIMessage, SystemMessage]] = Field(
        ...,
        description="БообщСния Ρ‡Π°Ρ‚Π° Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π΅.",
    )


add_routes(
    app,
    chain.with_types(input_type=InputChat),
    enable_feedback_endpoint=True,
    enable_public_trace_link_endpoint=True,
    playground_type="chat",
)
```

<!--
If you are using LangSmith, you can also set `enable_feedback_endpoint=True` on your route to enable thumbs-up/thumbs-down buttons
after each message, and `enable_public_trace_link_endpoint=True` to add a button that creates a public traces for runs.
Note that you will also need to set the following environment variables:

```bash
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_PROJECT="YOUR_PROJECT_NAME"
export LANGCHAIN_API_KEY="YOUR_API_KEY"
```

Here's an example with the above two options turned on:

<p align="center">
<img src="./.github/img/chat_playground.png" width="50%"/>
</p>

Note: If you enable public trace links, the internals of your chain will be exposed. We recommend only using this setting
for demos or testing.
-->

## Π Π°Π±ΠΎΡ‚Π° с классичСскими Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ

GigaServe Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ с runnable-интСрфСйсами (написанным с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [LangChain Expression Language](https://python.langchain.com/docs/expression_language/)), Ρ‚Π°ΠΊ ΠΈ с классичСскими Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ (посрСдством наслСдования ΠΎΡ‚ `Chain`).

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с классичСскими Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ схСмы для Ρ‚Π°ΠΊΠΈΡ… Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ошибки, Ρ‚.ΠΊ. ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΌΠΈ.
Π’Π°ΠΊΠΈΠ΅ ошибки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ, Ссли ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ `input_schema` Ρ‚Π°ΠΊΠΈΡ… Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ Π² GigaChain.

## Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅

НиТС описаны способы развСртывания Π½Π° AWS, Google Cloud Platforms (GCP) ΠΈ Azure.

### AWS

Для развСртывания Π½Π° AWS Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [AWS Copilot CLI](https://aws.github.io/copilot-cli/).

```bash
copilot init --app [application-name] --name [service-name] --type 'Load Balanced Web Service' --dockerfile './Dockerfile' --deploy
```

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ β€” Π² [ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ](https://aws.amazon.com/containers/copilot/).

### GCP

Для развСртывания Π½Π° GCP Cloud Run ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

```sh
gcloud run deploy [your-service-name] --source . --port 8001 --allow-unauthenticated --region us-central1 --set-env-vars=GIGACHAT_API_KEY=your_key
```

### Azure

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сСрвСр Π½Π° Azure с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Azure Container Apps:

```sh
az containerapp up --name [container-app-name] --source . --resource-group [resource-group-name] --environment  [environment-name] --ingress external --target-port 8001 --env-vars=OPENAI_API_KEY=your_key
```

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ информация Π² [ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ](https://learn.microsoft.com/en-us/azure/container-apps/containerapp-up).


## Π Π°Π±ΠΎΡ‚Π° с Pydantic

GigaServe ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Pydantic v2 с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ограничСниями:

- ΠŸΡ€ΠΈ использовании Pydantic v2 докумСнтация OpenAPI Π½Π΅ гСнСрируСтся. Π­Ρ‚ΠΎ связанно с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Fast API Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ [смСшиваниС пространств ΠΈΠΌΠ΅Π½ pydantic v1 ΠΈ v2](https://github.com/tiangolo/fastapi/issues/10360).
- GigaChain ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ пространство ΠΈΠΌΠ΅Π½ вСрсии v1 Π² Pydantic v2.

Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, эндпоинты API, страница пСсочницы ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

## Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности

## Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ

О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π½Π° свой сСрвСр GigaServe β€” Π² Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ FastAPI, посвящСнных [бСзопасности](https://fastapi.tiangolo.com/tutorial/security/) ΠΈ [использованию ΡΠ²ΡΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ПО](https://fastapi.tiangolo.com/tutorial/middleware/).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² GigaServe с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² FastAPI.

Π’Π°ΠΌ прСдстоит ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π΄Ρ€.

Если Π²Ρ‹ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² своих силах, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ [Auth0](https://auth0.com/).

#### ИспользованиС add_routes

[ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ](https://github.com/langchain-ai/langserve/tree/main/examples/auth) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `add_routes`.

| ОписаниС                                                                                                                                                                        | Бсылки                                                                                                                                                                                                                           |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **АутСнтификация** с `add_routes`: ΠŸΡ€ΠΎΡΡ‚Π°Ρ аутСнтификация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎ всСм эндпоинтам прилоТСния. НС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСсколькими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/global_deps/server.py)                                                                                                                                 |
| **АутСнтификация** с `add_routes`: ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, основанный Π½Π° зависимостях ΠΏΡƒΡ‚ΠΈ. НС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСсколькими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ.                                                                                                                    | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/path_dependencies/server.py)                                                                                                                           |
| **АутСнтификация** с `add_routes`: Π Π°Π±ΠΎΡ‚Π° с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ аутСнтификация для эндпоинтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с OpenAPI Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ.                                                                                 | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/client.ipynb)     |

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО FastAPI](https://fastapi.tiangolo.com/tutorial/middleware/).

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ использования Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… зависимостСй ΠΈ зависимостСй ΠΏΡƒΡ‚Π΅ΠΉ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ такая аутСнтификация Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² OpenAPI-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.
Π’ Ρ‚ΠΎ ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅ эти ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ Π½Π΅ подходят для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ. НапримСр, для создания прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `per_req_config_modifier` ΠΈΠ»ΠΈ `APIHandler` (см. Π½ΠΈΠΆΠ΅).

If you need to implement per user logic, you can use the `per_req_config_modifier` or `APIHandler` (below) to implement this logic.

**Π Π°Π±ΠΎΡ‚Π° с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ**

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° авторизация, которая зависит ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΡ€ΠΈ использовании `add_routes` Π·Π°Π΄Π°ΠΉΡ‚Π΅ `per_req_config_modifier`.

Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `Request` ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

#### ИспользованиС APIHandler

Если Π²Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с FastAPI ΠΈ Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [APIHandler](https://github.com/langchain-ai/langserve/blob/main/examples/api_handler_examples/server.py) GigaServe.

| ОписаниС                                                                                                                                                                                                 | Бсылки                                                                                                                                                                                                           |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **АутСнтификация** с `APIHandler`: Π Π°Π±ΠΎΡ‚Π° с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ аутСнтификация, которая дСмонстрируСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ поиска Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.                                                                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/client.ipynb)                             |
| **APIHandler** ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `APIHandler` вмСсто `add_routes`. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ эндпоинты. Π₯ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ примСнСниями FastAPI, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большС Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.                                                        | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/api_handler_examples/server.py)                                                                                                                             |

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ слоТнСС, Π½ΠΎ ΠΏΡ€ΠΈ этом прСдоставляСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ эндпоинтов, Ρ‡Ρ‚ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ позволяСт Ρ€Π΅Π°Π»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

### Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² β€” это типичная Π·Π°Π΄Π°Ρ‡Π° для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… языковых ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.
Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ:

- Π€Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π½Π° сСрвСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ эндпоинта ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ;
- Π€Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСн ΠΊΠ°ΠΊ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ значСния, Ρ‚Π°ΠΊ ΠΈ Π² Π²ΠΈΠ΄Π΅ ссылки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° содСрТимоС Ρ„Π°ΠΉΠ»Π°, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ s3.
- Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ ΠΈΠ»ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ.
- Π‘Π»ΠΎΠΆΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΠ» процСссов. 

Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² соотвСтствии со своими Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ.

> [!NOTE]
> GigaServe Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ `multipart/form-data`.
> Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ значСния Ρ„Π°ΠΉΠ»Π° Π² runnable-интСрфСйс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ base64.
>
> [ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ base64](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing).
>
> Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ссылок (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ s3) ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈΡ… Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ эндпоинт ΠΊΠ°ΠΊ `multipart/form-data`.

### НастраиваСмыС Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π’ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ для всСх runnable-интСрфСйсов. Они доступны Π² Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… `input_schema` ΠΈ `output_schema`. GigaServe ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эти Ρ‚ΠΈΠΏΡ‹ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ наслСдованныС Ρ‚ΠΈΠΏΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° `with_types`.

ΠžΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ:

```python
from typing import Any

from fastapi import FastAPI
from langchain.schema.runnable import RunnableLambda

app = FastAPI()


def func(x: Any) -> int:
    """ΠžΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ заданная функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, хотя Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ int."""
    return x + 1


runnable = RunnableLambda(func).with_types(
    input_type=int,
)

add_routes(app, runnable)
```

### ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹

Для дСсСриализации Π΄Π°Π½Π½Ρ‹Ρ… Π² pydantic-модСль, Π° Π½Π΅ `dict`, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΎΡ‚ `CustomUserType`.
ΠŸΡ€ΠΈ наслСдовании ΠΎΡ‚ этого Ρ‚ΠΈΠΏΠ° сСрвСр Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² `dict`, Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ pydantic-модСль.

```python
from fastapi import FastAPI
from langchain.schema.runnable import RunnableLambda

from langserve import add_routes
from langserve.schema import CustomUserType

app = FastAPI()


class Foo(CustomUserType):
    bar: int


def func(foo: Foo) -> int:
    """ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Foo, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ ΠΌΠΎΠ΄Π΅ pydantic model"""
    assert isinstance(foo, Foo)
    return foo.bar

# ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ автоматичСски!
# Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ
# runnable = RunnableLambda(func).with_types( # <-- НС Π½ΡƒΠΆΠ½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС
#     input_schema=Foo,
#     output_schema=int,
#
add_routes(app, RunnableLambda(func), path="/foo")
```

> [!NOTE]
> Π’ΠΈΠΏ `CustomUserType` поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сторонС сСрвСра ΠΈ опрСдСляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

### Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ страницы

На страницС пСсочницы Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ runnable-интСрфСйсов вашСго Π±Π΅ΠΊΠ΅Π½Π΄Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

| ОписаниС                                                                                                                                                                                                                                                           | Бсылки                                                                                                                                                                                                                           |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹** Π Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с пСсочницСй (Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‡Π°Ρ‚).                                                                                                                                                                              | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/widgets/chat/tuples/server.py)                                                                                                                              |
| **Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹** Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° для пСсочницы GigaServe.                                                                                                                                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/client.ipynb)                               |

#### Π‘Ρ…Π΅ΠΌΠ°

- Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ задаСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ поля ΠΈ поставляСтся ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ JSON-схСмы Π²Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.
- Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ `type`, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· извСстного списка Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ².
- Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ связаны со значСниями, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡƒΡ‚ΠΈ Π² JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

ΠžΠ±Ρ‰Π°Ρ схСма:

```typescript
type JsonPath = number | string | (number | string)[];
type NameSpacedPath = { title: string; path: JsonPath }; // title ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ JSON-схСмы, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ namespace
type OneOfPath = { oneOf: JsonPath[] };

type Widget = {
    type: string // Какой-Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстный Ρ‚ΠΈΠΏ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, base64file, chat ΠΈ Π΄Ρ€.
    [key: string]: JsonPath | NameSpacedPath | OneOfPath;
};
```

### ДоступныС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹

Π’ настоящСС врСмя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π²Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°:\

* Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°;
* Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Ρ‡Π°Ρ‚Π°.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ интСрфСйса пСсочницы ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ автоматичСски с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ графичСского интСрфСйса основанного Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ схСмС runnable-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
ΠŸΡ€ΠΈ создании настраиваСмых runnable-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² пСсочница Π΄ΠΎΠ»ΠΆΠ½Π° автоматичСски ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ подходящиС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ смоТСтС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ runnable.

#### Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ позволяСт Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π² интСрфСйсС пСсочницы. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π²ΠΈΠ΄Π΅ base64-строки.

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

```python
try:
    from pydantic.v1 import Field
except ImportError:
    from pydantic import Field

from langserve import CustomUserType


# Π’ΠΠ˜ΠœΠΠΠ˜Π•: ΠΠ°ΡΠ»Π΅Π΄ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΎΡ‚ CustomUserType, Π° Π½Π΅ ΠΎΡ‚ BaseModel. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС
#            сСрвСр Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² dict, Π° Π½Π΅ модСль pydantic.
class FileProcessingRequest(CustomUserType):
    """Request including a base64 encoded file."""

    # Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² интСрфСйсС ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ страницы.
    file: str = Field(..., extra={"widget": {"type": "base64file"}})
    num_chars: int = 100

```

> [!NOTE]
> [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»Π°](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing).

<p align="center">
<img src="https://github.com/ai-forever/gigaserve/assets/3205522/52199e46-9464-4c2e-8be8-222250e08c3f" width="50%"/>
</p>

### Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Ρ‡Π°Ρ‚Π° {#vidzhet-chata}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² [Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ](https://github.com/ai-forever/gigaserve/blob/main/examples/widgets/server.py).

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Ρ‡Π°Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ `"type": "chat"`:

* ПолС `input` β€” JSONPath ΠΊ полю запроса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит Π½ΠΎΠ²ΠΎΠ΅ входящСС сообщСниС.
* ПолС `output` β€” JSONPath ΠΊ полю ΠΎΡ‚Π²Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ нСсколько сообщСний.

НС ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ эти поля, Ссли входящиС ΠΈ исходящиС Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ прСдставлСны Π² исходном Π²ΠΈΠ΄Π΅.
НапримСр, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ исходящиС Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ списка сообщСний.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

```py
class ChatHistory(CustomUserType):
    chat_history: List[Tuple[str, str]] = Field(
        ...,
        examples=[[("human input", "ai response")]],
        extra={"widget": {"type": "chat", "input": "question", "output": "answer"}},
    )
    question: str


def _format_to_messages(input: ChatHistory) -> List[BaseMessage]:
    """ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π΄Π° Π² Π²ΠΈΠ΄Π΅ списка собщСний."""
    history = input.chat_history
    user_input = input.question

    messages = []

    for human, ai in history:
        messages.append(HumanMessage(content=human))
        messages.append(AIMessage(content=ai))
    messages.append(HumanMessage(content=user_input))
    return messages


model = ChatOpenAI()
chat_model = RunnableParallel({"answer": (RunnableLambda(_format_to_messages) | model)})
add_routes(
    app,
    chat_model.with_types(input_type=ChatHistory),
    config_keys=["configurable"],
    path="/chat",
)
```

### Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ эндпоинтов {#vklyuchenie-i-otklyuchenie-endpointov}

Начиная с вСрсии GigaServe 0.0.33, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ эндпоинты.
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ `enabled_endpoints`, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ эндпонтов ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ эндпоинтов `invoke`, `batch` ΠΈ `config_hash`.

```python
add_routes(app, chain, enabled_endpoints=["invoke", "batch", "config_hashes"], path="/mychain")
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ страницу пСсочницы для Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ.

```python
add_routes(app, chain, disabled_endpoints=["playground"], path="/mychain")
```

## Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

Π’ вСрсиях Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ 0.0.13β€”0.0.15 пСсочница, доступная ΠΏΠΎ адрСсу `/playground`, позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ Π½Π° сСрвСрС. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ [исправлСно Π² вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ 0.0.16 ΠΈ Π²Ρ‹ΡˆΠ΅](https://github.com/langchain-ai/langserve/pull/98).

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ai-forever/gigaserve",
    "name": "gigaserve",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.8.1",
    "maintainer_email": null,
    "keywords": null,
    "author": "LangChain",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/cf/2c/2a498b435353c1859de37cf77531b2de43c6b6a5fa33cfc94aa93807f101/gigaserve-0.2.3.tar.gz",
    "platform": null,
    "description": "# GigaServe \ud83e\udd9c\ufe0f\ud83c\udfd3 = LangServe + GigaChat\n\nGigaServe \u2014 \u044d\u0442\u043e python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438 runnable-\u043e\u0431\u044a\u0435\u043a\u0442\u044b GigaChain \u0441 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a \u043d\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0447\u0435\u0440\u0435\u0437 REST API.\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 GigaServe \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 [FastAPI](https://fastapi.tiangolo.com/) \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 [Pydantic](https://docs.pydantic.dev/latest/).\n\n## \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:\n\n- \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c \u0432\u0432\u043e\u0434\u0430 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 GigaChain. \u0421\u0445\u0435\u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a API \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.\n- \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 API-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441 JSONSchema \u0438 Swagger.\n- \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 `/invoke`, `/batch` \u0438 `/stream`.\n- \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 `/stream_log` \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0441\u0435\u0445 \u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0446\u0435\u043f\u043e\u0447\u043a\u0438/\u0430\u0433\u0435\u043d\u0442\u0430.\n- **\u043d\u043e\u0432\u043e\u0435** \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430  `/stream_events` (\u0441 \u0432\u0435\u0440\u0441\u0438\u0438 0.0.40), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439, \u0442\u0430\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 `/stream_log`.\n- \u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 `/playground` \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432.\n- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 open-source \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Python \u0442\u0430\u043a\u0438\u0445, \u043a\u0430\u043a FastAPI, Pydantic, uvloop \u0438 asyncio.\n- \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 SDK, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 GigaServe \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e HTTP API.\n\n### \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\n\n- \u041a\u043e\u043b\u0431\u044d\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.\n- OpenAPI-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Pydantic V2. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e Fast API \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [\u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u0438\u043c\u0435\u043d pydantic v1 \u0438 v2](https://github.com/tiangolo/fastapi/issues/10360). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043d\u0438\u0436\u0435.\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 {#ustanovka}\n\n\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:\n\n```bash\npip install \"gigaserve[all]\"\n```\n\n\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434:\n\n```sh\n# \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\npip install \"gigaserve[client]\"\n\n# \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\npip gigaserve \"langserve[server]\"\n```\n\n## GigaChain CLI \ud83d\udee0\ufe0f\n\nGigaChain CLI \u2014 \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 GigaServe. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:\n\n```sh\ngigachain app new ../path/to/directory\n```\n\n\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 GigaChain CLI \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:\n\n```sh\npip install -U gigachain-cli\n```\n\n## \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435\n\n\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 GigaServe \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 `poetry`.\n\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u0432 [\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438](https://python-poetry.org/docs/).\n\n### 1. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b gigachain cli.\n\n```sh\nlangchain app new my-app\n```\n\n### 2. \u0417\u0430\u0434\u0430\u0439\u0442\u0435 runnable-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 add_routes.\n\n\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0444\u0430\u0439\u043b `server.py`.\n\n```sh\nadd_routes(app. NotImplemented)\n```\n\n### 3. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 `poetry` \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.\n\n```sh\npoetry add [package-name] // e.g `poetry add langchain-openai`\n```\n\n### 4. \u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b.\n\n\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n\n```sh\nexport OPENAI_API_KEY=\"sk-...\"\n```\n\n### 5. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.\n\n```sh\npoetry run langchain serve --port=8100\n```\n\n## \u041f\u0440\u0438\u043c\u0435\u0440\u044b\n\n\u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0430 GigaServe \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 [\u0448\u0430\u0431\u043b\u043e\u043d\u044b GigaChain](https://github.com/ai-forever/gigachain/blob/master/templates/README.md).\n\n\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0432 [\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438](https://github.com/ai-forever/gigaserve/tree/main/examples).\n\n| \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435                                                                                                                                                                                                                                                           | \u0421\u0441\u044b\u043b\u043a\u0438                                                                                                                                                                                                                           |\n| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **LLMs** \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 OpenAI \u0438 Anthropic. \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438.                                                                                                                                              | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/llm/server.py), [client](https://github.com/ai-forever/gigaserve/blob/main/examples/llm/client.ipynb)                                                       |\n| **\u0420\u0435\u0442\u0440\u0438\u0432\u0435\u0440** \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0442\u0440\u0438\u0432\u0435\u0440\u0443.                                                                                                                                                                                                | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/retrieval/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/retrieval/client.ipynb)                                           |\n| **\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0442\u0440\u0438\u0432\u0435\u0440** [\u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0442\u0440\u0438\u0432\u0435\u0440](https://python.langchain.com/docs/expression_language/cookbook/retrieval#conversational-retrieval-chain) \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GigaServe                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/conversational_retrieval_chain/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/conversational_retrieval_chain/client.ipynb) |\n| **\u0410\u0433\u0435\u043d\u0442** \u0431\u0435\u0437 **\u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430**, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 [\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 OpenAI](https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent)                                                                                                            | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/agent/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/agent/client.ipynb)                                                   |\n| **\u0410\u0433\u0435\u043d\u0442** \u0441 **\u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430**, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 [\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 OpenAI](https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent)                                                                                                               | [server](https://github.com/ai-forever/gigaserve/blob/main/examples/agent_with_history/server.py), [client](https://github.com/ai-forever/gigaserve/blob/main/examples/agent_with_history/client.ipynb)                         |\n| [RunnableWithMessageHistory](https://python.langchain.com/docs/expression_language/how_to/message_history) \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0447\u0430\u0442\u0430 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 `session_id`, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.                                                                    | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence/client.ipynb)                   |\n| [RunnableWithMessageHistory](https://python.langchain.com/docs/expression_language/how_to/message_history) \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0447\u0430\u0442\u0430 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043d\u0430 \u0431\u044d\u043a\u0435\u043d\u0434\u0435. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 `conversation_id`, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0438 `user_id`. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c `user_id` \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f. | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence_and_user/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/chat_with_persistence_and_user/client.ipynb) |\n| [Configurable Runnable](https://python.langchain.com/docs/expression_language/how_to/configure). \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0440\u0435\u0442\u0440\u0438\u0432\u0435\u0440, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u043d\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b.                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_retrieval/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_retrieval/client.ipynb)                 |\n| [Configurable Runnable](https://python.langchain.com/docs/expression_language/how_to/configure). \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f \u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0434\u043b\u044f \u043d\u0438\u0445.                                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_chain/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/configurable_chain/client.ipynb)                         |\n| **APIHandler** \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `APIHandler` \u0432\u043c\u0435\u0441\u0442\u043e `add_routes`. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b. \u0425\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 FastAPI, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443.                                                        | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/api_handler_examples/server.py)                                                                                                                             |\n| **LCEL \u043f\u0440\u0438\u043c\u0435\u0440** \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e LCEL \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f.                                                                                                                                                                                          | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/passthrough_dict/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/passthrough_dict/client.ipynb)                             |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `add_routes`: \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/global_deps/server.py)                                                                                                                                 |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `add_routes`: \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u043f\u0443\u0442\u0438. \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.                                                                                                                    | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/path_dependencies/server.py)                                                                                                                           |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `add_routes`: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 OpenAPI \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.                                                                                 | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/client.ipynb)     |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `APIHandler`: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.                                                                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/client.ipynb)                             |\n| **\u0412\u0438\u0434\u0436\u0435\u0442\u044b** \u0420\u0430\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435\u0439 (\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0447\u0430\u0442).                                                                                                                                                                              | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/widgets/chat/tuples/server.py)                                                                                                                              |\n| **\u0412\u0438\u0434\u0436\u0435\u0442\u044b** \u0412\u0438\u0434\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b GigaServe.                                                                                                                                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/client.ipynb)                               |\n\n## \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\n\n### \u0421\u0435\u0440\u0432\u0435\u0440\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0447\u0430\u0442-\u043c\u043e\u0434\u0435\u043b\u0438 GigaChat \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 LLM, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0448\u0443\u0442\u043a\u0443 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 (`topic`) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0435\u043b\u0438 Anthropic.\n\n```python\n#!/usr/bin/env python\nfrom fastapi import FastAPI\nfrom langchain.prompts import ChatPromptTemplate\nfrom langchain.chat_models import GigaChat, ChatAnthropic, ChatOpenAI\n\nfrom langserve import add_routes\n\napp = FastAPI(\n  title=\"GigaChain Server\",\n  version=\"1.0\",\n  description=\"\u041f\u0440\u043e\u0441\u0442\u043e\u0439 API-\u0441\u0435\u0440\u0432\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b GigaChain\",\n)\n\nadd_routes(\n    app,\n    GigaChat(credentials=<\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435>),\n    path=\"/gigachat\",\n) \n\nadd_routes(\n    app,\n    ChatOpenAI(),\n    path=\"/openai\",\n)\n\nadd_routes(\n    app,\n    ChatAnthropic(model=\"claude-3-haiku-20240307\"),\n    path=\"/anthropic\",\n)\n\nmodel = ChatAnthropic()\nprompt = ChatPromptTemplate.from_template(\"\u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0438 \u0448\u0443\u0442\u043a\u0443 \u043e {topic}\")\nadd_routes(\n    app,\n    prompt | model,\n    path=\"/joke\",\n)\n\nif __name__ == \"__main__\":\n    import uvicorn\n\n    uvicorn.run(app, host=\"localhost\", port=8000)\n```\n\n### \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n\n\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f OpenAPI-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443:\n\n```sh\ncurl localhost:8000/docs\n```\n\n\u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0430\u0434\u0440\u0435\u0441 `localhost:8000` \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 404, \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 `@app.get(\"/\")`.\n\n> [!NOTE]\n> \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 pydantic v2 [\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f](#\u0440\u0430\u0431\u043e\u0442\u0430-\u0441-pydantic) \u0434\u043b\u044f \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 `/invoke`, `/batch`, `/stream` \u0438 `stream_log`.\n\n### \u041a\u043b\u0438\u0435\u043d\u0442\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Python SDK:\n\n```python\nfrom langchain.schema import SystemMessage, HumanMessage\nfrom langchain.prompts import ChatPromptTemplate\nfrom langchain.schema.runnable import RunnableMap\nfrom langserve import RemoteRunnable\n\nopenai = RemoteRunnable(\"http://localhost:8000/openai/\")\nanthropic = RemoteRunnable(\"http://localhost:8000/anthropic/\")\njoke_chain = RemoteRunnable(\"http://localhost:8000/joke/\")\n\n# \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n\njoke_chain.invoke({\"topic\": \"\u043f\u043e\u043f\u0443\u0433\u0430\u0438\"})\n\n# \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\nawait joke_chain.ainvoke({\"topic\": \"\u043f\u043e\u043f\u0443\u0433\u0430\u0438\"})\n\nprompt = [\n    SystemMessage(content='\u0412\u0435\u0434\u0438 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u043a\u043e\u0448\u043a\u0430 \u0438\u043b\u0438 \u043f\u043e\u043f\u0443\u0433\u0430\u0439.'),\n    HumanMessage(content='\u041f\u0440\u0438\u0432\u0435\u0442!')\n]\n\n# \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 astream\nasync for msg in anthropic.astream(prompt):\n    print(msg, end=\"\", flush=True)\n\nprompt = ChatPromptTemplate.from_messages(\n    [(\"system\", \"\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438 \u043c\u043d\u0435 \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043e {topic}\")]\n)\n\n# \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a\nchain = prompt | RunnableMap({\n    \"openai\": openai,\n    \"anthropic\": anthropic,\n})\n\nchain.batch([{ \"topic\": \"\u043f\u043e\u043f\u0443\u0433\u0430\u0438\" }, { \"topic\": \"\u043a\u043e\u0448\u043a\u0438\" }])\n```\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 TypeScript (\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f LangChain.js \u0432\u0435\u0440\u0441\u0438\u0438 0.0.166 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435):\n\n```typescript\nimport { RemoteRunnable } from \"@langchain/core/runnables/remote\";\n\nconst chain = new RemoteRunnable({\n  url: `http://localhost:8000/joke/`,\n});\nconst result = await chain.invoke({\n  topic: \"\u043a\u043e\u0448\u043a\u0438\",\n});\n```\n\n\u041a\u043b\u0438\u0435\u043d\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 Python-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 `requests`:\n\n```python\nimport requests\n\nresponse = requests.post(\n    \"http://localhost:8000/joke/invoke/\",\n    json={'input': {'topic': '\u043a\u043e\u0448\u043a\u0438'}}\n)\nresponse.json()\n```\n\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 cURL:\n\n```sh\ncurl --location --request POST 'http://localhost:8000/joke/invoke' \\\n    --header 'Content-Type: application/json' \\\n    --data-raw '{\n        \"input\": {\n            \"topic\": \"\u043a\u043e\u0448\u043a\u0438\"\n        }\n    }'\n```\n\n## \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b\n\n\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438:\n\n```python\n...\nadd_routes(\n    app,\n    runnable,\n    path=\"/my_runnable\",\n)\n```\n\n\u0421\u043f\u0438\u0441\u043e\u043a \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432:\n\n- `POST /my_runnable/invoke` \u2014 \u0432\u044b\u0437\u0432\u0430\u0442\u044c runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;\n- `POST /my_runnable/batch` \u2014 \u0432\u044b\u0437\u0432\u0430\u0442\u044c runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;\n- `POST /my_runnable/stream` \u2014 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c;\n- `POST /my_runnable/stream_log` \u2014 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u043f\u043e \u0445\u043e\u0434\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438;\n- `POST /my_runnable/astream_events` - \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432;\n- `GET /my_runnable/input_schema` \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON-\u0441\u0445\u0435\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430;\n- `GET /my_runnable/output_schema` \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON-\u0441\u0445\u0435\u043c\u0443 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430;\n- `GET /my_runnable/config_schema` \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON-\u0441\u0445\u0435\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430;\n\n> [!NOTE]\n> \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c [LangChain Expression Language (LCEL)](https://python.langchain.com/docs/expression_language/interface) \u2014 DSL \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0446\u0435\u043f\u043e\u0447\u0435\u043a.\n\n## \u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430\n\n\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 `/my_runnable/playground`.\n\u041d\u0430 \u043d\u0435\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043d\u0435\u043c\u0443 \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432.\n\n<p align=\"center\">\n<img src=\"https://github.com/ai-forever/gigaserve/assets/3205522/5ca56e29-f1bb-40f4-84b5-15916384a276\" width=\"50%\"/>\n</p>\n\n### \u0412\u0438\u0434\u0436\u0435\u0442\u044b\n\n\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [\u0432\u0438\u0434\u0436\u0435\u0442\u044b](#playground-widgets) \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n\u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.\n\n### \u041e\u0431\u043c\u0435\u043d \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438\n\nIn addition, for configurable runnables, the playground will allow you to configure the\nrunnable and share a link with the configuration:\n\n<p align=\"center\">\n<img src=\"https://github.com/ai-forever/gigaserve/assets/3205522/86ce9c59-f8e4-4d08-9fa3-62030e0f521d\" width=\"50%\"/>\n</p>\n\n\n## \u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0447\u0430\u0442\u0430\n\nGigaServe \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0447\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 `/my_runnable/playground/`.\n\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u0449\u0435\u0439 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0432 \u044d\u0442\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b runnable-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0445\u0435\u043c\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0439:\n\n- \u043b\u0438\u0431\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u043a\u043b\u044e\u0447 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0430\u0442\u0430. a single key, and that key's value must be a list of chat messages;\n- \u043b\u0438\u0431\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u0430 \u043a\u043b\u044e\u0447\u0430: \u043e\u0434\u0438\u043d \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0447\u0430\u0442\u0430, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c.\n\n\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.\n\n\u0422\u0430\u043a\u0436\u0435, runnable-\u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c `AIMessage` \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443.\n\n\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0443 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c `playground_type=\"chat\"` \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0443\u0442\u0438:\n\n```python\n# \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438\nprompt = ChatPromptTemplate.from_messages(\n    [\n        (\"system\", \"\u0422\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439, \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0422\u043e\u043b\u044f.\"),\n        MessagesPlaceholder(variable_name=\"messages\"),\n    ]\n)\n\nchain = prompt | ChatAnthropic(model=\"claude-2\")\n\n\nclass InputChat(BaseModel):\n    \"\"\"\u0412\u0432\u043e\u0434 \u0434\u043b\u044f \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0447\u0430\u0442\u0430.\"\"\"\n\n    messages: List[Union[HumanMessage, AIMessage, SystemMessage]] = Field(\n        ...,\n        description=\"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0447\u0430\u0442\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0435.\",\n    )\n\n\nadd_routes(\n    app,\n    chain.with_types(input_type=InputChat),\n    enable_feedback_endpoint=True,\n    enable_public_trace_link_endpoint=True,\n    playground_type=\"chat\",\n)\n```\n\n<!--\nIf you are using LangSmith, you can also set `enable_feedback_endpoint=True` on your route to enable thumbs-up/thumbs-down buttons\nafter each message, and `enable_public_trace_link_endpoint=True` to add a button that creates a public traces for runs.\nNote that you will also need to set the following environment variables:\n\n```bash\nexport LANGCHAIN_TRACING_V2=\"true\"\nexport LANGCHAIN_PROJECT=\"YOUR_PROJECT_NAME\"\nexport LANGCHAIN_API_KEY=\"YOUR_API_KEY\"\n```\n\nHere's an example with the above two options turned on:\n\n<p align=\"center\">\n<img src=\"./.github/img/chat_playground.png\" width=\"50%\"/>\n</p>\n\nNote: If you enable public trace links, the internals of your chain will be exposed. We recommend only using this setting\nfor demos or testing.\n-->\n\n## \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438\n\nGigaServe \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0441 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 (\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e [LangChain Expression Language](https://python.langchain.com/docs/expression_language/)), \u0442\u0430\u043a \u0438 \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 (\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 `Chain`).\n\n\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u0442.\u043a. \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u043c\u0438.\n\u0422\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 `input_schema` \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0432 GigaChain.\n\n## \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\n\n\u041d\u0438\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 AWS, Google Cloud Platforms (GCP) \u0438 Azure.\n\n### AWS\n\n\u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 AWS \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c [AWS Copilot CLI](https://aws.github.io/copilot-cli/).\n\n```bash\ncopilot init --app [application-name] --name [service-name] --type 'Load Balanced Web Service' --dockerfile './Dockerfile' --deploy\n```\n\n\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u2014 \u0432 [\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438](https://aws.amazon.com/containers/copilot/).\n\n### GCP\n\n\u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 GCP Cloud Run \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:\n\n```sh\ngcloud run deploy [your-service-name] --source . --port 8001 --allow-unauthenticated --region us-central1 --set-env-vars=GIGACHAT_API_KEY=your_key\n```\n\n### Azure\n\n\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Azure \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Azure Container Apps:\n\n```sh\naz containerapp up --name [container-app-name] --source . --resource-group [resource-group-name] --environment  [environment-name] --ingress external --target-port 8001 --env-vars=OPENAI_API_KEY=your_key\n```\n\n\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432 [\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438](https://learn.microsoft.com/en-us/azure/container-apps/containerapp-up).\n\n\n## \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Pydantic\n\nGigaServe \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Pydantic v2 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438:\n\n- \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Pydantic v2 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f OpenAPI \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e Fast API \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 [\u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u0438\u043c\u0435\u043d pydantic v1 \u0438 v2](https://github.com/tiangolo/fastapi/issues/10360).\n- GigaChain \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d \u0432\u0435\u0440\u0441\u0438\u0438 v1 \u0432 Pydantic v2.\n\n\u0417\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b API, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.\n\n## \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n\n## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\n\n\u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 GigaServe \u2014 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 FastAPI, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445 [\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438](https://fastapi.tiangolo.com/tutorial/security/) \u0438 [\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u041f\u041e](https://fastapi.tiangolo.com/tutorial/middleware/).\n\n\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 GigaServe \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 FastAPI.\n\n\u0412\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0434\u0440.\n\n\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0441\u0432\u043e\u0438\u0445 \u0441\u0438\u043b\u0430\u0445, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 [Auth0](https://auth0.com/).\n\n#### \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 add_routes\n\n[\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438](https://github.com/langchain-ai/langserve/tree/main/examples/auth) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e `add_routes`.\n\n| \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435                                                                                                                                                                        | \u0421\u0441\u044b\u043b\u043a\u0438                                                                                                                                                                                                                           |\n| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `add_routes`: \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/global_deps/server.py)                                                                                                                                 |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `add_routes`: \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 \u043f\u0443\u0442\u0438. \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.                                                                                                                    | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/path_dependencies/server.py)                                                                                                                           |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `add_routes`: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 OpenAPI \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.                                                                                 | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/per_req_config_modifier/client.ipynb)     |\n\n\u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c [\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u041f\u041e FastAPI](https://fastapi.tiangolo.com/tutorial/middleware/).\n\n\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043f\u0443\u0442\u0435\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 OpenAPI-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.\n\u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u0435 \u044d\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `per_req_config_modifier` \u0438\u043b\u0438 `APIHandler` (\u0441\u043c. \u043d\u0438\u0436\u0435).\n\nIf you need to implement per user logic, you can use the `per_req_config_modifier` or `APIHandler` (below) to implement this logic.\n\n**\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c**\n\n\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 `add_routes` \u0437\u0430\u0434\u0430\u0439\u0442\u0435 `per_req_config_modifier`.\n\n\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 `Request` \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n#### \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 APIHandler\n\n\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 FastAPI \u0438 Python, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c [APIHandler](https://github.com/langchain-ai/langserve/blob/main/examples/api_handler_examples/server.py) GigaServe.\n\n| \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435                                                                                                                                                                                                 | \u0421\u0441\u044b\u043b\u043a\u0438                                                                                                                                                                                                           |\n| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f** \u0441 `APIHandler`: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.                                                                                                                                           | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/auth/api_handler/client.ipynb)                             |\n| **APIHandler** \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `APIHandler` \u0432\u043c\u0435\u0441\u0442\u043e `add_routes`. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b. \u0425\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 FastAPI, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443.                                                        | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/api_handler_examples/server.py)                                                                                                                             |\n\n\u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432, \u0447\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n\n### \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438\n\n\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439.\n\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438:\n\n- \u0424\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0433\u043e;\n- \u0424\u0430\u0439\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430, \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043d\u043e\u0435 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 s3.\n- \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0438\u043b\u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c.\n- \u0421\u043b\u043e\u0436\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \n\n\u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.\n\n> [!NOTE]\n> GigaServe \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f `multipart/form-data`.\n> \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0432 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 base64.\n>\n> [\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e base64](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing).\n>\n> \u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0441\u044b\u043b\u043e\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 s3) \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043a\u0430\u043a `multipart/form-data`.\n\n### \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n\n\u0422\u0438\u043f\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u0445 `input_schema` \u0438 `output_schema`. GigaServe \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.\n\n\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 `with_types`.\n\n\u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438:\n\n```python\nfrom typing import Any\n\nfrom fastapi import FastAPI\nfrom langchain.schema.runnable import RunnableLambda\n\napp = FastAPI()\n\n\ndef func(x: Any) -> int:\n    \"\"\"\u041e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c int.\"\"\"\n    return x + 1\n\n\nrunnable = RunnableLambda(func).with_types(\n    input_type=int,\n)\n\nadd_routes(app, runnable)\n```\n\n### \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b\n\n\u0414\u043b\u044f \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 pydantic-\u043c\u043e\u0434\u0435\u043b\u044c, \u0430 \u043d\u0435 `dict`, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0439\u0442\u0435\u0441\u044c \u043e\u0442 `CustomUserType`.\n\u041f\u0440\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 `dict`, \u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0445 \u043a\u0430\u043a pydantic-\u043c\u043e\u0434\u0435\u043b\u044c.\n\n```python\nfrom fastapi import FastAPI\nfrom langchain.schema.runnable import RunnableLambda\n\nfrom langserve import add_routes\nfrom langserve.schema import CustomUserType\n\napp = FastAPI()\n\n\nclass Foo(CustomUserType):\n    bar: int\n\n\ndef func(foo: Foo) -> int:\n    \"\"\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0442\u0438\u043f Foo, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0432\u0438\u0434\u0435 \u043c\u043e\u0434\u0435 pydantic model\"\"\"\n    assert isinstance(foo, Foo)\n    return foo.bar\n\n# \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438!\n# \u0412\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0445 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\n# runnable = RunnableLambda(func).with_types( # <-- \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\n#     input_schema=Foo,\n#     output_schema=int,\n#\nadd_routes(app, RunnableLambda(func), path=\"/foo\")\n```\n\n> [!NOTE]\n> \u0422\u0438\u043f `CustomUserType` \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\n\n### \u0412\u0438\u0434\u0436\u0435\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n\n\u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 runnable-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432\u0430\u0448\u0435\u0433\u043e \u0431\u0435\u043a\u0435\u043d\u0434\u0430.\n\n\u041f\u0440\u0438\u043c\u0435\u0440\u044b:\n\n| \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435                                                                                                                                                                                                                                                           | \u0421\u0441\u044b\u043b\u043a\u0438                                                                                                                                                                                                                           |\n| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **\u0412\u0438\u0434\u0436\u0435\u0442\u044b** \u0420\u0430\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435\u0439 (\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0447\u0430\u0442).                                                                                                                                                                              | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/widgets/chat/tuples/server.py)                                                                                                                              |\n| **\u0412\u0438\u0434\u0436\u0435\u0442\u044b** \u0412\u0438\u0434\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b GigaServe.                                                                                                                                                                                                      | [server](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/server.py), [client](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing/client.ipynb)                               |\n\n#### \u0421\u0445\u0435\u043c\u0430\n\n- \u0412\u0438\u0434\u0436\u0435\u0442 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u043b\u044f \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c JSON-\u0441\u0445\u0435\u043c\u044b \u0432\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.\n- \u0412\u0438\u0434\u0436\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u043b\u044e\u0447 `type`, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.\n- \u0414\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u0443\u0442\u0438 \u0432 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u0435.\n\n\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:\n\n```typescript\ntype JsonPath = number | string | (number | string)[];\ntype NameSpacedPath = { title: string; path: JsonPath }; // title \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 JSON-\u0441\u0445\u0435\u043c\u044b, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c namespace\ntype OneOfPath = { oneOf: JsonPath[] };\n\ntype Widget = {\n    type: string // \u041a\u0430\u043a\u043e\u0439-\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, base64file, chat \u0438 \u0434\u0440.\n    [key: string]: JsonPath | NameSpacedPath | OneOfPath;\n};\n```\n\n### \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b\n\n\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430:\\\n\n* \u0432\u0438\u0434\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430;\n* \u0432\u0438\u0434\u0436\u0435\u0442 \u0447\u0430\u0442\u0430.\n\n\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 runnable-\u043e\u0431\u044a\u0435\u043a\u0442\u0430.\n\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 runnable-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 runnable.\n\n#### \u0412\u0438\u0434\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430\n\n\u0412\u0438\u0434\u0436\u0435\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 base64-\u0441\u0442\u0440\u043e\u043a\u0438.\n\n\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:\n\n```python\ntry:\n    from pydantic.v1 import Field\nexcept ImportError:\n    from pydantic import Field\n\nfrom langserve import CustomUserType\n\n\n# \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0439\u0442\u0435\u0441\u044c \u043e\u0442 CustomUserType, \u0430 \u043d\u0435 \u043e\u0442 BaseModel. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\n#            \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 dict, \u0430 \u043d\u0435 \u043c\u043e\u0434\u0435\u043b\u044c pydantic.\nclass FileProcessingRequest(CustomUserType):\n    \"\"\"Request including a base64 encoded file.\"\"\"\n\n    # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n    file: str = Field(..., extra={\"widget\": {\"type\": \"base64file\"}})\n    num_chars: int = 100\n\n```\n\n> [!NOTE]\n> [\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430](https://github.com/ai-forever/gigaserve/tree/main/examples/file_processing).\n\n<p align=\"center\">\n<img src=\"https://github.com/ai-forever/gigaserve/assets/3205522/52199e46-9464-4c2e-8be8-222250e08c3f\" width=\"50%\"/>\n</p>\n\n### \u0412\u0438\u0434\u0436\u0435\u0442 \u0447\u0430\u0442\u0430 {#vidzhet-chata}\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0432 [\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438](https://github.com/ai-forever/gigaserve/blob/main/examples/widgets/server.py).\n\n\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442 \u0447\u0430\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 `\"type\": \"chat\"`:\n\n* \u041f\u043e\u043b\u0435 `input` \u2014 JSONPath \u043a \u043f\u043e\u043b\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u043e\u0432\u043e\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.\n* \u041f\u043e\u043b\u0435 `output` \u2014 JSONPath \u043a \u043f\u043e\u043b\u044e \u043e\u0442\u0432\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n\n\u041d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f, \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0432\u0438\u0434\u0435.\n\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n\n\u041f\u0440\u0438\u043c\u0435\u0440:\n\n```py\nclass ChatHistory(CustomUserType):\n    chat_history: List[Tuple[str, str]] = Field(\n        ...,\n        examples=[[(\"human input\", \"ai response\")]],\n        extra={\"widget\": {\"type\": \"chat\", \"input\": \"question\", \"output\": \"answer\"}},\n    )\n    question: str\n\n\ndef _format_to_messages(input: ChatHistory) -> List[BaseMessage]:\n    \"\"\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0432\u043e\u0434\u0434\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\"\"\"\n    history = input.chat_history\n    user_input = input.question\n\n    messages = []\n\n    for human, ai in history:\n        messages.append(HumanMessage(content=human))\n        messages.append(AIMessage(content=ai))\n    messages.append(HumanMessage(content=user_input))\n    return messages\n\n\nmodel = ChatOpenAI()\nchat_model = RunnableParallel({\"answer\": (RunnableLambda(_format_to_messages) | model)})\nadd_routes(\n    app,\n    chat_model.with_types(input_type=ChatHistory),\n    config_keys=[\"configurable\"],\n    path=\"/chat\",\n)\n```\n\n### \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 {#vklyuchenie-i-otklyuchenie-endpointov}\n\n\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 GigaServe 0.0.33, \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b.\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 `enabled_endpoints`, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c \u044d\u043d\u0434\u043f\u043e\u043d\u0442\u043e\u0432 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 `invoke`, `batch` \u0438 `config_hash`.\n\n```python\nadd_routes(app, chain, enabled_endpoints=[\"invoke\", \"batch\", \"config_hashes\"], path=\"/mychain\")\n```\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438.\n\n```python\nadd_routes(app, chain, disabled_endpoints=[\"playground\"], path=\"/mychain\")\n```\n\n## \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\n\n\u0412 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 0.0.13\u20140.0.15 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 `/playground`, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0422\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 [\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 0.0.16 \u0438 \u0432\u044b\u0448\u0435](https://github.com/langchain-ai/langserve/pull/98).\n",
    "bugtrack_url": null,
    "license": "LangServe",
    "summary": null,
    "version": "0.2.3",
    "project_urls": {
        "Homepage": "https://github.com/ai-forever/gigaserve",
        "Repository": "https://github.com/ai-forever/gigaserve"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "986c7115a79b5bc36a2917b5ca0875509ef29de711b3e8d553282f4d2a8cb122",
                "md5": "15e854155c9b6d4b4d30e1d2eaf8ca92",
                "sha256": "8020aa8d4eabe8967b477a4eaaf35b1c2d21894973d2f5f4d2faec3f462cdaaa"
            },
            "downloads": -1,
            "filename": "gigaserve-0.2.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "15e854155c9b6d4b4d30e1d2eaf8ca92",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.8.1",
            "size": 1173102,
            "upload_time": "2024-09-09T13:59:47",
            "upload_time_iso_8601": "2024-09-09T13:59:47.521922Z",
            "url": "https://files.pythonhosted.org/packages/98/6c/7115a79b5bc36a2917b5ca0875509ef29de711b3e8d553282f4d2a8cb122/gigaserve-0.2.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cf2c2a498b435353c1859de37cf77531b2de43c6b6a5fa33cfc94aa93807f101",
                "md5": "eb7eff644a3e40b8777275ed7c071311",
                "sha256": "9031216a6c595992e21ec2c70e451d51269ec076c591db921a74e160514993f5"
            },
            "downloads": -1,
            "filename": "gigaserve-0.2.3.tar.gz",
            "has_sig": false,
            "md5_digest": "eb7eff644a3e40b8777275ed7c071311",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.8.1",
            "size": 1143960,
            "upload_time": "2024-09-09T13:59:49",
            "upload_time_iso_8601": "2024-09-09T13:59:49.878636Z",
            "url": "https://files.pythonhosted.org/packages/cf/2c/2a498b435353c1859de37cf77531b2de43c6b6a5fa33cfc94aa93807f101/gigaserve-0.2.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-09 13:59:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ai-forever",
    "github_project": "gigaserve",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "gigaserve"
}
        
Elapsed time: 0.44254s