Repository: ai-forever/gigachat (language: python)

Issue:
Добавил роль function_in_progress



Discussion / hints:

Fix patch:
diff --git a/examples/README.md b/examples/README.md
index 07cf1b0..0f0bc31 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -9,3 +9,5 @@
 * [Пример вопрос - ответ, для проверки сертификатов используем файл с корневым сертификатом Минцифры России](./example_russian_trusted_root_ca.py)
 * [Пример перенаправления заголовков запроса в GigaChat](./example_contextvars.py)
 * [Пример подсчёта токенов](./example_tokens.py)
+* [Пример получения изображения](./example_get_image.py)
+* [Jupyter-ноутбук с примером работы с чатом и изображениями](./simple_chat_with_images.ipynb)
diff --git a/examples/example_get_image.py b/examples/example_get_image.py
new file mode 100644
index 0000000..085b001
--- /dev/null
+++ b/examples/example_get_image.py
@@ -0,0 +1,26 @@
+import base64
+
+from gigachat import GigaChat
+from gigachat.models import Image
+
+
+def get_image(file_path: str = './giga_img.jpg'):
+    with GigaChat(credentials=...,
+                  verify_ssl_certs=False) as giga:
+        response: Image = giga.get_image(file_id=...)
+
+        # Сохранить изображение в файл
+        with open(file_path, mode="wb") as fd:
+            fd.write(base64.b64decode(response.content))
+
+
+async def get_image_async(file_path: str = './giga_img.jpg'):
+    from aiofile import async_open
+
+    async with GigaChat(credentials=...,
+                        verify_ssl_certs=False) as giga:
+        response: Image = await giga.aget_image(file_id=...)
+
+        # Сохранить изображение в файл
+        async with async_open(file_path, 'wb') as afp:
+            await afp.write(base64.b64decode(response.content))
diff --git a/examples/simple_chat_with_images.ipynb b/examples/simple_chat_with_images.ipynb
new file mode 100644
index 0000000..1cbafa0
--- /dev/null
+++ b/examples/simple_chat_with_images.ipynb
@@ -0,0 +1,187 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Пример работы с GigaChat"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Использование GigaChat"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from gigachat import GigaChat\n",
+    "from gigachat.models import Chat, Messages, MessagesRole\n",
+    "\n",
+    "# Используйте токен, полученный в личном кабинете из поля Авторизационные данные\n",
+    "giga = GigaChat(credentials=\"...\", verify_ssl_certs=False)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "ChatCompletion(choices=[Choices(message=Messages(role='assistant', content='Здравствуйте! Я GigaChat, генеративная языковая модель. Готова ответить на ваши вопросы. Чем могу вам помочь?', function_call=None), index=0, finish_reason='stop')], created=1713262349, model='GigaChat-Pro:2.2.25.3', usage=Usage(prompt_tokens=12, completion_tokens=31, total_tokens=43), object_='chat.completion')"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "giga.chat(\"Привет\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Работа с сообщениями"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "User:  Зачем ты нужен?\n",
+      "Bot:  Я помогаю проверять работу ГигаЧата на разных устройствах и в разных браузерах.\n"
+     ]
+    }
+   ],
+   "source": [
+    "\n",
+    "payload = Chat(\n",
+    "    messages=[\n",
+    "        Messages(\n",
+    "            role=MessagesRole.SYSTEM,\n",
+    "            content=\"Ты полезный ассистент для тестирования ГигаЧата.\"\n",
+    "        )\n",
+    "    ],\n",
+    "    temperature=0.7,\n",
+    "    max_tokens=100,\n",
+    ")\n",
+    "\n",
+    "user_input = input(\"Введите свой вопрос: \")\n",
+    "print(\"User: \", user_input)\n",
+    "payload.messages.append(Messages(role=MessagesRole.USER, content=user_input))\n",
+    "response = giga.chat(payload)\n",
+    "print(\"Bot: \", response.choices[0].message.content)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Работа с изображениями"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "payload = Chat(\n",
+    "    messages=[Messages(role=MessagesRole.USER, content=\"Нарисуй космонавта верхом на лошади\")],\n",
+    "    temperature=0.7,\n",
+    "    max_tokens=100,\n",
+    "    function_call=\"auto\",\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "ChatCompletion(choices=[Choices(message=Messages(role='assistant', content='Запускаю генерацию изображения... <img src=\"840c18b3-591b-48a8-9c55-dfa633159e2e\" fuse=\"true\"/> - вот такой космонавт на лошади у меня получился.', function_call=None), index=0, finish_reason='stop')], created=1713263220, model='GigaChat-Pro:2.2.25.3', usage=Usage(prompt_tokens=697, completion_tokens=47, total_tokens=744), object_='chat.completion')"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "giga.chat(payload)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "img = giga.get_image(\"840c18b3-591b-48a8-9c55-dfa633159e2e\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAMAAwADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwiiiityQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigVwooooC4UUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKWkooAKKKKACiiigAo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",
+      "text/plain": [
+       "<IPython.core.display.Image object>"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from IPython.display import Image\n",
+    "import base64\n",
+    "\n",
+    "Image(base64.b64decode(img.content))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "venv",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/poetry.lock b/poetry.lock
index 4362a41..39e8124 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,14 +1,28 @@
-# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+
+[[package]]
+name = "annotated-types"
+version = "0.7.0"
+description = "Reusable constraint types to use with typing.Annotated"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
+    {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
+]
+
+[package.dependencies]
+typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""}
 
 [[package]]
 name = "anyio"
-version = "4.2.0"
+version = "4.4.0"
 description = "High level compatibility layer for multiple asynchronous event loop implementations"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"},
-    {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"},
+    {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"},
+    {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"},
 ]
 
 [package.dependencies]
@@ -70,13 +84,13 @@ uvloop = ["uvloop (>=0.15.2)"]
 
 [[package]]
 name = "certifi"
-version = "2023.11.17"
+version = "2024.6.2"
 description = "Python package for providing Mozilla's CA Bundle."
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"},
-    {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"},
+    {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"},
+    {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"},
 ]
 
 [[package]]
@@ -170,13 +184,13 @@ toml = ["tomli"]
 
 [[package]]
 name = "exceptiongroup"
-version = "1.2.0"
+version = "1.2.1"
 description = "Backport of PEP 654 (exception groups)"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
-    {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
+    {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"},
+    {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"},
 ]
 
 [package.extras]
@@ -216,13 +230,13 @@ socks = ["socksio (==1.*)"]
 
 [[package]]
 name = "httpcore"
-version = "1.0.2"
+version = "1.0.5"
 description = "A minimal low-level HTTP client."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"},
-    {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"},
+    {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"},
+    {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"},
 ]
 
 [package.dependencies]
@@ -233,7 +247,7 @@ h11 = ">=0.13,<0.15"
 asyncio = ["anyio (>=4.0,<5.0)"]
 http2 = ["h2 (>=3,<5)"]
 socks = ["socksio (==1.*)"]
-trio = ["trio (>=0.22.0,<0.23.0)"]
+trio = ["trio (>=0.22.0,<0.26.0)"]
 
 [[package]]
 name = "httpx"
@@ -284,13 +298,13 @@ socks = ["socksio (==1.*)"]
 
 [[package]]
 name = "idna"
-version = "3.6"
+version = "3.7"
 description = "Internationalized Domain Names in Applications (IDNA)"
 optional = false
 python-versions = ">=3.5"
 files = [
-    {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
-    {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+    {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"},
+    {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"},
 ]
 
 [[package]]
@@ -306,38 +320,38 @@ files = [
 
 [[package]]
 name = "mypy"
-version = "1.8.0"
+version = "1.10.0"
 description = "Optional static typing for Python"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"},
-    {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"},
-    {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"},
-    {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"},
-    {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"},
-    {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"},
-    {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"},
-    {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"},
-    {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"},
-    {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"},
-    {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"},
-    {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"},
-    {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"},
-    {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"},
-    {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"},
-    {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"},
-    {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"},
-    {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"},
-    {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"},
-    {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"},
-    {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"},
-    {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"},
-    {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"},
-    {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"},
-    {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"},
-    {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"},
-    {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"},
+    {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"},
+    {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"},
+    {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"},
+    {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"},
+    {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"},
+    {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"},
+    {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"},
+    {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"},
+    {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"},
+    {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"},
+    {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"},
+    {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"},
+    {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"},
+    {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"},
+    {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"},
+    {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"},
+    {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"},
+    {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"},
+    {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"},
+    {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"},
+    {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"},
+    {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"},
+    {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"},
+    {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"},
+    {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"},
+    {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"},
+    {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"},
 ]
 
 [package.dependencies]
@@ -364,13 +378,13 @@ files = [
 
 [[package]]
 name = "packaging"
-version = "23.2"
+version = "24.1"
 description = "Core utilities for Python packages"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
 files = [
-    {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
-    {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
+    {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"},
+    {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"},
 ]
 
 [[package]]
@@ -386,28 +400,29 @@ files = [
 
 [[package]]
 name = "platformdirs"
-version = "4.1.0"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+version = "4.2.2"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"},
-    {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"},
+    {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"},
+    {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"},
 ]
 
 [package.extras]
-docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"]
+docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
+type = ["mypy (>=1.8)"]
 
 [[package]]
 name = "pluggy"
-version = "1.3.0"
+version = "1.5.0"
 description = "plugin and hook calling mechanisms for python"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"},
-    {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"},
+    {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+    {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
 ]
 
 [package.extras]
@@ -416,65 +431,123 @@ testing = ["pytest", "pytest-benchmark"]
 
 [[package]]
 name = "pydantic"
-version = "1.10.14"
-description = "Data validation and settings management using python type hints"
+version = "2.7.4"
+description = "Data validation using Python type hints"
 optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
 files = [
-    {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"},
-    {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"},
-    {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"},
-    {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"},
-    {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"},
-    {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"},
-    {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"},
-    {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"},
-    {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"},
-    {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"},
-    {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"},
-    {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"},
-    {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"},
-    {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"},
-    {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"},
-    {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"},
-    {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"},
-    {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"},
-    {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"},
-    {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"},
-    {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"},
-    {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"},
-    {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"},
-    {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"},
-    {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"},
-    {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"},
-    {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"},
-    {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"},
-    {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"},
-    {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"},
-    {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"},
-    {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"},
-    {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"},
-    {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"},
-    {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"},
-    {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"},
+    {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"},
+    {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"},
 ]
 
 [package.dependencies]
-typing-extensions = ">=4.2.0"
+annotated-types = ">=0.4.0"
+pydantic-core = "2.18.4"
+typing-extensions = ">=4.6.1"
 
 [package.extras]
-dotenv = ["python-dotenv (>=0.10.4)"]
-email = ["email-validator (>=1.0.3)"]
+email = ["email-validator (>=2.0.0)"]
+
+[[package]]
+name = "pydantic-core"
+version = "2.18.4"
+description = "Core functionality for Pydantic validation and serialization"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"},
+    {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"},
+    {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"},
+    {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"},
+    {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"},
+    {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"},
+    {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"},
+    {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"},
+    {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"},
+    {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"},
+    {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"},
+    {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"},
+    {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"},
+    {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"},
+    {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"},
+    {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"},
+    {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"},
+    {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"},
+    {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"},
+    {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"},
+    {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"},
+]
+
+[package.dependencies]
+typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
 
 [[package]]
 name = "pytest"
-version = "7.4.3"
+version = "7.4.4"
 description = "pytest: simple powerful testing with Python"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"},
-    {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"},
+    {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
+    {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
 ]
 
 [package.dependencies]
@@ -490,13 +563,13 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 
 [[package]]
 name = "pytest-asyncio"
-version = "0.21.1"
+version = "0.21.2"
 description = "Pytest support for asyncio"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"},
-    {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"},
+    {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"},
+    {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"},
 ]
 
 [package.dependencies]
@@ -544,17 +617,17 @@ testing = ["pytest-asyncio (==0.21.*)", "pytest-cov (==4.*)"]
 
 [[package]]
 name = "pytest-mock"
-version = "3.12.0"
+version = "3.14.0"
 description = "Thin-wrapper around the mock package for easier use with pytest"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"},
-    {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"},
+    {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"},
+    {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"},
 ]
 
 [package.dependencies]
-pytest = ">=5.0"
+pytest = ">=6.2.5"
 
 [package.extras]
 dev = ["pre-commit", "pytest-asyncio", "tox"]
@@ -587,13 +660,13 @@ files = [
 
 [[package]]
 name = "sniffio"
-version = "1.3.0"
+version = "1.3.1"
 description = "Sniff out which async library your code is running under"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
-    {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
+    {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
+    {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
 ]
 
 [[package]]
@@ -609,13 +682,13 @@ files = [
 
 [[package]]
 name = "typing-extensions"
-version = "4.9.0"
+version = "4.12.2"
 description = "Backported and Experimental Type Hints for Python 3.8+"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"},
-    {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"},
+    {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
+    {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
 ]
 
 [metadata]
diff --git a/pyproject.toml b/pyproject.toml
index fa15c9e..1309004 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "gigachat"
-version = "0.1.22"
+version = "0.1.29"
 description = "GigaChat. Python-library for GigaChain and LangChain"
 authors = ["Konstantin Krestnikov <rai220@gmail.com>", "Sergey Malyshev <in1t@ya.ru>"]
 license = "MIT"
diff --git a/src/gigachat/_types.py b/src/gigachat/_types.py
new file mode 100644
index 0000000..d9630d7
--- /dev/null
+++ b/src/gigachat/_types.py
@@ -0,0 +1,13 @@
+from typing import IO, Mapping, Optional, Tuple, Union
+
+FileContent = Union[IO[bytes], bytes, str]
+FileTypes = Union[
+    # file (or bytes)
+    FileContent,
+    # (filename, file (or bytes))
+    Tuple[Optional[str], FileContent],
+    # (filename, file (or bytes), content_type)
+    Tuple[Optional[str], FileContent, Optional[str]],
+    # (filename, file (or bytes), content_type, headers)
+    Tuple[Optional[str], FileContent, Optional[str], Mapping[str, str]],
+]
diff --git a/src/gigachat/api/assistants/__init__.py b/src/gigachat/api/assistants/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/gigachat/api/assistants/get_assistants.py b/src/gigachat/api/assistants/get_assistants.py
new file mode 100644
index 0000000..6faf355
--- /dev/null
+++ b/src/gigachat/api/assistants/get_assistants.py
@@ -0,0 +1,57 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.assistants import Assistants
+
+
+def _get_kwargs(
+    *,
+    assistant_id: Optional[str] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    params = {
+        "method": "GET",
+        "url": "/assistants",
+        "headers": headers,
+    }
+    if assistant_id:
+        params["params"] = {"assistant_id": assistant_id}
+    return params
+
+
+def _build_response(response: httpx.Response) -> Assistants:
+    if response.status_code == HTTPStatus.OK:
+        return Assistants(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    assistant_id: Optional[str] = None,
+    access_token: Optional[str] = None,
+) -> Assistants:
+    """Возвращает массив объектов с данными доступных ассистентов"""
+    kwargs = _get_kwargs(assistant_id=assistant_id, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    assistant_id: Optional[str] = None,
+    access_token: Optional[str] = None,
+) -> Assistants:
+    """Возвращает массив объектов с данными доступных ассистентов"""
+    kwargs = _get_kwargs(assistant_id=assistant_id, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/assistants/post_assistant_files_delete.py b/src/gigachat/api/assistants/post_assistant_files_delete.py
new file mode 100644
index 0000000..75ae742
--- /dev/null
+++ b/src/gigachat/api/assistants/post_assistant_files_delete.py
@@ -0,0 +1,60 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.assistants import AssistantFileDelete
+
+
+def _get_kwargs(
+    *,
+    assistant_id: str,
+    file_id: str,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+
+    return {
+        "method": "POST",
+        "url": "/assistants/files/delete",
+        "json": {
+            "assistant_id": assistant_id,
+            "file_id": file_id,
+        },
+        "headers": headers,
+    }
+
+
+def _build_response(response: httpx.Response) -> AssistantFileDelete:
+    if response.status_code == HTTPStatus.OK:
+        return AssistantFileDelete(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    assistant_id: str,
+    file_id: str,
+    access_token: Optional[str] = None,
+) -> AssistantFileDelete:
+    kwargs = _get_kwargs(assistant_id=assistant_id, file_id=file_id, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    assistant_id: str,
+    file_id: str,
+    access_token: Optional[str] = None,
+) -> AssistantFileDelete:
+    kwargs = _get_kwargs(assistant_id=assistant_id, file_id=file_id, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/assistants/post_assistant_modify.py b/src/gigachat/api/assistants/post_assistant_modify.py
new file mode 100644
index 0000000..d90053f
--- /dev/null
+++ b/src/gigachat/api/assistants/post_assistant_modify.py
@@ -0,0 +1,92 @@
+from http import HTTPStatus
+from typing import Any, Dict, List, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.assistants import Assistant
+
+
+def _get_kwargs(
+    *,
+    assistant_id: str,
+    name: Optional[str] = None,
+    description: Optional[str] = None,
+    instructions: Optional[str] = None,
+    file_ids: Optional[List[str]] = None,
+    metadata: Optional[Dict[str, Any]] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+
+    return {
+        "method": "POST",
+        "url": "/assistants/modify",
+        "json": {
+            "assistant_id": assistant_id,
+            "name": name,
+            "description": description,
+            "instructions": instructions,
+            "file_ids": file_ids,
+            "metadata": metadata,
+        },
+        "headers": headers,
+    }
+
+
+def _build_response(response: httpx.Response) -> Assistant:
+    if response.status_code == HTTPStatus.OK:
+        return Assistant(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    assistant_id: str,
+    name: Optional[str] = None,
+    description: Optional[str] = None,
+    instructions: Optional[str] = None,
+    file_ids: Optional[List[str]] = None,
+    metadata: Optional[Dict[str, Any]] = None,
+    access_token: Optional[str] = None,
+) -> Assistant:
+    kwargs = _get_kwargs(
+        assistant_id=assistant_id,
+        name=name,
+        description=description,
+        instructions=instructions,
+        file_ids=file_ids,
+        metadata=metadata,
+        access_token=access_token,
+    )
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    assistant_id: str,
+    name: Optional[str] = None,
+    description: Optional[str] = None,
+    instructions: Optional[str] = None,
+    file_ids: Optional[List[str]] = None,
+    metadata: Optional[Dict[str, Any]] = None,
+    access_token: Optional[str] = None,
+) -> Assistant:
+    kwargs = _get_kwargs(
+        assistant_id=assistant_id,
+        name=name,
+        description=description,
+        instructions=instructions,
+        file_ids=file_ids,
+        metadata=metadata,
+        access_token=access_token,
+    )
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/assistants/post_assistants.py b/src/gigachat/api/assistants/post_assistants.py
new file mode 100644
index 0000000..845042c
--- /dev/null
+++ b/src/gigachat/api/assistants/post_assistants.py
@@ -0,0 +1,94 @@
+from http import HTTPStatus
+from typing import Any, Dict, List, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.assistants import CreateAssistant
+
+
+def _get_kwargs(
+    *,
+    model: str,
+    name: str,
+    description: Optional[str] = None,
+    instructions: str,
+    file_ids: Optional[List[str]] = None,
+    metadata: Optional[Dict[str, Any]] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+
+    return {
+        "method": "POST",
+        "url": "/assistants",
+        "json": {
+            "model": model,
+            "name": name,
+            "description": description,
+            "instructions": instructions,
+            "file_ids": file_ids,
+            "metadata": metadata,
+        },
+        "headers": headers,
+    }
+
+
+def _build_response(response: httpx.Response) -> CreateAssistant:
+    if response.status_code == HTTPStatus.OK:
+        return CreateAssistant(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    model: str,
+    name: str,
+    description: Optional[str] = None,
+    instructions: str,
+    file_ids: Optional[List[str]] = None,
+    metadata: Optional[Dict[str, Any]] = None,
+    access_token: Optional[str] = None,
+) -> CreateAssistant:
+    """Создание ассистента"""
+    kwargs = _get_kwargs(
+        model=model,
+        name=name,
+        description=description,
+        instructions=instructions,
+        file_ids=file_ids,
+        metadata=metadata,
+        access_token=access_token,
+    )
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    model: str,
+    name: str,
+    description: Optional[str] = None,
+    instructions: str,
+    file_ids: Optional[List[str]] = None,
+    metadata: Optional[Dict[str, Any]] = None,
+    access_token: Optional[str] = None,
+) -> CreateAssistant:
+    """Создание ассистента"""
+    kwargs = _get_kwargs(
+        model=model,
+        name=name,
+        description=description,
+        instructions=instructions,
+        file_ids=file_ids,
+        metadata=metadata,
+        access_token=access_token,
+    )
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/get_image.py b/src/gigachat/api/get_image.py
new file mode 100644
index 0000000..daea87b
--- /dev/null
+++ b/src/gigachat/api/get_image.py
@@ -0,0 +1,56 @@
+import base64
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models import Image
+
+
+def _get_kwargs(
+    *,
+    file_id: str,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    headers["Accept"] = "application/jpg"
+    return {
+        "method": "GET",
+        "url": f"/files/{file_id}/content",
+        "headers": headers,
+    }
+
+
+def _build_response(response: httpx.Response) -> Image:
+    if response.status_code == HTTPStatus.OK:
+        return Image(content=base64.b64encode(response.content))
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    file_id: str,
+    access_token: Optional[str] = None,
+) -> Image:
+    """Возвращает изображение в base64 кодировке"""
+    kwargs = _get_kwargs(access_token=access_token, file_id=file_id)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    file_id: str,
+    access_token: Optional[str] = None,
+) -> Image:
+    """Возвращает изображение в base64 кодировке"""
+    kwargs = _get_kwargs(access_token=access_token, file_id=file_id)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/post_auth.py b/src/gigachat/api/post_auth.py
index 99c6a39..15b3124 100644
--- a/src/gigachat/api/post_auth.py
+++ b/src/gigachat/api/post_auth.py
@@ -1,3 +1,6 @@
+import base64
+import binascii
+import logging
 import uuid
 from http import HTTPStatus
 from typing import Any, Dict
@@ -8,6 +11,8 @@
 from gigachat.exceptions import AuthenticationError, ResponseError
 from gigachat.models import AccessToken
 
+_logger = logging.getLogger(__name__)
+
 
 def _get_kwargs(*, url: str, credentials: str, scope: str) -> Dict[str, Any]:
     headers = {
@@ -32,13 +37,24 @@ def _build_response(response: httpx.Response) -> AccessToken:
         raise ResponseError(response.url, response.status_code, response.content, response.headers)
 
 
+def _validate_credentials(credentials: str) -> None:
+    try:
+        base64.b64decode(credentials, validate=True)
+    except (ValueError, binascii.Error):
+        _logger.warning(
+            "Invalid credentials format. Please use only base64 credentials (Authorization data, not client secret!)"
+        )
+
+
 def sync(client: httpx.Client, *, url: str, credentials: str, scope: str) -> AccessToken:
+    _validate_credentials(credentials)
     kwargs = _get_kwargs(url=url, credentials=credentials, scope=scope)
     response = client.request(**kwargs)
     return _build_response(response)
 
 
 async def asyncio(client: httpx.AsyncClient, *, url: str, credentials: str, scope: str) -> AccessToken:
+    _validate_credentials(credentials)
     kwargs = _get_kwargs(url=url, credentials=credentials, scope=scope)
     response = await client.request(**kwargs)
     return _build_response(response)
diff --git a/src/gigachat/api/post_files.py b/src/gigachat/api/post_files.py
new file mode 100644
index 0000000..07580fe
--- /dev/null
+++ b/src/gigachat/api/post_files.py
@@ -0,0 +1,59 @@
+from http import HTTPStatus
+from typing import Any, Dict, Literal, Optional
+
+import httpx
+
+from gigachat._types import FileTypes
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models import UploadedFile
+
+
+def _get_kwargs(
+    *,
+    file: FileTypes,
+    purpose: Literal["general", "assistant"] = "general",
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+
+    return {
+        "method": "POST",
+        "url": "/files",
+        "files": {"file": file},
+        "data": {"purpose": purpose},
+        "headers": headers,
+    }
+
+
+def _build_response(response: httpx.Response) -> UploadedFile:
+    if response.status_code == HTTPStatus.OK:
+        return UploadedFile(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    file: FileTypes,
+    purpose: Literal["general", "assistant"] = "general",
+    access_token: Optional[str] = None,
+) -> UploadedFile:
+    kwargs = _get_kwargs(file=file, purpose=purpose, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    file: FileTypes,
+    purpose: Literal["general", "assistant"] = "general",
+    access_token: Optional[str] = None,
+) -> UploadedFile:
+    kwargs = _get_kwargs(file=file, purpose=purpose, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/stream_chat.py b/src/gigachat/api/stream_chat.py
index 3b415bf..1c4de72 100644
--- a/src/gigachat/api/stream_chat.py
+++ b/src/gigachat/api/stream_chat.py
@@ -48,9 +48,18 @@ def _check_response(response: httpx.Response) -> None:
     if response.status_code == HTTPStatus.OK:
         _check_content_type(response)
     elif response.status_code == HTTPStatus.UNAUTHORIZED:
-        raise AuthenticationError(response.url, response.status_code, b"", response.headers)
+        raise AuthenticationError(response.url, response.status_code, response.read(), response.headers)
     else:
-        raise ResponseError(response.url, response.status_code, b"", response.headers)
+        raise ResponseError(response.url, response.status_code, response.read(), response.headers)
+
+
+async def _acheck_response(response: httpx.Response) -> None:
+    if response.status_code == HTTPStatus.OK:
+        _check_content_type(response)
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, await response.aread(), response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, await response.aread(), response.headers)
 
 
 def sync(
@@ -75,7 +84,7 @@ async def asyncio(
 ) -> AsyncIterator[ChatCompletionChunk]:
     kwargs = _get_kwargs(chat=chat, access_token=access_token)
     async with client.stream(**kwargs) as response:
-        _check_response(response)
+        await _acheck_response(response)
         async for line in response.aiter_lines():
             if chunk := _parse_chunk(line):
                 yield chunk
diff --git a/src/gigachat/api/threads/__init__.py b/src/gigachat/api/threads/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/gigachat/api/threads/get_threads.py b/src/gigachat/api/threads/get_threads.py
new file mode 100644
index 0000000..394874b
--- /dev/null
+++ b/src/gigachat/api/threads/get_threads.py
@@ -0,0 +1,52 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.threads import Threads
+
+
+def _get_kwargs(
+    *,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    params = {
+        "method": "GET",
+        "url": "/threads",
+        "headers": headers,
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> Threads:
+    if response.status_code == HTTPStatus.OK:
+        return Threads(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    access_token: Optional[str] = None,
+) -> Threads:
+    """Получение перечня тредов"""
+    kwargs = _get_kwargs(access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    access_token: Optional[str] = None,
+) -> Threads:
+    """Получение перечня тредов"""
+    kwargs = _get_kwargs(access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/get_threads_messages.py b/src/gigachat/api/threads/get_threads_messages.py
new file mode 100644
index 0000000..086899d
--- /dev/null
+++ b/src/gigachat/api/threads/get_threads_messages.py
@@ -0,0 +1,62 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.threads import ThreadMessages
+
+
+def _get_kwargs(
+    *,
+    thread_id: str,
+    limit: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    params: Dict[str, Any] = {"thread_id": thread_id}
+    if limit:
+        params["limit"] = limit
+    params = {
+        "method": "GET",
+        "url": "/threads/messages",
+        "headers": headers,
+        "params": params,
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> ThreadMessages:
+    if response.status_code == HTTPStatus.OK:
+        return ThreadMessages(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    thread_id: str,
+    limit: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> ThreadMessages:
+    """Получение сообщений треда"""
+    kwargs = _get_kwargs(thread_id=thread_id, limit=limit, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    thread_id: str,
+    limit: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> ThreadMessages:
+    """Получение сообщений треда"""
+    kwargs = _get_kwargs(thread_id=thread_id, limit=limit, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/get_threads_run.py b/src/gigachat/api/threads/get_threads_run.py
new file mode 100644
index 0000000..a260096
--- /dev/null
+++ b/src/gigachat/api/threads/get_threads_run.py
@@ -0,0 +1,56 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.threads import ThreadRunResult
+
+
+def _get_kwargs(
+    *,
+    thread_id: str,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    params = {
+        "method": "GET",
+        "url": "/threads/run",
+        "headers": headers,
+        "params": {"thread_id": thread_id},
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> ThreadRunResult:
+    if response.status_code == HTTPStatus.OK:
+        return ThreadRunResult(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    thread_id: str,
+    access_token: Optional[str] = None,
+) -> ThreadRunResult:
+    """Получить результат run треда"""
+    kwargs = _get_kwargs(thread_id=thread_id, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    thread_id: str,
+    access_token: Optional[str] = None,
+) -> ThreadRunResult:
+    """Получить результат run треда"""
+    kwargs = _get_kwargs(thread_id=thread_id, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/post_thread_messages_rerun.py b/src/gigachat/api/threads/post_thread_messages_rerun.py
new file mode 100644
index 0000000..40da1c0
--- /dev/null
+++ b/src/gigachat/api/threads/post_thread_messages_rerun.py
@@ -0,0 +1,75 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.threads import ThreadCompletion, ThreadRunOptions
+
+
+def _get_kwargs(
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    thread_options_dict = {}
+    if thread_options:
+        thread_options_dict = thread_options.dict(exclude_none=True, by_alias=True, exclude={"stream"})
+    params = {
+        "method": "POST",
+        "url": "/threads/messages/rerun",
+        "headers": headers,
+        "json": {
+            **thread_options_dict,
+            **{
+                "thread_id": thread_id,
+            },
+        },
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> ThreadCompletion:
+    if response.status_code == HTTPStatus.OK:
+        return ThreadCompletion(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> ThreadCompletion:
+    """Перегенерация ответа модели"""
+    kwargs = _get_kwargs(
+        thread_id=thread_id,
+        thread_options=thread_options,
+        access_token=access_token,
+    )
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> ThreadCompletion:
+    """Перегенерация ответа модели"""
+    kwargs = _get_kwargs(
+        thread_id=thread_id,
+        thread_options=thread_options,
+        access_token=access_token,
+    )
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/post_thread_messages_rerun_stream.py b/src/gigachat/api/threads/post_thread_messages_rerun_stream.py
new file mode 100644
index 0000000..be90d63
--- /dev/null
+++ b/src/gigachat/api/threads/post_thread_messages_rerun_stream.py
@@ -0,0 +1,116 @@
+from http import HTTPStatus
+from typing import Any, AsyncIterator, Dict, Iterator, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.threads import ThreadCompletionChunk, ThreadRunOptions
+
+EVENT_STREAM = "text/event-stream"
+
+
+def _get_kwargs(
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    update_interval: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    thread_options_dict = {}
+    if thread_options:
+        thread_options_dict = thread_options.dict(exclude_none=True)
+    params = {
+        "method": "POST",
+        "url": "/threads/messages/rerun",
+        "headers": headers,
+        "json": {
+            **thread_options_dict,
+            **{
+                "thread_id": thread_id,
+                "update_interval": update_interval,
+                "stream": True,
+            },
+        },
+    }
+    return params
+
+
+def _parse_chunk(line: str) -> Optional[ThreadCompletionChunk]:
+    name, _, value = line.partition(": ")
+    if name == "data":
+        if value == "[DONE]":
+            return None
+        else:
+            return ThreadCompletionChunk.parse_raw(value)
+    else:
+        return None
+
+
+def _check_content_type(response: httpx.Response) -> None:
+    content_type, _, _ = response.headers.get("content-type", "").partition(";")
+    if content_type != EVENT_STREAM:
+        raise httpx.TransportError(f"Expected response Content-Type to be '{EVENT_STREAM}', got {content_type!r}")
+
+
+def _check_response(response: httpx.Response) -> None:
+    if response.status_code == HTTPStatus.OK:
+        _check_content_type(response)
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.read(), response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.read(), response.headers)
+
+
+async def _acheck_response(response: httpx.Response) -> None:
+    if response.status_code == HTTPStatus.OK:
+        _check_content_type(response)
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, await response.aread(), response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, await response.aread(), response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    update_interval: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> Iterator[ThreadCompletionChunk]:
+    """Перегенерация ответа модели"""
+    kwargs = _get_kwargs(
+        thread_id=thread_id,
+        thread_options=thread_options,
+        update_interval=update_interval,
+        access_token=access_token,
+    )
+    with client.stream(**kwargs) as response:
+        _check_response(response)
+        for line in response.iter_lines():
+            if chunk := _parse_chunk(line):
+                yield chunk
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    update_interval: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> AsyncIterator[ThreadCompletionChunk]:
+    """Перегенерация ответа модели"""
+    kwargs = _get_kwargs(
+        thread_id=thread_id,
+        thread_options=thread_options,
+        update_interval=update_interval,
+        access_token=access_token,
+    )
+    async with client.stream(**kwargs) as response:
+        await _acheck_response(response)
+        async for line in response.aiter_lines():
+            if chunk := _parse_chunk(line):
+                yield chunk
diff --git a/src/gigachat/api/threads/post_thread_messages_run.py b/src/gigachat/api/threads/post_thread_messages_run.py
new file mode 100644
index 0000000..81c032a
--- /dev/null
+++ b/src/gigachat/api/threads/post_thread_messages_run.py
@@ -0,0 +1,96 @@
+from http import HTTPStatus
+from typing import Any, Dict, List, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models import Messages
+from gigachat.models.threads import ThreadCompletion, ThreadRunOptions
+
+
+def _get_kwargs(
+    *,
+    messages: List[Messages],
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    model: Optional[str] = None,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    thread_options_dict = {}
+    if thread_options:
+        thread_options_dict = thread_options.dict(exclude_none=True, by_alias=True, exclude={"stream"})
+    if thread_id is not None or assistant_id is not None:
+        model = None
+    params = {
+        "method": "POST",
+        "url": "/threads/messages/run",
+        "headers": headers,
+        "json": {
+            **thread_options_dict,
+            **{
+                "thread_id": thread_id,
+                "assistant_id": assistant_id,
+                "model": model,
+                "messages": [message.dict(exclude_none=True) for message in messages],
+            },
+        },
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> ThreadCompletion:
+    if response.status_code == HTTPStatus.OK:
+        return ThreadCompletion(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    messages: List[Messages],
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    model: Optional[str] = None,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> ThreadCompletion:
+    """Добавление сообщений к треду с запуском"""
+    kwargs = _get_kwargs(
+        messages=messages,
+        thread_id=thread_id,
+        assistant_id=assistant_id,
+        model=model,
+        thread_options=thread_options,
+        access_token=access_token,
+    )
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    messages: List[Messages],
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    model: Optional[str] = None,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> ThreadCompletion:
+    """Добавление сообщений к треду с запуском"""
+    kwargs = _get_kwargs(
+        messages=messages,
+        thread_id=thread_id,
+        assistant_id=assistant_id,
+        model=model,
+        thread_options=thread_options,
+        access_token=access_token,
+    )
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/post_thread_messages_run_stream.py b/src/gigachat/api/threads/post_thread_messages_run_stream.py
new file mode 100644
index 0000000..54ca753
--- /dev/null
+++ b/src/gigachat/api/threads/post_thread_messages_run_stream.py
@@ -0,0 +1,135 @@
+from http import HTTPStatus
+from typing import Any, AsyncIterator, Dict, Iterator, List, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models import Messages
+from gigachat.models.threads import ThreadCompletionChunk, ThreadRunOptions
+
+EVENT_STREAM = "text/event-stream"
+
+
+def _get_kwargs(
+    *,
+    messages: List[Messages],
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    model: Optional[str] = None,
+    thread_options: Optional[ThreadRunOptions] = None,
+    update_interval: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    thread_options_dict = {}
+    if assistant_id is not None or thread_id is not None:
+        model = None
+    if thread_options:
+        thread_options_dict = thread_options.dict(exclude_none=True)
+    params = {
+        "method": "POST",
+        "url": "/threads/messages/run",
+        "headers": headers,
+        "json": {
+            **thread_options_dict,
+            **{
+                "thread_id": thread_id,
+                "assistant_id": assistant_id,
+                "model": model,
+                "messages": [message.dict(exclude_none=True) for message in messages],
+                "update_interval": update_interval,
+                "stream": True,
+            },
+        },
+    }
+    return params
+
+
+def _parse_chunk(line: str) -> Optional[ThreadCompletionChunk]:
+    name, _, value = line.partition(": ")
+    if name == "data":
+        if value == "[DONE]":
+            return None
+        else:
+            return ThreadCompletionChunk.parse_raw(value)
+    else:
+        return None
+
+
+def _check_content_type(response: httpx.Response) -> None:
+    content_type, _, _ = response.headers.get("content-type", "").partition(";")
+    if content_type != EVENT_STREAM:
+        raise httpx.TransportError(f"Expected response Content-Type to be '{EVENT_STREAM}', got {content_type!r}")
+
+
+def _check_response(response: httpx.Response) -> None:
+    if response.status_code == HTTPStatus.OK:
+        _check_content_type(response)
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.read(), response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.read(), response.headers)
+
+
+async def _acheck_response(response: httpx.Response) -> None:
+    if response.status_code == HTTPStatus.OK:
+        _check_content_type(response)
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, await response.aread(), response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, await response.aread(), response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    messages: List[Messages],
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    model: Optional[str] = None,
+    thread_options: Optional[ThreadRunOptions] = None,
+    update_interval: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> Iterator[ThreadCompletionChunk]:
+    kwargs = _get_kwargs(
+        messages=messages,
+        thread_id=thread_id,
+        assistant_id=assistant_id,
+        model=model,
+        thread_options=thread_options,
+        update_interval=update_interval,
+        access_token=access_token,
+    )
+    with client.stream(**kwargs) as response:
+        _check_response(response)
+        for line in response.iter_lines():
+            if chunk := _parse_chunk(line):
+                yield chunk
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    messages: List[Messages],
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    model: Optional[str] = None,
+    thread_options: Optional[ThreadRunOptions] = None,
+    update_interval: Optional[int] = None,
+    access_token: Optional[str] = None,
+) -> AsyncIterator[ThreadCompletionChunk]:
+    kwargs = _get_kwargs(
+        messages=messages,
+        thread_id=thread_id,
+        assistant_id=assistant_id,
+        model=model,
+        thread_options=thread_options,
+        update_interval=update_interval,
+        access_token=access_token,
+    )
+    async with client.stream(**kwargs) as response:
+        await _acheck_response(response)
+        async for line in response.aiter_lines():
+            if chunk := _parse_chunk(line):
+                yield chunk
diff --git a/src/gigachat/api/threads/post_threads_delete.py b/src/gigachat/api/threads/post_threads_delete.py
new file mode 100644
index 0000000..c917a2c
--- /dev/null
+++ b/src/gigachat/api/threads/post_threads_delete.py
@@ -0,0 +1,57 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+
+
+def _get_kwargs(
+    *,
+    thread_id: str,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    params = {
+        "method": "POST",
+        "url": "/threads/delete",
+        "json": {
+            "thread_id": thread_id,
+        },
+        "headers": headers,
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> bool:
+    if response.status_code == HTTPStatus.OK:
+        return True
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    thread_id: str,
+    access_token: Optional[str] = None,
+) -> bool:
+    """Удаляет тред"""
+    kwargs = _get_kwargs(thread_id=thread_id, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    thread_id: str,
+    access_token: Optional[str] = None,
+) -> bool:
+    """Удаляет тред"""
+    kwargs = _get_kwargs(thread_id=thread_id, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/post_threads_messages.py b/src/gigachat/api/threads/post_threads_messages.py
new file mode 100644
index 0000000..646801a
--- /dev/null
+++ b/src/gigachat/api/threads/post_threads_messages.py
@@ -0,0 +1,85 @@
+from http import HTTPStatus
+from typing import Any, Dict, List, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models import Messages
+from gigachat.models.threads import ThreadMessagesResponse
+
+
+def _get_kwargs(
+    *,
+    messages: List[Messages],
+    model: Optional[str] = None,
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    if thread_id is not None or assistant_id is not None:
+        model = None
+    params = {
+        "method": "POST",
+        "url": "/threads/messages",
+        "json": {
+            "thread_id": thread_id,
+            "model": model,
+            "assistant_id": assistant_id,
+            "messages": [message.dict() for message in messages],
+        },
+        "headers": headers,
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> ThreadMessagesResponse:
+    if response.status_code == HTTPStatus.OK:
+        return ThreadMessagesResponse(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    messages: List[Messages],
+    model: Optional[str] = None,
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    access_token: Optional[str] = None,
+) -> ThreadMessagesResponse:
+    """Добавление сообщений к треду без запуска"""
+    kwargs = _get_kwargs(
+        messages=messages,
+        model=model,
+        thread_id=thread_id,
+        assistant_id=assistant_id,
+        access_token=access_token,
+    )
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    messages: List[Messages],
+    model: Optional[str] = None,
+    thread_id: Optional[str] = None,
+    assistant_id: Optional[str] = None,
+    access_token: Optional[str] = None,
+) -> ThreadMessagesResponse:
+    """Добавление сообщений к треду без запуска"""
+    kwargs = _get_kwargs(
+        messages=messages,
+        model=model,
+        thread_id=thread_id,
+        assistant_id=assistant_id,
+        access_token=access_token,
+    )
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/threads/post_threads_run.py b/src/gigachat/api/threads/post_threads_run.py
new file mode 100644
index 0000000..44bf1cc
--- /dev/null
+++ b/src/gigachat/api/threads/post_threads_run.py
@@ -0,0 +1,62 @@
+from http import HTTPStatus
+from typing import Any, Dict, Optional
+
+import httpx
+
+from gigachat.api.utils import build_headers
+from gigachat.exceptions import AuthenticationError, ResponseError
+from gigachat.models.threads import ThreadRunOptions, ThreadRunResponse
+
+
+def _get_kwargs(
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> Dict[str, Any]:
+    headers = build_headers(access_token)
+    thread_options_dict = {}
+    if thread_options:
+        thread_options_dict = thread_options.dict(exclude_none=True)
+    params = {
+        "method": "POST",
+        "url": "/threads/run",
+        "headers": headers,
+        "json": {**thread_options_dict, **{"thread_id": thread_id}},
+    }
+    return params
+
+
+def _build_response(response: httpx.Response) -> ThreadRunResponse:
+    if response.status_code == HTTPStatus.OK:
+        return ThreadRunResponse(**response.json())
+    elif response.status_code == HTTPStatus.UNAUTHORIZED:
+        raise AuthenticationError(response.url, response.status_code, response.content, response.headers)
+    else:
+        raise ResponseError(response.url, response.status_code, response.content, response.headers)
+
+
+def sync(
+    client: httpx.Client,
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> ThreadRunResponse:
+    """Получить результат run треда"""
+    kwargs = _get_kwargs(thread_id=thread_id, thread_options=thread_options, access_token=access_token)
+    response = client.request(**kwargs)
+    return _build_response(response)
+
+
+async def asyncio(
+    client: httpx.AsyncClient,
+    *,
+    thread_id: str,
+    thread_options: Optional[ThreadRunOptions] = None,
+    access_token: Optional[str] = None,
+) -> ThreadRunResponse:
+    """Получить результат run треда"""
+    kwargs = _get_kwargs(thread_id=thread_id, thread_options=thread_options, access_token=access_token)
+    response = await client.request(**kwargs)
+    return _build_response(response)
diff --git a/src/gigachat/api/utils.py b/src/gigachat/api/utils.py
index 5a5c59e..f867e60 100644
--- a/src/gigachat/api/utils.py
+++ b/src/gigachat/api/utils.py
@@ -2,6 +2,7 @@
 
 from gigachat.context import (
     authorization_cvar,
+    client_id_cvar,
     operation_id_cvar,
     request_id_cvar,
     service_id_cvar,
@@ -24,6 +25,7 @@ def build_headers(access_token: Optional[str] = None) -> Dict[str, str]:
     request_id = request_id_cvar.get()
     service_id = service_id_cvar.get()
     operation_id = operation_id_cvar.get()
+    client_id = client_id_cvar.get()
 
     if authorization:
         headers["Authorization"] = authorization
@@ -35,4 +37,6 @@ def build_headers(access_token: Optional[str] = None) -> Dict[str, str]:
         headers["X-Service-ID"] = service_id
     if operation_id:
         headers["X-Operation-ID"] = operation_id
+    if client_id:
+        headers["X-Client-ID"] = client_id
     return headers
diff --git a/src/gigachat/assistants.py b/src/gigachat/assistants.py
new file mode 100644
index 0000000..d1805c5
--- /dev/null
+++ b/src/gigachat/assistants.py
@@ -0,0 +1,170 @@
+from typing import TYPE_CHECKING, Any, Dict, List, Optional
+
+from gigachat.api.assistants import (
+    get_assistants,
+    post_assistant_files_delete,
+    post_assistant_modify,
+    post_assistants,
+)
+from gigachat.models.assistants import (
+    Assistant,
+    AssistantFileDelete,
+    Assistants,
+    CreateAssistant,
+)
+
+if TYPE_CHECKING:
+    from gigachat.client import GigaChatAsyncClient, GigaChatSyncClient
+
+
+class AssistantsSyncClient:
+    def __init__(self, base_client: "GigaChatSyncClient"):
+        self.base_client = base_client
+
+    def get(self, assistant_id: Optional[str] = None) -> Assistants:
+        """Возвращает список доступных ассистентов"""
+        return self.base_client._decorator(
+            lambda: get_assistants.sync(
+                self.base_client._client,
+                assistant_id=assistant_id,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def create(
+        self,
+        model: str,
+        name: str,
+        instructions: str,
+        description: Optional[str] = None,
+        file_ids: Optional[List[str]] = None,
+        metadata: Optional[Dict[str, Any]] = None,
+    ) -> CreateAssistant:
+        """Создает ассистента"""
+        return self.base_client._decorator(
+            lambda: post_assistants.sync(
+                self.base_client._client,
+                model=model,
+                name=name,
+                description=description,
+                instructions=instructions,
+                file_ids=file_ids,
+                metadata=metadata,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def update(
+        self,
+        assistant_id: str,
+        name: Optional[str] = None,
+        description: Optional[str] = None,
+        instructions: Optional[str] = None,
+        file_ids: Optional[List[str]] = None,
+        metadata: Optional[Dict[str, Any]] = None,
+    ) -> Assistant:
+        """Обновляет ассистента"""
+
+        return self.base_client._decorator(
+            lambda: post_assistant_modify.sync(
+                self.base_client._client,
+                assistant_id=assistant_id,
+                name=name,
+                description=description,
+                instructions=instructions,
+                file_ids=file_ids,
+                metadata=metadata,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def delete_file(self, assistant_id: str, file_id: str) -> AssistantFileDelete:
+        """Удаляет файл ассистента"""
+        return self.base_client._decorator(
+            lambda: post_assistant_files_delete.sync(
+                self.base_client._client,
+                assistant_id=assistant_id,
+                file_id=file_id,
+                access_token=self.base_client.token,
+            )
+        )
+
+
+class AssistantsAsyncClient:
+    def __init__(self, base_client: "GigaChatAsyncClient"):
+        self.base_client = base_client
+
+    async def get(self, assistant_id: Optional[str] = None) -> Assistants:
+        """Возвращает список доступных ассистентов"""
+
+        async def _acall() -> Assistants:
+            return await get_assistants.asyncio(
+                self.base_client._aclient,
+                assistant_id=assistant_id,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def create(
+        self,
+        model: str,
+        name: str,
+        instructions: str,
+        description: Optional[str] = None,
+        file_ids: Optional[List[str]] = None,
+        metadata: Optional[Dict[str, Any]] = None,
+    ) -> CreateAssistant:
+        """Создает ассистента"""
+
+        async def _acall() -> CreateAssistant:
+            return await post_assistants.asyncio(
+                self.base_client._aclient,
+                model=model,
+                name=name,
+                description=description,
+                instructions=instructions,
+                file_ids=file_ids,
+                metadata=metadata,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def update(
+        self,
+        assistant_id: str,
+        name: Optional[str] = None,
+        description: Optional[str] = None,
+        instructions: Optional[str] = None,
+        file_ids: Optional[List[str]] = None,
+        metadata: Optional[Dict[str, Any]] = None,
+    ) -> Assistant:
+        """Обновляет ассистента"""
+
+        async def _acall() -> Assistant:
+            return await post_assistant_modify.asyncio(
+                self.base_client._aclient,
+                assistant_id=assistant_id,
+                name=name,
+                description=description,
+                instructions=instructions,
+                file_ids=file_ids,
+                metadata=metadata,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def delete_file(self, assistant_id: str, file_id: str) -> AssistantFileDelete:
+        """Удаляет файл ассистента"""
+
+        async def _acall() -> AssistantFileDelete:
+            return await post_assistant_files_delete.asyncio(
+                self.base_client._aclient,
+                assistant_id=assistant_id,
+                file_id=file_id,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
diff --git a/src/gigachat/client.py b/src/gigachat/client.py
index 8618182..2c2dc9c 100644
--- a/src/gigachat/client.py
+++ b/src/gigachat/client.py
@@ -1,19 +1,35 @@
 import logging
 from functools import cached_property
-from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, TypeVar, Union
+from typing import (
+    Any,
+    AsyncIterator,
+    Awaitable,
+    Callable,
+    Dict,
+    Iterator,
+    List,
+    Literal,
+    Optional,
+    TypeVar,
+    Union,
+)
 
 import httpx
 
+from gigachat._types import FileTypes
 from gigachat.api import (
+    get_image,
     get_model,
     get_models,
     post_auth,
     post_chat,
     post_embeddings,
+    post_files,
     post_token,
     post_tokens_count,
     stream_chat,
 )
+from gigachat.assistants import AssistantsAsyncClient, AssistantsSyncClient
 from gigachat.context import authorization_cvar
 from gigachat.exceptions import AuthenticationError
 from gigachat.models import (
@@ -22,14 +38,17 @@
     ChatCompletion,
     ChatCompletionChunk,
     Embeddings,
+    Image,
     Messages,
     MessagesRole,
     Model,
     Models,
     Token,
     TokensCount,
+    UploadedFile,
 )
 from gigachat.settings import Settings
+from gigachat.threads import ThreadsAsyncClient, ThreadsSyncClient
 
 T = TypeVar("T")
 
@@ -48,7 +67,11 @@ def _get_kwargs(settings: Settings) -> Dict[str, Any]:
     if settings.ca_bundle_file:
         kwargs["verify"] = settings.ca_bundle_file
     if settings.cert_file:
-        kwargs["cert"] = (settings.cert_file, settings.key_file, settings.key_file_password)
+        kwargs["cert"] = (
+            settings.cert_file,
+            settings.key_file,
+            settings.key_file_password,
+        )
     return kwargs
 
 
@@ -155,6 +178,11 @@ def _reset_token(self) -> None:
 class GigaChatSyncClient(_BaseClient):
     """Синхронный клиент GigaChat"""
 
+    def __init__(self, **kwargs: Any) -> None:
+        super().__init__(**kwargs)
+        self.assistants = AssistantsSyncClient(self)
+        self.threads = ThreadsSyncClient(self)
+
     @cached_property
     def _client(self) -> httpx.Client:
         return httpx.Client(**_get_kwargs(self._settings))
@@ -186,7 +214,11 @@ def _update_token(self) -> None:
             _logger.info("OAUTH UPDATE TOKEN")
         elif self._settings.user and self._settings.password:
             self._access_token = _build_access_token(
-                post_token.sync(self._client, user=self._settings.user, password=self._settings.password)
+                post_token.sync(
+                    self._client,
+                    user=self._settings.user,
+                    password=self._settings.password,
+                )
             )
             _logger.info("UPDATE TOKEN")
 
@@ -223,6 +255,20 @@ def get_model(self, model: str) -> Model:
         """Возвращает объект с описанием указанной модели"""
         return self._decorator(lambda: get_model.sync(self._client, model=model, access_token=self.token))
 
+    def get_image(self, file_id: str) -> Image:
+        """Возвращает изображение в кодировке base64"""
+        return self._decorator(lambda: get_image.sync(self._client, file_id=file_id, access_token=self.token))
+
+    def upload_file(
+        self,
+        file: FileTypes,
+        purpose: Literal["general", "assistant"] = "general",
+    ) -> UploadedFile:
+        """Загружает файл"""
+        return self._decorator(
+            lambda: post_files.sync(self._client, file=file, purpose=purpose, access_token=self.token)
+        )
+
     def chat(self, payload: Union[Chat, Dict[str, Any], str]) -> ChatCompletion:
         """Возвращает ответ модели с учетом переданных сообщений"""
         chat = _parse_chat(payload, self._settings)
@@ -250,6 +296,11 @@ def stream(self, payload: Union[Chat, Dict[str, Any], str]) -> Iterator[ChatComp
 class GigaChatAsyncClient(_BaseClient):
     """Асинхронный клиент GigaChat"""
 
+    def __init__(self, **kwargs: Any) -> None:
+        super().__init__(**kwargs)
+        self.a_assistants = AssistantsAsyncClient(self)
+        self.a_threads = ThreadsAsyncClient(self)
+
     @cached_property
     def _aclient(self) -> httpx.AsyncClient:
         return httpx.AsyncClient(**_get_kwargs(self._settings))
@@ -281,7 +332,11 @@ async def _aupdate_token(self) -> None:
             _logger.info("OAUTH UPDATE TOKEN")
         elif self._settings.user and self._settings.password:
             self._access_token = _build_access_token(
-                await post_token.asyncio(self._aclient, user=self._settings.user, password=self._settings.password)
+                await post_token.asyncio(
+                    self._aclient,
+                    user=self._settings.user,
+                    password=self._settings.password,
+                )
             )
             _logger.info("UPDATE TOKEN")
 
@@ -322,6 +377,14 @@ async def _acall() -> Models:
 
         return await self._adecorator(_acall)
 
+    async def aget_image(self, file_id: str) -> Image:
+        """Возвращает изображение в кодировке base64"""
+
+        async def _acall() -> Image:
+            return await get_image.asyncio(self._aclient, file_id=file_id, access_token=self.token)
+
+        return await self._adecorator(_acall)
+
     async def aget_model(self, model: str) -> Model:
         """Возвращает объект с описанием указанной модели"""
 
@@ -339,6 +402,18 @@ async def _acall() -> ChatCompletion:
 
         return await self._adecorator(_acall)
 
+    async def aupload_file(
+        self,
+        file: FileTypes,
+        purpose: Literal["general", "assistant"] = "general",
+    ) -> UploadedFile:
+        """Загружает файл"""
+
+        async def _acall() -> UploadedFile:
+            return await post_files.asyncio(self._aclient, file=file, purpose=purpose, access_token=self.token)
+
+        return await self._adecorator(_acall)
+
     async def astream(self, payload: Union[Chat, Dict[str, Any], str]) -> AsyncIterator[ChatCompletionChunk]:
         """Возвращает ответ модели с учетом переданных сообщений"""
         chat = _parse_chat(payload, self._settings)
diff --git a/src/gigachat/context.py b/src/gigachat/context.py
index 5ae429f..bb36ad6 100644
--- a/src/gigachat/context.py
+++ b/src/gigachat/context.py
@@ -4,7 +4,7 @@
 authorization_cvar: ContextVar[Optional[str]] = ContextVar("authorization_cvar", default=None)
 """Информация об авторизации с помощью JWE"""
 client_id_cvar: ContextVar[Optional[str]] = ContextVar("client_id_cvar", default=None)
-"""[DEPRECATED] Уникальный ID клиента"""
+"""Уникальный ID клиента"""
 request_id_cvar: ContextVar[Optional[str]] = ContextVar("request_id_cvar", default=None)
 """Уникальный ID запроса"""
 session_id_cvar: ContextVar[Optional[str]] = ContextVar("session_id_cvar", default=None)
diff --git a/src/gigachat/models/__init__.py b/src/gigachat/models/__init__.py
index 96e6b79..f88948a 100644
--- a/src/gigachat/models/__init__.py
+++ b/src/gigachat/models/__init__.py
@@ -10,6 +10,7 @@
 from gigachat.models.function import Function
 from gigachat.models.function_call import FunctionCall
 from gigachat.models.function_parameters import FunctionParameters
+from gigachat.models.image import Image
 from gigachat.models.messages import Messages
 from gigachat.models.messages_chunk import MessagesChunk
 from gigachat.models.messages_role import MessagesRole
@@ -17,6 +18,7 @@
 from gigachat.models.models import Models
 from gigachat.models.token import Token
 from gigachat.models.tokens_count import TokensCount
+from gigachat.models.uploaded_file import UploadedFile
 from gigachat.models.usage import Usage
 
 __all__ = (
@@ -40,4 +42,6 @@
     "Token",
     "TokensCount",
     "Usage",
+    "UploadedFile",
+    "Image",
 )
diff --git a/src/gigachat/models/assistants/__init__.py b/src/gigachat/models/assistants/__init__.py
new file mode 100644
index 0000000..fc80ac2
--- /dev/null
+++ b/src/gigachat/models/assistants/__init__.py
@@ -0,0 +1,6 @@
+from gigachat.models.assistants.assistant import Assistant
+from gigachat.models.assistants.assistant_file_delete import AssistantFileDelete
+from gigachat.models.assistants.assistants import Assistants
+from gigachat.models.assistants.create_assistant import CreateAssistant
+
+__all__ = ("Assistant", "AssistantFileDelete", "Assistants", "CreateAssistant")
diff --git a/src/gigachat/models/assistants/assistant.py b/src/gigachat/models/assistants/assistant.py
new file mode 100644
index 0000000..551d318
--- /dev/null
+++ b/src/gigachat/models/assistants/assistant.py
@@ -0,0 +1,26 @@
+from typing import Any, Dict, List, Optional
+
+from gigachat.pydantic_v1 import BaseModel
+
+
+class Assistant(BaseModel):
+    """Ассистент"""
+
+    model: str
+    """Идентификатор модели, которую необходимо использовать."""
+    assistant_id: str
+    """Идентификатор созданного ассистента. UUIDv4"""
+    name: Optional[str]
+    """Имя ассистента, которое было передано в запросе"""
+    description: Optional[str]
+    """Описание ассистента, которое было передано в запросе"""
+    instructions: Optional[str]
+    """Инструкция для ассистента, которое было передано в запросе"""
+    created_at: int
+    """Время создания ассистента в Unix-time формате"""
+    updated_at: int
+    """Время изменения ассистента в Unix-time формате"""
+    file_ids: Optional[List[str]]
+    """Идентификаторы прикрепленных к ассистенту файлов """
+    metadata: Optional[Dict[str, Any]]
+    """Дополнительная информация"""
diff --git a/src/gigachat/models/assistants/assistant_file_delete.py b/src/gigachat/models/assistants/assistant_file_delete.py
new file mode 100644
index 0000000..056f411
--- /dev/null
+++ b/src/gigachat/models/assistants/assistant_file_delete.py
@@ -0,0 +1,10 @@
+from gigachat.pydantic_v1 import BaseModel
+
+
+class AssistantFileDelete(BaseModel):
+    """Информация об удаленном файле"""
+
+    file_id: str
+    """Идентификатор прикрепленного к ассистенту файла"""
+    deleted: bool
+    """Признак удаления. Если true - файл удален из ассистента"""
diff --git a/src/gigachat/models/assistants/assistants.py b/src/gigachat/models/assistants/assistants.py
new file mode 100644
index 0000000..ef468e4
--- /dev/null
+++ b/src/gigachat/models/assistants/assistants.py
@@ -0,0 +1,11 @@
+from typing import List
+
+from gigachat.models.assistants.assistant import Assistant
+from gigachat.pydantic_v1 import BaseModel
+
+
+class Assistants(BaseModel):
+    """Доступные ассистенты"""
+
+    data: List[Assistant]
+    """Массив объектов с данными доступных ассистентов"""
diff --git a/src/gigachat/models/assistants/create_assistant.py b/src/gigachat/models/assistants/create_assistant.py
new file mode 100644
index 0000000..bcc32f0
--- /dev/null
+++ b/src/gigachat/models/assistants/create_assistant.py
@@ -0,0 +1,10 @@
+from gigachat.pydantic_v1 import BaseModel
+
+
+class CreateAssistant(BaseModel):
+    """Информация о созданном ассистенте"""
+
+    assistant_id: str
+    """Идентификатор созданного ассистента. UUIDv4"""
+    created_at: int
+    """Время создания ассистента в Unix-time формате"""
diff --git a/src/gigachat/models/chat_function_call.py b/src/gigachat/models/chat_function_call.py
index e7b5d71..ca7dcab 100644
--- a/src/gigachat/models/chat_function_call.py
+++ b/src/gigachat/models/chat_function_call.py
@@ -1,3 +1,5 @@
+from typing import Any, Dict, Optional
+
 from gigachat.pydantic_v1 import BaseModel
 
 
@@ -6,3 +8,5 @@ class ChatFunctionCall(BaseModel):
 
     name: str
     """Название функции"""
+    partial_arguments: Optional[Dict[str, Any]] = None
+    """Часть аргументов функции"""
diff --git a/src/gigachat/models/few_shot_example.py b/src/gigachat/models/few_shot_example.py
new file mode 100644
index 0000000..8491b50
--- /dev/null
+++ b/src/gigachat/models/few_shot_example.py
@@ -0,0 +1,9 @@
+from typing import Any, Dict
+
+from gigachat.pydantic_v1 import BaseModel
+
+
+class FewShotExample(BaseModel):
+    request: str
+    """Запрос пользователя"""
+    params: Dict[str, Any]
diff --git a/src/gigachat/models/function.py b/src/gigachat/models/function.py
index 64b38c2..63169df 100644
--- a/src/gigachat/models/function.py
+++ b/src/gigachat/models/function.py
@@ -1,5 +1,6 @@
-from typing import Any, Dict, Optional
+from typing import Any, Dict, List, Optional
 
+from gigachat.models.few_shot_example import FewShotExample
 from gigachat.models.function_parameters import FunctionParameters
 from gigachat.pydantic_v1 import BaseModel
 
@@ -13,5 +14,6 @@ class Function(BaseModel):
     """Описание функции"""
     parameters: Optional[FunctionParameters] = None
     """Список параметров функции"""
+    few_shot_examples: Optional[List[FewShotExample]] = None
     return_parameters: Optional[Dict[Any, Any]] = None
     """Список возвращаемых параметров функции"""
diff --git a/src/gigachat/models/image.py b/src/gigachat/models/image.py
new file mode 100644
index 0000000..5c86b38
--- /dev/null
+++ b/src/gigachat/models/image.py
@@ -0,0 +1,8 @@
+from gigachat.pydantic_v1 import BaseModel
+
+
+class Image(BaseModel):
+    """Изображение"""
+
+    content: str
+    """Изображение в base64 кодировке"""
diff --git a/src/gigachat/models/messages.py b/src/gigachat/models/messages.py
index 17788ae..73d2f62 100644
--- a/src/gigachat/models/messages.py
+++ b/src/gigachat/models/messages.py
@@ -1,8 +1,8 @@
-from typing import Optional
+from typing import Any, List, Optional
 
 from gigachat.models.function_call import FunctionCall
 from gigachat.models.messages_role import MessagesRole
-from gigachat.pydantic_v1 import BaseModel
+from gigachat.pydantic_v1 import BaseModel, Field
 
 
 class Messages(BaseModel):
@@ -14,6 +14,13 @@ class Messages(BaseModel):
     """Текст сообщения"""
     function_call: Optional[FunctionCall] = None
     """Вызов функции"""
+    name: Optional[str] = None
+    """Наименование функции. Заполняется, если role = "function" """
+    attachments: Optional[List[str]] = None
+    """Идентификаторы предзагруженных ранее файлов """
+    data_for_context: Optional[List["Messages"]] = None
+    """Данные для контекста"""
+    id_: Optional[Any] = Field(alias="id")
 
     class Config:
         use_enum_values = True
diff --git a/src/gigachat/models/messages_role.py b/src/gigachat/models/messages_role.py
index 2e3b704..156b16b 100644
--- a/src/gigachat/models/messages_role.py
+++ b/src/gigachat/models/messages_role.py
@@ -8,3 +8,5 @@ class MessagesRole(str, Enum):
     SYSTEM = "system"
     USER = "user"
     FUNCTION = "function"
+    SEARCH_RESULT = "search_result"
+    FUNCTION_IN_PROGRESS = "function_in_progress"
diff --git a/src/gigachat/models/threads/__init__.py b/src/gigachat/models/threads/__init__.py
new file mode 100644
index 0000000..bf78667
--- /dev/null
+++ b/src/gigachat/models/threads/__init__.py
@@ -0,0 +1,29 @@
+from gigachat.models.threads.thread import Thread
+from gigachat.models.threads.thread_completion import ThreadCompletion
+from gigachat.models.threads.thread_completion_chunk import ThreadCompletionChunk
+from gigachat.models.threads.thread_message import ThreadMessage
+from gigachat.models.threads.thread_message_attachment import ThreadMessageAttachment
+from gigachat.models.threads.thread_message_response import ThreadMessageResponse
+from gigachat.models.threads.thread_messages import ThreadMessages
+from gigachat.models.threads.thread_messages_response import ThreadMessagesResponse
+from gigachat.models.threads.thread_run_options import ThreadRunOptions
+from gigachat.models.threads.thread_run_response import ThreadRunResponse
+from gigachat.models.threads.thread_run_result import ThreadRunResult
+from gigachat.models.threads.thread_status import ThreadStatus
+from gigachat.models.threads.threads import Threads
+
+__all__ = (
+    "Thread",
+    "ThreadCompletion",
+    "ThreadCompletionChunk",
+    "ThreadMessage",
+    "ThreadMessageAttachment",
+    "ThreadMessageResponse",
+    "ThreadMessages",
+    "ThreadMessagesResponse",
+    "ThreadRunOptions",
+    "ThreadRunResponse",
+    "ThreadRunResult",
+    "ThreadStatus",
+    "Threads",
+)
diff --git a/src/gigachat/models/threads/thread.py b/src/gigachat/models/threads/thread.py
new file mode 100644
index 0000000..2f727e8
--- /dev/null
+++ b/src/gigachat/models/threads/thread.py
@@ -0,0 +1,25 @@
+from typing import Optional
+
+from gigachat.models.threads.thread_status import ThreadStatus
+from gigachat.pydantic_v1 import BaseModel, Field
+
+
+class Thread(BaseModel):
+    """Тред"""
+
+    id_: str = Field(alias="id")
+    """Идентификатор треда"""
+    assistant_id: Optional[str]
+    """Идентификатор ассистента. Передается при первом сообщении в сессию"""
+    model: str
+    """Алиас модели из Table.threads или из Table.assistants,
+    если прикреплен assistant_id"""
+    created_at: int
+    """Дата создания сессии в Unix-time формате"""
+    updated_at: int
+    """Дата последней активности в сессии в Unix-time формате.
+    Активностью считается добавление в сессию сообщения, run сессии"""
+    run_lock: bool
+    """Текущий статус запуска сессии"""
+    status: ThreadStatus
+    """Статус запуска"""
diff --git a/src/gigachat/models/threads/thread_completion.py b/src/gigachat/models/threads/thread_completion.py
new file mode 100644
index 0000000..de34585
--- /dev/null
+++ b/src/gigachat/models/threads/thread_completion.py
@@ -0,0 +1,24 @@
+from gigachat.models import Messages
+from gigachat.models.usage import Usage
+from gigachat.pydantic_v1 import BaseModel, Field
+
+
+class ThreadCompletion(BaseModel):
+    """Ответ модели"""
+
+    object_: str = Field(alias="object")
+    """Название вызываемого метода"""
+    model: str
+    """Название модели, которая вернула ответ"""
+    thread_id: str
+    """Идентификатор треда"""
+    message_id: str
+    """Идентификатор сообщения ответа модели"""
+    created: int
+    """Дата и время создания ответа в формате Unix time"""
+    usage: Usage
+    """Данные об использовании модели"""
+    message: Messages
+    """Массив ответов модели"""
+    finish_reason: str
+    """Причина завершения гипотезы"""
diff --git a/src/gigachat/models/threads/thread_completion_chunk.py b/src/gigachat/models/threads/thread_completion_chunk.py
new file mode 100644
index 0000000..d9f9c27
--- /dev/null
+++ b/src/gigachat/models/threads/thread_completion_chunk.py
@@ -0,0 +1,24 @@
+from typing import List
+
+from gigachat.models import ChoicesChunk
+from gigachat.models.usage import Usage
+from gigachat.pydantic_v1 import BaseModel, Field
+
+
+class ThreadCompletionChunk(BaseModel):
+    """Ответ модели"""
+
+    object_: str = Field(alias="object")
+    """Название вызываемого метода"""
+    model: str
+    """Название модели, которая вернула ответ"""
+    thread_id: str
+    """Идентификатор треда"""
+    message_id: str
+    """Идентификатор сообщения ответа модели"""
+    created: int
+    """Дата и время создания ответа в формате Unix time"""
+    usage: Usage
+    """Данные об использовании модели"""
+    choices: List[ChoicesChunk]
+    """Массив ответов модели в потоке"""
diff --git a/src/gigachat/models/threads/thread_message.py b/src/gigachat/models/threads/thread_message.py
new file mode 100644
index 0000000..a8ab109
--- /dev/null
+++ b/src/gigachat/models/threads/thread_message.py
@@ -0,0 +1,28 @@
+from typing import List, Optional
+
+from gigachat.models.function_call import FunctionCall
+from gigachat.models.messages_role import MessagesRole
+from gigachat.models.threads.thread_message_attachment import ThreadMessageAttachment
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadMessage(BaseModel):
+    """Сообщение"""
+
+    message_id: str
+    """Идентификатор сообщения"""
+    role: MessagesRole
+    """Роль автора сообщения"""
+    content: str = ""
+    """Текст сообщения"""
+    attachments: Optional[List[ThreadMessageAttachment]] = []
+    """Идентификаторы предзагруженных ранее файлов"""
+    created_at: int
+    """Дата создания сообщения в Unix-time формате"""
+    function_call: Optional[FunctionCall] = None
+    """Вызов функции"""
+    finish_reason: Optional[str] = None
+    """Причина завершения гипотезы"""
+
+    class Config:
+        use_enum_values = True
diff --git a/src/gigachat/models/threads/thread_message_attachment.py b/src/gigachat/models/threads/thread_message_attachment.py
new file mode 100644
index 0000000..6279e0e
--- /dev/null
+++ b/src/gigachat/models/threads/thread_message_attachment.py
@@ -0,0 +1,10 @@
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadMessageAttachment(BaseModel):
+    """Файл"""
+
+    file_id: str
+    """Индентификатор предзагруженного ранее файла"""
+    name: str
+    """Наименование файла"""
diff --git a/src/gigachat/models/threads/thread_message_response.py b/src/gigachat/models/threads/thread_message_response.py
new file mode 100644
index 0000000..263b4f3
--- /dev/null
+++ b/src/gigachat/models/threads/thread_message_response.py
@@ -0,0 +1,8 @@
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadMessageResponse(BaseModel):
+    created_at: int
+    """Время создания сообщения в Unix-time формате"""
+    message_id: str
+    """Идентификатор созданного сообщения"""
diff --git a/src/gigachat/models/threads/thread_messages.py b/src/gigachat/models/threads/thread_messages.py
new file mode 100644
index 0000000..0403443
--- /dev/null
+++ b/src/gigachat/models/threads/thread_messages.py
@@ -0,0 +1,13 @@
+from typing import List
+
+from gigachat.models.threads.thread_message import ThreadMessage
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadMessages(BaseModel):
+    """Сообщения треда"""
+
+    thread_id: str
+    """Идентификатор треда"""
+    messages: List[ThreadMessage]
+    """Сообщения"""
diff --git a/src/gigachat/models/threads/thread_messages_response.py b/src/gigachat/models/threads/thread_messages_response.py
new file mode 100644
index 0000000..fd7fd6a
--- /dev/null
+++ b/src/gigachat/models/threads/thread_messages_response.py
@@ -0,0 +1,11 @@
+from typing import List
+
+from gigachat.models.threads.thread_message_response import ThreadMessageResponse
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadMessagesResponse(BaseModel):
+    thread_id: str
+    """Идентификатор треда"""
+    messages: List[ThreadMessageResponse]
+    """Созданные сообщения"""
diff --git a/src/gigachat/models/threads/thread_run_options.py b/src/gigachat/models/threads/thread_run_options.py
new file mode 100644
index 0000000..d8c80b9
--- /dev/null
+++ b/src/gigachat/models/threads/thread_run_options.py
@@ -0,0 +1,32 @@
+from typing import List, Literal, Optional, Union
+
+from gigachat.models.chat_function_call import ChatFunctionCall
+from gigachat.models.function import Function
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadRunOptions(BaseModel):
+    """Параметры запроса"""
+
+    temperature: Optional[float] = None
+    """Температура выборки в диапазоне от ноля до двух"""
+    top_p: Optional[float] = None
+    """Альтернатива параметру температуры"""
+    limit: Optional[int] = None
+    """Максимальное количество сообщений исторического контекста, которые посылаются в модель в запросе
+    Если параметр не передан, считаем что необходимо отправить весь контекст"""
+    max_tokens: Optional[int] = None
+    """Максимальное количество токенов, которые будут использованы для создания ответов"""
+    repetition_penalty: Optional[float] = None
+    """Количество повторений слов.
+    Значение 1.0 - ничего не менять (нейтральное значение),
+    от 0 до 1 - повторять уже сказанные слова,
+    от 1 и далее стараться не использовать сказанные слова. Допустимое значение > 0"""
+    profanity_check: Optional[bool] = None
+    """Параметр цензуры"""
+    flags: Optional[List[str]] = None
+    """Флаги, включающие особенные фичи"""
+    function_call: Optional[Union[Literal["auto", "none"], ChatFunctionCall]] = None
+    """Правила вызова функций"""
+    functions: Optional[List[Function]] = None
+    """Набор функций, которые могут быть вызваны моделью"""
diff --git a/src/gigachat/models/threads/thread_run_response.py b/src/gigachat/models/threads/thread_run_response.py
new file mode 100644
index 0000000..6c33bd1
--- /dev/null
+++ b/src/gigachat/models/threads/thread_run_response.py
@@ -0,0 +1,11 @@
+from gigachat.models.threads.thread_status import ThreadStatus
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadRunResponse(BaseModel):
+    status: ThreadStatus
+    """Статус запуска"""
+    thread_id: str
+    """Идентификатор запущенного треда"""
+    created_at: int
+    """Время запуска сессии в Unix-time формате"""
diff --git a/src/gigachat/models/threads/thread_run_result.py b/src/gigachat/models/threads/thread_run_result.py
new file mode 100644
index 0000000..e3beb30
--- /dev/null
+++ b/src/gigachat/models/threads/thread_run_result.py
@@ -0,0 +1,20 @@
+from typing import List, Optional
+
+from gigachat.models.threads.thread_message import ThreadMessage
+from gigachat.models.threads.thread_status import ThreadStatus
+from gigachat.pydantic_v1 import BaseModel
+
+
+class ThreadRunResult(BaseModel):
+    """Run треда"""
+
+    status: ThreadStatus
+    """Статус запуска"""
+    thread_id: str
+    """Идентификатор треда"""
+    updated_at: int
+    """Время обновления статуса run-a в Unix-time формате"""
+    model: str
+    """Модель"""
+    messages: Optional[List[ThreadMessage]] = None
+    """Сообщения"""
diff --git a/src/gigachat/models/threads/thread_status.py b/src/gigachat/models/threads/thread_status.py
new file mode 100644
index 0000000..e32374d
--- /dev/null
+++ b/src/gigachat/models/threads/thread_status.py
@@ -0,0 +1,10 @@
+from enum import Enum
+
+
+class ThreadStatus(str, Enum):
+    """Статус треда"""
+
+    IN_PROGRESS = "in_progress"
+    READY = "ready"
+    FAILED = "failed"
+    DELETED = "deleted"
diff --git a/src/gigachat/models/threads/threads.py b/src/gigachat/models/threads/threads.py
new file mode 100644
index 0000000..05cabc2
--- /dev/null
+++ b/src/gigachat/models/threads/threads.py
@@ -0,0 +1,11 @@
+from typing import List
+
+from gigachat.models.threads.thread import Thread
+from gigachat.pydantic_v1 import BaseModel
+
+
+class Threads(BaseModel):
+    """Треды"""
+
+    threads: List[Thread]
+    """Массив тредов клиента"""
diff --git a/src/gigachat/models/uploaded_file.py b/src/gigachat/models/uploaded_file.py
new file mode 100644
index 0000000..144d897
--- /dev/null
+++ b/src/gigachat/models/uploaded_file.py
@@ -0,0 +1,18 @@
+from gigachat.pydantic_v1 import BaseModel, Field
+
+
+class UploadedFile(BaseModel):
+    """Информация о загруженном файле"""
+
+    id_: str = Field(alias="id")
+    """Идентификатор файла, на который можно ссылаться в API """
+    object_: str = Field(alias="object")
+    """Тип объекта"""
+    bytes_: int = Field(alias="bytes")
+    """Размер файла в байтах"""
+    created_at: int
+    """Время создания файла в Unix-time формате"""
+    filename: str
+    """Имя файла"""
+    purpose: str
+    """Предполагаемое назначение файла."""
diff --git a/src/gigachat/threads.py b/src/gigachat/threads.py
new file mode 100644
index 0000000..01dd8ff
--- /dev/null
+++ b/src/gigachat/threads.py
@@ -0,0 +1,480 @@
+import logging
+from typing import (
+    TYPE_CHECKING,
+    Any,
+    AsyncIterator,
+    Dict,
+    Iterator,
+    List,
+    Optional,
+    Union,
+)
+
+from gigachat.api.threads import (
+    get_threads,
+    get_threads_messages,
+    get_threads_run,
+    post_thread_messages_rerun,
+    post_thread_messages_rerun_stream,
+    post_thread_messages_run,
+    post_thread_messages_run_stream,
+    post_threads_delete,
+    post_threads_messages,
+    post_threads_run,
+)
+from gigachat.exceptions import AuthenticationError
+from gigachat.models import (
+    Messages,
+    MessagesRole,
+)
+from gigachat.models.threads import (
+    ThreadCompletion,
+    ThreadCompletionChunk,
+    ThreadMessages,
+    ThreadMessagesResponse,
+    ThreadRunOptions,
+    ThreadRunResponse,
+    ThreadRunResult,
+    Threads,
+)
+
+if TYPE_CHECKING:
+    from gigachat.client import GigaChatAsyncClient, GigaChatSyncClient
+
+
+def _parse_message(message: Union[Messages, str, Dict[str, Any]]) -> Messages:
+    if isinstance(message, str):
+        return Messages(role=MessagesRole.USER, content=message)
+    else:
+        return Messages.parse_obj(message)
+
+
+_logger = logging.getLogger(__name__)
+
+
+class ThreadsSyncClient:
+    def __init__(self, base_client: "GigaChatSyncClient"):
+        self.base_client = base_client
+
+    def list(self) -> Threads:  # noqa: A003
+        """Получение перечня тредов"""
+        return self.base_client._decorator(
+            lambda: get_threads.sync(self.base_client._client, access_token=self.base_client.token)
+        )
+
+    def delete(self, thread_id: str) -> bool:
+        """Удаляет тред"""
+
+        return self.base_client._decorator(
+            lambda: post_threads_delete.sync(
+                self.base_client._client,
+                thread_id=thread_id,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def get_run(self, thread_id: str) -> ThreadRunResult:
+        """Получить результат run треда"""
+
+        return self.base_client._decorator(
+            lambda: get_threads_run.sync(
+                self.base_client._client,
+                thread_id=thread_id,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def get_messages(self, thread_id: str, limit: Optional[int] = None) -> ThreadMessages:
+        """Получение сообщений треда"""
+
+        return self.base_client._decorator(
+            lambda: get_threads_messages.sync(
+                self.base_client._client,
+                thread_id=thread_id,
+                limit=limit,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def run(
+        self,
+        thread_id: str,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+    ) -> ThreadRunResponse:
+        """Запуск генерации ответа на контекст треда"""
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+        return self.base_client._decorator(
+            lambda: post_threads_run.sync(
+                self.base_client._client,
+                thread_id=thread_id,
+                thread_options=thread_options,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def add_messages(
+        self,
+        messages: Union[List[Messages], List[str], List[Dict[str, Any]]],
+        model: Optional[str] = None,
+        thread_id: Optional[str] = None,
+        assistant_id: Optional[str] = None,
+    ) -> ThreadMessagesResponse:
+        """Добавление сообщений к треду без запуска"""
+        parsed_messages = [_parse_message(message) for message in messages]
+        return self.base_client._decorator(
+            lambda: post_threads_messages.sync(
+                self.base_client._client,
+                messages=parsed_messages,
+                model=model,
+                thread_id=thread_id,
+                assistant_id=assistant_id,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def run_messages(
+        self,
+        messages: Union[List[Messages], List[str], List[Dict[str, Any]]],
+        thread_id: Optional[str] = None,
+        assistant_id: Optional[str] = None,
+        model: Optional[str] = None,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+    ) -> ThreadCompletion:
+        """Добавление сообщений к треду с запуском"""
+        parsed_messages = [_parse_message(message) for message in messages]
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        return self.base_client._decorator(
+            lambda: post_thread_messages_run.sync(
+                self.base_client._client,
+                messages=parsed_messages,
+                thread_id=thread_id,
+                assistant_id=assistant_id,
+                model=model,
+                thread_options=thread_options,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def rerun_messages(
+        self,
+        thread_id: str,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+    ) -> ThreadCompletion:
+        """Перегенерация ответа модели"""
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        return self.base_client._decorator(
+            lambda: post_thread_messages_rerun.sync(
+                self.base_client._client,
+                thread_id=thread_id,
+                thread_options=thread_options,
+                access_token=self.base_client.token,
+            )
+        )
+
+    def run_messages_stream(
+        self,
+        messages: Union[List[Messages], List[str], List[Dict[str, Any]]],
+        thread_id: Optional[str] = None,
+        assistant_id: Optional[str] = None,
+        model: Optional[str] = None,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+        update_interval: Optional[int] = None,
+    ) -> Iterator[ThreadCompletionChunk]:
+        """Добавление сообщений к треду с запуском"""
+        parsed_messages = [_parse_message(message) for message in messages]
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        if self.base_client._use_auth:
+            if self.base_client._check_validity_token():
+                try:
+                    for chunk in post_thread_messages_run_stream.sync(
+                        self.base_client._client,
+                        messages=parsed_messages,
+                        thread_id=thread_id,
+                        assistant_id=assistant_id,
+                        model=model,
+                        thread_options=thread_options,
+                        update_interval=update_interval,
+                        access_token=self.base_client.token,
+                    ):
+                        yield chunk
+                    return
+                except AuthenticationError:
+                    _logger.warning("AUTHENTICATION ERROR")
+                    self.base_client._reset_token()
+            self.base_client._update_token()
+
+        for chunk in post_thread_messages_run_stream.sync(
+            self.base_client._client,
+            messages=parsed_messages,
+            thread_id=thread_id,
+            assistant_id=assistant_id,
+            model=model,
+            thread_options=thread_options,
+            update_interval=update_interval,
+            access_token=self.base_client.token,
+        ):
+            yield chunk
+
+    def rerun_messages_stream(
+        self,
+        thread_id: str,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+        update_interval: Optional[int] = None,
+    ) -> Iterator[ThreadCompletionChunk]:
+        """Перегенерация ответа модели"""
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        if self.base_client._use_auth:
+            if self.base_client._check_validity_token():
+                try:
+                    for chunk in post_thread_messages_rerun_stream.sync(
+                        self.base_client._client,
+                        thread_id=thread_id,
+                        thread_options=thread_options,
+                        update_interval=update_interval,
+                        access_token=self.base_client.token,
+                    ):
+                        yield chunk
+                    return
+                except AuthenticationError:
+                    _logger.warning("AUTHENTICATION ERROR")
+                    self.base_client._reset_token()
+            self.base_client._update_token()
+
+        for chunk in post_thread_messages_rerun_stream.sync(
+            self.base_client._client,
+            thread_id=thread_id,
+            thread_options=thread_options,
+            update_interval=update_interval,
+            access_token=self.base_client.token,
+        ):
+            yield chunk
+
+
+class ThreadsAsyncClient:
+    def __init__(self, base_client: "GigaChatAsyncClient"):
+        self.base_client = base_client
+
+    async def list(self) -> Threads:  # noqa: A003
+        """Получение перечня тредов"""
+
+        async def _acall() -> Threads:
+            return await get_threads.asyncio(
+                self.base_client._aclient,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def delete(self, thread_id: str) -> bool:
+        """Удаляет тред"""
+
+        async def _acall() -> bool:
+            return await post_threads_delete.asyncio(
+                self.base_client._aclient,
+                thread_id=thread_id,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def get_run(self, thread_id: str) -> ThreadRunResult:
+        """Получить результат run треда"""
+
+        async def _acall() -> ThreadRunResult:
+            return await get_threads_run.asyncio(
+                self.base_client._aclient,
+                thread_id=thread_id,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def get_messages(self, thread_id: str, limit: Optional[int] = None) -> ThreadMessages:
+        """Получение сообщений треда"""
+
+        async def _acall() -> ThreadMessages:
+            return await get_threads_messages.asyncio(
+                self.base_client._aclient,
+                thread_id=thread_id,
+                limit=limit,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def run(
+        self,
+        thread_id: str,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+    ) -> ThreadRunResponse:
+        """Запуск генерации ответа на контекст треда"""
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        async def _acall() -> ThreadRunResponse:
+            return await post_threads_run.asyncio(
+                self.base_client._aclient,
+                thread_id=thread_id,
+                thread_options=thread_options,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def add_messages(
+        self,
+        messages: Union[List[Messages], List[str], List[Dict[str, Any]]],
+        model: Optional[str] = None,
+        thread_id: Optional[str] = None,
+        assistant_id: Optional[str] = None,
+    ) -> ThreadMessagesResponse:
+        """Добавление сообщений к треду без запуска"""
+        parsed_messages = [_parse_message(message) for message in messages]
+
+        async def _acall() -> ThreadMessagesResponse:
+            return await post_threads_messages.asyncio(
+                self.base_client._aclient,
+                messages=parsed_messages,
+                model=model,
+                thread_id=thread_id,
+                assistant_id=assistant_id,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def run_messages(
+        self,
+        messages: Union[List[Messages], List[str], List[Dict[str, Any]]],
+        thread_id: Optional[str] = None,
+        assistant_id: Optional[str] = None,
+        model: Optional[str] = None,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+    ) -> ThreadCompletion:
+        """Добавление сообщений к треду с запуском"""
+        parsed_messages = [_parse_message(message) for message in messages]
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        async def _acall() -> ThreadCompletion:
+            return await post_thread_messages_run.asyncio(
+                self.base_client._aclient,
+                messages=parsed_messages,
+                thread_id=thread_id,
+                assistant_id=assistant_id,
+                model=model,
+                thread_options=thread_options,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def rerun_messages(
+        self,
+        thread_id: str,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+    ) -> ThreadCompletion:
+        """Перегенерация ответа модели"""
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        async def _acall() -> ThreadCompletion:
+            return await post_thread_messages_rerun.asyncio(
+                self.base_client._aclient,
+                thread_id=thread_id,
+                thread_options=thread_options,
+                access_token=self.base_client.token,
+            )
+
+        return await self.base_client._adecorator(_acall)
+
+    async def run_messages_stream(
+        self,
+        messages: Union[List[Messages], List[str], List[Dict[str, Any]]],
+        thread_id: Optional[str] = None,
+        assistant_id: Optional[str] = None,
+        model: Optional[str] = None,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+        update_interval: Optional[int] = None,
+    ) -> AsyncIterator[ThreadCompletionChunk]:
+        """Добавление сообщений к треду с запуском"""
+        parsed_messages = [_parse_message(message) for message in messages]
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        if self.base_client._use_auth:
+            if self.base_client._check_validity_token():
+                try:
+                    async for chunk in post_thread_messages_run_stream.asyncio(
+                        self.base_client._aclient,
+                        messages=parsed_messages,
+                        thread_id=thread_id,
+                        assistant_id=assistant_id,
+                        model=model,
+                        thread_options=thread_options,
+                        update_interval=update_interval,
+                        access_token=self.base_client.token,
+                    ):
+                        yield chunk
+                    return
+                except AuthenticationError:
+                    _logger.warning("AUTHENTICATION ERROR")
+                    self.base_client._reset_token()
+            await self.base_client._aupdate_token()
+
+        async for chunk in post_thread_messages_run_stream.asyncio(
+            self.base_client._aclient,
+            messages=parsed_messages,
+            thread_id=thread_id,
+            assistant_id=assistant_id,
+            model=model,
+            thread_options=thread_options,
+            update_interval=update_interval,
+            access_token=self.base_client.token,
+        ):
+            yield chunk
+
+    async def rerun_messages_stream(
+        self,
+        thread_id: str,
+        thread_options: Optional[Union[ThreadRunOptions, Dict[str, Any]]] = None,
+        update_interval: Optional[int] = None,
+    ) -> AsyncIterator[ThreadCompletionChunk]:
+        """Перегенерация ответа модели"""
+        if thread_options is not None:
+            thread_options = ThreadRunOptions.parse_obj(thread_options)
+
+        if self.base_client._use_auth:
+            if self.base_client._check_validity_token():
+                try:
+                    async for chunk in post_thread_messages_rerun_stream.asyncio(
+                        self.base_client._aclient,
+                        thread_id=thread_id,
+                        thread_options=thread_options,
+                        update_interval=update_interval,
+                        access_token=self.base_client.token,
+                    ):
+                        yield chunk
+                    return
+                except AuthenticationError:
+                    _logger.warning("AUTHENTICATION ERROR")
+                    self.base_client._reset_token()
+            await self.base_client._aupdate_token()
+
+        async for chunk in post_thread_messages_rerun_stream.asyncio(
+            self.base_client._aclient,
+            thread_id=thread_id,
+            thread_options=thread_options,
+            update_interval=update_interval,
+            access_token=self.base_client.token,
+        ):
+            yield chunk


Test patch:
diff --git a/tests/data/assistants/get_assistants.json b/tests/data/assistants/get_assistants.json
new file mode 100644
index 0000000..e76a6ac
--- /dev/null
+++ b/tests/data/assistants/get_assistants.json
@@ -0,0 +1,32 @@
+{
+  "data": [
+    {
+      "assistant_id": "111",
+      "created_at": 1715684019,
+      "name": "lonely",
+      "instructions": "Assistant",
+      "model": "GigaChat-Pro",
+      "updated_at": 1715684019,
+      "metadata": {
+        "test": 234
+      },
+      "file_ids": [
+        "222"
+      ]
+    },
+    {
+      "assistant_id": "222",
+      "created_at": 1715684019,
+      "name": "lonely",
+      "instructions": "Assistant",
+      "model": "GigaChat-Pro",
+      "updated_at": 1715684019,
+      "metadata": {
+        "test": 234
+      },
+      "file_ids": [
+        "222"
+      ]
+    }
+  ]
+}
diff --git a/tests/data/assistants/post_assistant_files_delete.json b/tests/data/assistants/post_assistant_files_delete.json
new file mode 100644
index 0000000..d5a28fb
--- /dev/null
+++ b/tests/data/assistants/post_assistant_files_delete.json
@@ -0,0 +1,4 @@
+{
+  "file_id": "222",
+  "deleted": true
+}
diff --git a/tests/data/assistants/post_assistant_modify.json b/tests/data/assistants/post_assistant_modify.json
new file mode 100644
index 0000000..ad8c64b
--- /dev/null
+++ b/tests/data/assistants/post_assistant_modify.json
@@ -0,0 +1,14 @@
+{
+  "assistant_id": "111",
+  "created_at": 1715684158,
+  "name": "lonely_assistant",
+  "instructions": "Assistant",
+  "model": "GigaChat-Pro",
+  "updated_at": 1715684158,
+  "metadata": {
+    "test": 234
+  },
+  "file_ids": [
+    "222"
+  ]
+}
diff --git a/tests/data/assistants/post_assistants.json b/tests/data/assistants/post_assistants.json
new file mode 100644
index 0000000..781ac43
--- /dev/null
+++ b/tests/data/assistants/post_assistants.json
@@ -0,0 +1,4 @@
+{
+  "assistant_id": "111",
+  "created_at": 1715684019
+}
diff --git a/tests/data/image.jpg b/tests/data/image.jpg
new file mode 100644
index 0000000..146ee51
Binary files /dev/null and b/tests/data/image.jpg differ
diff --git a/tests/data/post_files.json b/tests/data/post_files.json
new file mode 100644
index 0000000..7103a57
--- /dev/null
+++ b/tests/data/post_files.json
@@ -0,0 +1,8 @@
+{
+  "id": "c757a9c5-de04-498f-baa3-efcc54de7853",
+  "object": "file",
+  "bytes": 42966,
+  "created_at": 1715768909,
+  "filename": "image.jpg",
+  "purpose": "general"
+}
diff --git a/tests/data/threads/get_threads.json b/tests/data/threads/get_threads.json
new file mode 100644
index 0000000..956fea6
--- /dev/null
+++ b/tests/data/threads/get_threads.json
@@ -0,0 +1,28 @@
+{
+  "threads": [
+    {
+      "id": "2cc91bae-34f7-4ee4-bcae-f5f71880deda",
+      "model": "GigaChat-Pro",
+      "created_at": 1715684634,
+      "updated_at": 1715684764,
+      "status": "ready",
+      "run_lock": false
+    },
+    {
+      "id": "9b1cc6d9-0eeb-46de-b01f-6f74c9a82df7",
+      "model": "GigaChat-Pro",
+      "created_at": 1715684407,
+      "updated_at": 1715684612,
+      "status": "ready",
+      "run_lock": false
+    },
+    {
+      "id": "2fb1bb2b-1459-49be-8f94-ed5604c01786",
+      "model": "GigaChat-Pro",
+      "created_at": 1715626694,
+      "updated_at": 1715626708,
+      "status": "ready",
+      "run_lock": false
+    }
+  ]
+}
diff --git a/tests/data/threads/get_threads_messages.json b/tests/data/threads/get_threads_messages.json
new file mode 100644
index 0000000..5ae0fea
--- /dev/null
+++ b/tests/data/threads/get_threads_messages.json
@@ -0,0 +1,26 @@
+{
+  "thread_id": "fc4a58e8-1410-4684-b473-066eabeca000",
+  "messages": [
+    {
+      "message_id": "77b2cfe2-706e-4749-9507-7b89d555ad8a",
+      "role": "user",
+      "content": "Какой окрас кота?",
+      "attachments": [
+        {
+          "file_id": "7ec30261-5360-4b12-9e9f-408bc481db51",
+          "name": "1695931383_gas-kvas-com-p-kartinki-s-kotami-9.jpeg"
+        }
+      ],
+      "created_at": 1715126198,
+      "model": "GigaChat-Pro"
+    },
+    {
+      "message_id": "de208428-3d4a-47f4-a4e3-a81a98e3cfeb",
+      "role": "assistant",
+      "content": "У кота на картинке табби окрас, который характеризуется наличием полос на теле и узоров на голове и хвосте. Полосы могут быть разной ширины и формы, образуя уникальный рисунок для каждой кошки.",
+      "created_at": 1715126200,
+      "finish_reason": "stop",
+      "model": "GigaChat-Pro"
+    }
+  ]
+}
diff --git a/tests/data/threads/get_threads_run.json b/tests/data/threads/get_threads_run.json
new file mode 100644
index 0000000..71778e5
--- /dev/null
+++ b/tests/data/threads/get_threads_run.json
@@ -0,0 +1,27 @@
+{
+  "status": "ready",
+  "thread_id": "fc4a58e8-1410-4684-b473-066eabeca000",
+  "updated_at": 1715126200,
+  "model": "GigaChat-Pro",
+  "messages": [
+    {
+      "message_id": "77b2cfe2-706e-4749-9507-7b89d555ad8a",
+      "role": "user",
+      "content": "Какой окрас кота?",
+      "attachments": [
+        {
+          "file_id": "7ec30261-5360-4b12-9e9f-408bc481db51",
+          "name": "1695931383_gas-kvas-com-p-kartinki-s-kotami-9.jpeg"
+        }
+      ],
+      "created_at": 1715126198
+    },
+    {
+      "message_id": "de208428-3d4a-47f4-a4e3-a81a98e3cfeb",
+      "role": "assistant",
+      "content": "У кота на картинке табби окрас, который характеризуется наличием полос на теле и узоров на голове и хвосте. Полосы могут быть разной ширины и формы, образуя уникальный рисунок для каждой кошки.",
+      "created_at": 1715126200,
+      "finish_reason": "stop"
+    }
+  ]
+}
diff --git a/tests/data/threads/post_thread_messages_rerun.json b/tests/data/threads/post_thread_messages_rerun.json
new file mode 100644
index 0000000..9a55041
--- /dev/null
+++ b/tests/data/threads/post_thread_messages_rerun.json
@@ -0,0 +1,17 @@
+{
+  "object": "threads.messages.run",
+  "model": "GigaChat-Pro:2.2.25.3",
+  "thread_id": "228d95e6-be1e-44a4-9bc0-dee90f00dc32",
+  "message_id": "337f0998-3194-40cf-a66b-7e6709db356c",
+  "created": 1715686966,
+  "usage": {
+    "prompt_tokens": 12,
+    "completion_tokens": 15,
+    "total_tokens": 27
+  },
+  "message": {
+    "content": "Здравствуйте! Я могу вам чем-нибудь помочь?",
+    "role": "assistant"
+  },
+  "finish_reason": "stop"
+}
diff --git a/tests/data/threads/post_thread_messages_rerun.stream b/tests/data/threads/post_thread_messages_rerun.stream
new file mode 100644
index 0000000..0e8b4be
--- /dev/null
+++ b/tests/data/threads/post_thread_messages_rerun.stream
@@ -0,0 +1,147 @@
+data: {"choices":[{"delta":{"content":"Я попыталась написать стихотворение о том, что такое LLM и как он работает. Вот что у меня получилось:\n\nНейросеть, что генеративной зовётся,\nПостигла суть юридических наук.\nОна теперь не просто развлекается,\nА учится вести большой количество дел.\n\nLLM теперь умеет составлять договоры,","role":"assistant"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":69,"completion_tokens":77,"total_tokens":146},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"Г"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"от"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ови"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ть"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" и"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ски"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":","},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" консу"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ль"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"тировать"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" клиентов"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":","},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684767,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"У"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ча"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ствовать"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" в"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" судеб"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ных"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" пре"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ниях"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":","},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"И"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"зу"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"чать"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" юриди"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ческие"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" тек"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"сты"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"."},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"Е"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ё"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" работа"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" будет"},"index":0}],"created":1715684768,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" поле"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"зна"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"Ю"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ри"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"стам"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":","},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" ад"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"во"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ката"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"м"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" и"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" судь"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ям"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":","},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"С"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ту"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ден"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"там"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" юридических"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" факуль"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"те"},"index":0}],"created":1715684769,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"тов"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"\n"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"И"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" всем"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":","},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" кто"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" интересу"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"ется"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":" правом"},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":"."},"index":0}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: {"choices":[{"delta":{"content":""},"index":0,"finish_reason":"stop"}],"created":1715684770,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":1,"total_tokens":1},"thread_id":"2cc91bae-34f7-4ee4-bcae-f5f71880deda","message_id":"f7968272-89b5-4d28-a0b1-b74dcfb56f37"}
+
+data: [DONE]
diff --git a/tests/data/threads/post_thread_messages_run.json b/tests/data/threads/post_thread_messages_run.json
new file mode 100644
index 0000000..fabd00b
--- /dev/null
+++ b/tests/data/threads/post_thread_messages_run.json
@@ -0,0 +1,17 @@
+{
+  "object": "threads.messages.run",
+  "model": "GigaChat-Pro:2.2.25.3",
+  "thread_id": "b549e2ec-a691-409d-aa6f-ff6a1271db47",
+  "message_id": "4c600221-1aaa-4c9d-9edb-572e465f4ee8",
+  "created": 1715686918,
+  "usage": {
+    "prompt_tokens": 12,
+    "completion_tokens": 15,
+    "total_tokens": 27
+  },
+  "message": {
+    "content": "Здравствуйте! Я могу вам чем-нибудь помочь?",
+    "role": "assistant"
+  },
+  "finish_reason": "stop"
+}
diff --git a/tests/data/threads/post_thread_messages_run.stream b/tests/data/threads/post_thread_messages_run.stream
new file mode 100644
index 0000000..40acee4
--- /dev/null
+++ b/tests/data/threads/post_thread_messages_run.stream
@@ -0,0 +1,5 @@
+data: {"choices":[{"delta":{"content":"Здравствуйте! Я GigaChat, генеративная языковая модель. Готова ответить на ваши","role":"assistant"},"index":0}],"created":1715684408,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":64,"completion_tokens":23,"total_tokens":87},"thread_id":"9b1cc6d9-0eeb-46de-b01f-6f74c9a82df7","message_id":"fd753d3f-f1f5-498f-b5dd-da380607d470"}
+
+data: {"choices":[{"delta":{"content":" вопросы. Чем могу вам помочь?"},"index":0,"finish_reason":"stop"}],"created":1715684409,"model":"GigaChat-Pro:2.2.25.3","object":"threads.messages.run","usage":{"prompt_tokens":0,"completion_tokens":8,"total_tokens":8},"thread_id":"9b1cc6d9-0eeb-46de-b01f-6f74c9a82df7","message_id":"fd753d3f-f1f5-498f-b5dd-da380607d470"}
+
+data: [DONE]
diff --git a/tests/data/threads/post_threads_delete.txt b/tests/data/threads/post_threads_delete.txt
new file mode 100644
index 0000000..e69de29
diff --git a/tests/data/threads/post_threads_messages.json b/tests/data/threads/post_threads_messages.json
new file mode 100644
index 0000000..3ebbdcb
--- /dev/null
+++ b/tests/data/threads/post_threads_messages.json
@@ -0,0 +1,9 @@
+{
+  "thread_id": "93d6b96b-ae36-4be6-ac3a-44cee7613c3a",
+  "messages": [
+    {
+      "created_at": 1715685479,
+      "message_id": "baf19b28-e6d0-4fd0-a3b4-2d30ed687d64"
+    }
+  ]
+}
diff --git a/tests/data/threads/post_threads_run.json b/tests/data/threads/post_threads_run.json
new file mode 100644
index 0000000..69f3d91
--- /dev/null
+++ b/tests/data/threads/post_threads_run.json
@@ -0,0 +1,5 @@
+{
+  "status": "in_progress",
+  "thread_id": "93d6b96b-ae36-4be6-ac3a-44cee7613c3a",
+  "created_at": 1715685511
+}
diff --git a/tests/unit_tests/gigachat/test_assistants.py b/tests/unit_tests/gigachat/test_assistants.py
new file mode 100644
index 0000000..66c81d9
--- /dev/null
+++ b/tests/unit_tests/gigachat/test_assistants.py
@@ -0,0 +1,96 @@
+import pytest
+from pytest_httpx import HTTPXMock
+
+from gigachat.client import GigaChatAsyncClient, GigaChatSyncClient
+from gigachat.models.assistants import (
+    Assistant,
+    AssistantFileDelete,
+    Assistants,
+    CreateAssistant,
+)
+
+from ...utils import get_json
+
+BASE_URL = "http://base_url"
+
+GET_ASSISTANTS_URL = f"{BASE_URL}/assistants"
+POST_ASSISTANTS_URL = f"{BASE_URL}/assistants"
+POST_ASSISTANT_MODIFY_URL = f"{BASE_URL}/assistants/modify"
+POST_ASSISTANT_FILES_DELETE_URL = f"{BASE_URL}/assistants/files/delete"
+
+GET_ASSISTANTS = get_json("assistants/get_assistants.json")
+POST_ASSISTANTS = get_json("assistants/post_assistants.json")
+POST_ASSISTANT_MODIFY = get_json("assistants/post_assistant_modify.json")
+POST_ASSISTANT_FILES_DELETE = get_json("assistants/post_assistant_files_delete.json")
+
+
+def test_get_assistants(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_ASSISTANTS_URL, json=GET_ASSISTANTS)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.assistants.get()
+
+    assert isinstance(response, Assistants)
+    assert len(response.data) == 2
+
+
+@pytest.mark.asyncio()
+async def test_aget_assistants(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_ASSISTANTS_URL, json=GET_ASSISTANTS)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_assistants.get()
+
+    assert isinstance(response, Assistants)
+    assert len(response.data) == 2
+
+
+def test_post_assistants(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_ASSISTANTS_URL, json=POST_ASSISTANTS)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.assistants.create(model="GigaChat", name="name", instructions="123")
+
+    assert isinstance(response, CreateAssistant)
+    assert response.assistant_id == "111"
+
+
+@pytest.mark.asyncio()
+async def test_apost_assistants(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_ASSISTANTS_URL, json=POST_ASSISTANTS)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_assistants.create(model="GigaChat", name="name", instructions="123")
+
+    assert isinstance(response, CreateAssistant)
+    assert response.assistant_id == "111"
+
+
+def test_post_assistant_modify(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_ASSISTANT_MODIFY_URL, json=POST_ASSISTANT_MODIFY)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.assistants.update(assistant_id="111")
+
+    assert isinstance(response, Assistant)
+
+
+@pytest.mark.asyncio()
+async def test_apost_assistant_modify(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_ASSISTANT_MODIFY_URL, json=POST_ASSISTANT_MODIFY)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_assistants.update(assistant_id="111")
+
+    assert isinstance(response, Assistant)
+
+
+def test_post_assistant_files_delete(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_ASSISTANT_FILES_DELETE_URL, json=POST_ASSISTANT_FILES_DELETE)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.assistants.delete_file(assistant_id="111", file_id="222")
+
+    assert isinstance(response, AssistantFileDelete)
+
+
+@pytest.mark.asyncio()
+async def test_apost_assistant_files_delete(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_ASSISTANT_FILES_DELETE_URL, json=POST_ASSISTANT_FILES_DELETE)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_assistants.delete_file(assistant_id="111", file_id="222")
+
+    assert isinstance(response, AssistantFileDelete)
diff --git a/tests/unit_tests/gigachat/test_client.py b/tests/unit_tests/gigachat/test_client.py
index 6b9a789..507a0be 100644
--- a/tests/unit_tests/gigachat/test_client.py
+++ b/tests/unit_tests/gigachat/test_client.py
@@ -23,6 +23,7 @@
     Model,
     Models,
     TokensCount,
+    UploadedFile,
 )
 from gigachat.settings import Settings
 
@@ -36,6 +37,7 @@
 MODEL_URL = f"{BASE_URL}/models/model"
 TOKENS_COUNT_URL = f"{BASE_URL}/tokens/count"
 EMBEDDINGS_URL = f"{BASE_URL}/embeddings"
+FILES_URL = f"{BASE_URL}/files"
 
 ACCESS_TOKEN = get_json("access_token.json")
 TOKEN = get_json("token.json")
@@ -48,6 +50,9 @@
 MODELS = get_json("models.json")
 TOKENS_COUNT = get_json("tokens_count.json")
 MODEL = get_json("model.json")
+FILES = get_json("post_files.json")
+
+FILE = get_bytes("image.jpg")
 
 HEADERS_STREAM = {"Content-Type": "text/event-stream"}
 
@@ -93,9 +98,14 @@ def test__parse_chat_model(payload_value: Optional[str], setting_value: Optional
     ],
 )
 def test__parse_chat_profanity_check(
-    payload_value: Optional[bool], setting_value: Optional[bool], expected: Optional[bool]
+    payload_value: Optional[bool],
+    setting_value: Optional[bool],
+    expected: Optional[bool],
 ) -> None:
-    actual = _parse_chat(Chat(messages=[], profanity_check=payload_value), Settings(profanity_check=setting_value))
+    actual = _parse_chat(
+        Chat(messages=[], profanity_check=payload_value),
+        Settings(profanity_check=setting_value),
+    )
     assert actual.profanity_check is expected
 
 
@@ -144,6 +154,15 @@ def test_chat(httpx_mock: HTTPXMock) -> None:
     assert isinstance(response, ChatCompletion)
 
 
+def test_upload_file(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=FILES_URL, json=FILES)
+
+    with GigaChatSyncClient(base_url=BASE_URL, model="model") as client:
+        response = client.upload_file(file=FILE)
+
+    assert isinstance(response, UploadedFile)
+
+
 def test_chat_access_token(httpx_mock: HTTPXMock) -> None:
     httpx_mock.add_response(url=CHAT_URL, json=CHAT_COMPLETION)
     access_token = "access_token"
@@ -189,7 +208,10 @@ def test_chat_update_token_credentials(httpx_mock: HTTPXMock) -> None:
     access_token = "access_token"
 
     with GigaChatSyncClient(
-        base_url=BASE_URL, auth_url=AUTH_URL, access_token=access_token, credentials=CREDENTIALS
+        base_url=BASE_URL,
+        auth_url=AUTH_URL,
+        access_token=access_token,
+        credentials=CREDENTIALS,
     ) as client:
         assert client.token == access_token
         with pytest.raises(AuthenticationError):
@@ -263,7 +285,10 @@ def test_chat_with_functions(httpx_mock: HTTPXMock) -> None:
     assert response.choices[0].message.function_call is not None
     assert response.choices[0].message.function_call.name == "fc"
     assert response.choices[0].message.function_call.arguments is not None
-    assert response.choices[0].message.function_call.arguments == {"location": "Москва", "num_days": 0}
+    assert response.choices[0].message.function_call.arguments == {
+        "location": "Москва",
+        "num_days": 0,
+    }
 
 
 def test_embeddings(httpx_mock: HTTPXMock) -> None:
@@ -443,7 +468,10 @@ async def test_achat_update_token_credentials(httpx_mock: HTTPXMock) -> None:
     access_token = "access_token"
 
     async with GigaChatAsyncClient(
-        base_url=BASE_URL, auth_url=AUTH_URL, access_token=access_token, credentials=CREDENTIALS
+        base_url=BASE_URL,
+        auth_url=AUTH_URL,
+        access_token=access_token,
+        credentials=CREDENTIALS,
     ) as client:
         assert client.token == access_token
         with pytest.raises(AuthenticationError):
@@ -541,3 +569,13 @@ def test__update_token() -> None:
 async def test__aupdate_token() -> None:
     async with GigaChatAsyncClient(base_url=BASE_URL) as client:
         await client._aupdate_token()
+
+
+@pytest.mark.asyncio()
+async def test_aupload_file(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=FILES_URL, json=FILES)
+
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.aupload_file(file=FILE)
+
+    assert isinstance(response, UploadedFile)
diff --git a/tests/unit_tests/gigachat/test_get_image.py b/tests/unit_tests/gigachat/test_get_image.py
new file mode 100644
index 0000000..e98c89a
--- /dev/null
+++ b/tests/unit_tests/gigachat/test_get_image.py
@@ -0,0 +1,28 @@
+import pytest
+from pytest_httpx import HTTPXMock
+
+from gigachat.client import GigaChatAsyncClient, GigaChatSyncClient
+from gigachat.models import Image
+
+from ...utils import get_bytes
+
+BASE_URL = "http://base_url"
+IMAGE_URL = f"{BASE_URL}/files/img_file/content"
+IMAGE = get_bytes("image.jpg")
+
+
+def test_get_image(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=IMAGE_URL, content=IMAGE)
+    with GigaChatSyncClient(base_url=BASE_URL, model="model") as client:
+        response = client.get_image(file_id="img_file")
+
+    assert isinstance(response, Image)
+
+
+@pytest.mark.asyncio()
+async def test_aget_image(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=IMAGE_URL, content=IMAGE)
+    async with GigaChatAsyncClient(base_url=BASE_URL, model="model") as client:
+        response = await client.aget_image(file_id="img_file")
+
+    assert isinstance(response, Image)
diff --git a/tests/unit_tests/gigachat/test_threads.py b/tests/unit_tests/gigachat/test_threads.py
new file mode 100644
index 0000000..9f12ea2
--- /dev/null
+++ b/tests/unit_tests/gigachat/test_threads.py
@@ -0,0 +1,252 @@
+import pytest
+from pytest_httpx import HTTPXMock
+
+from gigachat.client import GigaChatAsyncClient, GigaChatSyncClient
+from gigachat.models.threads import (
+    ThreadCompletion,
+    ThreadCompletionChunk,
+    ThreadMessages,
+    ThreadMessagesResponse,
+    ThreadRunOptions,
+    ThreadRunResponse,
+    ThreadRunResult,
+    Threads,
+)
+
+from ...utils import get_bytes, get_json
+
+BASE_URL = "http://base_url"
+
+GET_THREADS_URL = f"{BASE_URL}/threads"
+GET_THREADS_MESSAGES_URL = f"{BASE_URL}/threads/messages?thread_id=111"
+GET_THREADS_RUN_URL = f"{BASE_URL}/threads/run?thread_id=111"
+POST_THREAD_MESSAGES_RERUN_URL = f"{BASE_URL}/threads/messages/rerun"
+POST_THREAD_MESSAGES_RUN_URL = f"{BASE_URL}/threads/messages/run"
+POST_THREADS_DELETE_URL = f"{BASE_URL}/threads/delete"
+POST_THREADS_MESSAGES_URL = f"{BASE_URL}/threads/messages"
+POST_THREADS_RUN_URL = f"{BASE_URL}/threads/run"
+
+GET_THREADS = get_json("threads/get_threads.json")
+GET_THREADS_MESSAGES = get_json("threads/get_threads_messages.json")
+GET_THREADS_RUN = get_json("threads/get_threads_run.json")
+POST_THREAD_MESSAGES_RERUN = get_json("threads/post_thread_messages_rerun.json")
+POST_THREAD_MESSAGES_RERUN_STREAM = get_bytes("threads/post_thread_messages_rerun.stream")
+POST_THREAD_MESSAGES_RUN = get_json("threads/post_thread_messages_run.json")
+POST_THREAD_MESSAGES_RUN_STREAM = get_bytes("threads/post_thread_messages_run.stream")
+POST_THREADS_DELETE = get_bytes("threads/post_threads_delete.txt")
+POST_THREADS_MESSAGES = get_json("threads/post_threads_messages.json")
+POST_THREADS_RUN = get_json("threads/post_threads_run.json")
+
+HEADERS_STREAM = {"Content-Type": "text/event-stream"}
+
+
+def test_get_threads(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_THREADS_URL, json=GET_THREADS)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.list()
+
+    assert isinstance(response, Threads)
+    assert len(response.threads) == 3
+
+
+@pytest.mark.asyncio()
+async def test_aget_threads(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_THREADS_URL, json=GET_THREADS)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.list()
+
+    assert isinstance(response, Threads)
+    assert len(response.threads) == 3
+
+
+def test_get_threads_messages(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_THREADS_MESSAGES_URL, json=GET_THREADS_MESSAGES)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.get_messages(thread_id="111")
+
+    assert isinstance(response, ThreadMessages)
+    assert len(response.messages) == 2
+
+
+@pytest.mark.asyncio()
+async def test_aget_threads_messages(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_THREADS_MESSAGES_URL, json=GET_THREADS_MESSAGES)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.get_messages(thread_id="111")
+
+    assert isinstance(response, ThreadMessages)
+    assert len(response.messages) == 2
+
+
+def test_get_threads_run(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_THREADS_RUN_URL, json=GET_THREADS_RUN)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.get_run(thread_id="111")
+
+    assert isinstance(response, ThreadRunResult)
+    assert len(response.messages) == 2  # type: ignore
+
+
+@pytest.mark.asyncio()
+async def test_aget_threads_run(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=GET_THREADS_RUN_URL, json=GET_THREADS_RUN)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.get_run(thread_id="111")
+
+    assert isinstance(response, ThreadRunResult)
+    assert len(response.messages) == 2  # type: ignore
+
+
+def test_post_thread_messages_rerun(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREAD_MESSAGES_RERUN_URL, json=POST_THREAD_MESSAGES_RERUN)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.rerun_messages(thread_id="111", thread_options=ThreadRunOptions(temperature=0.1))
+
+    assert isinstance(response, ThreadCompletion)
+
+
+@pytest.mark.asyncio()
+async def test_apost_thread_messages_rerun(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREAD_MESSAGES_RERUN_URL, json=POST_THREAD_MESSAGES_RERUN)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.rerun_messages(
+            thread_id="111", thread_options=ThreadRunOptions(temperature=0.1)
+        )
+
+    assert isinstance(response, ThreadCompletion)
+
+
+def test_post_thread_messages_run(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREAD_MESSAGES_RUN_URL, json=POST_THREAD_MESSAGES_RUN)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.run_messages(messages=[""], thread_options=ThreadRunOptions(temperature=0.1))
+
+    assert isinstance(response, ThreadCompletion)
+
+
+@pytest.mark.asyncio()
+async def test_apost_thread_messages_run(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREAD_MESSAGES_RUN_URL, json=POST_THREAD_MESSAGES_RUN)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.run_messages(messages=[""], thread_options=ThreadRunOptions(temperature=0.1))
+
+    assert isinstance(response, ThreadCompletion)
+
+
+def test_post_thread_messages(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREADS_MESSAGES_URL, json=POST_THREADS_MESSAGES)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.add_messages(messages=[""])
+
+    assert isinstance(response, ThreadMessagesResponse)
+
+
+@pytest.mark.asyncio()
+async def test_apost_thread_messages(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREADS_MESSAGES_URL, json=POST_THREADS_MESSAGES)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.add_messages(messages=[""])
+
+    assert isinstance(response, ThreadMessagesResponse)
+
+
+def test_post_threads_run(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREADS_RUN_URL, json=POST_THREADS_RUN)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.run(thread_id="111", thread_options=ThreadRunOptions(temperature=0.1))
+
+    assert isinstance(response, ThreadRunResponse)
+
+
+@pytest.mark.asyncio()
+async def test_apost_threads_run(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREADS_RUN_URL, json=POST_THREADS_RUN)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.run(thread_id="111", thread_options=ThreadRunOptions(temperature=0.1))
+
+    assert isinstance(response, ThreadRunResponse)
+
+
+def test_post_threads_delete(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREADS_DELETE_URL, content=POST_THREADS_DELETE)
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = client.threads.delete(thread_id="111")
+
+    assert isinstance(response, bool)
+
+
+@pytest.mark.asyncio()
+async def test_apost_threads_delete(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(url=POST_THREADS_DELETE_URL, content=POST_THREADS_DELETE)
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = await client.a_threads.delete(thread_id="111")
+
+    assert isinstance(response, bool)
+
+
+def test_post_thread_messages_rerun_stream(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(
+        url=POST_THREAD_MESSAGES_RERUN_URL,
+        content=POST_THREAD_MESSAGES_RERUN_STREAM,
+        headers=HEADERS_STREAM,
+    )
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = list(
+            client.threads.rerun_messages_stream(thread_id="111", thread_options=ThreadRunOptions(temperature=0.1))
+        )
+
+    assert all(isinstance(chunk, ThreadCompletionChunk) for chunk in response)
+    assert len(response) == 73
+
+
+@pytest.mark.asyncio()
+async def test_apost_thread_messages_rerun_stream(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(
+        url=POST_THREAD_MESSAGES_RERUN_URL,
+        content=POST_THREAD_MESSAGES_RERUN_STREAM,
+        headers=HEADERS_STREAM,
+    )
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = [
+            chunk
+            async for chunk in client.a_threads.rerun_messages_stream(
+                thread_id="111", thread_options=ThreadRunOptions(temperature=0.1)
+            )
+        ]
+
+    assert all(isinstance(chunk, ThreadCompletionChunk) for chunk in response)
+    assert len(response) == 73
+
+
+def test_post_thread_messages_run_stream(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(
+        url=POST_THREAD_MESSAGES_RUN_URL,
+        content=POST_THREAD_MESSAGES_RUN_STREAM,
+        headers=HEADERS_STREAM,
+    )
+    with GigaChatSyncClient(base_url=BASE_URL) as client:
+        response = list(
+            client.threads.run_messages_stream(messages=[""], thread_options=ThreadRunOptions(temperature=0.1))
+        )
+
+    assert all(isinstance(chunk, ThreadCompletionChunk) for chunk in response)
+    assert len(response) == 2
+
+
+@pytest.mark.asyncio()
+async def test_apost_thread_messages_run_stream(httpx_mock: HTTPXMock) -> None:
+    httpx_mock.add_response(
+        url=POST_THREAD_MESSAGES_RUN_URL,
+        content=POST_THREAD_MESSAGES_RUN_STREAM,
+        headers=HEADERS_STREAM,
+    )
+    async with GigaChatAsyncClient(base_url=BASE_URL) as client:
+        response = [
+            chunk
+            async for chunk in client.a_threads.run_messages_stream(
+                messages=[""], thread_options=ThreadRunOptions(temperature=0.1)
+            )
+        ]
+
+    assert all(isinstance(chunk, ThreadCompletionChunk) for chunk in response)
+    assert len(response) == 2