├── .python-version ├── .env-example ├── .gitignore ├── pyproject.toml ├── README.md ├── typst ├── act.typ ├── ru-numbers.typ └── invoice.typ ├── mail.py ├── main.py └── uv.lock /.python-version: -------------------------------------------------------------------------------- 1 | 3.13 2 | -------------------------------------------------------------------------------- /.env-example: -------------------------------------------------------------------------------- 1 | GIGACHAT_CREDENTIALS=... 2 | EMAIL_LOGIN=... 3 | EMAIL_PASSWORD=... 4 | EMAIL_IMAP_HOST=imap.yandex.com 5 | EMAIL_IMAP_PORT=993 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python-generated files 2 | __pycache__/ 3 | *.py[oc] 4 | build/ 5 | dist/ 6 | wheels/ 7 | *.egg-info 8 | 9 | # Virtual environments 10 | .venv 11 | .env 12 | 13 | *.doc 14 | *.docx 15 | *.pdf 16 | *.json 17 | 18 | attachments 19 | 20 | *:Zone.Identifier 21 | 22 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "gigachat-tests" 3 | version = "0.1.0" 4 | description = "Add your description here" 5 | readme = "README.md" 6 | requires-python = ">=3.13" 7 | dependencies = [ 8 | "langchain>=0.3.25", 9 | "langchain-gigachat>=0.3.10", 10 | "langgraph>=0.4.3", 11 | "python-dotenv>=1.1.0", 12 | ] 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ИИ-агент создания акта выполненных работ 2 | 3 | Этот ИИ-агент создан как Proof of Concept для создания актов выполненных работ. Агент работает на Python и использует LangChain, в качестве LLM используется GigaChat. Видео про ИИ-агентов и создание своего агента: [https://youtu.be/KFgwXXWT7sQ](https://youtu.be/KFgwXXWT7sQ). 4 | 5 | Для запуска создай `.env` файл и укажи в нём токен для подключения к API GigaChat: 6 | 7 | ```bash 8 | cp .env-example .env 9 | ``` 10 | 11 | Установка зависимостей с пакетным менеджером `uv`: 12 | 13 | ```bash 14 | uv venv 15 | uv sync 16 | ``` 17 | 18 | Запуск агента: 19 | 20 | ```bash 21 | uv run main.py 22 | ``` 23 | -------------------------------------------------------------------------------- /typst/act.typ: -------------------------------------------------------------------------------- 1 | #import "ru-numbers.typ": ru-words 2 | #import "@preview/zero:0.3.3": num, set-group 3 | #set-group(size: 3, separator: sym.space.thin, threshold: 4) 4 | 5 | #let act = json("act.json") 6 | 7 | #let act_sum = act.jobs.map(job => job.at("price")).sum() 8 | 9 | = Акт выполненных работ 10 | 11 | #datetime.today().display("[day].[month].[year]") 12 | 13 | #table( 14 | columns: 2, 15 | stroke: none, 16 | inset: (left: 0pt), 17 | [*Исполнитель:*], [ИП Голобурдин Алексей Анатольевич], 18 | [*Заказчик:*], [#act.customer.at("name")] 19 | ) 20 | 21 | #table( 22 | columns: 6, 23 | [№], [Наименование товара], [Ед. изм.], [Кол-во], [Цена, ₽], [Сумма, ₽], 24 | ..for (index, job) in act.jobs.enumerate() {( 25 | [ 26 | #align(center)[#(index + 1)] 27 | ],[ 28 | #job.at("task") 29 | ], [#align(center)[шт]], [#align(center)[1]], [ 30 | #align(center)[#num(job.at("price"))] 31 | ],[ 32 | #align(center)[#num(job.at("price"))] 33 | ] 34 | )}, 35 | ) 36 | 37 | Общая стоимость выполненных работ, оказанных услуг в российских рублях: #num(act_sum) (#ru-words(act_sum)) 00 копеек. Заказчик не имеет претензий по срокам, качеству и объёму товаров и услуг 38 | 39 | #table( 40 | columns: 2, 41 | stroke: none, 42 | inset: (left: 0pt), 43 | [ 44 | *#act.customer.at("name")* 45 | ], [ 46 | *ИП Голобурдин Алексей Анатольевич* 47 | ], text( 48 | )[ 49 | ИНН: #act.customer.at("INN")\ 50 | ОГРН: #act.customer.at("OGRN")\ 51 | Юридический адрес: #act.customer.at("address")\ 52 | Банк: #act.customer.at("bank").at("name")\ 53 | БИК: #act.customer.at("bank").at("BIC")\ 54 | Расчетный счет: #act.customer.at("bank").at("current_account")\ 55 | Корр. счет: #act.customer.at("bank").at("corporate_account")\ 56 | ],[ 57 | ИНН: 482423943474\ 58 | ОГРНИП: 313482405700058\ 59 | Р/с: 40802810602230000885\ 60 | Банк: АО "АЛЬФА-БАНК"\ 61 | БИК: 044525593\ 62 | Корр. счет: 30101810200000000593 63 | ],[ 64 | \ 65 | #text("________________/") #act.customer.at("signatory") / 66 | ], [ 67 | \ 68 | #text("________________/") Голобурдин А.А. / 69 | ] 70 | ) 71 | -------------------------------------------------------------------------------- /typst/ru-numbers.typ: -------------------------------------------------------------------------------- 1 | // -------------------------------------------------------------- 2 | // Число → русская пропись (до миллиардов). Typst 0.12+ 3 | // -------------------------------------------------------------- 4 | 5 | #import calc: rem, floor // rem — остаток; floor — целая часть 6 | 7 | // — словари — 8 | #let _units = ( 9 | "ноль", "один", "два", "три", "четыре", 10 | "пять", "шесть", "семь", "восемь", "девять", 11 | "десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", 12 | "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать", 13 | ) 14 | 15 | 16 | #let _tens = ( 17 | "", "", "двадцать", "тридцать", "сорок", 18 | "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто", 19 | ) 20 | 21 | 22 | #let _hundreds = ( 23 | "", "сто", "двести", "триста", "четыреста", 24 | "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот", 25 | ) 26 | 27 | // (1-форма, 2–4-форма, 5+-форма, женский род?) 28 | #let _scales = ( 29 | ("", "", "", false), 30 | ("тысяча", "тысячи", "тысяч", true ), 31 | ("миллион", "миллиона", "миллионов", false), 32 | ("миллиард","миллиарда","миллиардов",false), 33 | ) 34 | 35 | // — выбор формы слова-разряда — 36 | #let _form(n, one, few, many) = { 37 | let m = rem(n, 100) 38 | let last = rem(n, 10) 39 | if m >= 11 and m <= 14 { many } 40 | else if last == 1 { one } 41 | else if last >= 2 and last <= 4 { few } 42 | else { many } 43 | 44 | } 45 | 46 | // — пропись триады (0–999) — 47 | #let _chunk(n, fem) = { 48 | let words = () 49 | 50 | // сотни 51 | let h = floor(n / 100) 52 | if h != 0 { words.push(_hundreds.at(h)) } 53 | 54 | // < 100 55 | let rest = rem(n, 100) 56 | if rest < 20 { 57 | if rest != 0 { 58 | let w = _units.at(rest) 59 | if fem and rest == 1 { words.push("одна") } 60 | else if fem and rest == 2 { words.push("две") } 61 | else { words.push(w) } 62 | } 63 | } else { 64 | let t = floor(rest / 10) 65 | words.push(_tens.at(t)) 66 | 67 | let u = rem(rest, 10) 68 | if u != 0 { 69 | let w = _units.at(u) 70 | if fem and u == 1 { words.push("одна") } 71 | else if fem and u == 2 { words.push("две") } 72 | else { words.push(w) } 73 | } 74 | } 75 | 76 | words.join(" ") 77 | } 78 | 79 | // — экспортируемая функция — 80 | #let ru-words(n) = { 81 | if n == 0 { _units.at(0) } 82 | else { 83 | let parts = () 84 | let scale = 0 85 | let num = n 86 | 87 | while num > 0 { 88 | let chunk = rem(num, 1000) 89 | if chunk != 0 { 90 | let (one, few, many, fem) = _scales.at(scale) 91 | let chunk_words = _chunk(chunk, fem) 92 | 93 | if scale == 0 { 94 | parts.push(chunk_words) 95 | 96 | } else { 97 | let name = _form(chunk, one, few, many) 98 | parts.push(chunk_words + " " + name) 99 | } 100 | } 101 | scale += 1 102 | 103 | num = floor(num / 1000) 104 | } 105 | 106 | parts.rev().join(" ") 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /typst/invoice.typ: -------------------------------------------------------------------------------- 1 | #import "ru-numbers.typ": ru-words 2 | #import "@preview/zero:0.3.3": num, set-group 3 | #set-group(size: 3, separator: sym.space.thin, threshold: 4) 4 | 5 | #let invoice = json("invoice.json") 6 | 7 | #let invoice_overall_sum = invoice.jobs.map(job => job.at("price")).sum() 8 | #let invoice_jobs_count = invoice.jobs.len() 9 | 10 | #let get_invoice_number( 11 | // d — дата; по умолчанию берём сегодняшнюю 12 | num, 13 | d: datetime.today() 14 | ) = { 15 | d.display( 16 | "[year repr:last_two padding:zero]" + // YY 17 | "[month padding:zero]" + // MM 18 | "[day padding:zero]" + // DD 19 | num, // суффикс 20 | ) 21 | } 22 | 23 | #let ru-months = ( 24 | "января", "февраля", "марта", "апреля", 25 | "мая", "июня", "июля", "августа", 26 | "сентября","октября", "ноября", "декабря", 27 | ) 28 | #let today = datetime.today() 29 | 30 | 31 | #table( 32 | columns: (auto, 1fr, auto, auto), 33 | [ИНН 482423943474], [ОГРНИП 313482405700058], table.cell(rowspan: 2, align: bottom)[Сч. №], table.cell(rowspan: 2, align: bottom)[40802810602230000885], 34 | table.cell(colspan: 2)[Получатель\ 35 | ИП ГОЛОБУРДИН АЛЕКСЕЙ АНАТОЛЬЕВИЧ], 36 | table.cell(colspan: 2, rowspan: 2)[Банк получателя\ 37 | АО "АЛЬФА-БАНК"], 38 | table.cell()[БИК], 39 | table.cell()[044525593], 40 | table.cell()[Сч. №], 41 | table.cell()[30101810200000000593], 42 | ) 43 | 44 | #set align(center) 45 | #block(below: 1.5em, above: 2em)[ 46 | #align(center)[ 47 | = СЧЕТ № #get_invoice_number("01") от #today.day()~#ru-months.at(today.month() - 1)~#today.year() г. 48 | ] 49 | ] 50 | 51 | #set align(left) 52 | 53 | Плательщик: #invoice.customer.name ИНН #invoice.customer.INN ОГРН #invoice.customer.OGRN 54 | 55 | #table( 56 | columns: (0.4fr, 2.7fr, 0.7fr, 0.7fr, 0.8fr, 1.3fr), 57 | table.cell(align: center)[№], [Наименование товара], table.cell(align: center)[Ед. изм.], table.cell(align: center)[Кол-во], table.cell(align: center)[Цена, ₽], table.cell(align: center)[Сумма, ₽], 58 | ..for (index, job) in invoice.jobs.enumerate() {( 59 | table.cell(align: center)[ 60 | #(index + 1) 61 | ],[ 62 | #job.at("task") 63 | ], table.cell(align: center)[шт], table.cell(align: center)[1], table.cell(align: center)[ 64 | #align(center)[#num(job.at("price"))] 65 | ],table.cell(align: center)[ 66 | #align(center)[#num(job.at("price"))] 67 | ] 68 | )}, 69 | table.cell(colspan: 5, stroke: none, align: right)[*Итого:*], table.cell(align: center)[#num(invoice_overall_sum)], 70 | table.cell(colspan: 5, stroke: none, align: right)[*НДС:*], table.cell(align: center)[не облагается], 71 | table.cell(colspan: 5, stroke: none, align: right)[*Всего к оплате:*], table.cell(align: center)[#num(invoice_overall_sum)], 72 | ) 73 | 74 | Всего наименований #invoice_jobs_count , на сумму #num(invoice_overall_sum) (#ru-words(invoice_overall_sum)) руб 00 копеек. Оплачивая настоящий счёт, вы присоединяетесь к Оферте, опубликованной на сайте https://to.digital/oferta.pdf. 75 | 76 | #block(above: 3em)[ 77 | ИП Голобурдин #text("__________________________") Голобурдин А.А. 78 | ] 79 | -------------------------------------------------------------------------------- /mail.py: -------------------------------------------------------------------------------- 1 | """ 2 | Скачивает письма из Яндекс-почты за последние N суток, 3 | включая тексты и все вложения, через IMAP-SSL. 4 | 5 | Требуется «Пароль приложения» Яндекс-почты (web-интерфейс → Аккаунт → Безопасность 6 | → Пароли приложений). 7 | IMAP-доступ должен быть включён (Почта → Все настройки → Почтовые программы). 8 | """ 9 | from dataclasses import dataclass 10 | import imaplib 11 | import email 12 | from email.header import decode_header 13 | import os 14 | from pathlib import Path 15 | from datetime import datetime, timedelta, timezone 16 | from typing import TypeAlias 17 | 18 | from langchain_core.tools import tool 19 | 20 | 21 | SAVE_ATTACHMENTS_DIRECTORY = "attachments" 22 | 23 | 24 | Filename: TypeAlias = str # имя файла, в котором хранится аттачмент письма 25 | 26 | 27 | @dataclass 28 | class Email: 29 | """Данные по конкретному письму в почтовом ящике""" 30 | subject: str # тема письма 31 | body: str # тело письма 32 | attachments: list[Filename] # список имён файлов прикрепленных к письму 33 | date: str # дата письма 34 | 35 | 36 | def _imap_date(dt: datetime) -> str: 37 | """Формат даты для IMAP: 16-May-2025""" 38 | return dt.strftime("%d-%b-%Y") 39 | 40 | 41 | def _decode(s): 42 | """Декодирует заголовки (Subject, From, filename…)""" 43 | parts = decode_header(s) 44 | decoded = [] 45 | for text, enc in parts: 46 | decoded.append( 47 | text.decode(enc or "utf-8", errors="ignore") 48 | if isinstance(text, bytes) 49 | else text 50 | ) 51 | return "".join(decoded) 52 | 53 | 54 | class IncorrectEnvVariables(Exception): 55 | """Не хватает нужной переменной окружения""" 56 | pass 57 | 58 | 59 | class CantSearchEmails(Exception): 60 | """Не получилось найти письма""" 61 | 62 | 63 | class CantReadEmail(Exception): 64 | """Не получилось прочесть конкретное письмо""" 65 | 66 | 67 | @tool 68 | def fetch_recent_emails(days: int = 3) -> list[Email]: 69 | """Возвращает почтовые сообщения и вложения за последние *days* суток.""" 70 | user = os.getenv("EMAIL_LOGIN") 71 | password = os.getenv("EMAIL_PASSWORD") 72 | imap_host = os.getenv("EMAIL_IMAP_HOST") 73 | imap_port = os.getenv("EMAIL_IMAP_PORT") 74 | if not all((user, password, imap_host, imap_port)): 75 | raise IncorrectEnvVariables("set correct env variables") 76 | 77 | emails: list[Email] = [] 78 | since = datetime.now(timezone.utc) - timedelta(days=days) 79 | since_str = _imap_date(since) 80 | 81 | # ── Подключаемся ──────────────────────────────────────────────────────────── 82 | imap = imaplib.IMAP4_SSL(imap_host, imap_port) 83 | imap.login(user, password) 84 | imap.select("INBOX") 85 | 86 | # ── Ищем письма ──────────────────────────────────────────────────────────── 87 | status, data = imap.search(None, "SINCE", since_str) # 'SINCE 13-May-2025' 88 | if status != "OK": 89 | raise CantSearchEmails("Поиск не удался:", data) 90 | 91 | 92 | ids = data[0].split() 93 | print(f"Найдено {len(ids)} писем за последние {days} дня(ей)") 94 | 95 | # ── Готовим каталог для вложений ─────────────────────────────────────────── 96 | Path(SAVE_ATTACHMENTS_DIRECTORY).mkdir(exist_ok=True) 97 | 98 | # ── Обрабатываем каждое письмо ──────────────────────────────────────────── 99 | for num in ids: 100 | status, msg_data = imap.fetch(num, "(RFC822)") 101 | if status != "OK": 102 | raise CantReadEmail(f"Не удалось получить письмо id={num}") 103 | 104 | msg = email.message_from_bytes(msg_data[0][1]) 105 | 106 | email_subject = _decode(msg.get("Subject", "")) 107 | email_date = msg.get("Date", "") 108 | 109 | # Текст письма (всегда берём первую текстовую часть) 110 | body = "" 111 | for part in msg.walk(): 112 | ctype = part.get_content_type() 113 | if ctype == "text/plain" and part.get_filename() is None: 114 | charset = part.get_content_charset() or "utf-8" 115 | body = part.get_payload(decode=True).decode(charset, errors="ignore") 116 | break 117 | email_body = body 118 | 119 | # Вложения 120 | attachments: list[Filename] = [] 121 | for part in msg.walk(): 122 | filename = part.get_filename() 123 | if filename: 124 | print("attachment", filename) 125 | filename = _decode(filename).strip() 126 | filepath = Path(SAVE_ATTACHMENTS_DIRECTORY) / filename 127 | # предотвращаем перезапись 128 | if filepath.exists(): 129 | base, ext = os.path.splitext(filename) 130 | filepath = Path(SAVE_ATTACHMENTS_DIRECTORY) / f"{base}_{num.decode()}{ext}" 131 | with open(filepath, "wb") as f: 132 | f.write(part.get_payload(decode=True)) 133 | attachments.append(Filename(filepath)) 134 | 135 | emails.append(Email( 136 | subject=email_subject, 137 | body=email_body, 138 | attachments=attachments, 139 | date=email_date 140 | )) 141 | imap.close() 142 | imap.logout() 143 | return emails 144 | 145 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass, asdict 2 | import json 3 | import os 4 | import subprocess 5 | from typing import Sequence 6 | import sys 7 | import uuid 8 | 9 | from dotenv import find_dotenv, load_dotenv 10 | from langchain_core.language_models import LanguageModelLike 11 | from langchain_core.runnables import RunnableConfig 12 | from langchain_core.tools import BaseTool, tool 13 | from langchain_gigachat.chat_models import GigaChat 14 | from langgraph.prebuilt import create_react_agent 15 | from langgraph.checkpoint.memory import InMemorySaver 16 | from mail import fetch_recent_emails 17 | 18 | 19 | load_dotenv(find_dotenv()) 20 | 21 | 22 | try: 23 | REQUISITES_FILE = sys.argv[1] 24 | except IndexError: 25 | exit("Передай аргументом файл с реквизитами") 26 | 27 | 28 | @dataclass 29 | class Bank: 30 | """Банковские реквизиты заказчика""" 31 | name: str # наименование банка 32 | BIC: str # БИК 33 | current_account: str # расчётный счёт 34 | corporate_account: str # корреспондентский счёт 35 | 36 | 37 | @dataclass 38 | class Customer: 39 | """Заказчик""" 40 | name: str # полное название юридического лица, наприемер, ООО «Рога и копыта» 41 | INN: str # ИНН 42 | OGRN: str # ОГРН или ОГРНИП 43 | address: str # юридический адрес 44 | signatory: str # подписант 45 | bank: Bank # банковские реквизиты заказчика 46 | 47 | 48 | @dataclass 49 | class Job: 50 | task: str # выполненная задача 51 | price: int # цена за задачу 52 | 53 | 54 | @tool 55 | def generate_pdf_act(customer: Customer, jobs: list[Job]) -> None: 56 | """ 57 | Генерирует PDF-акт, в котором заполнены данные 58 | клиента, его банковские реквизиты, а также выполненные задачи 59 | 60 | Args: 61 | customer (Customer): данные клиента 62 | jobs (list[Job]): список выполненных задач для внесения в акт 63 | 64 | Returns: 65 | None 66 | """ 67 | #print(f"generate_pdf_act({asdict(customer)}, {list(map(lambda j: asdict(j), jobs))})") 68 | act_json = { 69 | "customer": asdict(customer), 70 | "jobs": list(map( 71 | lambda j: asdict(j), jobs 72 | )) 73 | } 74 | with open(os.path.join("typst", "act.json"), "w") as f: 75 | json.dump(act_json, f, ensure_ascii=False) 76 | command = ["typst", "compile", "--root", "./typst", "typst/act.typ"] 77 | try: 78 | subprocess.run(command, 79 | check=True, 80 | stdout=subprocess.PIPE, 81 | stderr=subprocess.PIPE, text=True) 82 | except subprocess.CalledProcessError as e: 83 | print(e.stderr) 84 | 85 | 86 | @tool 87 | def generate_pdf_invoice(customer: Customer, jobs: list[Job]) -> None: 88 | """ 89 | Генерирует PDF-счёт, в котором заполнены данные 90 | клиента, а также выполненные задачи 91 | 92 | Args: 93 | customer (Customer): данные клиента 94 | jobs (list[Job]): список выполненных задач для внесения в акт 95 | 96 | Returns: 97 | None 98 | """ 99 | invoice_json = { 100 | "customer": asdict(customer), 101 | "jobs": list(map( 102 | lambda j: asdict(j), jobs 103 | )) 104 | } 105 | with open(os.path.join("typst", "invoice.json"), "w") as f: 106 | json.dump(invoice_json, f, ensure_ascii=False) 107 | command = ["typst", "compile", "--root", "./typst", "typst/invoice.typ"] 108 | try: 109 | subprocess.run(command, 110 | check=True, 111 | stdout=subprocess.PIPE, 112 | stderr=subprocess.PIPE, text=True) 113 | except subprocess.CalledProcessError as e: 114 | print(e.stderr) 115 | 116 | 117 | class LLMAgent: 118 | def __init__(self, model: LanguageModelLike, tools: Sequence[BaseTool]): 119 | self._model = model 120 | self._agent = create_react_agent( 121 | model, 122 | tools=tools, 123 | checkpointer=InMemorySaver()) 124 | self._config: RunnableConfig = { 125 | "configurable": {"thread_id": uuid.uuid4().hex}} 126 | 127 | def upload_file(self, file): 128 | print(f"upload file {file} to LLM") 129 | file_uploaded_id = self._model.upload_file(file).id_ # type: ignore 130 | return file_uploaded_id 131 | 132 | def invoke( 133 | self, 134 | content: str, 135 | attachments: list[str]|None=None, 136 | temperature: float=0.1 137 | ) -> str: 138 | """Отправляет сообщение в чат""" 139 | message: dict = { 140 | "role": "user", 141 | "content": content, 142 | **({"attachments": attachments} if attachments else {}) 143 | } 144 | return self._agent.invoke( 145 | { 146 | "messages": [message], 147 | "temperature": temperature 148 | }, 149 | config=self._config)["messages"][-1].content 150 | 151 | 152 | def print_agent_response(llm_response: str) -> None: 153 | print(f"\033[35m{llm_response}\033[0m") 154 | 155 | 156 | def get_user_prompt() -> str: 157 | return input("\nТы: ") 158 | 159 | 160 | def main(): 161 | model = GigaChat( 162 | model="GigaChat-2-Max", 163 | verify_ssl_certs=False, 164 | ) 165 | 166 | agent = LLMAgent(model, tools=[generate_pdf_act, generate_pdf_invoice]) 167 | system_prompt = ( 168 | "Твоя задача спросить у пользователя, что он хочет сгенерировать — акт или счёт или оба документа. " 169 | "Затем нужно сгенерировать акт или счёт, для этого тебе надо взять реквизиты " 170 | "контрагента из приложенного файла, а также запроси работы для включения в " 171 | "акт (наименования задач и их стоимость), работ может быть несколько. " 172 | "Если пользователь указывает в качетсве работы курс, то для документов берём одну работу, в точности такую " 173 | "\"Обучение одного сотрудника на курсе «Хардкорная веб-разработка»\", стоимостью 170 тыс руб." 174 | "Никакие данные не придумывай, всё необходимое строго запроси у " 175 | "пользователя. Мои реквизиты не запрашивай, они есть в моём коде. " 176 | "Имя и отчество подписанта сокращаем до одной первой буквы, " 177 | "например, Иванов А.Е. " 178 | "Название компании оборачиваем в кавычки ёлочкой, например, " 179 | "ООО «Рога и копыта», то есть до названия компании ставим « и после названия " 180 | "ставим »." 181 | ) 182 | 183 | file_uploaded_id= agent.upload_file(open(REQUISITES_FILE, "rb")) 184 | agent_response = agent.invoke(content=system_prompt, attachments=[file_uploaded_id]) 185 | 186 | while(True): 187 | print_agent_response(agent_response) 188 | agent_response = agent.invoke(get_user_prompt()) 189 | 190 | 191 | if __name__ == "__main__": 192 | try: 193 | main() 194 | except KeyboardInterrupt: 195 | print("\nдосвидули!") 196 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 1 3 | requires-python = ">=3.13" 4 | 5 | [[package]] 6 | name = "annotated-types" 7 | version = "0.7.0" 8 | source = { registry = "https://pypi.org/simple" } 9 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } 10 | wheels = [ 11 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, 12 | ] 13 | 14 | [[package]] 15 | name = "anyio" 16 | version = "4.9.0" 17 | source = { registry = "https://pypi.org/simple" } 18 | dependencies = [ 19 | { name = "idna" }, 20 | { name = "sniffio" }, 21 | ] 22 | sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } 23 | wheels = [ 24 | { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, 25 | ] 26 | 27 | [[package]] 28 | name = "certifi" 29 | version = "2025.4.26" 30 | source = { registry = "https://pypi.org/simple" } 31 | sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 } 32 | wheels = [ 33 | { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 }, 34 | ] 35 | 36 | [[package]] 37 | name = "cffi" 38 | version = "1.17.1" 39 | source = { registry = "https://pypi.org/simple" } 40 | dependencies = [ 41 | { name = "pycparser" }, 42 | ] 43 | sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } 44 | wheels = [ 45 | { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, 46 | { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, 47 | { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, 48 | { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, 49 | { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, 50 | { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, 51 | { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, 52 | { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, 53 | { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, 54 | { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, 55 | { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, 56 | ] 57 | 58 | [[package]] 59 | name = "charset-normalizer" 60 | version = "3.4.2" 61 | source = { registry = "https://pypi.org/simple" } 62 | sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } 63 | wheels = [ 64 | { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, 65 | { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, 66 | { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, 67 | { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, 68 | { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, 69 | { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, 70 | { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, 71 | { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, 72 | { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, 73 | { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, 74 | { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, 75 | { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, 76 | { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, 77 | { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, 78 | ] 79 | 80 | [[package]] 81 | name = "gigachat" 82 | version = "0.1.39.post1" 83 | source = { registry = "https://pypi.org/simple" } 84 | dependencies = [ 85 | { name = "httpx" }, 86 | { name = "pydantic" }, 87 | ] 88 | sdist = { url = "https://files.pythonhosted.org/packages/46/08/0af29564a79f9ed660e4928e3641b9bc042fcf0a2fc4bf3234f7e1cd94c9/gigachat-0.1.39.post1.tar.gz", hash = "sha256:5d7d14c3340e72c24f09ba0755324a3937da6ee45b5ce9f7aab4d4037b050db6", size = 32491 } 89 | wheels = [ 90 | { url = "https://files.pythonhosted.org/packages/68/63/8b74e70b7b9496dc72b4f551b0ee12aacaa2a871a1d6cf60830a2e0df78f/gigachat-0.1.39.post1-py3-none-any.whl", hash = "sha256:7b60d9ce08d874b118f55ebe18b8ff0c7fa53ae2437d07a86a714773ea7bb212", size = 67299 }, 91 | ] 92 | 93 | [[package]] 94 | name = "gigachat-tests" 95 | version = "0.1.0" 96 | source = { virtual = "." } 97 | dependencies = [ 98 | { name = "langchain" }, 99 | { name = "langchain-gigachat" }, 100 | { name = "langgraph" }, 101 | { name = "python-dotenv" }, 102 | ] 103 | 104 | [package.metadata] 105 | requires-dist = [ 106 | { name = "langchain", specifier = ">=0.3.25" }, 107 | { name = "langchain-gigachat", specifier = ">=0.3.10" }, 108 | { name = "langgraph", specifier = ">=0.4.3" }, 109 | { name = "python-dotenv", specifier = ">=1.1.0" }, 110 | ] 111 | 112 | [[package]] 113 | name = "greenlet" 114 | version = "3.2.2" 115 | source = { registry = "https://pypi.org/simple" } 116 | sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797 } 117 | wheels = [ 118 | { url = "https://files.pythonhosted.org/packages/89/30/97b49779fff8601af20972a62cc4af0c497c1504dfbb3e93be218e093f21/greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", size = 269150 }, 119 | { url = "https://files.pythonhosted.org/packages/21/30/877245def4220f684bc2e01df1c2e782c164e84b32e07373992f14a2d107/greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", size = 637381 }, 120 | { url = "https://files.pythonhosted.org/packages/8e/16/adf937908e1f913856b5371c1d8bdaef5f58f251d714085abeea73ecc471/greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", size = 651427 }, 121 | { url = "https://files.pythonhosted.org/packages/ad/49/6d79f58fa695b618654adac64e56aff2eeb13344dc28259af8f505662bb1/greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", size = 645795 }, 122 | { url = "https://files.pythonhosted.org/packages/5a/e6/28ed5cb929c6b2f001e96b1d0698c622976cd8f1e41fe7ebc047fa7c6dd4/greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", size = 648398 }, 123 | { url = "https://files.pythonhosted.org/packages/9d/70/b200194e25ae86bc57077f695b6cc47ee3118becf54130c5514456cf8dac/greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", size = 606795 }, 124 | { url = "https://files.pythonhosted.org/packages/f8/c8/ba1def67513a941154ed8f9477ae6e5a03f645be6b507d3930f72ed508d3/greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", size = 1117976 }, 125 | { url = "https://files.pythonhosted.org/packages/c3/30/d0e88c1cfcc1b3331d63c2b54a0a3a4a950ef202fb8b92e772ca714a9221/greenlet-3.2.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", size = 1145509 }, 126 | { url = "https://files.pythonhosted.org/packages/90/2e/59d6491834b6e289051b252cf4776d16da51c7c6ca6a87ff97e3a50aa0cd/greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421", size = 296023 }, 127 | { url = "https://files.pythonhosted.org/packages/65/66/8a73aace5a5335a1cba56d0da71b7bd93e450f17d372c5b7c5fa547557e9/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", size = 629911 }, 128 | { url = "https://files.pythonhosted.org/packages/48/08/c8b8ebac4e0c95dcc68ec99198842e7db53eda4ab3fb0a4e785690883991/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", size = 635251 }, 129 | { url = "https://files.pythonhosted.org/packages/37/26/7db30868f73e86b9125264d2959acabea132b444b88185ba5c462cb8e571/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", size = 632620 }, 130 | { url = "https://files.pythonhosted.org/packages/10/ec/718a3bd56249e729016b0b69bee4adea0dfccf6ca43d147ef3b21edbca16/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", size = 628851 }, 131 | { url = "https://files.pythonhosted.org/packages/9b/9d/d1c79286a76bc62ccdc1387291464af16a4204ea717f24e77b0acd623b99/greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", size = 593718 }, 132 | { url = "https://files.pythonhosted.org/packages/cd/41/96ba2bf948f67b245784cd294b84e3d17933597dffd3acdb367a210d1949/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", size = 1105752 }, 133 | { url = "https://files.pythonhosted.org/packages/68/3b/3b97f9d33c1f2eb081759da62bd6162159db260f602f048bc2f36b4c453e/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", size = 1125170 }, 134 | { url = "https://files.pythonhosted.org/packages/31/df/b7d17d66c8d0f578d2885a3d8f565e9e4725eacc9d3fdc946d0031c055c4/greenlet-3.2.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240", size = 269899 }, 135 | ] 136 | 137 | [[package]] 138 | name = "h11" 139 | version = "0.16.0" 140 | source = { registry = "https://pypi.org/simple" } 141 | sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } 142 | wheels = [ 143 | { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, 144 | ] 145 | 146 | [[package]] 147 | name = "httpcore" 148 | version = "1.0.9" 149 | source = { registry = "https://pypi.org/simple" } 150 | dependencies = [ 151 | { name = "certifi" }, 152 | { name = "h11" }, 153 | ] 154 | sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } 155 | wheels = [ 156 | { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, 157 | ] 158 | 159 | [[package]] 160 | name = "httpx" 161 | version = "0.28.1" 162 | source = { registry = "https://pypi.org/simple" } 163 | dependencies = [ 164 | { name = "anyio" }, 165 | { name = "certifi" }, 166 | { name = "httpcore" }, 167 | { name = "idna" }, 168 | ] 169 | sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } 170 | wheels = [ 171 | { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, 172 | ] 173 | 174 | [[package]] 175 | name = "idna" 176 | version = "3.10" 177 | source = { registry = "https://pypi.org/simple" } 178 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } 179 | wheels = [ 180 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, 181 | ] 182 | 183 | [[package]] 184 | name = "jsonpatch" 185 | version = "1.33" 186 | source = { registry = "https://pypi.org/simple" } 187 | dependencies = [ 188 | { name = "jsonpointer" }, 189 | ] 190 | sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } 191 | wheels = [ 192 | { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, 193 | ] 194 | 195 | [[package]] 196 | name = "jsonpointer" 197 | version = "3.0.0" 198 | source = { registry = "https://pypi.org/simple" } 199 | sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } 200 | wheels = [ 201 | { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, 202 | ] 203 | 204 | [[package]] 205 | name = "langchain" 206 | version = "0.3.25" 207 | source = { registry = "https://pypi.org/simple" } 208 | dependencies = [ 209 | { name = "langchain-core" }, 210 | { name = "langchain-text-splitters" }, 211 | { name = "langsmith" }, 212 | { name = "pydantic" }, 213 | { name = "pyyaml" }, 214 | { name = "requests" }, 215 | { name = "sqlalchemy" }, 216 | ] 217 | sdist = { url = "https://files.pythonhosted.org/packages/fc/f9/a256609096a9fc7a1b3a6300a97000091efabdf21555a97988f93d4d9258/langchain-0.3.25.tar.gz", hash = "sha256:a1d72aa39546a23db08492d7228464af35c9ee83379945535ceef877340d2a3a", size = 10225045 } 218 | wheels = [ 219 | { url = "https://files.pythonhosted.org/packages/ed/5c/5c0be747261e1f8129b875fa3bfea736bc5fe17652f9d5e15ca118571b6f/langchain-0.3.25-py3-none-any.whl", hash = "sha256:931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21", size = 1011008 }, 220 | ] 221 | 222 | [[package]] 223 | name = "langchain-core" 224 | version = "0.3.59" 225 | source = { registry = "https://pypi.org/simple" } 226 | dependencies = [ 227 | { name = "jsonpatch" }, 228 | { name = "langsmith" }, 229 | { name = "packaging" }, 230 | { name = "pydantic" }, 231 | { name = "pyyaml" }, 232 | { name = "tenacity" }, 233 | { name = "typing-extensions" }, 234 | ] 235 | sdist = { url = "https://files.pythonhosted.org/packages/51/78/d17dae349301712e5b1bb4c0c98ecf84c566a71666fbcb1d4006c67b043a/langchain_core-0.3.59.tar.gz", hash = "sha256:052a37cf298c505144f007e5aeede6ecff2dc92c827525d1ef59101eb3a4551c", size = 557225 } 236 | wheels = [ 237 | { url = "https://files.pythonhosted.org/packages/30/40/aa440a7cd05f1dab5d7c91a1284eb776c3cf3eb59fa18ed39927650cfa38/langchain_core-0.3.59-py3-none-any.whl", hash = "sha256:9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70", size = 437656 }, 238 | ] 239 | 240 | [[package]] 241 | name = "langchain-gigachat" 242 | version = "0.3.10" 243 | source = { registry = "https://pypi.org/simple" } 244 | dependencies = [ 245 | { name = "gigachat" }, 246 | { name = "langchain-core" }, 247 | { name = "types-requests" }, 248 | ] 249 | sdist = { url = "https://files.pythonhosted.org/packages/46/e3/21fd8969e9cca7a22358bc7bb49fb2a1778e3eeaac52d81c92171e721fee/langchain_gigachat-0.3.10.tar.gz", hash = "sha256:67dfe48db0d35f0229dfc0c3b04d3ec90b476b512a13a6f64483f431ce8bb9a2", size = 22487 } 250 | wheels = [ 251 | { url = "https://files.pythonhosted.org/packages/20/5b/ebcfb534424f665baca147f0558e8f17e92a4dda49852050b9ed8358b05a/langchain_gigachat-0.3.10-py3-none-any.whl", hash = "sha256:a9ebf2fa1de86479001b0d5e5942427210871eb5923b1dd8a0bf9757041af23b", size = 27209 }, 252 | ] 253 | 254 | [[package]] 255 | name = "langchain-text-splitters" 256 | version = "0.3.8" 257 | source = { registry = "https://pypi.org/simple" } 258 | dependencies = [ 259 | { name = "langchain-core" }, 260 | ] 261 | sdist = { url = "https://files.pythonhosted.org/packages/e7/ac/b4a25c5716bb0103b1515f1f52cc69ffb1035a5a225ee5afe3aed28bf57b/langchain_text_splitters-0.3.8.tar.gz", hash = "sha256:116d4b9f2a22dda357d0b79e30acf005c5518177971c66a9f1ab0edfdb0f912e", size = 42128 } 262 | wheels = [ 263 | { url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl", hash = "sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02", size = 32440 }, 264 | ] 265 | 266 | [[package]] 267 | name = "langgraph" 268 | version = "0.4.3" 269 | source = { registry = "https://pypi.org/simple" } 270 | dependencies = [ 271 | { name = "langchain-core", marker = "python_full_version < '4.0'" }, 272 | { name = "langgraph-checkpoint" }, 273 | { name = "langgraph-prebuilt", marker = "python_full_version < '4.0'" }, 274 | { name = "langgraph-sdk", marker = "python_full_version < '4.0'" }, 275 | { name = "pydantic" }, 276 | { name = "xxhash" }, 277 | ] 278 | sdist = { url = "https://files.pythonhosted.org/packages/60/9e/5a64602eff18a99d0216a80eff823051ffbdb7c11b5a16171cee8b1ccce5/langgraph-0.4.3.tar.gz", hash = "sha256:272d5d5903f2c2882dbeeba849846a0f2500bd83fb3734a3801ebe64c1a60bdd", size = 125407 } 279 | wheels = [ 280 | { url = "https://files.pythonhosted.org/packages/35/53/0a20edd9f41eb3707722444ec1b43752b792bbe904d1c8cc3ba27f8eb2c8/langgraph-0.4.3-py3-none-any.whl", hash = "sha256:dec926e034f4d440b92a3c52139cb6e9763bc1791e79a6ea53a233309cec864f", size = 151191 }, 281 | ] 282 | 283 | [[package]] 284 | name = "langgraph-checkpoint" 285 | version = "2.0.25" 286 | source = { registry = "https://pypi.org/simple" } 287 | dependencies = [ 288 | { name = "langchain-core" }, 289 | { name = "ormsgpack" }, 290 | ] 291 | sdist = { url = "https://files.pythonhosted.org/packages/c5/72/d49828e6929cb3ded1472aa3e5e4a369d292c4f21021ac683d28fbc8f4f8/langgraph_checkpoint-2.0.25.tar.gz", hash = "sha256:77a63cab7b5f84dec1d49db561326ec28bdd48bcefb7fe4ac372069d2609287b", size = 36952 } 292 | wheels = [ 293 | { url = "https://files.pythonhosted.org/packages/12/52/bceb5b5348c7a60ef0625ab0a0a0a9ff5d78f0e12aed8cc55c49d5e8a8c9/langgraph_checkpoint-2.0.25-py3-none-any.whl", hash = "sha256:23416a0f5bc9dd712ac10918fc13e8c9c4530c419d2985a441df71a38fc81602", size = 42312 }, 294 | ] 295 | 296 | [[package]] 297 | name = "langgraph-prebuilt" 298 | version = "0.1.8" 299 | source = { registry = "https://pypi.org/simple" } 300 | dependencies = [ 301 | { name = "langchain-core" }, 302 | { name = "langgraph-checkpoint" }, 303 | ] 304 | sdist = { url = "https://files.pythonhosted.org/packages/57/30/f31f0e076c37d097b53e4cff5d479a3686e1991f6c86a1a4727d5d1f5489/langgraph_prebuilt-0.1.8.tar.gz", hash = "sha256:4de7659151829b2b955b6798df6800e580e617782c15c2c5b29b139697491831", size = 24543 } 305 | wheels = [ 306 | { url = "https://files.pythonhosted.org/packages/36/72/9e092665502f8f52f2708065ed14fbbba3f95d1a1b65d62049b0c5fcdf00/langgraph_prebuilt-0.1.8-py3-none-any.whl", hash = "sha256:ae97b828ae00be2cefec503423aa782e1bff165e9b94592e224da132f2526968", size = 25903 }, 307 | ] 308 | 309 | [[package]] 310 | name = "langgraph-sdk" 311 | version = "0.1.69" 312 | source = { registry = "https://pypi.org/simple" } 313 | dependencies = [ 314 | { name = "httpx" }, 315 | { name = "orjson" }, 316 | ] 317 | sdist = { url = "https://files.pythonhosted.org/packages/06/78/4ca0603240332be5fc8ebbb9bc418896310643bef32e3319a311fab37e4c/langgraph_sdk-0.1.69.tar.gz", hash = "sha256:2e85d73b78a03f9606d0fafd62048b3060371149f6f9e61f07f087fd56c766fa", size = 45343 } 318 | wheels = [ 319 | { url = "https://files.pythonhosted.org/packages/b0/e6/8e82a0373e233392d83ae37f473c9799c536b307322f0caf49a59bce9522/langgraph_sdk-0.1.69-py3-none-any.whl", hash = "sha256:0ed117bcdf67285a17c57f6265f1d94f2dbd71346cf48a8e1a5fa25e523eb6b8", size = 48905 }, 320 | ] 321 | 322 | [[package]] 323 | name = "langsmith" 324 | version = "0.3.42" 325 | source = { registry = "https://pypi.org/simple" } 326 | dependencies = [ 327 | { name = "httpx" }, 328 | { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, 329 | { name = "packaging" }, 330 | { name = "pydantic" }, 331 | { name = "requests" }, 332 | { name = "requests-toolbelt" }, 333 | { name = "zstandard" }, 334 | ] 335 | sdist = { url = "https://files.pythonhosted.org/packages/3a/44/fe171c0b0fb0377b191aebf0b7779e0c7b2a53693c6a01ddad737212495d/langsmith-0.3.42.tar.gz", hash = "sha256:2b5cbc450ab808b992362aac6943bb1d285579aa68a3a8be901d30a393458f25", size = 345619 } 336 | wheels = [ 337 | { url = "https://files.pythonhosted.org/packages/89/8e/e8a58e0abaae3f3ac4702e9ca35d1fc6159711556b64ffd0e247771a3f12/langsmith-0.3.42-py3-none-any.whl", hash = "sha256:18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff", size = 360334 }, 338 | ] 339 | 340 | [[package]] 341 | name = "orjson" 342 | version = "3.10.18" 343 | source = { registry = "https://pypi.org/simple" } 344 | sdist = { url = "https://files.pythonhosted.org/packages/81/0b/fea456a3ffe74e70ba30e01ec183a9b26bec4d497f61dcfce1b601059c60/orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53", size = 5422810 } 345 | wheels = [ 346 | { url = "https://files.pythonhosted.org/packages/04/f0/8aedb6574b68096f3be8f74c0b56d36fd94bcf47e6c7ed47a7bd1474aaa8/orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147", size = 249087 }, 347 | { url = "https://files.pythonhosted.org/packages/bc/f7/7118f965541aeac6844fcb18d6988e111ac0d349c9b80cda53583e758908/orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c", size = 133273 }, 348 | { url = "https://files.pythonhosted.org/packages/fb/d9/839637cc06eaf528dd8127b36004247bf56e064501f68df9ee6fd56a88ee/orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103", size = 136779 }, 349 | { url = "https://files.pythonhosted.org/packages/2b/6d/f226ecfef31a1f0e7d6bf9a31a0bbaf384c7cbe3fce49cc9c2acc51f902a/orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595", size = 132811 }, 350 | { url = "https://files.pythonhosted.org/packages/73/2d/371513d04143c85b681cf8f3bce743656eb5b640cb1f461dad750ac4b4d4/orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc", size = 137018 }, 351 | { url = "https://files.pythonhosted.org/packages/69/cb/a4d37a30507b7a59bdc484e4a3253c8141bf756d4e13fcc1da760a0b00cb/orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc", size = 138368 }, 352 | { url = "https://files.pythonhosted.org/packages/1e/ae/cd10883c48d912d216d541eb3db8b2433415fde67f620afe6f311f5cd2ca/orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049", size = 142840 }, 353 | { url = "https://files.pythonhosted.org/packages/6d/4c/2bda09855c6b5f2c055034c9eda1529967b042ff8d81a05005115c4e6772/orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58", size = 133135 }, 354 | { url = "https://files.pythonhosted.org/packages/13/4a/35971fd809a8896731930a80dfff0b8ff48eeb5d8b57bb4d0d525160017f/orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034", size = 134810 }, 355 | { url = "https://files.pythonhosted.org/packages/99/70/0fa9e6310cda98365629182486ff37a1c6578e34c33992df271a476ea1cd/orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1", size = 413491 }, 356 | { url = "https://files.pythonhosted.org/packages/32/cb/990a0e88498babddb74fb97855ae4fbd22a82960e9b06eab5775cac435da/orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012", size = 153277 }, 357 | { url = "https://files.pythonhosted.org/packages/92/44/473248c3305bf782a384ed50dd8bc2d3cde1543d107138fd99b707480ca1/orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f", size = 137367 }, 358 | { url = "https://files.pythonhosted.org/packages/ad/fd/7f1d3edd4ffcd944a6a40e9f88af2197b619c931ac4d3cfba4798d4d3815/orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea", size = 142687 }, 359 | { url = "https://files.pythonhosted.org/packages/4b/03/c75c6ad46be41c16f4cfe0352a2d1450546f3c09ad2c9d341110cd87b025/orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52", size = 134794 }, 360 | { url = "https://files.pythonhosted.org/packages/c2/28/f53038a5a72cc4fd0b56c1eafb4ef64aec9685460d5ac34de98ca78b6e29/orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3", size = 131186 }, 361 | ] 362 | 363 | [[package]] 364 | name = "ormsgpack" 365 | version = "1.9.1" 366 | source = { registry = "https://pypi.org/simple" } 367 | sdist = { url = "https://files.pythonhosted.org/packages/25/a7/462cf8ff5e29241868b82d3a5ec124d690eb6a6a5c6fa5bb1367b839e027/ormsgpack-1.9.1.tar.gz", hash = "sha256:3da6e63d82565e590b98178545e64f0f8506137b92bd31a2d04fd7c82baf5794", size = 56887 } 368 | wheels = [ 369 | { url = "https://files.pythonhosted.org/packages/b8/54/0390d5d092831e4df29dbafe32402891fc14b3e6ffe5a644b16cbbc9d9bc/ormsgpack-1.9.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ac61c18d9dd085e8519b949f7e655f7fb07909fd09c53b4338dd33309012e289", size = 383226 }, 370 | { url = "https://files.pythonhosted.org/packages/47/64/8b15d262d1caefead8fb22ec144f5ff7d9505fc31c22bc34598053d46fbe/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134840b8c6615da2c24ce77bd12a46098015c808197a9995c7a2d991e1904eec", size = 214057 }, 371 | { url = "https://files.pythonhosted.org/packages/57/00/65823609266bad4d5ed29ea753d24a3bdb01c7edaf923da80967fc31f9c5/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:38fd42618f626394b2c7713c5d4bcbc917254e9753d5d4cde460658b51b11a74", size = 217340 }, 372 | { url = "https://files.pythonhosted.org/packages/a0/51/e535c50f7f87b49110233647f55300d7975139ef5e51f1adb4c55f58c124/ormsgpack-1.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d36397333ad07b9eba4c2e271fa78951bd81afc059c85a6e9f6c0eb2de07cda", size = 223815 }, 373 | { url = "https://files.pythonhosted.org/packages/0c/ee/393e4a6de2a62124bf589602648f295a9fb3907a0e2fe80061b88899d072/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:603063089597917d04e4c1b1d53988a34f7dc2ff1a03adcfd1cf4ae966d5fba6", size = 394287 }, 374 | { url = "https://files.pythonhosted.org/packages/c6/d8/e56d7c3cb73a0e533e3e2a21ae5838b2aa36a9dac1ca9c861af6bae5a369/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:94bbf2b185e0cb721ceaba20e64b7158e6caf0cecd140ca29b9f05a8d5e91e2f", size = 480707 }, 375 | { url = "https://files.pythonhosted.org/packages/e6/e0/6a3c6a6dc98583a721c54b02f5195bde8f801aebdeda9b601fa2ab30ad39/ormsgpack-1.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38f380b1e8c96a712eb302b9349347385161a8e29046868ae2bfdfcb23e2692", size = 397246 }, 376 | { url = "https://files.pythonhosted.org/packages/b0/60/0ee5d790f13507e1f75ac21fc82dc1ef29afe1f520bd0f249d65b2f4839b/ormsgpack-1.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:a4bc63fb30db94075611cedbbc3d261dd17cf2aa8ff75a0fd684cd45ca29cb1b", size = 125371 }, 377 | ] 378 | 379 | [[package]] 380 | name = "packaging" 381 | version = "24.2" 382 | source = { registry = "https://pypi.org/simple" } 383 | sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } 384 | wheels = [ 385 | { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, 386 | ] 387 | 388 | [[package]] 389 | name = "pycparser" 390 | version = "2.22" 391 | source = { registry = "https://pypi.org/simple" } 392 | sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } 393 | wheels = [ 394 | { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, 395 | ] 396 | 397 | [[package]] 398 | name = "pydantic" 399 | version = "2.11.4" 400 | source = { registry = "https://pypi.org/simple" } 401 | dependencies = [ 402 | { name = "annotated-types" }, 403 | { name = "pydantic-core" }, 404 | { name = "typing-extensions" }, 405 | { name = "typing-inspection" }, 406 | ] 407 | sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540 } 408 | wheels = [ 409 | { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900 }, 410 | ] 411 | 412 | [[package]] 413 | name = "pydantic-core" 414 | version = "2.33.2" 415 | source = { registry = "https://pypi.org/simple" } 416 | dependencies = [ 417 | { name = "typing-extensions" }, 418 | ] 419 | sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } 420 | wheels = [ 421 | { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, 422 | { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, 423 | { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, 424 | { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, 425 | { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, 426 | { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, 427 | { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, 428 | { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, 429 | { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, 430 | { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, 431 | { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, 432 | { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, 433 | { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, 434 | { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, 435 | { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, 436 | { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, 437 | { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, 438 | ] 439 | 440 | [[package]] 441 | name = "python-dotenv" 442 | version = "1.1.0" 443 | source = { registry = "https://pypi.org/simple" } 444 | sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } 445 | wheels = [ 446 | { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, 447 | ] 448 | 449 | [[package]] 450 | name = "pyyaml" 451 | version = "6.0.2" 452 | source = { registry = "https://pypi.org/simple" } 453 | sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } 454 | wheels = [ 455 | { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, 456 | { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, 457 | { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, 458 | { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, 459 | { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, 460 | { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, 461 | { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, 462 | { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, 463 | { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, 464 | ] 465 | 466 | [[package]] 467 | name = "requests" 468 | version = "2.32.3" 469 | source = { registry = "https://pypi.org/simple" } 470 | dependencies = [ 471 | { name = "certifi" }, 472 | { name = "charset-normalizer" }, 473 | { name = "idna" }, 474 | { name = "urllib3" }, 475 | ] 476 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } 477 | wheels = [ 478 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, 479 | ] 480 | 481 | [[package]] 482 | name = "requests-toolbelt" 483 | version = "1.0.0" 484 | source = { registry = "https://pypi.org/simple" } 485 | dependencies = [ 486 | { name = "requests" }, 487 | ] 488 | sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } 489 | wheels = [ 490 | { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, 491 | ] 492 | 493 | [[package]] 494 | name = "sniffio" 495 | version = "1.3.1" 496 | source = { registry = "https://pypi.org/simple" } 497 | sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } 498 | wheels = [ 499 | { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, 500 | ] 501 | 502 | [[package]] 503 | name = "sqlalchemy" 504 | version = "2.0.41" 505 | source = { registry = "https://pypi.org/simple" } 506 | dependencies = [ 507 | { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, 508 | { name = "typing-extensions" }, 509 | ] 510 | sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 } 511 | wheels = [ 512 | { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491 }, 513 | { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827 }, 514 | { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224 }, 515 | { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045 }, 516 | { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357 }, 517 | { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511 }, 518 | { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420 }, 519 | { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329 }, 520 | { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 }, 521 | ] 522 | 523 | [[package]] 524 | name = "tenacity" 525 | version = "9.1.2" 526 | source = { registry = "https://pypi.org/simple" } 527 | sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } 528 | wheels = [ 529 | { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, 530 | ] 531 | 532 | [[package]] 533 | name = "types-requests" 534 | version = "2.32.0.20250328" 535 | source = { registry = "https://pypi.org/simple" } 536 | dependencies = [ 537 | { name = "urllib3" }, 538 | ] 539 | sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995 } 540 | wheels = [ 541 | { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663 }, 542 | ] 543 | 544 | [[package]] 545 | name = "typing-extensions" 546 | version = "4.13.2" 547 | source = { registry = "https://pypi.org/simple" } 548 | sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } 549 | wheels = [ 550 | { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, 551 | ] 552 | 553 | [[package]] 554 | name = "typing-inspection" 555 | version = "0.4.0" 556 | source = { registry = "https://pypi.org/simple" } 557 | dependencies = [ 558 | { name = "typing-extensions" }, 559 | ] 560 | sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } 561 | wheels = [ 562 | { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, 563 | ] 564 | 565 | [[package]] 566 | name = "urllib3" 567 | version = "2.4.0" 568 | source = { registry = "https://pypi.org/simple" } 569 | sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } 570 | wheels = [ 571 | { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, 572 | ] 573 | 574 | [[package]] 575 | name = "xxhash" 576 | version = "3.5.0" 577 | source = { registry = "https://pypi.org/simple" } 578 | sdist = { url = "https://files.pythonhosted.org/packages/00/5e/d6e5258d69df8b4ed8c83b6664f2b47d30d2dec551a29ad72a6c69eafd31/xxhash-3.5.0.tar.gz", hash = "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", size = 84241 } 579 | wheels = [ 580 | { url = "https://files.pythonhosted.org/packages/c9/b8/e4b3ad92d249be5c83fa72916c9091b0965cb0faeff05d9a0a3870ae6bff/xxhash-3.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", size = 31795 }, 581 | { url = "https://files.pythonhosted.org/packages/fc/d8/b3627a0aebfbfa4c12a41e22af3742cf08c8ea84f5cc3367b5de2d039cce/xxhash-3.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", size = 30792 }, 582 | { url = "https://files.pythonhosted.org/packages/c3/cc/762312960691da989c7cd0545cb120ba2a4148741c6ba458aa723c00a3f8/xxhash-3.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", size = 220950 }, 583 | { url = "https://files.pythonhosted.org/packages/fe/e9/cc266f1042c3c13750e86a535496b58beb12bf8c50a915c336136f6168dc/xxhash-3.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", size = 199980 }, 584 | { url = "https://files.pythonhosted.org/packages/bf/85/a836cd0dc5cc20376de26b346858d0ac9656f8f730998ca4324921a010b9/xxhash-3.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", size = 428324 }, 585 | { url = "https://files.pythonhosted.org/packages/b4/0e/15c243775342ce840b9ba34aceace06a1148fa1630cd8ca269e3223987f5/xxhash-3.5.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", size = 194370 }, 586 | { url = "https://files.pythonhosted.org/packages/87/a1/b028bb02636dfdc190da01951d0703b3d904301ed0ef6094d948983bef0e/xxhash-3.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", size = 207911 }, 587 | { url = "https://files.pythonhosted.org/packages/80/d5/73c73b03fc0ac73dacf069fdf6036c9abad82de0a47549e9912c955ab449/xxhash-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", size = 216352 }, 588 | { url = "https://files.pythonhosted.org/packages/b6/2a/5043dba5ddbe35b4fe6ea0a111280ad9c3d4ba477dd0f2d1fe1129bda9d0/xxhash-3.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", size = 203410 }, 589 | { url = "https://files.pythonhosted.org/packages/a2/b2/9a8ded888b7b190aed75b484eb5c853ddd48aa2896e7b59bbfbce442f0a1/xxhash-3.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", size = 210322 }, 590 | { url = "https://files.pythonhosted.org/packages/98/62/440083fafbc917bf3e4b67c2ade621920dd905517e85631c10aac955c1d2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", size = 414725 }, 591 | { url = "https://files.pythonhosted.org/packages/75/db/009206f7076ad60a517e016bb0058381d96a007ce3f79fa91d3010f49cc2/xxhash-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", size = 192070 }, 592 | { url = "https://files.pythonhosted.org/packages/1f/6d/c61e0668943a034abc3a569cdc5aeae37d686d9da7e39cf2ed621d533e36/xxhash-3.5.0-cp313-cp313-win32.whl", hash = "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", size = 30172 }, 593 | { url = "https://files.pythonhosted.org/packages/96/14/8416dce965f35e3d24722cdf79361ae154fa23e2ab730e5323aa98d7919e/xxhash-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", size = 30041 }, 594 | { url = "https://files.pythonhosted.org/packages/27/ee/518b72faa2073f5aa8e3262408d284892cb79cf2754ba0c3a5870645ef73/xxhash-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", size = 26801 }, 595 | ] 596 | 597 | [[package]] 598 | name = "zstandard" 599 | version = "0.23.0" 600 | source = { registry = "https://pypi.org/simple" } 601 | dependencies = [ 602 | { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, 603 | ] 604 | sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } 605 | wheels = [ 606 | { url = "https://files.pythonhosted.org/packages/80/f1/8386f3f7c10261fe85fbc2c012fdb3d4db793b921c9abcc995d8da1b7a80/zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", size = 788975 }, 607 | { url = "https://files.pythonhosted.org/packages/16/e8/cbf01077550b3e5dc86089035ff8f6fbbb312bc0983757c2d1117ebba242/zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", size = 633448 }, 608 | { url = "https://files.pythonhosted.org/packages/06/27/4a1b4c267c29a464a161aeb2589aff212b4db653a1d96bffe3598f3f0d22/zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", size = 4945269 }, 609 | { url = "https://files.pythonhosted.org/packages/7c/64/d99261cc57afd9ae65b707e38045ed8269fbdae73544fd2e4a4d50d0ed83/zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", size = 5306228 }, 610 | { url = "https://files.pythonhosted.org/packages/7a/cf/27b74c6f22541f0263016a0fd6369b1b7818941de639215c84e4e94b2a1c/zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", size = 5336891 }, 611 | { url = "https://files.pythonhosted.org/packages/fa/18/89ac62eac46b69948bf35fcd90d37103f38722968e2981f752d69081ec4d/zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", size = 5436310 }, 612 | { url = "https://files.pythonhosted.org/packages/a8/a8/5ca5328ee568a873f5118d5b5f70d1f36c6387716efe2e369010289a5738/zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", size = 4859912 }, 613 | { url = "https://files.pythonhosted.org/packages/ea/ca/3781059c95fd0868658b1cf0440edd832b942f84ae60685d0cfdb808bca1/zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", size = 4936946 }, 614 | { url = "https://files.pythonhosted.org/packages/ce/11/41a58986f809532742c2b832c53b74ba0e0a5dae7e8ab4642bf5876f35de/zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", size = 5466994 }, 615 | { url = "https://files.pythonhosted.org/packages/83/e3/97d84fe95edd38d7053af05159465d298c8b20cebe9ccb3d26783faa9094/zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", size = 4848681 }, 616 | { url = "https://files.pythonhosted.org/packages/6e/99/cb1e63e931de15c88af26085e3f2d9af9ce53ccafac73b6e48418fd5a6e6/zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", size = 4694239 }, 617 | { url = "https://files.pythonhosted.org/packages/ab/50/b1e703016eebbc6501fc92f34db7b1c68e54e567ef39e6e59cf5fb6f2ec0/zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", size = 5200149 }, 618 | { url = "https://files.pythonhosted.org/packages/aa/e0/932388630aaba70197c78bdb10cce2c91fae01a7e553b76ce85471aec690/zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", size = 5655392 }, 619 | { url = "https://files.pythonhosted.org/packages/02/90/2633473864f67a15526324b007a9f96c96f56d5f32ef2a56cc12f9548723/zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", size = 5191299 }, 620 | { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, 621 | { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, 622 | ] 623 | --------------------------------------------------------------------------------