# 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"
}