From 9e1546aed863a068fe05189f2a4bd8b75ab1b3dc Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Thu, 8 May 2025 10:13:23 +0200 Subject: [PATCH 01/35] =?UTF-8?q?MCP=E3=83=AD=E3=83=BC=E3=82=AB=E3=83=AB?= =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=AE=9F=E8=A1=8C=E7=94=A8=E3=81=AB=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-for-developer.md | 3 ++- src/middleman_ai/mcp/server.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README-for-developer.md b/README-for-developer.md index 700a251..4e5c124 100644 --- a/README-for-developer.md +++ b/README-for-developer.md @@ -23,7 +23,8 @@ Claude Desktop アプリケーションの`claude_desktop_config.json`を以下 "command": "/path/to/python", "args": ["/path/to/middleman_ai/mcp/server.py"], "env": { - "MIDDLEMAN_API_KEY": "xxxxx" + "MIDDLEMAN_API_KEY": "xxxxx", + "MIDDLEMAN_BASE_URL_VCR": "http://0.0.0.0:8000" } } } diff --git a/src/middleman_ai/mcp/server.py b/src/middleman_ai/mcp/server.py index a4d1b23..7acd365 100644 --- a/src/middleman_ai/mcp/server.py +++ b/src/middleman_ai/mcp/server.py @@ -16,7 +16,8 @@ mcp = FastMCP("Middleman Tools") api_key = os.environ.get("MIDDLEMAN_API_KEY", "") -client = ToolsClient(api_key=api_key) +base_url = os.environ.get("MIDDLEMAN_BASE_URL_VCR", "https://middleman-ai.com/") +client = ToolsClient(api_key=api_key, base_url=base_url) @mcp.tool() From de01586a3e750df45f7c0e611b8030567245180c Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Thu, 8 May 2025 10:16:05 +0200 Subject: [PATCH 02/35] =?UTF-8?q?MCP=E3=81=ABmd=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=8B=E3=82=89=E5=A4=89=E6=8F=9B=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=83=84=E3=83=BC=E3=83=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/mcp/server.py | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/middleman_ai/mcp/server.py b/src/middleman_ai/mcp/server.py index 7acd365..e525292 100644 --- a/src/middleman_ai/mcp/server.py +++ b/src/middleman_ai/mcp/server.py @@ -1,5 +1,6 @@ import os import sys +from pathlib import Path from typing import Any, Dict, List from mcp.server.fastmcp import FastMCP @@ -36,6 +37,27 @@ def md_to_pdf(markdown_text: str, pdf_template_id: str | None = None) -> str: return client.md_to_pdf(markdown_text, pdf_template_id=pdf_template_id) +@mcp.tool() +def md_file_to_pdf(md_file_full_path: str, pdf_template_id: str | None = None) -> str: + """ + Convert a Markdown file to PDF and return the download URL. + + Args: + md_file_full_path: Path to the local Markdown file + pdf_template_id: Optional ID of the PDF template to use. + If not provided, the default template will be used + + Returns: + The URL to download the generated PDF + """ + if not md_file_full_path.startswith("/"): + raise ValueError("md_file_full_path must start with '/'") + + with Path(md_file_full_path).open("r") as f: + md_text = f.read() + return client.md_to_pdf(md_text, pdf_template_id=pdf_template_id) + + @mcp.tool() def md_to_docx(markdown_text: str) -> str: """ @@ -50,6 +72,25 @@ def md_to_docx(markdown_text: str) -> str: return client.md_to_docx(markdown_text) +@mcp.tool() +def md_file_to_docx(md_file_full_path: str) -> str: + """ + Convert a Markdown file to DOCX and return the download URL. + + Args: + md_file_full_path: Path to the local Markdown file + + Returns: + The URL to download the generated DOCX + """ + if not md_file_full_path.startswith("/"): + raise ValueError("md_file_full_path must start with '/'") + + with Path(md_file_full_path).open("r") as f: + md_text = f.read() + return client.md_to_docx(md_text) + + @mcp.tool() def pdf_to_page_images(pdf_file_path: str) -> List[Dict[str, Any]]: """ From 24830bb1878ac3fe1c1c732e7ce3d2b0eabdd0e1 Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Thu, 8 May 2025 11:30:59 +0200 Subject: [PATCH 03/35] =?UTF-8?q?MCP=E3=81=AESTG=E7=92=B0=E5=A2=83?= =?UTF-8?q?=E3=81=AE=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-for-developer.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README-for-developer.md b/README-for-developer.md index 4e5c124..882d781 100644 --- a/README-for-developer.md +++ b/README-for-developer.md @@ -33,6 +33,8 @@ Claude Desktop アプリケーションの`claude_desktop_config.json`を以下 ### PyPI テスト環境で MCP サーバー実行 +⚠ 配布直後、最新のバージョンが反映されるまで数分かかることがあります。 + ```json { "mcpServers": { @@ -46,11 +48,12 @@ Claude Desktop アプリケーションの`claude_desktop_config.json`を以下 "--index-strategy", "unsafe-best-match", "--from", - "middleman-ai==0.0.x", + "middleman-ai", "mcp-server" ], "env": { - "MIDDLEMAN_API_KEY": "xxxxx" + "MIDDLEMAN_API_KEY": "xxxxx", + "MIDDLEMAN_BASE_URL_VCR": "https://stg.middleman-ai.com/" } } } From 27ab533faea1f0da55fb2f5caf4f363645ae7a76 Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Thu, 8 May 2025 12:02:47 +0200 Subject: [PATCH 04/35] =?UTF-8?q?middleman-ai=20=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4f32ddd..59c0d7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "middleman-ai" -version = "0.1.0" +version = "0.1.1.0" description = "Python client SDK for Middleman.ai API" authors = [{ name = "Generative Agents, Inc." }] dependencies = [ diff --git a/uv.lock b/uv.lock index 7de9f06..5ed5a1e 100644 --- a/uv.lock +++ b/uv.lock @@ -593,7 +593,7 @@ wheels = [ [[package]] name = "middleman-ai" -version = "0.1.0" +version = "0.1.1.0" source = { editable = "." } dependencies = [ { name = "click" }, From eab9dc09c5de015938575c74616422865506b3d6 Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Thu, 8 May 2025 12:02:59 +0200 Subject: [PATCH 05/35] =?UTF-8?q?MCP=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3=E3=82=B0=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/mcp/server.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/middleman_ai/mcp/server.py b/src/middleman_ai/mcp/server.py index e525292..33800dc 100644 --- a/src/middleman_ai/mcp/server.py +++ b/src/middleman_ai/mcp/server.py @@ -50,10 +50,15 @@ def md_file_to_pdf(md_file_full_path: str, pdf_template_id: str | None = None) - Returns: The URL to download the generated PDF """ - if not md_file_full_path.startswith("/"): - raise ValueError("md_file_full_path must start with '/'") - - with Path(md_file_full_path).open("r") as f: + file_path = Path(md_file_full_path) + if not file_path.exists(): + raise ValueError(f"File not found: {md_file_full_path}") + if not file_path.is_file(): + raise ValueError(f"Path is not a file: {md_file_full_path}") + if not os.access(file_path, os.R_OK): + raise ValueError(f"File not readable: {md_file_full_path}") + + with file_path.open("r") as f: md_text = f.read() return client.md_to_pdf(md_text, pdf_template_id=pdf_template_id) @@ -83,10 +88,15 @@ def md_file_to_docx(md_file_full_path: str) -> str: Returns: The URL to download the generated DOCX """ - if not md_file_full_path.startswith("/"): - raise ValueError("md_file_full_path must start with '/'") + file_path = Path(md_file_full_path) + if not file_path.exists(): + raise ValueError(f"File not found: {md_file_full_path}") + if not file_path.is_file(): + raise ValueError(f"Path is not a file: {md_file_full_path}") + if not os.access(file_path, os.R_OK): + raise ValueError(f"File not readable: {md_file_full_path}") - with Path(md_file_full_path).open("r") as f: + with file_path.open("r") as f: md_text = f.read() return client.md_to_docx(md_text) From 20412a180ae151a01f1a069389da17292a641fc8 Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Thu, 8 May 2025 12:19:02 +0200 Subject: [PATCH 06/35] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_mcp.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/test_mcp.py b/tests/test_mcp.py index ff13338..2925dce 100644 --- a/tests/test_mcp.py +++ b/tests/test_mcp.py @@ -10,6 +10,8 @@ json_to_pptx_analyze, json_to_pptx_execute, mcp, + md_file_to_docx, + md_file_to_pdf, md_to_docx, md_to_pdf, pdf_to_page_images, @@ -150,3 +152,51 @@ def test_run_server(mocker: "MockerFixture") -> None: run_server() mock_mcp.run.assert_called_once_with(transport="stdio") + + +def test_md_file_to_pdf_tool(mocker: "MockerFixture") -> None: + """md_file_to_pdfツールのテスト。""" + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_path = mocker.patch("middleman_ai.mcp.server.Path") + mock_os_access = mocker.patch("middleman_ai.mcp.server.os.access") + # mock_open を変数に束縛せず、Pathオブジェクトのopenメソッドのモックを設定 + mock_file_handle = mocker.MagicMock() + mock_file_handle.read.return_value = "# Test MD" + mock_path.return_value.open.return_value.__enter__.return_value = mock_file_handle + + mock_path.return_value.exists.return_value = True + mock_path.return_value.is_file.return_value = True + mock_client.md_to_pdf.return_value = "https://example.com/test_file.pdf" + + file_path = "/fake/path/to/test.md" + result = md_file_to_pdf(file_path) + + assert result == "https://example.com/test_file.pdf" + mock_path.assert_called_once_with(file_path) + mock_path.return_value.open.assert_called_once_with("r") + mock_client.md_to_pdf.assert_called_once_with("# Test MD", pdf_template_id=None) + mock_os_access.assert_called_once_with(mock_path.return_value, mocker.ANY) + + +def test_md_file_to_docx_tool(mocker: "MockerFixture") -> None: + """md_file_to_docxツールのテスト。""" + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_path = mocker.patch("middleman_ai.mcp.server.Path") + mock_os_access = mocker.patch("middleman_ai.mcp.server.os.access") + # mock_open を変数に束縛せず、Pathオブジェクトのopenメソッドのモックを設定 + mock_file_handle = mocker.MagicMock() + mock_file_handle.read.return_value = "# Test MD" + mock_path.return_value.open.return_value.__enter__.return_value = mock_file_handle + + mock_path.return_value.exists.return_value = True + mock_path.return_value.is_file.return_value = True + mock_client.md_to_docx.return_value = "https://example.com/test_file.docx" + + file_path = "/fake/path/to/test.md" + result = md_file_to_docx(file_path) + + assert result == "https://example.com/test_file.docx" + mock_path.assert_called_once_with(file_path) + mock_path.return_value.open.assert_called_once_with("r") + mock_client.md_to_docx.assert_called_once_with("# Test MD") + mock_os_access.assert_called_once_with(mock_path.return_value, mocker.ANY) From 403161cd5ff1161856460a6295b5ecc4ab128b6f Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Fri, 9 May 2025 08:54:34 +0200 Subject: [PATCH 07/35] MIDDLEMAN_BASE_URL_VCR => MIDDLEMAN_BASE_URL --- .env.test.sample | 2 +- README-for-developer.md | 4 ++-- src/middleman_ai/mcp/server.py | 2 +- tests/test_client_vcr.py | 2 +- tests/test_langchain_tools_vcr.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.env.test.sample b/.env.test.sample index 71dc89b..07014d4 100644 --- a/.env.test.sample +++ b/.env.test.sample @@ -1,4 +1,4 @@ -MIDDLEMAN_BASE_URL_VCR=https://middleman-ai.com +MIDDLEMAN_BASE_URL=https://middleman-ai.com MIDDLEMAN_API_KEY_VCR=your_test_api_key MIDDLEMAN_TEST_PDF_TEMPLATE_ID=your_test_pdf_template_id MIDDLEMAN_TEST_PPTX_TEMPLATE_ID=your_test_pptx_template_id diff --git a/README-for-developer.md b/README-for-developer.md index 882d781..00f9a23 100644 --- a/README-for-developer.md +++ b/README-for-developer.md @@ -24,7 +24,7 @@ Claude Desktop アプリケーションの`claude_desktop_config.json`を以下 "args": ["/path/to/middleman_ai/mcp/server.py"], "env": { "MIDDLEMAN_API_KEY": "xxxxx", - "MIDDLEMAN_BASE_URL_VCR": "http://0.0.0.0:8000" + "MIDDLEMAN_BASE_URL": "http://0.0.0.0:8000" } } } @@ -53,7 +53,7 @@ Claude Desktop アプリケーションの`claude_desktop_config.json`を以下 ], "env": { "MIDDLEMAN_API_KEY": "xxxxx", - "MIDDLEMAN_BASE_URL_VCR": "https://stg.middleman-ai.com/" + "MIDDLEMAN_BASE_URL": "https://stg.middleman-ai.com/" } } } diff --git a/src/middleman_ai/mcp/server.py b/src/middleman_ai/mcp/server.py index 33800dc..4ec52b7 100644 --- a/src/middleman_ai/mcp/server.py +++ b/src/middleman_ai/mcp/server.py @@ -17,7 +17,7 @@ mcp = FastMCP("Middleman Tools") api_key = os.environ.get("MIDDLEMAN_API_KEY", "") -base_url = os.environ.get("MIDDLEMAN_BASE_URL_VCR", "https://middleman-ai.com/") +base_url = os.environ.get("MIDDLEMAN_BASE_URL", "https://middleman-ai.com/") client = ToolsClient(api_key=api_key, base_url=base_url) diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index 88b1156..428c0a2 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -21,7 +21,7 @@ def client() -> ToolsClient: ToolsClient: テスト用のクライアントインスタンス """ return ToolsClient( - base_url=os.getenv("MIDDLEMAN_BASE_URL_VCR") or "https://middleman-ai.com", + base_url=os.getenv("MIDDLEMAN_BASE_URL") or "https://middleman-ai.com", api_key=os.getenv("MIDDLEMAN_API_KEY_VCR") or "", ) diff --git a/tests/test_langchain_tools_vcr.py b/tests/test_langchain_tools_vcr.py index a8f1bf3..a2c8887 100644 --- a/tests/test_langchain_tools_vcr.py +++ b/tests/test_langchain_tools_vcr.py @@ -31,7 +31,7 @@ def client() -> ToolsClient: ToolsClient: テスト用のクライアントインスタンス """ return ToolsClient( - base_url=os.getenv("MIDDLEMAN_BASE_URL_VCR") or "https://middleman-ai.com", + base_url=os.getenv("MIDDLEMAN_BASE_URL") or "https://middleman-ai.com", api_key=os.getenv("MIDDLEMAN_API_KEY_VCR") or "", ) From d39be8ad8d453f5fb9f1c0cca62cb193951c55d8 Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Fri, 9 May 2025 08:54:48 +0200 Subject: [PATCH 08/35] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=920.1.1=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 59c0d7b..a4797e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "middleman-ai" -version = "0.1.1.0" +version = "0.1.1" description = "Python client SDK for Middleman.ai API" authors = [{ name = "Generative Agents, Inc." }] dependencies = [ diff --git a/uv.lock b/uv.lock index 5ed5a1e..d297a31 100644 --- a/uv.lock +++ b/uv.lock @@ -593,7 +593,7 @@ wheels = [ [[package]] name = "middleman-ai" -version = "0.1.1.0" +version = "0.1.1" source = { editable = "." } dependencies = [ { name = "click" }, From 74b382782b06bce8167edbe58e17ee7a70bdabdc Mon Sep 17 00:00:00 2001 From: hitoshi-hasegawa Date: Fri, 9 May 2025 10:23:58 +0200 Subject: [PATCH 09/35] =?UTF-8?q?CHANGELOG=E3=81=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0d74e0..43db13a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ フォーマットは[Keep a Changelog](https://keepachangelog.com/ja/)に基づいています。 +## [v0.1.1] - 2025-05-09 + +### 追加 + +- ローカルの Markdown ファイルパスを指定して PDF に変換する MCP ツール (`md_file_to_pdf`) を追加 +- ローカルの Markdown ファイルパスを指定して DOCX に変換する MCP ツール (`md_file_to_docx`) を追加 + ## [v0.1.0] - 2025-04-28 ### 追加 From 601958e655a17fdd3516a133a1809e22f35fc9ca Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 13:03:24 +0900 Subject: [PATCH 10/35] =?UTF-8?q?=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=81=A7=E3=81=AF=E3=83=AA=E3=83=86=E3=83=A9=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E3=83=99=E3=82=BF=E6=89=93=E3=81=A1=E3=82=92=E8=A8=B1?= =?UTF-8?q?=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 3 +++ tests/test_client.py | 2 +- tests/test_client_vcr.py | 2 -- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a4797e4..c8a69ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,9 @@ lint.ignore = ["RUF001", "RUF002", "RUF022", "N818"] [tool.ruff.isort] known-first-party = ["middleman_ai"] +[tool.ruff.lint.extend-per-file-ignores] +"tests/**/*.py" = ["PLR2004"] + [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] diff --git a/tests/test_client.py b/tests/test_client.py index d2223fe..fb862fe 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -46,7 +46,7 @@ def test_init(client: ToolsClient) -> None: """初期化のテスト。""" assert client.api_key == "test_api_key" assert client.base_url == "https://middleman-ai.com" - assert client.timeout == 30.0 # noqa: PLR2004 + assert client.timeout == 30.0 assert client.session.headers["Authorization"] == "Bearer test_api_key" assert client.session.headers["Content-Type"] == "application/json" diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index 428c0a2..c966aa3 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -1,5 +1,3 @@ -# ruff: noqa: PLR2004 - """LangChainツール群のVCRテストモジュール。""" import os From 8200a1ae6a1e445b9129bd7c09b11a80623b58bf Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 13:03:38 +0900 Subject: [PATCH 11/35] =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=AF=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-for-developer.md | 2 +- tests/conftest.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README-for-developer.md b/README-for-developer.md index 00f9a23..0455d19 100644 --- a/README-for-developer.md +++ b/README-for-developer.md @@ -53,7 +53,7 @@ Claude Desktop アプリケーションの`claude_desktop_config.json`を以下 ], "env": { "MIDDLEMAN_API_KEY": "xxxxx", - "MIDDLEMAN_BASE_URL": "https://stg.middleman-ai.com/" + "MIDDLEMAN_BASE_URL": "${各環境のAPIベースURL}" } } } diff --git a/tests/conftest.py b/tests/conftest.py index a6f4d53..2e2e48f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -75,7 +75,10 @@ def _set_version_string(self: VCRHTTPResponse, value: str) -> None: def scrub_uri_request(request: Any) -> Any: - """リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する""" + """ + リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する + 本番環境以外のURLが露出することを避けるための処置です + """ req = copy.deepcopy(request) # ミュータブルに触らず安全に p = urlparse(req.uri) redacted = urlunparse( From ba143dade64843a44a998d6309b6ec50eadcf30b Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 13:04:24 +0900 Subject: [PATCH 12/35] =?UTF-8?q?=E3=83=90=E3=83=AA=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=A8=E3=83=A9=E3=83=BC=E7=B3=BB?= =?UTF-8?q?=E3=82=92BadRequestError=E3=81=AB=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/client.py | 7 +++++-- src/middleman_ai/exceptions.py | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index 64c70c2..230c08e 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -9,10 +9,10 @@ from pydantic import ValidationError as PydanticValidationError from .exceptions import ( + BadRequestError, ConnectionError, ForbiddenError, InternalError, - MiddlemanBaseException, NotEnoughCreditError, NotFoundError, ValidationError, @@ -29,6 +29,7 @@ ) # HTTPステータスコード +HTTP_BAD_REQUEST = 400 HTTP_PAYMENT_REQUIRED = 402 HTTP_UNAUTHORIZED = 401 HTTP_FORBIDDEN = 403 @@ -116,6 +117,8 @@ def _handle_response(self, response: requests.Response) -> Dict[str, Any]: except json.JSONDecodeError: pass + if response.status_code == HTTP_BAD_REQUEST: + raise BadRequestError() from e if response.status_code == HTTP_PAYMENT_REQUIRED: raise NotEnoughCreditError() from e if response.status_code in (HTTP_UNAUTHORIZED, HTTP_FORBIDDEN): @@ -141,7 +144,7 @@ def _handle_response(self, response: requests.Response) -> Dict[str, Any]: f"Validation error: {error_body}" if error_body else str(e) ) raise ValidationError(error_message) from e - raise MiddlemanBaseException(str(e)) from e + raise BadRequestError(str(e)) from e except requests.exceptions.RequestException as e: raise ConnectionError() from e except json.JSONDecodeError as e: diff --git a/src/middleman_ai/exceptions.py b/src/middleman_ai/exceptions.py index 8f44474..6cb3613 100644 --- a/src/middleman_ai/exceptions.py +++ b/src/middleman_ai/exceptions.py @@ -19,6 +19,10 @@ class NotEnoughCreditError(MiddlemanBaseException): """クレジット不足によりAPIの実行ができません。""" +class BadRequestError(MiddlemanBaseException): + """リクエストが不正です。""" + + class ForbiddenError(MiddlemanBaseException): """APIキーが無効か、アクセス権限がありません。""" From ba9570aa8ce65ba84812fb7bf81e187be81def77 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 13:11:32 +0900 Subject: [PATCH 13/35] =?UTF-8?q?md=5Fto=5Fdocx=E3=82=AF=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=82=A2=E3=83=B3=E3=83=88=E3=81=AB=E3=83=86=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=83=88ID=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=97=E6=97=A2=E5=AD=98=E3=81=AE=E5=8D=98=E4=BD=93=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.test.sample | 2 +- src/middleman_ai/client.py | 13 +++++++++++-- tests/cassettes/test_md_to_docx_tool_vcr.yaml | 2 +- tests/cassettes/test_md_to_docx_vcr.yaml | 2 +- tests/test_client_vcr.py | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.env.test.sample b/.env.test.sample index 07014d4..d6eb1bd 100644 --- a/.env.test.sample +++ b/.env.test.sample @@ -1,4 +1,4 @@ MIDDLEMAN_BASE_URL=https://middleman-ai.com -MIDDLEMAN_API_KEY_VCR=your_test_api_key +MIDDLEMAN_API_KEY=your_test_api_key MIDDLEMAN_TEST_PDF_TEMPLATE_ID=your_test_pdf_template_id MIDDLEMAN_TEST_PPTX_TEMPLATE_ID=your_test_pptx_template_id diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index 230c08e..1235ed7 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -155,6 +155,7 @@ def md_to_pdf(self, markdown_text: str, pdf_template_id: str | None = None) -> s Args: markdown_text: 変換対象のMarkdown文字列 + pdf_template_id: テンプレートID(UUID) Returns: str: 生成されたPDFのURL @@ -180,11 +181,16 @@ def md_to_pdf(self, markdown_text: str, pdf_template_id: str | None = None) -> s except requests.exceptions.RequestException as e: raise ConnectionError() from e - def md_to_docx(self, markdown_text: str) -> str: + def md_to_docx( + self, + markdown_text: str, + docx_template_id: str | None = None, + ) -> str: """Markdown文字列をDOCXに変換し、DOCXのダウンロードURLを返します。 Args: markdown_text: 変換対象のMarkdown文字列 + docx_template_id: テンプレートID(UUID) Returns: str: 生成されたDOCXのURL @@ -196,7 +202,10 @@ def md_to_docx(self, markdown_text: str) -> str: try: response = self.session.post( f"{self.base_url}/api/v1/tools/md-to-docx", - json={"markdown": markdown_text}, + json={ + "markdown": markdown_text, + "template_id": docx_template_id, + }, timeout=self.timeout, ) data = self._handle_response(response) diff --git a/tests/cassettes/test_md_to_docx_tool_vcr.yaml b/tests/cassettes/test_md_to_docx_tool_vcr.yaml index 843d05e..60172a5 100644 --- a/tests/cassettes/test_md_to_docx_tool_vcr.yaml +++ b/tests/cassettes/test_md_to_docx_tool_vcr.yaml @@ -2,7 +2,7 @@ interactions: - request: body: '{"markdown": "# Test Heading\n\n This is a test markdown document.\n\n ## - Section 1\n - Item 1\n - Item 2\n "}' + Section 1\n - Item 1\n - Item 2\n ", "template_id": null}' headers: Accept: - "*/*" diff --git a/tests/cassettes/test_md_to_docx_vcr.yaml b/tests/cassettes/test_md_to_docx_vcr.yaml index 158d731..8b48142 100644 --- a/tests/cassettes/test_md_to_docx_vcr.yaml +++ b/tests/cassettes/test_md_to_docx_vcr.yaml @@ -2,7 +2,7 @@ interactions: - request: body: '{"markdown": "# Test Heading\n\n This is a test markdown document.\n\n ## - Section 1\n - Item 1\n - Item 2\n "}' + Section 1\n - Item 1\n - Item 2\n ", "template_id": null}' headers: Accept: - "*/*" diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index c966aa3..8a943d2 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -20,7 +20,7 @@ def client() -> ToolsClient: """ return ToolsClient( base_url=os.getenv("MIDDLEMAN_BASE_URL") or "https://middleman-ai.com", - api_key=os.getenv("MIDDLEMAN_API_KEY_VCR") or "", + api_key=os.getenv("MIDDLEMAN_API_KEY") or "", ) From edc523fab4be20b933195c5939081ee0bccaa1d1 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 15:33:21 +0900 Subject: [PATCH 14/35] =?UTF-8?q?md=5Fto=5Fdocx=E3=81=AE=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=82=A2=E3=83=B3=E3=83=88=E5=8D=98=E4=BD=93=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E4=BF=AE=E6=AD=A3=20&=20VCR=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=A7=E7=92=B0=E5=A2=83=E4=BE=9D=E5=AD=98?= =?UTF-8?q?=E3=81=AE=E5=80=A4=E3=81=AF=E3=83=9E=E3=82=B9=E3=82=AF=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=82=AB=E3=82=BB=E3=83=83=E3=83=88=E3=81=AB=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E3=81=99=E3=82=8B=E4=BB=95=E7=B5=84=E3=81=BF=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/client.py | 2 +- .../test_json_to_pptx_analyze_v2_vcr.yaml | 123 +++++++++--------- .../test_json_to_pptx_execute_v2_vcr.yaml | 3 +- tests/cassettes/test_md_to_docx_tool_vcr.yaml | 2 +- tests/cassettes/test_md_to_docx_vcr.yaml | 2 +- .../test_md_to_docx_with_template_id_vcr.yaml | 47 +++++++ .../test_md_to_pdf_with_template_id_vcr.yaml | 2 +- tests/cli/test_cli.py | 4 - tests/conftest.py | 17 +-- tests/test_client_vcr.py | 50 ++++++- tests/vcr_utils.py | 32 +++++ 11 files changed, 200 insertions(+), 84 deletions(-) create mode 100644 tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml create mode 100644 tests/vcr_utils.py diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index 1235ed7..bc21f46 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -204,7 +204,7 @@ def md_to_docx( f"{self.base_url}/api/v1/tools/md-to-docx", json={ "markdown": markdown_text, - "template_id": docx_template_id, + "docx_template_id": docx_template_id, }, timeout=self.timeout, ) diff --git a/tests/cassettes/test_json_to_pptx_analyze_v2_vcr.yaml b/tests/cassettes/test_json_to_pptx_analyze_v2_vcr.yaml index 0503a19..8b300e8 100644 --- a/tests/cassettes/test_json_to_pptx_analyze_v2_vcr.yaml +++ b/tests/cassettes/test_json_to_pptx_analyze_v2_vcr.yaml @@ -1,63 +1,64 @@ interactions: -- request: - body: '{"pptx_template_id": "19823658-6af5-4560-ab87-632da39511de"}' - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate, zstd - Connection: - - keep-alive - Content-Length: - - '60' - Content-Type: - - application/json - User-Agent: - - python-requests/2.32.3 - authorization: - - DUMMY - method: POST - uri: https://middleman-ai.com/api/v2/tools/json-to-pptx/analyze - response: - body: - string: '{"important_remark_for_user":"- The ''slides'' field contains the slides - definition provided in the template.\n- Generate the presentation content - by filling in the placeholder values for the slide you selected to use according - to the JSON schema defined in ''json_to_pptx_presentation_schema''.\n- When - calling the json-to-pptx/execute endpoint, use the provided schema to structure - your ''presentation'' field data. \n- The URL expires in 1 hour. Please note - that you will not be able to download the file after it has expired.","slides":[{"position":1,"type":"Title","description":"Please - use this slide to create title slide of presentation","placeholders":[{"name":"title","description":"Presentation - title"}]},{"position":2,"type":"Common","description":"Please use this slide - to create content.","placeholders":[{"name":"title","description":"Input slide - title here"},{"name":"content","description":"Input slide content here"},{"name":"image","description":"Input - slide image url here"}]}],"json_to_pptx_presentation_schema":{"$defs":{"Placeholder":{"properties":{"name":{"description":"The - key of the placeholder","title":"Name","type":"string"},"content":{"description":"The - content of the placeholder","title":"Content","type":"string"}},"required":["name","content"],"title":"Placeholder","type":"object"},"Slide":{"properties":{"type":{"description":"The - type of the slide","title":"Type","type":"string"},"placeholders":{"description":"The - placeholders of the slide","items":{"$ref":"#/$defs/Placeholder"},"title":"Placeholders","type":"array"},"speaker_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Additional - notes for the slide intended for the presenter. These notes provide extra - context or cues during the presentation and are not visible to the audience.","title":"Speaker - Notes"}},"required":["type","placeholders"],"title":"Slide","type":"object"}},"properties":{"slides":{"description":"The - slides of the presentation","items":{"$ref":"#/$defs/Slide"},"title":"Slides","type":"array"}},"required":["slides"],"title":"Presentation","type":"object"}}' - headers: - content-encoding: - - gzip - content-type: - - application/json - date: - - FILTERED - server: - - FILTERED - transfer-encoding: - - chunked - vary: - - Accept-Encoding - x-middleware-rewrite: - - FILTERED - x-request-id: - - FILTERED - status: - code: 200 - message: OK + - request: + body: '{"pptx_template_id": "TEMPLATE_ID"}' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate, zstd + Connection: + - keep-alive + Content-Length: + - "60" + Content-Type: + - application/json + User-Agent: + - python-requests/2.32.3 + authorization: + - DUMMY + method: POST + uri: https://middleman-ai.com/api/v2/tools/json-to-pptx/analyze + response: + body: + string: + '{"important_remark_for_user":"- The ''slides'' field contains the slides + definition provided in the template.\n- Generate the presentation content + by filling in the placeholder values for the slide you selected to use according + to the JSON schema defined in ''json_to_pptx_presentation_schema''.\n- When + calling the json-to-pptx/execute endpoint, use the provided schema to structure + your ''presentation'' field data. \n- The URL expires in 1 hour. Please note + that you will not be able to download the file after it has expired.","slides":[{"position":1,"type":"Title","description":"Please + use this slide to create title slide of presentation","placeholders":[{"name":"title","description":"Presentation + title"}]},{"position":2,"type":"Common","description":"Please use this slide + to create content.","placeholders":[{"name":"title","description":"Input slide + title here"},{"name":"content","description":"Input slide content here"},{"name":"image","description":"Input + slide image url here"}]}],"json_to_pptx_presentation_schema":{"$defs":{"Placeholder":{"properties":{"name":{"description":"The + key of the placeholder","title":"Name","type":"string"},"content":{"description":"The + content of the placeholder","title":"Content","type":"string"}},"required":["name","content"],"title":"Placeholder","type":"object"},"Slide":{"properties":{"type":{"description":"The + type of the slide","title":"Type","type":"string"},"placeholders":{"description":"The + placeholders of the slide","items":{"$ref":"#/$defs/Placeholder"},"title":"Placeholders","type":"array"},"speaker_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Additional + notes for the slide intended for the presenter. These notes provide extra + context or cues during the presentation and are not visible to the audience.","title":"Speaker + Notes"}},"required":["type","placeholders"],"title":"Slide","type":"object"}},"properties":{"slides":{"description":"The + slides of the presentation","items":{"$ref":"#/$defs/Slide"},"title":"Slides","type":"array"}},"required":["slides"],"title":"Presentation","type":"object"}}' + headers: + content-encoding: + - gzip + content-type: + - application/json + date: + - FILTERED + server: + - FILTERED + transfer-encoding: + - chunked + vary: + - Accept-Encoding + x-middleware-rewrite: + - FILTERED + x-request-id: + - FILTERED + status: + code: 200 + message: OK version: 1 diff --git a/tests/cassettes/test_json_to_pptx_execute_v2_vcr.yaml b/tests/cassettes/test_json_to_pptx_execute_v2_vcr.yaml index 20e0515..9fda5b2 100644 --- a/tests/cassettes/test_json_to_pptx_execute_v2_vcr.yaml +++ b/tests/cassettes/test_json_to_pptx_execute_v2_vcr.yaml @@ -1,7 +1,6 @@ interactions: - request: - body: - '{"pptx_template_id": "19823658-6af5-4560-ab87-632da39511de", "presentation": + body: '{"pptx_template_id": "TEMPLATE_ID", "presentation": {"slides": [{"type": "title", "placeholders": [{"name": "title", "content": "Test Title"}, {"name": "subtitle", "content": "Test Subtitle"}]}]}}' headers: diff --git a/tests/cassettes/test_md_to_docx_tool_vcr.yaml b/tests/cassettes/test_md_to_docx_tool_vcr.yaml index 60172a5..0f81654 100644 --- a/tests/cassettes/test_md_to_docx_tool_vcr.yaml +++ b/tests/cassettes/test_md_to_docx_tool_vcr.yaml @@ -2,7 +2,7 @@ interactions: - request: body: '{"markdown": "# Test Heading\n\n This is a test markdown document.\n\n ## - Section 1\n - Item 1\n - Item 2\n ", "template_id": null}' + Section 1\n - Item 1\n - Item 2\n ", "docx_template_id": null}' headers: Accept: - "*/*" diff --git a/tests/cassettes/test_md_to_docx_vcr.yaml b/tests/cassettes/test_md_to_docx_vcr.yaml index 8b48142..3227f1c 100644 --- a/tests/cassettes/test_md_to_docx_vcr.yaml +++ b/tests/cassettes/test_md_to_docx_vcr.yaml @@ -2,7 +2,7 @@ interactions: - request: body: '{"markdown": "# Test Heading\n\n This is a test markdown document.\n\n ## - Section 1\n - Item 1\n - Item 2\n ", "template_id": null}' + Section 1\n - Item 1\n - Item 2\n ", "docx_template_id": null}' headers: Accept: - "*/*" diff --git a/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml b/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml new file mode 100644 index 0000000..ef1e330 --- /dev/null +++ b/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml @@ -0,0 +1,47 @@ +interactions: + - request: + body: + '{"markdown": "# Test Heading\n\n This is a test markdown document.\n\n ## + Section 1\n - Item 1\n - Item 2\n ", "docx_template_id": "TEMPLATE_ID"}' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate, zstd + Connection: + - keep-alive + Content-Length: + - "180" + Content-Type: + - application/json + User-Agent: + - python-requests/2.32.3 + authorization: + - DUMMY + method: POST + uri: https://stg.middleman-ai.com/api/v1/tools/md-to-docx + response: + body: + string: + '{"docx_url":"https://stg.middleman-ai.com/s/abfbc7fe/scLdYIML1z","important_remark_for_user":"The + URL expires in 1 hour.Please note that you will not be able to download the + file after it has expired."}' + headers: + content-length: + - "202" + content-type: + - application/json + date: + - FILTERED + server: + - FILTERED + vary: + - Accept-Encoding + x-middleware-rewrite: + - FILTERED + x-request-id: + - FILTERED + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_md_to_pdf_with_template_id_vcr.yaml b/tests/cassettes/test_md_to_pdf_with_template_id_vcr.yaml index 1d26f42..c0eb76d 100644 --- a/tests/cassettes/test_md_to_pdf_with_template_id_vcr.yaml +++ b/tests/cassettes/test_md_to_pdf_with_template_id_vcr.yaml @@ -2,7 +2,7 @@ interactions: - request: body: '{"markdown": "# Test Heading\n\n This is a test markdown document.\n\n ## - Section 1\n - Item 1\n - Item 2\n ", "pdf_template_id": "a978ae98-d4c6-430e-a049-1f377b5d25d1"}' + Section 1\n - Item 1\n - Item 2\n ", "pdf_template_id": "TEMPLATE_ID"}' headers: Accept: - "*/*" diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 116313e..4bf4845 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -3,15 +3,11 @@ """Tests for the CLI implementation.""" import json -import os import click from middleman_ai.cli.main import cli -# Set dummy API key for tests -os.environ["MIDDLEMAN_API_KEY"] = "test-key" - def test_md_to_pdf(runner, mock_client): """Test md_to_pdf CLI command.""" diff --git a/tests/conftest.py b/tests/conftest.py index 2e2e48f..f9263a0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -37,11 +37,6 @@ def pytest_configure(config: pytest.Config) -> None: if env_file.exists(): load_dotenv(env_file) - # Skip API key check for CLI tests which use mocks - if "test_cli.py" not in str(config.invocation_params.dir): - if not os.getenv("MIDDLEMAN_API_KEY"): - pytest.skip("MIDDLEMAN_API_KEY is not set") - # オリジナルの play_response メソッドを保存 _original_play_response = Cassette.play_response @@ -74,12 +69,14 @@ def _set_version_string(self: VCRHTTPResponse, value: str) -> None: VCRHTTPResponse.version_string = property(_get_version_string, _set_version_string) -def scrub_uri_request(request: Any) -> Any: +def scrub_request(request: Any) -> Any: """ - リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する - 本番環境以外のURLが露出することを避けるための処置です + 環境差異によってエラーが発生しないよう、環境依存のパラメータの値をカセットに記録する差異に統一する + また、本番環境以外のURLが露出することを避けるなどカセットに秘匿情報が出ないための処置を行う """ - req = copy.deepcopy(request) # ミュータブルに触らず安全に + # リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する + # 本番環境以外のURLが露出することを避けるための処置です + req = copy.deepcopy(request) p = urlparse(req.uri) redacted = urlunparse( (p.scheme, "middleman-ai.com", p.path, p.params, p.query, p.fragment) @@ -138,6 +135,6 @@ def vcr_config() -> Dict[str, Any]: "record_mode": "once", "match_on": ["method", "path", "query", "body"], "ignore_localhost": True, - "before_record_request": scrub_uri_request, + "before_record_request": scrub_request, "before_record_response": scrub_response, } diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index 8a943d2..2d11e2c 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -6,6 +6,7 @@ import pytest from middleman_ai.client import Presentation, ToolsClient +from tests.vcr_utils import generate_filter_request_body_function if TYPE_CHECKING: from _pytest.fixtures import FixtureRequest # noqa: F401 @@ -45,7 +46,11 @@ def test_md_to_pdf_vcr(client: ToolsClient) -> None: assert "/s/" in pdf_url -@pytest.mark.vcr() +@pytest.mark.vcr( + before_record_request=generate_filter_request_body_function( + "pdf_template_id", "TEMPLATE_ID" + ), +) def test_md_to_pdf_with_template_id_vcr(client: ToolsClient) -> None: """ToolsClient.md_to_pdfの実際のAPIを使用したテスト。 @@ -90,6 +95,35 @@ def test_md_to_docx_vcr(client: ToolsClient) -> None: assert "/s/" in docx_url +@pytest.mark.vcr( + before_record_request=generate_filter_request_body_function( + "docx_template_id", + "TEMPLATE_ID", + ), +) +def test_md_to_docx_with_template_id_vcr(client: ToolsClient) -> None: + """ToolsClient.md_to_docxの実際のAPIを使用したテスト。 + + Note: + このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 + 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 + """ + test_markdown = """# Test Heading + + This is a test markdown document. + + ## Section 1 + - Item 1 + - Item 2 + """ + docx_url = client.md_to_docx( + markdown_text=test_markdown, + docx_template_id=os.getenv("MIDDLEMAN_TEST_DOCX_TEMPLATE_ID") or "", + ) + assert docx_url.startswith("https://") + assert "/s/" in docx_url + + # マルチパートの場合リクエストごとにファイルがどこで分割されるかが異なるようなので # bodyをマッチ判定の対象外にしている @pytest.mark.vcr(match_on=["method", "scheme", "port", "path", "query"]) @@ -110,7 +144,12 @@ def test_pdf_to_page_images_vcr(client: ToolsClient) -> None: assert all("/s/" in page["image_url"] for page in pages) -@pytest.mark.vcr() +@pytest.mark.vcr( + before_record_request=generate_filter_request_body_function( + "pptx_template_id", + "TEMPLATE_ID", + ), +) def test_json_to_pptx_analyze_v2_vcr(client: ToolsClient) -> None: """ToolsClient.json_to_pptx_analyze_v2の実際のAPIを使用したテスト。 @@ -137,7 +176,12 @@ def test_json_to_pptx_analyze_v2_vcr(client: ToolsClient) -> None: assert all("description" in placeholder for placeholder in placeholders) -@pytest.mark.vcr() +@pytest.mark.vcr( + before_record_request=generate_filter_request_body_function( + "pptx_template_id", + "TEMPLATE_ID", + ), +) def test_json_to_pptx_execute_v2_vcr(client: ToolsClient) -> None: """ToolsClient.json_to_pptx_execute_v2の実際のAPIを使用したテスト。 diff --git a/tests/vcr_utils.py b/tests/vcr_utils.py new file mode 100644 index 0000000..84f7409 --- /dev/null +++ b/tests/vcr_utils.py @@ -0,0 +1,32 @@ +# VCRテストでは、例えばSTGに向けてテストした場合と本番に向けてテストした場合など +# 環境差異によって生じるリクエスト内容の差異があるとエラーになってしまう +# かといってリクエストボディを丸ごとignoreするとテストにならないので +# 環境差異を吸収するための関数をここに定義し、 +# それぞれのテストで環境差異が発生する部分をマスクしてカセットを登録できるようにする + + +import json +from collections.abc import Callable +from typing import Any + + +def _filter_value_in_request_body(request: Any, key: str, replace_value: str) -> Any: + """ + 共通ロジック: + リクエストボディが JSON である場合、一致する key があれば置き換える + """ + try: + body = json.loads(request.body.decode()) + except Exception: + return request + if key in body: + body[key] = replace_value + request.body = json.dumps(body).encode() + return request + + +def generate_filter_request_body_function(key: str, replace_value: str) -> Callable: + """ + VCRテストで環境依存な値をマスクするための関数(リクエストボディ用) + """ + return lambda request: _filter_value_in_request_body(request, key, replace_value) From bd562403ab4f32bf8fa375c97c00e6d1900ca11e Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 15:33:52 +0900 Subject: [PATCH 15/35] =?UTF-8?q?md-to-docx=E3=81=AE=E3=83=86=E3=83=B3?= =?UTF-8?q?=E3=83=97=E3=83=AC=E3=83=BC=E3=83=88ID=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=81=8C=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86CLI?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/cli/main.py | 7 ++++-- tests/cli/test_cli.py | 42 ++++++++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/middleman_ai/cli/main.py b/src/middleman_ai/cli/main.py index 64b3d58..3441a6f 100644 --- a/src/middleman_ai/cli/main.py +++ b/src/middleman_ai/cli/main.py @@ -54,7 +54,8 @@ def md_to_pdf(template_id: str | None = None) -> None: @cli.command() -def md_to_docx() -> None: +@click.argument("template_id", required=False) +def md_to_docx(template_id: str | None = None) -> None: """Convert Markdown to DOCX.""" print("md_to_docx コマンドを実行しています...") try: @@ -68,9 +69,11 @@ def md_to_docx() -> None: length=1, label="DOCXに変換中...", show_eta=False ) as bar: print("APIを呼び出しています...") - docx_url = client.md_to_docx(markdown_text) + docx_url = client.md_to_docx(markdown_text, docx_template_id=template_id) bar.update(1) print(f"変換結果URL: {docx_url}") + if template_id: + print(f"使用したテンプレートID: {template_id}") except MiddlemanBaseException as e: print(f"エラーが発生しました: {e!s}") raise click.ClickException(str(e)) from e diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 4bf4845..4fa7303 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -9,7 +9,7 @@ from middleman_ai.cli.main import cli -def test_md_to_pdf(runner, mock_client): +def test_md_to_pdf_cli(runner, mock_client): """Test md_to_pdf CLI command.""" mock_client.md_to_pdf.return_value = "https://example.com/test.pdf" result = runner.invoke(cli, ["md-to-pdf"], input="# Test") @@ -18,16 +18,36 @@ def test_md_to_pdf(runner, mock_client): mock_client.md_to_pdf.assert_called_once_with("# Test", pdf_template_id=None) -def test_md_to_docx(runner, mock_client): +def test_md_to_pdf_cli_with_template_id(runner, mock_client): + mock_client.md_to_pdf.return_value = "https://example.com/test.pdf" + result = runner.invoke(cli, ["md-to-pdf", "TEMPLATE_ID"], input="# Test") + assert result.exit_code == 0 + assert "https://example.com/test.pdf" in result.output + mock_client.md_to_pdf.assert_called_once_with( + "# Test", pdf_template_id="TEMPLATE_ID" + ) + + +def test_md_to_docx_cli(runner, mock_client): """Test md_to_docx CLI command.""" mock_client.md_to_docx.return_value = "https://example.com/test.docx" result = runner.invoke(cli, ["md-to-docx"], input="# Test") assert result.exit_code == 0 assert "https://example.com/test.docx" in result.output - mock_client.md_to_docx.assert_called_once_with("# Test") + mock_client.md_to_docx.assert_called_once_with("# Test", docx_template_id=None) + + +def test_md_to_docx_cli_with_template_id(runner, mock_client): + mock_client.md_to_docx.return_value = "https://example.com/test.docx" + result = runner.invoke(cli, ["md-to-docx", "TEMPLATE_ID"], input="# Test") + assert result.exit_code == 0 + assert "https://example.com/test.docx" in result.output + mock_client.md_to_docx.assert_called_once_with( + "# Test", docx_template_id="TEMPLATE_ID" + ) -def test_pdf_to_page_images(runner, mock_client, tmp_path): +def test_pdf_to_page_images_cli(runner, mock_client, tmp_path): """Test pdf_to_page_images CLI command.""" mock_client.pdf_to_page_images.return_value = [ {"page_no": 1, "image_url": "https://example.com/page1.png"}, @@ -42,7 +62,7 @@ def test_pdf_to_page_images(runner, mock_client, tmp_path): mock_client.pdf_to_page_images.assert_called_once_with(str(pdf_path)) -def test_json_to_pptx_analyze(runner, mock_client): +def test_json_to_pptx_analyze_cli(runner, mock_client): """Test json_to_pptx_analyze CLI command.""" mock_client.json_to_pptx_analyze_v2.return_value = [ {"type": "title", "placeholders": [{"name": "title", "content": ""}]} @@ -53,7 +73,7 @@ def test_json_to_pptx_analyze(runner, mock_client): mock_client.json_to_pptx_analyze_v2.assert_called_once_with("template-123") -def test_json_to_pptx_execute(runner, mock_client): +def test_json_to_pptx_execute_cli(runner, mock_client): """Test json_to_pptx_execute CLI command.""" mock_client.json_to_pptx_execute_v2.return_value = "https://example.com/result.pptx" input_data = { @@ -72,7 +92,7 @@ def test_json_to_pptx_execute(runner, mock_client): mock_client.json_to_pptx_execute_v2.assert_called_once() -def test_missing_api_key(runner, mocker): +def test_missing_api_key_cli(runner, mocker): """Test error handling when API key is missing.""" mocker.patch( "middleman_ai.cli.main.get_api_key", @@ -83,7 +103,7 @@ def test_missing_api_key(runner, mocker): assert "API key not set" in result.output -def test_invalid_json_input(runner, mock_client): +def test_invalid_json_input_cli(runner, mock_client): """Test error handling for invalid JSON input.""" result = runner.invoke( cli, ["json-to-pptx-execute", "template-123"], input="invalid json" @@ -92,7 +112,7 @@ def test_invalid_json_input(runner, mock_client): assert "Invalid JSON input" in result.output -def test_pptx_to_page_images(runner, mock_client, tmp_path) -> None: +def test_pptx_to_page_images_cli(runner, mock_client, tmp_path) -> None: """Test pptx_to_page_images CLI command.""" mock_client.pptx_to_page_images.return_value = [ {"page_no": 1, "image_url": "https://example.com/slide1.png"}, @@ -107,7 +127,7 @@ def test_pptx_to_page_images(runner, mock_client, tmp_path) -> None: mock_client.pptx_to_page_images.assert_called_once_with(str(pptx_path)) -def test_docx_to_page_images(runner, mock_client, tmp_path) -> None: +def test_docx_to_page_images_cli(runner, mock_client, tmp_path) -> None: """Test docx_to_page_images CLI command.""" mock_client.docx_to_page_images.return_value = [ {"page_no": 1, "image_url": "https://example.com/page1.png"}, @@ -122,7 +142,7 @@ def test_docx_to_page_images(runner, mock_client, tmp_path) -> None: mock_client.docx_to_page_images.assert_called_once_with(str(docx_path)) -def test_xlsx_to_page_images(runner, mock_client, tmp_path) -> None: +def test_xlsx_to_page_images_cli(runner, mock_client, tmp_path) -> None: """Test xlsx_to_page_images CLI command.""" mock_client.xlsx_to_page_images.return_value = [ {"sheet_name": "Sheet1", "image_url": "https://example.com/sheet1.png"}, From 7df66c60ffc0bb2fa8fb09b3b24b0ccccfaf0d24 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 15:51:14 +0900 Subject: [PATCH 16/35] =?UTF-8?q?md-to-docx=E3=81=AETool=E3=82=92=E3=83=86?= =?UTF-8?q?=E3=83=B3=E3=83=97=E3=83=AC=E3=83=BC=E3=83=88ID=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langchain_tools/md_to_docx.py | 30 ++- tests/test_langchain_tools.py | 177 ++++++++++++++---- 2 files changed, 163 insertions(+), 44 deletions(-) diff --git a/src/middleman_ai/langchain_tools/md_to_docx.py b/src/middleman_ai/langchain_tools/md_to_docx.py index ce957bf..7234f3a 100644 --- a/src/middleman_ai/langchain_tools/md_to_docx.py +++ b/src/middleman_ai/langchain_tools/md_to_docx.py @@ -15,6 +15,10 @@ class MdToDocxInput(BaseModel): ..., description="変換対象のMarkdown文字列。有効なMarkdown形式である必要があります。", ) + docx_template_id: str | None = Field( + None, + description="DOCXテンプレートのID(UUID)。プレゼンテーションの生成に使用します。省略した場合はデフォルトのテンプレートが利用されます。ユーザーからテンプレートIDの共有がない場合は省略してください。", + ) class MdToDocxTool(BaseTool): @@ -28,8 +32,14 @@ class MdToDocxTool(BaseTool): ) args_schema: type[BaseModel] = MdToDocxInput client: ToolsClient = Field(..., exclude=True) - - def __init__(self, client: ToolsClient, **kwargs: Any) -> None: + default_template_id: str | None = Field(..., exclude=True) + + def __init__( + self, + client: ToolsClient, + default_template_id: str | None = None, + **kwargs: Any, + ) -> None: """ツールを初期化します。 Args: @@ -37,9 +47,10 @@ def __init__(self, client: ToolsClient, **kwargs: Any) -> None: **kwargs: BaseTool用の追加引数 """ kwargs["client"] = client + kwargs["default_template_id"] = default_template_id super().__init__(**kwargs) - def _run(self, text: str) -> str: + def _run(self, text: str, docx_template_id: str | None = None) -> str: """同期的にMarkdown文字列をDOCXに変換します。 Args: @@ -48,9 +59,14 @@ def _run(self, text: str) -> str: Returns: str: 生成されたDOCXのURL """ - return self.client.md_to_docx(text) - - async def _arun(self, text: str) -> str: + docx_template_id_to_use = ( + docx_template_id + if docx_template_id is not None + else self.default_template_id + ) + return self.client.md_to_docx(text, docx_template_id=docx_template_id_to_use) + + async def _arun(self, text: str, docx_template_id: str | None = None) -> str: """非同期的にMarkdown文字列をDOCXに変換します。 Args: @@ -60,4 +76,4 @@ async def _arun(self, text: str) -> str: str: 生成されたDOCXのURL """ # 現時点では同期メソッドを呼び出し - return self._run(text) + return self._run(text, docx_template_id) diff --git a/tests/test_langchain_tools.py b/tests/test_langchain_tools.py index 5c5b03f..a559bfd 100644 --- a/tests/test_langchain_tools.py +++ b/tests/test_langchain_tools.py @@ -35,7 +35,7 @@ def test_md_to_pdf_tool(client: ToolsClient, mocker: "MockerFixture") -> None: ) tool = MdToPdfTool(client=client) - result = tool._run("# Test") + result = tool.run("# Test") assert result == "https://example.com/test.pdf" mock_md_to_pdf.assert_called_once_with("# Test", pdf_template_id=None) @@ -52,7 +52,12 @@ def test_md_to_pdf_tool_with_template_id( ) tool = MdToPdfTool(client=client) - result = tool._run("# Test", pdf_template_id="00000000-0000-0000-0000-000000000001") + result = tool.run( + { + "text": "# Test", + "pdf_template_id": "00000000-0000-0000-0000-000000000001", + } + ) assert result == "https://example.com/test.pdf" mock_md_to_pdf.assert_called_once_with( @@ -75,7 +80,7 @@ def test_md_to_pdf_tool_with_default_template_id( client=client, default_template_id="00000000-0000-0000-0000-000000000001", ) - result = tool._run("# Test") + result = tool.run("# Test") assert result == "https://example.com/test.pdf" mock_md_to_pdf.assert_called_once_with( @@ -98,9 +103,11 @@ def test_md_to_pdf_tool_with_both_template_id_and_default_template_id( client=client, default_template_id="00000000-0000-0000-0000-000000000001", ) - result = tool._run( - "# Test", - pdf_template_id="00000000-0000-0000-0000-000000000002", + result = tool.run( + { + "text": "# Test", + "pdf_template_id": "00000000-0000-0000-0000-000000000002", + } ) assert result == "https://example.com/test.pdf" @@ -119,10 +126,89 @@ def test_md_to_docx_tool(client: ToolsClient, mocker: "MockerFixture") -> None: ) tool = MdToDocxTool(client=client) - result = tool._run("# Test") + result = tool.run("# Test") + + assert result == "https://example.com/test.docx" + mock_md_to_docx.assert_called_once_with("# Test", docx_template_id=None) + + +def test_md_to_docx_tool_with_template_id( + client: ToolsClient, + mocker: "MockerFixture", +) -> None: + """MdToDocxToolのテスト。""" + mock_md_to_docx = mocker.patch.object( + client, + "md_to_docx", + return_value="https://example.com/test.docx", + ) + + tool = MdToDocxTool(client=client) + result = tool.run( + { + "text": "# Test", + "docx_template_id": "00000000-0000-0000-0000-000000000001", + } + ) assert result == "https://example.com/test.docx" - mock_md_to_docx.assert_called_once_with("# Test") + mock_md_to_docx.assert_called_once_with( + "# Test", + docx_template_id="00000000-0000-0000-0000-000000000001", + ) + + +def test_md_to_docx_tool_with_default_template_id( + client: ToolsClient, + mocker: "MockerFixture", +) -> None: + """MdToDocxToolのテスト。""" + mock_md_to_docx = mocker.patch.object( + client, + "md_to_docx", + return_value="https://example.com/test.docx", + ) + + tool = MdToDocxTool( + client=client, + default_template_id="00000000-0000-0000-0000-000000000001", + ) + result = tool.run("# Test") + + assert result == "https://example.com/test.docx" + mock_md_to_docx.assert_called_once_with( + "# Test", + docx_template_id="00000000-0000-0000-0000-000000000001", + ) + + +def test_md_to_docx_tool_with_both_template_id_and_default_template_id( + client: ToolsClient, + mocker: "MockerFixture", +) -> None: + """MdToDocxToolのテスト。""" + mock_md_to_docx = mocker.patch.object( + client, + "md_to_docx", + return_value="https://example.com/test.docx", + ) + + tool = MdToDocxTool( + client=client, + default_template_id="00000000-0000-0000-0000-000000000001", + ) + result = tool.run( + { + "text": "# Test", + "docx_template_id": "00000000-0000-0000-0000-000000000002", + } + ) + + assert result == "https://example.com/test.docx" + mock_md_to_docx.assert_called_once_with( + "# Test", + docx_template_id="00000000-0000-0000-0000-000000000002", + ) def test_pdf_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") -> None: @@ -138,7 +224,7 @@ def test_pdf_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") - ) tool = PdfToPageImagesTool(client=client) - result = tool._run("/path/to/test.pdf") + result = tool.run("/path/to/test.pdf") assert isinstance(result, str) assert "https://example.com/page1.png" in result @@ -159,7 +245,7 @@ def test_pptx_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") ) tool = PptxToPageImagesTool(client=client) - result = tool._run("/path/to/test.pptx") + result = tool.run("/path/to/test.pptx") assert isinstance(result, str) assert "https://example.com/slide1.png" in result @@ -180,7 +266,7 @@ def test_docx_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") ) tool = DocxToPageImagesTool(client=client) - result = tool._run("/path/to/test.docx") + result = tool.run("/path/to/test.docx") assert isinstance(result, str) assert "https://example.com/page1.png" in result @@ -201,7 +287,7 @@ def test_xlsx_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") ) tool = XlsxToPageImagesTool(client=client) - result = tool._run("/path/to/test.xlsx") + result = tool.run("/path/to/test.xlsx") assert isinstance(result, str) assert "https://example.com/sheet1.png" in result @@ -253,10 +339,10 @@ def test_json_to_pptx_analyze_tool_without_default_template_id( # テンプレートIDが指定されていない場合はエラー with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool._run("") + tool.run("") # テンプレートIDが指定された場合は成功 - result = tool._run("template-123") + result = tool.run("template-123") assert isinstance(result, str) assert "Title Slide" in result assert "Content Slide" in result @@ -312,7 +398,7 @@ def test_json_to_pptx_analyze_tool_with_default_template_id( ) tool = JsonToPptxAnalyzeTool(client=client, default_template_id="template-123") - result = tool._run("") + result = tool.run("") assert isinstance(result, str) assert "Title Slide" in result @@ -369,7 +455,7 @@ def test_json_to_pptx_analyze_tool_with_both_template_id_and_default_template_id ) tool = JsonToPptxAnalyzeTool(client=client, default_template_id="template-123") - result = tool._run(template_id="template-456") + result = tool.run("template-456") assert isinstance(result, str) assert "Title Slide" in result @@ -418,18 +504,22 @@ def test_json_to_pptx_execute_tool_without_default_template_id( # テンプレートIDが指定されていない場合はエラー with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool._run( - presentation=Presentation.model_validate( - presentation_data, - ).model_dump_json(), + tool.run( + { + "presentation": Presentation.model_validate( + presentation_data, + ).model_dump_json(), + } ) # テンプレートIDが指定された場合は成功 - result = tool._run( - presentation=Presentation.model_validate( - presentation_data, - ).model_dump_json(), - template_id=template_id, + result = tool.run( + { + "presentation": Presentation.model_validate( + presentation_data, + ).model_dump_json(), + "template_id": template_id, + } ) assert result == "https://example.com/result.pptx" mock_execute.assert_called_once_with( @@ -470,10 +560,12 @@ def test_json_to_pptx_execute_tool_with_default_template_id( ) tool = JsonToPptxExecuteTool(client=client, default_template_id=template_id) - result = tool._run( - presentation=Presentation.model_validate( - presentation_data, - ).model_dump_json(), + result = tool.run( + { + "presentation": Presentation.model_validate( + presentation_data, + ).model_dump_json(), + } ) assert result == "https://example.com/result.pptx" @@ -514,11 +606,13 @@ def test_json_to_pptx_execute_tool_with_both_template_id_and_default_template_id ) tool = JsonToPptxExecuteTool(client=client, default_template_id="template-123") - result = tool._run( - presentation=Presentation.model_validate( - presentation_data, - ).model_dump_json(), - template_id="template-456", + result = tool.run( + { + "presentation": Presentation.model_validate( + presentation_data, + ).model_dump_json(), + "template_id": "template-456", + } ) assert result == "https://example.com/result.pptx" @@ -543,7 +637,7 @@ def test_json_to_pptx_analyze_tool_template_id_error( # テンプレートIDが指定されていない場合 tool = JsonToPptxAnalyzeTool(client=client) with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool._run("") + tool.run("") mock_analyze.assert_not_called() @@ -562,7 +656,11 @@ def test_json_to_pptx_execute_tool_template_id_error( tool = JsonToPptxExecuteTool(client=client) test_json = '{"slides": []}' with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool._run(test_json) + tool.run( + { + "presentation": test_json, + } + ) mock_execute.assert_not_called() @@ -579,6 +677,11 @@ def test_json_to_pptx_execute_tool_json_error( tool = JsonToPptxExecuteTool(client=client) with pytest.raises(ValueError, match="不正なJSON形式です"): - tool._run("invalid json", template_id="template-123") + tool.run( + { + "presentation": "invalid json", + "template_id": "template-123", + } + ) mock_execute.assert_not_called() From 683943571bd1647b6d43460be1ed4577ad0f40f4 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 15:59:35 +0900 Subject: [PATCH 17/35] =?UTF-8?q?md-to-docx=E3=81=AE=E3=83=86=E3=83=B3?= =?UTF-8?q?=E3=83=97=E3=83=AC=E3=83=BC=E3=83=88ID=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=81=ABMCP=E3=82=92=E5=AF=BE=E5=BF=9C=20&=20=E5=8D=98?= =?UTF-8?q?=E4=BD=93=E3=83=86=E3=82=B9=E3=83=88=E5=90=8D=E3=81=AE=E6=94=B9?= =?UTF-8?q?=E5=96=84=E3=81=A8=E3=83=86=E3=83=B3=E3=83=97=E3=83=AC=E3=83=BC?= =?UTF-8?q?=E3=83=88ID=E6=8C=87=E5=AE=9A=E3=81=8C=E3=81=82=E3=82=8B?= =?UTF-8?q?=E3=83=84=E3=83=BC=E3=83=AB=E3=81=AE=E3=83=91=E3=83=A9=E3=83=A1?= =?UTF-8?q?=E3=82=BF=E3=83=A9=E3=82=A4=E3=82=BA=E3=83=89=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/mcp/server.py | 12 ++- tests/test_mcp.py | 166 +++++++++++++++++++++------------ 2 files changed, 113 insertions(+), 65 deletions(-) diff --git a/src/middleman_ai/mcp/server.py b/src/middleman_ai/mcp/server.py index 4ec52b7..c159179 100644 --- a/src/middleman_ai/mcp/server.py +++ b/src/middleman_ai/mcp/server.py @@ -64,26 +64,30 @@ def md_file_to_pdf(md_file_full_path: str, pdf_template_id: str | None = None) - @mcp.tool() -def md_to_docx(markdown_text: str) -> str: +def md_to_docx(markdown_text: str, docx_template_id: str | None = None) -> str: """ Convert Markdown text to DOCX and return the download URL. Args: markdown_text: The Markdown text to convert + docx_template_id: Optional ID of the DOCX template to use. + If not provided, the default template will be used Returns: The URL to download the generated DOCX """ - return client.md_to_docx(markdown_text) + return client.md_to_docx(markdown_text, docx_template_id=docx_template_id) @mcp.tool() -def md_file_to_docx(md_file_full_path: str) -> str: +def md_file_to_docx(md_file_full_path: str, docx_template_id: str | None = None) -> str: """ Convert a Markdown file to DOCX and return the download URL. Args: md_file_full_path: Path to the local Markdown file + docx_template_id: Optional ID of the DOCX template to use. + If not provided, the default template will be used Returns: The URL to download the generated DOCX @@ -98,7 +102,7 @@ def md_file_to_docx(md_file_full_path: str) -> str: with file_path.open("r") as f: md_text = f.read() - return client.md_to_docx(md_text) + return client.md_to_docx(md_text, docx_template_id=docx_template_id) @mcp.tool() diff --git a/tests/test_mcp.py b/tests/test_mcp.py index 2925dce..1bae0ad 100644 --- a/tests/test_mcp.py +++ b/tests/test_mcp.py @@ -2,6 +2,7 @@ from typing import TYPE_CHECKING +import pytest from mcp.server.fastmcp import FastMCP from middleman_ai.client import Presentation, Slide @@ -30,29 +31,120 @@ def test_mcp_instance() -> None: assert mcp.name == "Middleman Tools" -def test_md_to_pdf_tool(mocker: "MockerFixture") -> None: +@pytest.mark.parametrize( + "template_id", + [ + None, + "123e4567-e89b-12d3-a456-426614174000", + ], +) +def test_md_to_pdf_tool_mcp(mocker: "MockerFixture", template_id: str | None) -> None: """md_to_pdfツールのテスト。""" mock_client = mocker.patch("middleman_ai.mcp.server.client") mock_client.md_to_pdf.return_value = "https://example.com/test.pdf" - result = md_to_pdf("# Test") + result = md_to_pdf("# Test", pdf_template_id=template_id) assert result == "https://example.com/test.pdf" - mock_client.md_to_pdf.assert_called_once_with("# Test", pdf_template_id=None) + mock_client.md_to_pdf.assert_called_once_with("# Test", pdf_template_id=template_id) + + +@pytest.mark.parametrize( + "template_id", + [ + None, + "123e4567-e89b-12d3-a456-426614174000", + ], +) +def test_md_file_to_pdf_tool_mcp( + mocker: "MockerFixture", + template_id: str | None, +) -> None: + """md_file_to_pdfツールのテスト。""" + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_path = mocker.patch("middleman_ai.mcp.server.Path") + mock_os_access = mocker.patch("middleman_ai.mcp.server.os.access") + # mock_open を変数に束縛せず、Pathオブジェクトのopenメソッドのモックを設定 + mock_file_handle = mocker.MagicMock() + mock_file_handle.read.return_value = "# Test MD" + mock_path.return_value.open.return_value.__enter__.return_value = mock_file_handle + + mock_path.return_value.exists.return_value = True + mock_path.return_value.is_file.return_value = True + mock_client.md_to_pdf.return_value = "https://example.com/test_file.pdf" + + file_path = "/fake/path/to/test.md" + result = md_file_to_pdf(file_path, pdf_template_id=template_id) + + assert result == "https://example.com/test_file.pdf" + mock_path.assert_called_once_with(file_path) + mock_path.return_value.open.assert_called_once_with("r") + mock_client.md_to_pdf.assert_called_once_with( + "# Test MD", + pdf_template_id=template_id, + ) + mock_os_access.assert_called_once_with(mock_path.return_value, mocker.ANY) -def test_md_to_docx_tool(mocker: "MockerFixture") -> None: +@pytest.mark.parametrize( + "template_id", + [ + None, + "123e4567-e89b-12d3-a456-426614174000", + ], +) +def test_md_to_docx_tool_mcp(mocker: "MockerFixture", template_id: str | None) -> None: """md_to_docxツールのテスト。""" mock_client = mocker.patch("middleman_ai.mcp.server.client") mock_client.md_to_docx.return_value = "https://example.com/test.docx" - result = md_to_docx("# Test") + result = md_to_docx("# Test", docx_template_id=template_id) assert result == "https://example.com/test.docx" - mock_client.md_to_docx.assert_called_once_with("# Test") + mock_client.md_to_docx.assert_called_once_with( + "# Test", + docx_template_id=template_id, + ) -def test_pptx_to_page_images_tool(mocker: "MockerFixture") -> None: +@pytest.mark.parametrize( + "template_id", + [ + None, + "123e4567-e89b-12d3-a456-426614174000", + ], +) +def test_md_file_to_docx_tool_mcp( + mocker: "MockerFixture", + template_id: str | None, +) -> None: + """md_file_to_docxツールのテスト。""" + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_path = mocker.patch("middleman_ai.mcp.server.Path") + mock_os_access = mocker.patch("middleman_ai.mcp.server.os.access") + # mock_open を変数に束縛せず、Pathオブジェクトのopenメソッドのモックを設定 + mock_file_handle = mocker.MagicMock() + mock_file_handle.read.return_value = "# Test MD" + mock_path.return_value.open.return_value.__enter__.return_value = mock_file_handle + + mock_path.return_value.exists.return_value = True + mock_path.return_value.is_file.return_value = True + mock_client.md_to_docx.return_value = "https://example.com/test_file.docx" + + file_path = "/fake/path/to/test.md" + result = md_file_to_docx(file_path, docx_template_id=template_id) + + assert result == "https://example.com/test_file.docx" + mock_path.assert_called_once_with(file_path) + mock_path.return_value.open.assert_called_once_with("r") + mock_client.md_to_docx.assert_called_once_with( + "# Test MD", + docx_template_id=template_id, + ) + mock_os_access.assert_called_once_with(mock_path.return_value, mocker.ANY) + + +def test_pptx_to_page_images_tool_mcp(mocker: "MockerFixture") -> None: """pptx_to_page_imagesツールのテスト。""" expected_result = [ {"page_no": 1, "image_url": "https://example.com/slide1.png"}, @@ -67,7 +159,7 @@ def test_pptx_to_page_images_tool(mocker: "MockerFixture") -> None: mock_client.pptx_to_page_images.assert_called_once_with("/path/to/test.pptx") -def test_docx_to_page_images_tool(mocker: "MockerFixture") -> None: +def test_docx_to_page_images_tool_mcp(mocker: "MockerFixture") -> None: """docx_to_page_imagesツールのテスト。""" expected_result = [ {"page_no": 1, "image_url": "https://example.com/page1.png"}, @@ -82,7 +174,7 @@ def test_docx_to_page_images_tool(mocker: "MockerFixture") -> None: mock_client.docx_to_page_images.assert_called_once_with("/path/to/test.docx") -def test_xlsx_to_page_images_tool(mocker: "MockerFixture") -> None: +def test_xlsx_to_page_images_tool_mcp(mocker: "MockerFixture") -> None: """xlsx_to_page_imagesツールのテスト。""" expected_result = [ {"sheet_name": "Sheet1", "image_url": "https://example.com/sheet1.png"}, @@ -97,7 +189,7 @@ def test_xlsx_to_page_images_tool(mocker: "MockerFixture") -> None: mock_client.xlsx_to_page_images.assert_called_once_with("/path/to/test.xlsx") -def test_pdf_to_page_images_tool(mocker: "MockerFixture") -> None: +def test_pdf_to_page_images_tool_mcp(mocker: "MockerFixture") -> None: """pdf_to_page_imagesツールのテスト。""" expected_result = [ {"page_no": 1, "image_url": "https://example.com/page1.png"}, @@ -112,7 +204,7 @@ def test_pdf_to_page_images_tool(mocker: "MockerFixture") -> None: mock_client.pdf_to_page_images.assert_called_once_with("/path/to/test.pdf") -def test_json_to_pptx_analyze_tool(mocker: "MockerFixture") -> None: +def test_json_to_pptx_analyze_tool_mcp(mocker: "MockerFixture") -> None: """json_to_pptx_analyzeツールのテスト。""" expected_result = {"slides": 5, "estimated_time": 10} mock_client_analyze = mocker.patch( @@ -127,7 +219,7 @@ def test_json_to_pptx_analyze_tool(mocker: "MockerFixture") -> None: mock_client_analyze.assert_called_once_with(json_data["pptx_template_id"]) -def test_json_to_pptx_execute_tool(mocker: "MockerFixture") -> None: +def test_json_to_pptx_execute_tool_mcp(mocker: "MockerFixture") -> None: """json_to_pptx_executeツールのテスト。""" expected_result = "https://example.com/generated.pptx" mock_execute = mocker.patch( @@ -145,58 +237,10 @@ def test_json_to_pptx_execute_tool(mocker: "MockerFixture") -> None: mock_execute.assert_called_once_with(template_id, expected_arg) -def test_run_server(mocker: "MockerFixture") -> None: +def test_run_server_mcp(mocker: "MockerFixture") -> None: """run_serverのテスト。""" mock_mcp = mocker.patch("middleman_ai.mcp.server.mcp") run_server() mock_mcp.run.assert_called_once_with(transport="stdio") - - -def test_md_file_to_pdf_tool(mocker: "MockerFixture") -> None: - """md_file_to_pdfツールのテスト。""" - mock_client = mocker.patch("middleman_ai.mcp.server.client") - mock_path = mocker.patch("middleman_ai.mcp.server.Path") - mock_os_access = mocker.patch("middleman_ai.mcp.server.os.access") - # mock_open を変数に束縛せず、Pathオブジェクトのopenメソッドのモックを設定 - mock_file_handle = mocker.MagicMock() - mock_file_handle.read.return_value = "# Test MD" - mock_path.return_value.open.return_value.__enter__.return_value = mock_file_handle - - mock_path.return_value.exists.return_value = True - mock_path.return_value.is_file.return_value = True - mock_client.md_to_pdf.return_value = "https://example.com/test_file.pdf" - - file_path = "/fake/path/to/test.md" - result = md_file_to_pdf(file_path) - - assert result == "https://example.com/test_file.pdf" - mock_path.assert_called_once_with(file_path) - mock_path.return_value.open.assert_called_once_with("r") - mock_client.md_to_pdf.assert_called_once_with("# Test MD", pdf_template_id=None) - mock_os_access.assert_called_once_with(mock_path.return_value, mocker.ANY) - - -def test_md_file_to_docx_tool(mocker: "MockerFixture") -> None: - """md_file_to_docxツールのテスト。""" - mock_client = mocker.patch("middleman_ai.mcp.server.client") - mock_path = mocker.patch("middleman_ai.mcp.server.Path") - mock_os_access = mocker.patch("middleman_ai.mcp.server.os.access") - # mock_open を変数に束縛せず、Pathオブジェクトのopenメソッドのモックを設定 - mock_file_handle = mocker.MagicMock() - mock_file_handle.read.return_value = "# Test MD" - mock_path.return_value.open.return_value.__enter__.return_value = mock_file_handle - - mock_path.return_value.exists.return_value = True - mock_path.return_value.is_file.return_value = True - mock_client.md_to_docx.return_value = "https://example.com/test_file.docx" - - file_path = "/fake/path/to/test.md" - result = md_file_to_docx(file_path) - - assert result == "https://example.com/test_file.docx" - mock_path.assert_called_once_with(file_path) - mock_path.return_value.open.assert_called_once_with("r") - mock_client.md_to_docx.assert_called_once_with("# Test MD") - mock_os_access.assert_called_once_with(mock_path.return_value, mocker.ANY) From a664f964339d1e9b3f96c4464ddf9a6a72611cf4 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 16:24:05 +0900 Subject: [PATCH 18/35] =?UTF-8?q?VCR=E3=83=86=E3=82=B9=E3=83=88=E3=81=AE?= =?UTF-8?q?=E7=92=B0=E5=A2=83=E4=BE=9D=E5=AD=98=E5=AF=BE=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_json_to_pptx_analyze_tool_vcr.yaml | 29 +++++--- .../test_json_to_pptx_execute_tool_vcr.yaml | 3 +- tests/conftest.py | 58 +-------------- tests/test_client_vcr.py | 28 +------ tests/test_langchain_tools_vcr.py | 2 +- tests/vcr_utils.py | 74 ++++++++++++++++++- 6 files changed, 100 insertions(+), 94 deletions(-) diff --git a/tests/cassettes/test_json_to_pptx_analyze_tool_vcr.yaml b/tests/cassettes/test_json_to_pptx_analyze_tool_vcr.yaml index 0503a19..57f693a 100644 --- a/tests/cassettes/test_json_to_pptx_analyze_tool_vcr.yaml +++ b/tests/cassettes/test_json_to_pptx_analyze_tool_vcr.yaml @@ -1,6 +1,6 @@ interactions: - request: - body: '{"pptx_template_id": "19823658-6af5-4560-ab87-632da39511de"}' + body: '{"pptx_template_id": "TEMPLATE_ID"}' headers: Accept: - '*/*' @@ -31,15 +31,24 @@ interactions: title"}]},{"position":2,"type":"Common","description":"Please use this slide to create content.","placeholders":[{"name":"title","description":"Input slide title here"},{"name":"content","description":"Input slide content here"},{"name":"image","description":"Input - slide image url here"}]}],"json_to_pptx_presentation_schema":{"$defs":{"Placeholder":{"properties":{"name":{"description":"The - key of the placeholder","title":"Name","type":"string"},"content":{"description":"The - content of the placeholder","title":"Content","type":"string"}},"required":["name","content"],"title":"Placeholder","type":"object"},"Slide":{"properties":{"type":{"description":"The - type of the slide","title":"Type","type":"string"},"placeholders":{"description":"The - placeholders of the slide","items":{"$ref":"#/$defs/Placeholder"},"title":"Placeholders","type":"array"},"speaker_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Additional - notes for the slide intended for the presenter. These notes provide extra - context or cues during the presentation and are not visible to the audience.","title":"Speaker - Notes"}},"required":["type","placeholders"],"title":"Slide","type":"object"}},"properties":{"slides":{"description":"The - slides of the presentation","items":{"$ref":"#/$defs/Slide"},"title":"Slides","type":"array"}},"required":["slides"],"title":"Presentation","type":"object"}}' + slide image url here"}]}],"json_to_pptx_presentation_schema":"{\"$defs\": + {\"Placeholder\": {\"properties\": {\"name\": {\"description\": \"The key + of the placeholder\", \"title\": \"Name\", \"type\": \"string\"}, \"content\": + {\"description\": \"The content of the placeholder\", \"title\": \"Content\", + \"type\": \"string\"}}, \"required\": [\"name\", \"content\"], \"title\": + \"Placeholder\", \"type\": \"object\"}, \"Slide\": {\"properties\": {\"type\": + {\"description\": \"The type of the slide\", \"title\": \"Type\", \"type\": + \"string\"}, \"placeholders\": {\"description\": \"The placeholders of the + slide\", \"items\": {\"$ref\": \"#/$defs/Placeholder\"}, \"title\": \"Placeholders\", + \"type\": \"array\"}, \"speaker_notes\": {\"anyOf\": [{\"type\": \"string\"}, + {\"type\": \"null\"}], \"default\": null, \"description\": \"Additional notes + for the slide intended for the presenter. These notes provide extra context + or cues during the presentation and are not visible to the audience.\", \"title\": + \"Speaker Notes\"}}, \"required\": [\"type\", \"placeholders\"], \"title\": + \"Slide\", \"type\": \"object\"}}, \"properties\": {\"slides\": {\"description\": + \"The slides of the presentation\", \"items\": {\"$ref\": \"#/$defs/Slide\"}, + \"title\": \"Slides\", \"type\": \"array\"}}, \"required\": [\"slides\"], + \"title\": \"Presentation\", \"type\": \"object\"}"}' headers: content-encoding: - gzip diff --git a/tests/cassettes/test_json_to_pptx_execute_tool_vcr.yaml b/tests/cassettes/test_json_to_pptx_execute_tool_vcr.yaml index d125adf..86cbfdc 100644 --- a/tests/cassettes/test_json_to_pptx_execute_tool_vcr.yaml +++ b/tests/cassettes/test_json_to_pptx_execute_tool_vcr.yaml @@ -1,7 +1,6 @@ interactions: - request: - body: - '{"pptx_template_id": "19823658-6af5-4560-ab87-632da39511de", "presentation": + body: '{"pptx_template_id": "TEMPLATE_ID", "presentation": {"slides": [{"type": "title", "placeholders": [{"name": "title", "content": "Test Title"}, {"name": "subtitle", "content": "Test Subtitle"}]}]}}' headers: diff --git a/tests/conftest.py b/tests/conftest.py index f9263a0..3b269fe 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,16 +1,16 @@ """テスト実行のための設定モジュール。""" -import copy import logging import os from pathlib import Path from typing import TYPE_CHECKING, Any, Dict -from urllib.parse import urlparse, urlunparse import pytest from dotenv import load_dotenv from vcr.cassette import Cassette # type: ignore -from vcr.stubs import VCRHTTPResponse # type: ignore +from vcr.stubs import VCRHTTPResponse + +from tests.vcr_utils import scrub_request, scrub_response # type: ignore if TYPE_CHECKING: from pytest_mock import MockerFixture # noqa: F401 @@ -69,58 +69,6 @@ def _set_version_string(self: VCRHTTPResponse, value: str) -> None: VCRHTTPResponse.version_string = property(_get_version_string, _set_version_string) -def scrub_request(request: Any) -> Any: - """ - 環境差異によってエラーが発生しないよう、環境依存のパラメータの値をカセットに記録する差異に統一する - また、本番環境以外のURLが露出することを避けるなどカセットに秘匿情報が出ないための処置を行う - """ - # リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する - # 本番環境以外のURLが露出することを避けるための処置です - req = copy.deepcopy(request) - p = urlparse(req.uri) - redacted = urlunparse( - (p.scheme, "middleman-ai.com", p.path, p.params, p.query, p.fragment) - ) - req.uri = redacted - return req - - -def scrub_response(response: Any) -> Any: - """レスポンスの機密情報や環境依存情報を削除・置換する - - 特定のヘッダー(x-middleware-rewrite, x-request-id など)を削除し、 - レスポンス中のURLを標準化します。 - """ - # レスポンス本体のディープコピーを作成 - resp = copy.deepcopy(response) - - # 環境依存の情報が含まれるヘッダーを削除または置換 - headers_to_filter = [ - "x-middleware-rewrite", - "x-request-id", - "date", - "server", - ] - - for header in headers_to_filter: - if header in resp["headers"]: - resp["headers"][header] = ["FILTERED"] - - # リダイレクト先URLがあればそれも標準化 - if "location" in resp["headers"]: - location = resp["headers"]["location"][0] - p = urlparse(location) - if p.netloc and "middleman-ai.com" in p.netloc: - standardized = urlunparse( - (p.scheme, "middleman-ai.com", p.path, p.params, p.query, p.fragment) - ) - resp["headers"]["location"] = [standardized] - - # レスポンス本文内のURLパターンも置換できますが、ここでは実装していません - - return resp - - @pytest.fixture(scope="module") def vcr_config() -> Dict[str, Any]: """VCRの設定を行います。 diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index 2d11e2c..d7c70eb 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -6,7 +6,6 @@ import pytest from middleman_ai.client import Presentation, ToolsClient -from tests.vcr_utils import generate_filter_request_body_function if TYPE_CHECKING: from _pytest.fixtures import FixtureRequest # noqa: F401 @@ -46,11 +45,7 @@ def test_md_to_pdf_vcr(client: ToolsClient) -> None: assert "/s/" in pdf_url -@pytest.mark.vcr( - before_record_request=generate_filter_request_body_function( - "pdf_template_id", "TEMPLATE_ID" - ), -) +@pytest.mark.vcr() def test_md_to_pdf_with_template_id_vcr(client: ToolsClient) -> None: """ToolsClient.md_to_pdfの実際のAPIを使用したテスト。 @@ -95,12 +90,7 @@ def test_md_to_docx_vcr(client: ToolsClient) -> None: assert "/s/" in docx_url -@pytest.mark.vcr( - before_record_request=generate_filter_request_body_function( - "docx_template_id", - "TEMPLATE_ID", - ), -) +@pytest.mark.vcr() def test_md_to_docx_with_template_id_vcr(client: ToolsClient) -> None: """ToolsClient.md_to_docxの実際のAPIを使用したテスト。 @@ -144,12 +134,7 @@ def test_pdf_to_page_images_vcr(client: ToolsClient) -> None: assert all("/s/" in page["image_url"] for page in pages) -@pytest.mark.vcr( - before_record_request=generate_filter_request_body_function( - "pptx_template_id", - "TEMPLATE_ID", - ), -) +@pytest.mark.vcr() def test_json_to_pptx_analyze_v2_vcr(client: ToolsClient) -> None: """ToolsClient.json_to_pptx_analyze_v2の実際のAPIを使用したテスト。 @@ -176,12 +161,7 @@ def test_json_to_pptx_analyze_v2_vcr(client: ToolsClient) -> None: assert all("description" in placeholder for placeholder in placeholders) -@pytest.mark.vcr( - before_record_request=generate_filter_request_body_function( - "pptx_template_id", - "TEMPLATE_ID", - ), -) +@pytest.mark.vcr() def test_json_to_pptx_execute_v2_vcr(client: ToolsClient) -> None: """ToolsClient.json_to_pptx_execute_v2の実際のAPIを使用したテスト。 diff --git a/tests/test_langchain_tools_vcr.py b/tests/test_langchain_tools_vcr.py index a2c8887..3adca34 100644 --- a/tests/test_langchain_tools_vcr.py +++ b/tests/test_langchain_tools_vcr.py @@ -32,7 +32,7 @@ def client() -> ToolsClient: """ return ToolsClient( base_url=os.getenv("MIDDLEMAN_BASE_URL") or "https://middleman-ai.com", - api_key=os.getenv("MIDDLEMAN_API_KEY_VCR") or "", + api_key=os.getenv("MIDDLEMAN_API_KEY") or "", ) diff --git a/tests/vcr_utils.py b/tests/vcr_utils.py index 84f7409..97015ad 100644 --- a/tests/vcr_utils.py +++ b/tests/vcr_utils.py @@ -4,10 +4,11 @@ # 環境差異を吸収するための関数をここに定義し、 # それぞれのテストで環境差異が発生する部分をマスクしてカセットを登録できるようにする - +import copy import json from collections.abc import Callable from typing import Any +from urllib.parse import urlparse, urlunparse def _filter_value_in_request_body(request: Any, key: str, replace_value: str) -> Any: @@ -25,8 +26,77 @@ def _filter_value_in_request_body(request: Any, key: str, replace_value: str) -> return request -def generate_filter_request_body_function(key: str, replace_value: str) -> Callable: +def _generate_filter_request_body_function(key: str, replace_value: str) -> Callable: """ VCRテストで環境依存な値をマスクするための関数(リクエストボディ用) """ return lambda request: _filter_value_in_request_body(request, key, replace_value) + + +def _mask_request_uri(request: Any) -> Any: + """ + 本番環境以外のURLが露出することを避けるなどカセットに秘匿情報が出ないための処置を行う + """ + req = copy.deepcopy(request) + p = urlparse(req.uri) + redacted = urlunparse( + (p.scheme, "middleman-ai.com", p.path, p.params, p.query, p.fragment) + ) + req.uri = redacted + return req + + +def scrub_request(request: Any) -> Any: + """ + 環境差異によってエラーが発生しないよう、環境依存のパラメータの値をカセットに記録する差異に統一する + また、 + """ + # リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する + # 本番環境以外のURLが露出することを避けるための処置です + req = _mask_request_uri(request) + + p = urlparse(req.uri) + request_path = p.path + if "md-to-pdf" in request_path: + req = _filter_value_in_request_body(req, "pdf_template_id", "TEMPLATE_ID") + if "md-to-docx" in request_path: + req = _filter_value_in_request_body(req, "docx_template_id", "TEMPLATE_ID") + if "json-to-pptx" in request_path: + req = _filter_value_in_request_body(req, "pptx_template_id", "TEMPLATE_ID") + return req + + +def scrub_response(response: Any) -> Any: + """レスポンスの機密情報や環境依存情報を削除・置換する + + 特定のヘッダー(x-middleware-rewrite, x-request-id など)を削除し、 + レスポンス中のURLを標準化します。 + """ + # レスポンス本体のディープコピーを作成 + resp = copy.deepcopy(response) + + # 環境依存の情報が含まれるヘッダーを削除または置換 + headers_to_filter = [ + "x-middleware-rewrite", + "x-request-id", + "date", + "server", + ] + + for header in headers_to_filter: + if header in resp["headers"]: + resp["headers"][header] = ["FILTERED"] + + # リダイレクト先URLがあればそれも標準化 + if "location" in resp["headers"]: + location = resp["headers"]["location"][0] + p = urlparse(location) + if p.netloc and "middleman-ai.com" in p.netloc: + standardized = urlunparse( + (p.scheme, "middleman-ai.com", p.path, p.params, p.query, p.fragment) + ) + resp["headers"]["location"] = [standardized] + + # レスポンス本文内のURLパターンも置換できますが、ここでは実装していません + + return resp From 9353d7765ca760055a6a0d0b8b242f6e027eeed7 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 16:52:55 +0900 Subject: [PATCH 19/35] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/langchain_tools/md_to_docx.py | 1 + tests/vcr_utils.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleman_ai/langchain_tools/md_to_docx.py b/src/middleman_ai/langchain_tools/md_to_docx.py index 7234f3a..349dd1d 100644 --- a/src/middleman_ai/langchain_tools/md_to_docx.py +++ b/src/middleman_ai/langchain_tools/md_to_docx.py @@ -44,6 +44,7 @@ def __init__( Args: client: Middleman.ai APIクライアント + default_template_id: デフォルトのDOCXテンプレートのID(UUID) **kwargs: BaseTool用の追加引数 """ kwargs["client"] = client diff --git a/tests/vcr_utils.py b/tests/vcr_utils.py index 97015ad..04deaa6 100644 --- a/tests/vcr_utils.py +++ b/tests/vcr_utils.py @@ -49,7 +49,6 @@ def _mask_request_uri(request: Any) -> Any: def scrub_request(request: Any) -> Any: """ 環境差異によってエラーが発生しないよう、環境依存のパラメータの値をカセットに記録する差異に統一する - また、 """ # リクエストのURI からホスト名を標準化してmiddleman-ai.comに置換する # 本番環境以外のURLが露出することを避けるための処置です From a396c5e65286541e570d09327f820bf6bca2c8ae Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 16:57:28 +0900 Subject: [PATCH 20/35] fix cassette --- tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml b/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml index ef1e330..b6a9f1e 100644 --- a/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml +++ b/tests/cassettes/test_md_to_docx_with_template_id_vcr.yaml @@ -19,11 +19,11 @@ interactions: authorization: - DUMMY method: POST - uri: https://stg.middleman-ai.com/api/v1/tools/md-to-docx + uri: https://middleman-ai.com/api/v1/tools/md-to-docx response: body: string: - '{"docx_url":"https://stg.middleman-ai.com/s/abfbc7fe/scLdYIML1z","important_remark_for_user":"The + '{"docx_url":"https://middleman-ai.com/s/abfbc7fe/scLdYIML1z","important_remark_for_user":"The URL expires in 1 hour.Please note that you will not be able to download the file after it has expired."}' headers: From e2d6aab503d3445f060c6a5cf7d70453a70a3d60 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 14 May 2025 18:46:17 +0900 Subject: [PATCH 21/35] =?UTF-8?q?version=20v0.1.2=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20&=20CLI=E3=81=ABBASE=5FURL=E7=92=B0=E5=A2=83?= =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=81=8C=E5=8A=B9=E3=81=8B=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=83=90=E3=82=B0=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- src/middleman_ai/cli/main.py | 29 +++++++++++++++++++++-------- uv.lock | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c8a69ec..527a3ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "middleman-ai" -version = "0.1.1" +version = "0.1.2" description = "Python client SDK for Middleman.ai API" authors = [{ name = "Generative Agents, Inc." }] dependencies = [ diff --git a/src/middleman_ai/cli/main.py b/src/middleman_ai/cli/main.py index 3441a6f..5c3f818 100644 --- a/src/middleman_ai/cli/main.py +++ b/src/middleman_ai/cli/main.py @@ -10,6 +10,12 @@ from middleman_ai.exceptions import MiddlemanBaseException +def get_base_url() -> str: + """Get base URL from environment variable.""" + base_url = os.getenv("MIDDLEMAN_BASE_URL", "https://middleman-ai.com") + return base_url + + def get_api_key() -> str: """Get API key from environment variable.""" api_key = os.getenv("MIDDLEMAN_API_KEY") @@ -19,6 +25,13 @@ def get_api_key() -> str: return api_key +def get_client() -> ToolsClient: + """Get client from environment variable.""" + base_url = get_base_url() + api_key = get_api_key() + return ToolsClient(base_url=base_url, api_key=api_key) + + @click.group() def cli() -> None: """Middleman.ai CLI tools.""" @@ -32,7 +45,7 @@ def md_to_pdf(template_id: str | None = None) -> None: """Convert Markdown to PDF.""" print("md_to_pdf コマンドを実行しています...") try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() print("標準入力からMarkdownを読み込んでいます...") markdown_text = sys.stdin.read() print( @@ -59,7 +72,7 @@ def md_to_docx(template_id: str | None = None) -> None: """Convert Markdown to DOCX.""" print("md_to_docx コマンドを実行しています...") try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() print("標準入力からMarkdownを読み込んでいます...") markdown_text = sys.stdin.read() print( @@ -87,7 +100,7 @@ def md_to_docx(template_id: str | None = None) -> None: def pdf_to_page_images(pdf_path: str) -> None: """Convert PDF pages to images.""" try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() with click.progressbar( # type: ignore[var-annotated] length=1, label="PDFを画像に変換中...", show_eta=False ) as bar: @@ -104,7 +117,7 @@ def pdf_to_page_images(pdf_path: str) -> None: def pptx_to_page_images(pptx_path: str) -> None: """Convert PPTX pages to images.""" try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() with click.progressbar( # type: ignore[var-annotated] length=1, label="PPTXを画像に変換中...", show_eta=False ) as bar: @@ -121,7 +134,7 @@ def pptx_to_page_images(pptx_path: str) -> None: def docx_to_page_images(docx_path: str) -> None: """Convert DOCX pages to images.""" try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() with click.progressbar( # type: ignore[var-annotated] length=1, label="DOCXを画像に変換中...", show_eta=False ) as bar: @@ -138,7 +151,7 @@ def docx_to_page_images(docx_path: str) -> None: def xlsx_to_page_images(xlsx_path: str) -> None: """Convert XLSX pages to images.""" try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() with click.progressbar( # type: ignore[var-annotated] length=1, label="XLSXを画像に変換中...", show_eta=False ) as bar: @@ -155,7 +168,7 @@ def xlsx_to_page_images(xlsx_path: str) -> None: def json_to_pptx_analyze(template_id: str) -> None: """Analyze PPTX template.""" try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() with click.progressbar( # type: ignore[var-annotated] length=1, label="テンプレートを解析中...", show_eta=False ) as bar: @@ -171,7 +184,7 @@ def json_to_pptx_analyze(template_id: str) -> None: def json_to_pptx_execute(template_id: str) -> None: """Execute PPTX template with data from stdin.""" try: - client = ToolsClient(api_key=get_api_key()) + client = get_client() data = json.loads(sys.stdin.read()) presentation = Presentation( slides=[ diff --git a/uv.lock b/uv.lock index d297a31..7e16f28 100644 --- a/uv.lock +++ b/uv.lock @@ -593,7 +593,7 @@ wheels = [ [[package]] name = "middleman-ai" -version = "0.1.1" +version = "0.1.2" source = { editable = "." } dependencies = [ { name = "click" }, From d81b87d23e995f017e0a49cf6e21a9c4c028aed0 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Mon, 19 May 2025 12:36:17 +0900 Subject: [PATCH 22/35] =?UTF-8?q?SDK=E3=81=AECI=E6=A7=8B=E7=AF=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yaml | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..18a522f --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,47 @@ +name: Run Tests + +on: + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + version: "0.5.29" + + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v3 + with: + path: .venv + key: venv-${{ matrix.python-version }}-${{ hashFiles('**/uv.lock') }} + + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: | + uv sync --dev + + - name: Run linting + run: | + uv run ruff check . + + - name: Run type checking + run: | + uv run mypy . + + - name: Run tests + run: uv run pytest -v From 751df118980a4e143436dda0d5f295d1550f851c Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Mon, 19 May 2025 12:48:01 +0900 Subject: [PATCH 23/35] =?UTF-8?q?mypy=E3=81=AFsrc=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=80=E3=81=AE=E3=81=BF=E3=82=92=E5=AF=BE=E8=B1=A1?= =?UTF-8?q?=E3=81=AB=E5=AE=9F=E8=A1=8C=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?CI=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yaml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 18a522f..a7301eb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -41,7 +41,7 @@ jobs: - name: Run type checking run: | - uv run mypy . + uv run mypy ./src - name: Run tests run: uv run pytest -v diff --git a/pyproject.toml b/pyproject.toml index 527a3ad..9a1c809 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ target-version = "py38" lint.select = ["E", "F", "I", "N", "W", "B", "UP", "PL", "RUF"] lint.ignore = ["RUF001", "RUF002", "RUF022", "N818"] -[tool.ruff.isort] +[tool.ruff.lint.isort] known-first-party = ["middleman_ai"] [tool.ruff.lint.extend-per-file-ignores] From a40bbd0646ba0903bc03a117fc8cb821fafe1ba4 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Mon, 19 May 2025 12:50:45 +0900 Subject: [PATCH 24/35] =?UTF-8?q?=E5=8F=A4=E3=81=84=E3=82=A2=E3=82=AF?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE=E3=83=90=E3=83=BC=E3=82=B8?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a7301eb..9e75069 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,10 +11,10 @@ jobs: python-version: ["3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} From 615b0adab009c08588ef6d5650d3da7529a97493 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Mon, 19 May 2025 15:48:35 +0900 Subject: [PATCH 25/35] =?UTF-8?q?Cursor=20Rules=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/cli.mdc | 82 +++++++++++++++++++++++++++++++++ .cursor/rules/client.mdc | 63 +++++++++++++++++++++++++ .cursor/rules/langchaintool.mdc | 64 +++++++++++++++++++++++++ .cursor/rules/mcp.mdc | 34 ++++++++++++++ .cursor/rules/readme.mdc | 43 +++++++++++++++++ .cursor/rules/vcr.mdc | 54 ++++++++++++++++++++++ README-for-developer.md | 1 + 7 files changed, 341 insertions(+) create mode 100644 .cursor/rules/cli.mdc create mode 100644 .cursor/rules/client.mdc create mode 100644 .cursor/rules/langchaintool.mdc create mode 100644 .cursor/rules/mcp.mdc create mode 100644 .cursor/rules/readme.mdc create mode 100644 .cursor/rules/vcr.mdc diff --git a/.cursor/rules/cli.mdc b/.cursor/rules/cli.mdc new file mode 100644 index 0000000..3c84a0f --- /dev/null +++ b/.cursor/rules/cli.mdc @@ -0,0 +1,82 @@ +--- +description: +globs: src/middleman_ai/cli/*.py,tests/cli/*.py +alwaysApply: false +--- +# CLI実装ルール + +このドキュメントにはMiddleman SDK用のコマンドラインインターフェース(CLI)に関するルールをまとめます。 + +## 実装の概要 + +CLIは [cli](mdc:src/middleman_ai/cli) ディレクトリに実装されており、コマンドラインからMiddleman.ai APIを呼び出すための機能を提供しています。実装にはclick(https://click.palletsprojects.com/en/stable/)を使用しています。 + +## 実装ルール + +- 各コマンドは `@cli.command()` デコレータで定義する +- 環境変数 `MIDDLEMAN_API_KEY` からAPIキーを取得する +- 入力データは標準入力から受け取る +- コマンドの引数はClickの型アノテーションで定義する、引数が必須なのか非必須なのかは注意すること +- エラーハンドリングは `click.ClickException` を使用する +- 進捗状況は `click.progressbar` で表示する +- 今何をしているかがわかりやすいよう、利用者向けのログをprintで適宜表示する + +```python +@cli.command() +@click.argument("template_id", required=False) +def md_to_pdf(template_id: str | None = None) -> None: + """Convert Markdown to PDF.""" + try: + client = get_client() + markdown_text = sys.stdin.read() + with click.progressbar(length=1, label="PDFに変換中...") as bar: + pdf_url = client.md_to_pdf(markdown_text, pdf_template_id=template_id) + bar.update(1) + print(f"変換結果URL: {pdf_url}") + except MiddlemanBaseException as e: + raise click.ClickException(str(e)) from e +``` + +## テストルール + +CLIのテストは [tests/cli](mdc:tests/cli) ディレクトリに実装されています。 + +### test_cli.py の共通ルール + +1. **テストフィクスチャ**: CLI実装の部分のみがテスト対象のため、中で利用しているクライアント部分をモック化してテストする + ```python + def test_md_to_pdf_cli(runner, mock_client): + ``` + +2. **コマンド呼び出し**: `runner.invoke` でCLIコマンドを実行し、標準入力はオプション引数 `input` で渡す + ```python + result = runner.invoke(cli, ["md-to-pdf"], input="# Test") + ``` + +3. **結果検証**: 終了コード、出力内容、モックの呼び出し状況を検証 + ```python + assert result.exit_code == 0 + assert "https://example.com/test.pdf" in result.output + mock_client.md_to_pdf.assert_called_once_with("# Test", pdf_template_id=None) + ``` + +4. **エラー処理のテスト**: APIキー未設定などのエラーケースもテスト + ```python + def test_missing_api_key_cli(runner, mocker): + ``` + +### test_mcp_cli.py + +MCPサーバーコマンドのテストを実装しています。 +MCPサーバー立ち上げコマンドのみ、他とは特徴が違います。 +このコマンドはMiddlemanのAPIコールをするのではなくMCPサーバーを立ち上げる役割になります。 + +```python +def test_mcp_command(runner: CliRunner, mocker: "MockerFixture") -> None: + """mcpコマンドのテスト。""" + mock_run_server = mocker.patch.object(mcp_server, "run_server") + result = runner.invoke(mcp_command) + assert result.exit_code == 0 + assert "MCP server is running" in result.output + mock_run_server.assert_called_once_with() +``` diff --git a/.cursor/rules/client.mdc b/.cursor/rules/client.mdc new file mode 100644 index 0000000..9aeafe9 --- /dev/null +++ b/.cursor/rules/client.mdc @@ -0,0 +1,63 @@ +--- +description: +globs: client.py,test_client.py,test_client_vcr.py +alwaysApply: false +--- +# Pythonクライアント実装ルール + +このドキュメントにはMiddleman SDKにアクセスできるPythonクライアント [client.py](mdc:src/middleman_ai/client.py) の実装ルールをまとめます。 + +## 実装ルール + +- エラー処理は分散させずに共通化する +- レスポンスは正しいPydanticモデルでパースする + +## テストルール + +Pythonクライアントのテストは以下の2箇所で実装します。 + +- [test_client.py](mdc:tests/test_client.py): 単体テスト +- [test_client_vcr.py](mdc:tests/test_client_vcr.py): VCRテスト + +### test_client.py + +API呼び出しをpytestを使ってモック化することで、クライアントコードのみをテストする単体テストを記載します。 +正常系、異常系やAPIに渡すパラメータパターンごとにテストケースが分かれれいます。 + +```python +# 例 +def test_md_to_pdf_success( + client: ToolsClient, mocker: "MockerFixture", mock_response: Mock +) -> None: + """md_to_pdf成功時のテスト。""" + mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) + + result = client.md_to_pdf("# Test") + + assert result == "https://example.com/test.pdf" + mock_post.assert_called_once_with( + "https://middleman-ai.com/api/v1/tools/md-to-pdf", + json={"markdown": "# Test", "pdf_template_id": None}, + timeout=30.0, + ) +``` + +### test_client_vcr.py の共通ルール + +VCRテストでは、以下のルールに従ってテストを実装します。 +なお、 [vcr.mdc](mdc:.cursor/rules/vcr.mdc) に記載の共通ルールも守るようにしてください。 + + +1. **テスト内のアサーション**: 環境に依存する値や戻り値が呼び出しごとに違う値は、環境によらずに成功するアサーションにします + ```python + # https://xxx.xxx/s/xxxxx というURLであることを検証する場合の例、xxxの部分は環境依存 + assert pdf_url.startswith("https://") + assert "/s/" in pdf_url + ``` + +2. **環境変数の利用**: テンプレートIDなど環境依存の値は環境変数から取得する + ```python + template_id = os.getenv("MIDDLEMAN_TEST_PPTX_TEMPLATE_ID") or "" + ``` + + diff --git a/.cursor/rules/langchaintool.mdc b/.cursor/rules/langchaintool.mdc new file mode 100644 index 0000000..62696a9 --- /dev/null +++ b/.cursor/rules/langchaintool.mdc @@ -0,0 +1,64 @@ +--- +description: +globs: src/middleman_ai/langchain_tools/*.py +alwaysApply: false +--- +# LangChain Tool実装ルール + +このドキュメントにはMiddleman SDKでLangChain向けに提供されるツール実装に関するルールをまとめます。 + +## 実装の概要 + +LangChainツールは [langchain_tools](mdc:src/middleman_ai/langchain_tools) ディレクトリに実装されており、AIエージェントがMiddleman.ai APIを利用できるように設計されています。 + +## 実装ルール + +- 各ツールはLangChainの`BaseTool`を継承する +- ツールにはわかりやすい名前と説明を付ける +- 入力スキーマはPydanticモデルで定義する +- `_run`メソッドと`_arun`メソッドを実装する(非同期処理がない場合は`_arun`は`_run`を呼び出す) + +## テストルール + +LangChainツール実装のテストは以下の2箇所で実装します。 + +- [test_langchain_tools.py](mdc:tests/test_langchain_tools.py): 単体テスト +- [test_langchain_tools_vcr.py](mdc:tests/test_langchain_tools_vcr.py): VCRテスト + +### test_langchain_tools.py の共通ルール + +APIリクエストをモック化して実装部分のみをテストします。 + +1. **クライアントとAPIのモック**: pytestのモックの仕組みを利用してクライアントのメソッドをモック化し、Tool単体での動作テストにします + ```python + mock_md_to_pdf = mocker.patch.object(client, "md_to_pdf", return_value="https://example.com/test.pdf") + ``` + +2. **複数テストケース**: パラメータパターンがある場合にはパターンごとにテストケースを分け、どんなパターンに対応しているかがわかりやすいテストケース名をつける + ```python + def test_md_to_pdf_tool_with_template_id(client: ToolsClient, mocker: "MockerFixture") -> None: + ``` + +3. **エラーケースのテスト**: バリデーションエラーや不正な入力のチェックが実装されている場合、異常系テストも実装 + ```python + def test_json_to_pptx_analyze_tool_template_id_error(client: ToolsClient, mocker: "MockerFixture") -> None: + ``` + +### test_langchain_tools_vcr.py の共通ルール + +VCRテストでは、以下のルールに従ってテストを実装します。 +なお、 [vcr.mdc](mdc:.cursor/rules/vcr.mdc) に記載の共通ルールも守るようにしてください。 + +1. **テスト関数の命名**: 関数名の末尾に `_vcr` を付与 + ```python + def test_md_to_pdf_tool_vcr(client: ToolsClient) -> None: + ``` + + +2. **テスト実行方法**: ツールの`run`メソッドを直接呼び出し、返り値を検証する。決してプライベートメソッドである `_run` や `_arun` を直接呼び出すテストにしないこと + ```python + tool = MdToPdfTool(client=client) + result = tool.run(test_markdown) + assert isinstance(result, str) + assert result.startswith("https://") + ``` diff --git a/.cursor/rules/mcp.mdc b/.cursor/rules/mcp.mdc new file mode 100644 index 0000000..cc245d7 --- /dev/null +++ b/.cursor/rules/mcp.mdc @@ -0,0 +1,34 @@ +--- +description: +globs: src/middleman_ai/mcp/*.py,test_mcp_cli.py,test_mcp.py +alwaysApply: false +--- +# MCP実装ルール + +このドキュメントにはMiddleman SDKがModel Context Protocol(MCP)に準拠したサーバー実装に関するルールをまとめます。 + +## 実装の概要 + +MCPサーバーは [mcp](mdc:src/middleman_ai/mcp) ディレクトリに実装されています。MCPはAnthropicが提供する標準プロトコルで、AI(LLM)とツールを接続するための仕組みを提供します。これにより、Claude、Cursor、ZedなどのMCP対応クライアントからMiddleman.ai APIを直接利用できるようになります。 + +実装には`FastMCP`フレームワークを使用し、各ツールを関数としてMCPサーバーに登録しています。 + +## 実装ルール + +- 各ツールは`@mcp.tool()`デコレータを使用して定義する +- 引数の型はPythonの型アノテーションを使用して明示する +- サーバー起動時には環境変数(`MIDDLEMAN_API_KEY`)からAPIキーを取得する +- ファイル読み込み機能を持つツールでは、パスの存在やアクセス権を確認する + +## テストルール + +MCPサーバーのテストは [test_mcp.py](mdc:tests/test_mcp.py) に実装されています。 + +### test_mcp.py の共通ルール + +1. **モックの使用**: MCPの実装のみをテストしたいのでクライアントの処理はモック化します + ```python + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_client.md_to_pdf.return_value = "https://example.com/test.pdf" + ``` + diff --git a/.cursor/rules/readme.mdc b/.cursor/rules/readme.mdc new file mode 100644 index 0000000..1098446 --- /dev/null +++ b/.cursor/rules/readme.mdc @@ -0,0 +1,43 @@ +--- +description: +globs: +alwaysApply: true +--- +# Middleman SDK + +## 概要 +このリポジトリではAIエージェントが利用できるツールをAPIとして提供するサービス「Middleman」のAPIを簡単に利用できるようにするためのクライアントコードをSDKとして管理しています。 + +Middleman SDKは、以下の4種類の方法でMiddlemanのAPIへのアクセスを提供します。 + +- Pythonクライアント: Pythonコードから簡単にAPI呼び出しができるクライアント(実装: [client.py](mdc:src/middleman_ai/client.py)) +- LangChainツール: AIエージェントを作るためのPythonフレームワークLangChain/LangGraphと結合できるツール(実装: src/middlema_ai/langchain_tools) +- CLI: コマンドラインから簡単にAPI呼び出すことができるCLI(実装: [main.py](mdc:src/middleman_ai/cli/main.py)) +- MCP(Model Context Protocol): AIエージェントが外部APIやツールを呼び出すためのプロトコル(実装: [server.py](mdc:src/middleman_ai/mcp/server.py)) + +※ Model Context Protocol参考サイト: https://modelcontextprotocol.io/introduction + + +# 開発ルール + +## テスト + +### ルール +- ユーザーからの依頼に対応後、必ず単体テストを実行し実装が妥当かどうかを確認する +- 新しい引数が増えたなど、テストすべき新しい観点が発生した場合にはテストケースの追加・修正が必要である + +### テスト実行 + +```bash +uv run pytest +uv run pytest -v +uv run pytest -v path/to/test +uv run pytest -k search_keyword +``` + +### リンター実行 + +```bash +uv run ruff check . +uv run mypy ./src +``` diff --git a/.cursor/rules/vcr.mdc b/.cursor/rules/vcr.mdc new file mode 100644 index 0000000..b7675a0 --- /dev/null +++ b/.cursor/rules/vcr.mdc @@ -0,0 +1,54 @@ +--- +description: +globs: tests/**/*.yaml,tests/**/*_vcr.py,vcr_utils.py,conftest.py +alwaysApply: false +--- +# VCRテスト(Virtual Cassette Recorder) + +VCRテストとは、外部APIとの通信をモック化するテスト手法です。実際のHTTPリクエストとレスポンスを「カセット」と呼ばれるファイルに記録し、以降のテスト実行時にはその記録を再生することで、外部サービスに依存せずテストを実行できます。 + +## VCRテストの目的と利点 + +1. **一貫性の確保**: 外部APIの応答変更に影響されず、一貫したテスト結果を得られます +2. **高速化**: 実際のネットワークリクエストが不要なため、テスト実行が高速化します +3. **オフライン対応**: インターネット接続がない環境でもテストが可能です +4. **API負荷軽減**: 外部サービスへの不必要なリクエストを減らせます + +## VCRテストの仕組み + +1. 初回テスト実行時に実際のHTTPリクエストを送信 +2. リクエストとレスポンスの詳細(URL、ヘッダー、ボディなど)をYAMLファイルに記録 +3. 2回目以降の実行時はYAMLファイルから応答を再生 + +## 重要な注意事項 + +1. **ローカル実行時の挙動**: ローカル環境での実行時には2回目以降もリクエスト照合が行われます。つまり、実際のリクエストの内容とカセットに記録されたリクエストの内容が一致するか確認され、一致する場合のみ記録された応答が返されます。 + +2. **カセット修正のルール**: カセットファイルを手動で修正する場合、必ず人間(チームメンバーまたは管理者)に修正許可を得てください。カセットの内容を不用意に変更すると、テストの信頼性が損なわれる可能性があります。 + +3. **機密情報の扱い**: APIキーなどの機密情報がカセットファイルに記録される場合があるため、それらが適切にフィルタリングされていることを確認してください。 + + +## VCRテスト共通の実装ルール + +1. **テスト関数の命名**: 関数名の末尾に `_vcr` を付けて、VCRテストであることを明示する + ```python + def test_md_to_pdf_vcr(client: ToolsClient) -> None: + ``` + +2. **pytest.mark.vcr() デコレータ**: 全てのVCRテスト関数に付与する + ```python + @pytest.mark.vcr() + def test_md_to_pdf_vcr(client: ToolsClient) -> None: + ``` + +3. **マルチパートリクエストの扱い**: ファイルアップロードを伴うテストでは、リクエストボディが環境によって変化するため、`match_on` パラメータを使用してマッチング条件を調整する + ```python + @pytest.mark.vcr(match_on=["method", "scheme", "port", "path", "query"]) + def test_pdf_to_page_images_vcr(client: ToolsClient) -> None: + ``` + +4. **機密情報のカセット記録**: このリポジトリはpublicリポジトリのため、機密情報(APIキーや本番環境以外の環境のURLなど)がカセットに残ると悪用の可能性がある。そのため、 [vcr_utils.py](mdc:tests/vcr_utils.py) [conftest.py](mdc:tests/conftest.py) にあるように機密情報をフィルタリングしている。もし、機密情報がカセットに記録されていることに気づいた場合、フィルタリングを追加し、人間にもその旨を理由と共に報告すること。 + + + diff --git a/README-for-developer.md b/README-for-developer.md index 0455d19..f5f2305 100644 --- a/README-for-developer.md +++ b/README-for-developer.md @@ -10,6 +10,7 @@ uv run pytest ```bash uv run ruff check . +uv run mypy ./src ``` ### ローカル環境で MCP サーバー実行 From a4b8c11c058bb38ec239cff2189cf55d24758e82 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Mon, 19 May 2025 16:04:16 +0900 Subject: [PATCH 26/35] fix typo --- .cursor/rules/readme.mdc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cursor/rules/readme.mdc b/.cursor/rules/readme.mdc index 1098446..f773d9e 100644 --- a/.cursor/rules/readme.mdc +++ b/.cursor/rules/readme.mdc @@ -11,7 +11,7 @@ alwaysApply: true Middleman SDKは、以下の4種類の方法でMiddlemanのAPIへのアクセスを提供します。 - Pythonクライアント: Pythonコードから簡単にAPI呼び出しができるクライアント(実装: [client.py](mdc:src/middleman_ai/client.py)) -- LangChainツール: AIエージェントを作るためのPythonフレームワークLangChain/LangGraphと結合できるツール(実装: src/middlema_ai/langchain_tools) +- LangChainツール: AIエージェントを作るためのPythonフレームワークLangChain/LangGraphと結合できるツール(実装: src/middleman_ai/langchain_tools) - CLI: コマンドラインから簡単にAPI呼び出すことができるCLI(実装: [main.py](mdc:src/middleman_ai/cli/main.py)) - MCP(Model Context Protocol): AIエージェントが外部APIやツールを呼び出すためのプロトコル(実装: [server.py](mdc:src/middleman_ai/mcp/server.py)) From 1db7793cbb696ae5d65bd7718aa1a6fc0f46027f Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 2 Jul 2025 18:44:54 +0900 Subject: [PATCH 27/35] =?UTF-8?q?mermaid-to-image=E3=81=AEClient=E5=AE=9F?= =?UTF-8?q?=E8=A3=85=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + CLAUDE.md | 96 +++++++++++++ src/middleman_ai/client.py | 42 ++++++ src/middleman_ai/models.py | 33 ++++- tests/CLAUDE.md | 48 +++++++ .../cassettes/test_mermaid_to_image_vcr.yaml | 46 +++++++ ...est_mermaid_to_image_with_options_vcr.yaml | 46 +++++++ tests/test_client.py | 126 ++++++++++++++++++ 8 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 CLAUDE.md create mode 100644 tests/CLAUDE.md create mode 100644 tests/cassettes/test_mermaid_to_image_vcr.yaml create mode 100644 tests/cassettes/test_mermaid_to_image_with_options_vcr.yaml diff --git a/.gitignore b/.gitignore index 4d27781..a6220d1 100644 --- a/.gitignore +++ b/.gitignore @@ -191,3 +191,6 @@ spec.md .env.production .env.development.local .env.production.local + +# Claude Code +.claude/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e4777aa --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,96 @@ +# CLAUDE.md + +このファイルはこのリポジトリでコードを扱う際のClaude Code (claude.ai/code) へのガイダンスを提供します。 + +## コマンド + +### 開発用コマンド +```bash +# テスト実行 +uv run pytest + +# リンター実行 +uv run ruff check . +uv run mypy ./src + +# タイプチェック +uv run mypy ./src + +# コードフォーマット +uv run black . +``` + +### ビルドと配布 +詳細は [README-for-developer.md](README-for-developer.md) の「配布」セクションを参照してください。 + +### CLIテスト +```bash +# APIキー設定 +export MIDDLEMAN_API_KEY=your-api-key + +# CLIコマンドテスト +echo "# テスト" | uvx middleman md-to-pdf [template-id] +uvx middleman pdf-to-page-images input.pdf +``` + +## アーキテクチャ + +Middleman.ai API用のPython SDKで、3つの主要なインターフェース層から構成されています: + +### 1. コアクライアント (`src/middleman_ai/client.py`) +- `ToolsClient`: HTTPセッション管理を含むメインAPIクライアントクラス +- 全APIエンドポイント実装: `md_to_pdf`, `md_to_docx`, `pdf_to_page_images`など +- `exceptions.py`でカスタム例外による集約エラーハンドリング +- `models.py`でPydanticモデルとしてレスポンス定義 + +### 2. LangChainツール (`src/middleman_ai/langchain_tools/`) +- 各ツールはLangChainの`BaseTool`を継承 +- AIエージェント用にクライアントメソッドをラップ +- `_run`と`_arun`メソッド両方を実装 +- ツール例: `MdToPdfTool`, `JsonToPptxAnalyzeTool`など + +### 3. MCPサーバー (`src/middleman_ai/mcp/server.py`) +- FastMCPを使用したModel Context Protocol実装 +- Claude Desktopやその他MCPクライアントにツールを公開 +- `@mcp.tool()`デコレータによる自動登録 +- テキスト入力とファイルパス入力の両方をサポート + +### 4. CLIインターフェース (`src/middleman_ai/cli/main.py`) +- Clickベースのコマンドラインインターフェース +- 標準入力またはファイル引数からの読み込み +- 環境変数設定 (`MIDDLEMAN_API_KEY`, `MIDDLEMAN_BASE_URL`) + +## テスト戦略 + +### 単体テスト (`tests/test_*.py`) +- pytest-mockを使用してHTTPリクエストをモック +- API呼び出しなしでクライアントロジックをテスト +- 成功/エラーシナリオとパラメータ検証をカバー + +### VCRテスト (`tests/test_*_vcr.py`) +- VCR.pyカセットを使用した実際のAPI統合テスト +- 環境に依存しないアサーション(正確な値ではなくURLパターンをチェック) +- テンプレートIDや機密データには環境変数を使用 + +### テストデータ +- `tests/data/`にサンプルファイル +- `tests/cassettes/`にVCRカセット +- `vcr_utils.py`にテストユーティリティ + +## 主要な実装ルール + +### エラーハンドリング +- クライアントで集約例外ハンドリングを使用 +- HTTPステータスコードを特定の例外タイプにマップ +- 適切なエラー伝播でPydanticレスポンスを解析 + +### コードスタイル +- Blackフォーマット(行長: 88) +- 特定のルールセットでRuffリンティング +- 型ヒント必須(mypyで強制) +- 全API リクエスト/レスポンスデータにPydanticモデル + +### 環境設定 +- `MIDDLEMAN_API_KEY`: API認証に必須 +- `MIDDLEMAN_BASE_URL`: APIベースURL(デフォルトは本番環境) +- VCRテストでテンプレートID用のテスト環境変数 \ No newline at end of file diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index bc21f46..f4e5939 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -23,6 +23,8 @@ JsonToPptxExecuteResponse, MdToDocxResponse, MdToPdfResponse, + MermaidToImageOptions, + MermaidToImageResponse, PdfToPageImagesResponse, PptxToPageImagesResponse, XlsxToPageImagesResponse, @@ -452,3 +454,43 @@ def json_to_pptx_execute_v2( return result.pptx_url except PydanticValidationError as e: raise ValidationError(str(e)) from e + + def mermaid_to_image( + self, + mermaid_text: str, + options: MermaidToImageOptions | None = None, + ) -> str: + """Mermaidダイアグラムを画像に変換し、画像のダウンロードURLを返します。 + + Args: + mermaid_text: 変換対象のMermaidダイアグラムテキスト + options: 変換オプション(テーマ、背景色、サイズなど) + + Returns: + str: 生成された画像のURL + + Raises: + ValidationError: 入力データが不正 + その他、_handle_responseで定義される例外 + """ + try: + if options is None: + options = MermaidToImageOptions() + + request_data = { + "content": mermaid_text, + "options": options.model_dump(exclude_none=True), + } + + response = self.session.post( + f"{self.base_url}/api/v1/tools/mermaid-to-image", + json=request_data, + timeout=self.timeout, + ) + data = self._handle_response(response) + result = MermaidToImageResponse.model_validate(data) + return result.image_url + except PydanticValidationError as e: + raise ValidationError(str(e)) from e + except requests.exceptions.RequestException as e: + raise ConnectionError() from e diff --git a/src/middleman_ai/models.py b/src/middleman_ai/models.py index 26ad4a1..4b0dbd9 100644 --- a/src/middleman_ai/models.py +++ b/src/middleman_ai/models.py @@ -1,6 +1,6 @@ """Middleman.ai SDKのデータモデルを定義するモジュール。""" -from typing import List, Optional +from typing import List, Literal, Optional from pydantic import BaseModel, Field @@ -89,3 +89,34 @@ class XlsxToPageImagesResponse(BaseModel): important_remark_for_user: Optional[str] = Field( None, description="ユーザーへの重要な注意事項" ) + + +class CustomSize(BaseModel): + """Mermaid画像のカスタムサイズ設定。""" + + width: int = Field(..., ge=100, le=1200, description="画像幅(100-1200ピクセル)") + height: int = Field(..., ge=100, le=1200, description="画像高さ(100-1200ピクセル)") + + +class MermaidToImageOptions(BaseModel): + """Mermaid → 画像変換のオプション設定。""" + + theme: Literal["default", "dark", "forest", "neutral"] = Field( + default="default", description="Mermaidテーマ" + ) + background_color: str = Field( + default="#ffffff", description="背景色(透明またはRGBカラー)" + ) + custom_size: Optional[CustomSize] = Field( + default=None, description="カスタムサイズ設定" + ) + + +class MermaidToImageResponse(BaseModel): + """Mermaid → 画像変換のレスポンスモデル。""" + + image_url: str = Field(..., description="生成された画像のダウンロードURL") + format: str = Field(..., description="出力フォーマット(例: png)") + important_remark_for_user: Optional[str] = Field( + None, description="ユーザーへの重要な注意事項" + ) diff --git a/tests/CLAUDE.md b/tests/CLAUDE.md new file mode 100644 index 0000000..4090859 --- /dev/null +++ b/tests/CLAUDE.md @@ -0,0 +1,48 @@ +# VCR テスト(Virtual Cassette Recorder) + +VCR テストとは、外部 API との通信をモック化するテスト手法です。実際の HTTP リクエストとレスポンスを「カセット」と呼ばれるファイルに記録し、以降のテスト実行時にはその記録を再生することで、外部サービスに依存せずテストを実行できます。 + +## VCR テストの目的と利点 + +1. **一貫性の確保**: 外部 API の応答変更に影響されず、一貫したテスト結果を得られます +2. **高速化**: 実際のネットワークリクエストが不要なため、テスト実行が高速化します +3. **オフライン対応**: インターネット接続がない環境でもテストが可能です +4. **API 負荷軽減**: 外部サービスへの不必要なリクエストを減らせます + +## VCR テストの仕組み + +1. 初回テスト実行時に実際の HTTP リクエストを送信 +2. リクエストとレスポンスの詳細(URL、ヘッダー、ボディなど)を YAML ファイルに記録 +3. 2 回目以降の実行時は YAML ファイルから応答を再生 + +## 重要な注意事項 + +1. **ローカル実行時の挙動**: ローカル環境での実行時には 2 回目以降もリクエスト照合が行われます。つまり、実際のリクエストの内容とカセットに記録されたリクエストの内容が一致するか確認され、一致する場合のみ記録された応答が返されます。 + +2. **カセット修正のルール**: カセットファイルを手動で修正する場合、必ず人間(チームメンバーまたは管理者)に修正許可を得てください。カセットの内容を不用意に変更すると、テストの信頼性が損なわれる可能性があります。 + +3. **機密情報の扱い**: API キーなどの機密情報がカセットファイルに記録される場合があるため、それらが適切にフィルタリングされていることを grep などを駆使して確認してから人間に成果を報告してください。 + +## VCR テスト共通の実装ルール + +1. **テスト関数の命名**: 関数名の末尾に `_vcr` を付けて、VCR テストであることを明示する + + ```python + def test_md_to_pdf_vcr(client: ToolsClient) -> None: + ``` + +2. **pytest.mark.vcr() デコレータ**: 全ての VCR テスト関数に付与する + + ```python + @pytest.mark.vcr() + def test_md_to_pdf_vcr(client: ToolsClient) -> None: + ``` + +3. **マルチパートリクエストの扱い**: ファイルアップロードを伴うテストでは、リクエストボディが環境によって変化するため、`match_on` パラメータを使用してマッチング条件を調整する + + ```python + @pytest.mark.vcr(match_on=["method", "scheme", "port", "path", "query"]) + def test_pdf_to_page_images_vcr(client: ToolsClient) -> None: + ``` + +4. **機密情報のカセット記録**: このリポジトリは public リポジトリのため、機密情報(API キーや本番環境以外の環境の URL など)がカセットに残ると悪用の可能性がある。そのため、 @vcr_utils.py @conftest.py にあるように機密情報をフィルタリングしている。もし、機密情報がカセットに記録されていることに気づいた場合、フィルタリングを追加し、人間にもその旨を理由と共に報告すること。 diff --git a/tests/cassettes/test_mermaid_to_image_vcr.yaml b/tests/cassettes/test_mermaid_to_image_vcr.yaml new file mode 100644 index 0000000..fcf4f63 --- /dev/null +++ b/tests/cassettes/test_mermaid_to_image_vcr.yaml @@ -0,0 +1,46 @@ +interactions: +- request: + body: '{"content": "graph TD\n A[Start] --> B[Process]\n B --> C{Decision}\n C + -->|Yes| D[End]\n C -->|No| B", "options": {"theme": "default", "background_color": + "#ffffff"}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate, zstd + Connection: + - keep-alive + Content-Length: + - '179' + Content-Type: + - application/json + User-Agent: + - python-requests/2.32.3 + authorization: + - DUMMY + method: POST + uri: https://middleman-ai.com/api/v1/tools/mermaid-to-image + response: + body: + string: '{"image_url":"https://middleman-ai.com/s/dc6f1fab/sV0t1928ik","format":"png","important_remark_for_user":"The + URL expires in 1 hour. Please note that you will not be able to download the + file after it has expired."}' + headers: + content-length: + - '215' + content-type: + - application/json + date: + - FILTERED + server: + - FILTERED + vary: + - Accept-Encoding + x-middleware-rewrite: + - FILTERED + x-request-id: + - FILTERED + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_mermaid_to_image_with_options_vcr.yaml b/tests/cassettes/test_mermaid_to_image_with_options_vcr.yaml new file mode 100644 index 0000000..74fb58e --- /dev/null +++ b/tests/cassettes/test_mermaid_to_image_with_options_vcr.yaml @@ -0,0 +1,46 @@ +interactions: +- request: + body: '{"content": "graph LR\n A[User] --> B[API]\n B --> C[Response]\n C + --> A", "options": {"theme": "dark", "background_color": "transparent", "custom_size": + {"width": 800, "height": 600}}}' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate, zstd + Connection: + - keep-alive + Content-Length: + - '194' + Content-Type: + - application/json + User-Agent: + - python-requests/2.32.3 + authorization: + - DUMMY + method: POST + uri: https://middleman-ai.com/api/v1/tools/mermaid-to-image + response: + body: + string: '{"image_url":"https://middleman-ai.com/s/dc6f1fab/dyFvUzr9Oi","format":"png","important_remark_for_user":"The + URL expires in 1 hour. Please note that you will not be able to download the + file after it has expired."}' + headers: + content-length: + - '215' + content-type: + - application/json + date: + - FILTERED + server: + - FILTERED + vary: + - Accept-Encoding + x-middleware-rewrite: + - FILTERED + x-request-id: + - FILTERED + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_client.py b/tests/test_client.py index fb862fe..257d1af 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -245,3 +245,129 @@ def test_xlsx_to_page_images_file_error(client: ToolsClient) -> None: """xlsx_to_page_images ファイルエラー時のテスト。""" with pytest.raises(ValidationError, match="Failed to read XLSX file"): client.xlsx_to_page_images("nonexistent.xlsx") + + +def test_mermaid_to_image_success( + client: ToolsClient, mocker: "MockerFixture", mock_response: Mock +) -> None: + """mermaid_to_image成功時のテスト。""" + mock_response.json.return_value = { + "image_url": "https://example.com/mermaid.png", + "format": "png", + "important_remark_for_user": "The URL expires in 1 hour." + } + mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) + + result = client.mermaid_to_image("graph TD; A-->B") + + assert result == "https://example.com/mermaid.png" + mock_post.assert_called_once_with( + "https://middleman-ai.com/api/v1/tools/mermaid-to-image", + json={ + "content": "graph TD; A-->B", + "options": { + "theme": "default", + "background_color": "#ffffff" + } + }, + timeout=30.0, + ) + + +def test_mermaid_to_image_success_with_options( + client: ToolsClient, mocker: "MockerFixture", mock_response: Mock +) -> None: + """mermaid_to_image オプション付き成功時のテスト。""" + from middleman_ai.models import MermaidToImageOptions, CustomSize + + mock_response.json.return_value = { + "image_url": "https://example.com/mermaid.png", + "format": "png", + "important_remark_for_user": "The URL expires in 1 hour." + } + mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) + + options = MermaidToImageOptions( + theme="dark", + background_color="transparent", + custom_size=CustomSize(width=800, height=600) + ) + + result = client.mermaid_to_image("graph LR; A-->B", options=options) + + assert result == "https://example.com/mermaid.png" + mock_post.assert_called_once_with( + "https://middleman-ai.com/api/v1/tools/mermaid-to-image", + json={ + "content": "graph LR; A-->B", + "options": { + "theme": "dark", + "background_color": "transparent", + "custom_size": { + "width": 800, + "height": 600 + } + } + }, + timeout=30.0, + ) + + +@pytest.mark.parametrize( + "status_code,expected_exception", + [ + (HTTP_PAYMENT_REQUIRED, NotEnoughCreditError), + (HTTP_UNAUTHORIZED, ForbiddenError), + (HTTP_FORBIDDEN, ForbiddenError), + (HTTP_NOT_FOUND, NotFoundError), + (HTTP_INTERNAL_SERVER_ERROR, InternalError), + ], +) +def test_mermaid_to_image_error_responses( + client: ToolsClient, + mocker: "MockerFixture", + status_code: int, + expected_exception: type, +) -> None: + """mermaid_to_image エラーレスポンス時のテスト。""" + mock_response = Mock(spec=requests.Response) + mock_response.status_code = status_code + mock_response.raise_for_status.side_effect = requests.exceptions.HTTPError() + mock_response.json.return_value = {} + mock_response.url = "https://middleman-ai.com/api/v1/tools/mermaid-to-image" + mock_response.headers = {} + mock_response.text = "" + + mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) + + with pytest.raises(expected_exception): + client.mermaid_to_image("graph TD; A-->B") + + mock_post.assert_called_once() + + +def test_mermaid_to_image_connection_error( + client: ToolsClient, mocker: "MockerFixture" +) -> None: + """mermaid_to_image 接続エラー時のテスト。""" + mock_post = mocker.patch.object( + client.session, "post", side_effect=requests.exceptions.ConnectionError() + ) + + with pytest.raises(ConnectionError): + client.mermaid_to_image("graph TD; A-->B") + + mock_post.assert_called_once() + + +def test_mermaid_to_image_validation_error( + client: ToolsClient, mocker: "MockerFixture", mock_response: Mock +) -> None: + """mermaid_to_image バリデーションエラー時のテスト。""" + mock_response.json.return_value = {"invalid": "response"} + mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) + + with pytest.raises(ValidationError): + client.mermaid_to_image("graph TD; A-->B") + + mock_post.assert_called_once() From 77a81896058c4bab55b7206effede4699de27c24 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 2 Jul 2025 18:45:55 +0900 Subject: [PATCH 28/35] =?UTF-8?q?mermaid-to-image=E3=81=AEClientVCR?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_client_vcr.py | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index d7c70eb..8247ea0 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -246,3 +246,50 @@ def test_xlsx_to_page_images_vcr(client: ToolsClient) -> None: assert all("sheet_name" in page and "image_url" in page for page in pages) assert all(page["image_url"].startswith("https://") for page in pages) assert all("/s/" in page["image_url"] for page in pages) + + +@pytest.mark.vcr() +def test_mermaid_to_image_vcr(client: ToolsClient) -> None: + """ToolsClient.mermaid_to_imageの実際のAPIを使用したテスト。 + + Note: + このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 + 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 + """ + test_mermaid = """graph TD + A[Start] --> B[Process] + B --> C{Decision} + C -->|Yes| D[End] + C -->|No| B""" + + image_url = client.mermaid_to_image(mermaid_text=test_mermaid) + assert isinstance(image_url, str) + assert image_url.startswith("https://") + assert "/s/" in image_url + + +@pytest.mark.vcr() +def test_mermaid_to_image_with_options_vcr(client: ToolsClient) -> None: + """ToolsClient.mermaid_to_imageのオプション付きテスト。 + + Note: + このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 + 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 + """ + from middleman_ai.models import CustomSize, MermaidToImageOptions + + test_mermaid = """graph LR + A[User] --> B[API] + B --> C[Response] + C --> A""" + + options = MermaidToImageOptions( + theme="dark", + background_color="transparent", + custom_size=CustomSize(width=800, height=600) + ) + + image_url = client.mermaid_to_image(mermaid_text=test_mermaid, options=options) + assert isinstance(image_url, str) + assert image_url.startswith("https://") + assert "/s/" in image_url From e4d09f7c745b05fa2e6c98c676d3d5afa10e171a Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 2 Jul 2025 19:21:07 +0900 Subject: [PATCH 29/35] =?UTF-8?q?mermaid-to-image:=20Client=E3=81=AE?= =?UTF-8?q?=E3=83=87=E3=83=95=E3=82=A9=E3=83=AB=E3=83=88=E5=80=A4=E3=81=AE?= =?UTF-8?q?=E6=89=B1=E3=81=84=E3=82=92=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/client.py | 9 +++--- src/middleman_ai/models.py | 30 +++++++++--------- .../cassettes/test_mermaid_to_image_vcr.yaml | 7 ++--- tests/test_client.py | 31 +++++++------------ 4 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index f4e5939..182bb8a 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -474,13 +474,14 @@ def mermaid_to_image( その他、_handle_responseで定義される例外 """ try: - if options is None: - options = MermaidToImageOptions() - request_data = { "content": mermaid_text, - "options": options.model_dump(exclude_none=True), } + + if options is not None: + options_dict = options.model_dump(exclude_none=True) + if options_dict: # 空でない場合のみ追加 + request_data["options"] = options_dict response = self.session.post( f"{self.base_url}/api/v1/tools/mermaid-to-image", diff --git a/src/middleman_ai/models.py b/src/middleman_ai/models.py index 4b0dbd9..50ac870 100644 --- a/src/middleman_ai/models.py +++ b/src/middleman_ai/models.py @@ -1,6 +1,6 @@ """Middleman.ai SDKのデータモデルを定義するモジュール。""" -from typing import List, Literal, Optional +from typing import List, Literal from pydantic import BaseModel, Field @@ -9,7 +9,7 @@ class MdToPdfResponse(BaseModel): """Markdown → PDF変換のレスポンスモデル。""" pdf_url: str = Field(..., description="生成されたPDFのダウンロードURL") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -18,7 +18,7 @@ class MdToDocxResponse(BaseModel): """Markdown → DOCX変換のレスポンスモデル。""" docx_url: str = Field(..., description="生成されたDOCXのダウンロードURL") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -34,7 +34,7 @@ class PdfToPageImagesResponse(BaseModel): """PDF → ページ画像変換のレスポンスモデル。""" pages: List[PageImage] = Field(..., description="各ページの画像情報") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -43,7 +43,7 @@ class JsonToPptxAnalyzeResponse(BaseModel): """PPTX テンプレート解析のレスポンスモデル。""" slides: List[dict] = Field(..., description="テンプレートの構造情報") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -52,7 +52,7 @@ class JsonToPptxExecuteResponse(BaseModel): """JSON → PPTX変換実行のレスポンスモデル。""" pptx_url: str = Field(..., description="生成されたPPTXのダウンロードURL") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -61,7 +61,7 @@ class PptxToPageImagesResponse(BaseModel): """PPTX → ページ画像変換のレスポンスモデル。""" pages: List[PageImage] = Field(..., description="各スライドの画像情報") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -70,7 +70,7 @@ class DocxToPageImagesResponse(BaseModel): """DOCX → ページ画像変換のレスポンスモデル。""" pages: List[PageImage] = Field(..., description="各ページの画像情報") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -86,7 +86,7 @@ class XlsxToPageImagesResponse(BaseModel): """XLSX → ページ画像変換のレスポンスモデル。""" pages: List[XlsxPageImage] = Field(..., description="各シートの画像情報") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) @@ -101,13 +101,13 @@ class CustomSize(BaseModel): class MermaidToImageOptions(BaseModel): """Mermaid → 画像変換のオプション設定。""" - theme: Literal["default", "dark", "forest", "neutral"] = Field( - default="default", description="Mermaidテーマ" + theme: Literal["default", "dark", "forest", "neutral"] | None = Field( + default=None, description="Mermaidテーマ" ) - background_color: str = Field( - default="#ffffff", description="背景色(透明またはRGBカラー)" + background_color: str | None = Field( + default=None, description="背景色(透明またはRGBカラー)" ) - custom_size: Optional[CustomSize] = Field( + custom_size: CustomSize | None = Field( default=None, description="カスタムサイズ設定" ) @@ -117,6 +117,6 @@ class MermaidToImageResponse(BaseModel): image_url: str = Field(..., description="生成された画像のダウンロードURL") format: str = Field(..., description="出力フォーマット(例: png)") - important_remark_for_user: Optional[str] = Field( + important_remark_for_user: str | None = Field( None, description="ユーザーへの重要な注意事項" ) diff --git a/tests/cassettes/test_mermaid_to_image_vcr.yaml b/tests/cassettes/test_mermaid_to_image_vcr.yaml index fcf4f63..bddb959 100644 --- a/tests/cassettes/test_mermaid_to_image_vcr.yaml +++ b/tests/cassettes/test_mermaid_to_image_vcr.yaml @@ -1,8 +1,7 @@ interactions: - request: body: '{"content": "graph TD\n A[Start] --> B[Process]\n B --> C{Decision}\n C - -->|Yes| D[End]\n C -->|No| B", "options": {"theme": "default", "background_color": - "#ffffff"}}' + -->|Yes| D[End]\n C -->|No| B"}' headers: Accept: - '*/*' @@ -11,7 +10,7 @@ interactions: Connection: - keep-alive Content-Length: - - '179' + - '115' Content-Type: - application/json User-Agent: @@ -22,7 +21,7 @@ interactions: uri: https://middleman-ai.com/api/v1/tools/mermaid-to-image response: body: - string: '{"image_url":"https://middleman-ai.com/s/dc6f1fab/sV0t1928ik","format":"png","important_remark_for_user":"The + string: '{"image_url":"https://middleman-ai.com/s/dc6f1fab/2AMlGuC5se","format":"png","important_remark_for_user":"The URL expires in 1 hour. Please note that you will not be able to download the file after it has expired."}' headers: diff --git a/tests/test_client.py b/tests/test_client.py index 257d1af..ea7485a 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -22,6 +22,7 @@ NotFoundError, ValidationError, ) +from middleman_ai.models import CustomSize, MermaidToImageOptions if TYPE_CHECKING: from pytest_mock import MockerFixture @@ -247,14 +248,14 @@ def test_xlsx_to_page_images_file_error(client: ToolsClient) -> None: client.xlsx_to_page_images("nonexistent.xlsx") -def test_mermaid_to_image_success( +def test_mermaid_to_image_without_options( client: ToolsClient, mocker: "MockerFixture", mock_response: Mock ) -> None: - """mermaid_to_image成功時のテスト。""" + """mermaid_to_image オプションなし成功時のテスト。""" mock_response.json.return_value = { "image_url": "https://example.com/mermaid.png", "format": "png", - "important_remark_for_user": "The URL expires in 1 hour." + "important_remark_for_user": "The URL expires in 1 hour.", } mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) @@ -264,11 +265,7 @@ def test_mermaid_to_image_success( mock_post.assert_called_once_with( "https://middleman-ai.com/api/v1/tools/mermaid-to-image", json={ - "content": "graph TD; A-->B", - "options": { - "theme": "default", - "background_color": "#ffffff" - } + "content": "graph TD; A-->B" }, timeout=30.0, ) @@ -278,21 +275,20 @@ def test_mermaid_to_image_success_with_options( client: ToolsClient, mocker: "MockerFixture", mock_response: Mock ) -> None: """mermaid_to_image オプション付き成功時のテスト。""" - from middleman_ai.models import MermaidToImageOptions, CustomSize - + mock_response.json.return_value = { "image_url": "https://example.com/mermaid.png", "format": "png", - "important_remark_for_user": "The URL expires in 1 hour." + "important_remark_for_user": "The URL expires in 1 hour.", } mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) options = MermaidToImageOptions( theme="dark", background_color="transparent", - custom_size=CustomSize(width=800, height=600) + custom_size=CustomSize(width=800, height=600), ) - + result = client.mermaid_to_image("graph LR; A-->B", options=options) assert result == "https://example.com/mermaid.png" @@ -303,11 +299,8 @@ def test_mermaid_to_image_success_with_options( "options": { "theme": "dark", "background_color": "transparent", - "custom_size": { - "width": 800, - "height": 600 - } - } + "custom_size": {"width": 800, "height": 600}, + }, }, timeout=30.0, ) @@ -337,7 +330,7 @@ def test_mermaid_to_image_error_responses( mock_response.url = "https://middleman-ai.com/api/v1/tools/mermaid-to-image" mock_response.headers = {} mock_response.text = "" - + mock_post = mocker.patch.object(client.session, "post", return_value=mock_response) with pytest.raises(expected_exception): From e943ac611ff79c57d6a2db09cc57d39b391012c0 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Wed, 2 Jul 2025 21:38:36 +0900 Subject: [PATCH 30/35] =?UTF-8?q?mermaid-to-image:=20CLI=E3=81=AE=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleman_ai/cli/main.py | 72 +++++++++++++++-- src/middleman_ai/client.py | 2 +- tests/cli/test_cli.py | 152 +++++++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+), 9 deletions(-) diff --git a/src/middleman_ai/cli/main.py b/src/middleman_ai/cli/main.py index 5c3f818..da43562 100644 --- a/src/middleman_ai/cli/main.py +++ b/src/middleman_ai/cli/main.py @@ -1,3 +1,4 @@ +# mypy: disable-error-code="var-annotated" """Main CLI implementation.""" import json @@ -8,6 +9,7 @@ from middleman_ai.client import Placeholder, Presentation, Slide, ToolsClient from middleman_ai.exceptions import MiddlemanBaseException +from middleman_ai.models import CustomSize, MermaidToImageOptions def get_base_url() -> str: @@ -51,7 +53,7 @@ def md_to_pdf(template_id: str | None = None) -> None: print( f"読み込んだMarkdown ({len(markdown_text)} 文字): {markdown_text[:50]}..." ) - with click.progressbar(length=1, label="PDFに変換中...", show_eta=False) as bar: # type: ignore[var-annotated] + with click.progressbar(length=1, label="PDFに変換中...", show_eta=False) as bar: print("APIを呼び出しています...") pdf_url = client.md_to_pdf(markdown_text, pdf_template_id=template_id) bar.update(1) @@ -78,7 +80,7 @@ def md_to_docx(template_id: str | None = None) -> None: print( f"読み込んだMarkdown ({len(markdown_text)} 文字): {markdown_text[:50]}..." ) - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="DOCXに変換中...", show_eta=False ) as bar: print("APIを呼び出しています...") @@ -101,7 +103,7 @@ def pdf_to_page_images(pdf_path: str) -> None: """Convert PDF pages to images.""" try: client = get_client() - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="PDFを画像に変換中...", show_eta=False ) as bar: results = client.pdf_to_page_images(pdf_path) @@ -118,7 +120,7 @@ def pptx_to_page_images(pptx_path: str) -> None: """Convert PPTX pages to images.""" try: client = get_client() - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="PPTXを画像に変換中...", show_eta=False ) as bar: results = client.pptx_to_page_images(pptx_path) @@ -135,7 +137,7 @@ def docx_to_page_images(docx_path: str) -> None: """Convert DOCX pages to images.""" try: client = get_client() - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="DOCXを画像に変換中...", show_eta=False ) as bar: results = client.docx_to_page_images(docx_path) @@ -152,7 +154,7 @@ def xlsx_to_page_images(xlsx_path: str) -> None: """Convert XLSX pages to images.""" try: client = get_client() - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="XLSXを画像に変換中...", show_eta=False ) as bar: results = client.xlsx_to_page_images(xlsx_path) @@ -169,7 +171,7 @@ def json_to_pptx_analyze(template_id: str) -> None: """Analyze PPTX template.""" try: client = get_client() - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="テンプレートを解析中...", show_eta=False ) as bar: results = client.json_to_pptx_analyze_v2(template_id) @@ -198,7 +200,7 @@ def json_to_pptx_execute(template_id: str) -> None: for slide in data["slides"] ] ) - with click.progressbar( # type: ignore[var-annotated] + with click.progressbar( length=1, label="PPTXを生成中...", show_eta=False ) as bar: pptx_url = client.json_to_pptx_execute_v2(template_id, presentation) @@ -210,6 +212,60 @@ def json_to_pptx_execute(template_id: str) -> None: raise click.ClickException(str(e)) from e +@cli.command() +@click.option( + "--theme", + type=click.Choice(["default", "dark", "forest", "neutral"]), + help="Mermaidテーマ", +) +@click.option("--background-color", help="背景色(例: transparent, #ffffff, #000000") +@click.option("--width", type=int, help="画像幅(100-1200px)") +@click.option("--height", type=int, help="画像高さ(100-1200px)") +def mermaid_to_image( + theme: str | None, + background_color: str | None, + width: int | None, + height: int | None, +) -> None: + """Convert Mermaid diagram to image.""" + print("mermaid_to_image コマンドを実行しています...") + try: + client = get_client() + print("標準入力からMermaidダイアグラムを読み込んでいます...") + mermaid_text = sys.stdin.read() + print(f"読み込んだMermaid ({len(mermaid_text)} 文字): {mermaid_text[:50]}...") + + # オプション設定 + custom_size = None + if width is not None and height is not None: + custom_size = CustomSize(width=width, height=height) + elif (width is not None) != (height is not None): + raise click.ClickException( + "widthとheightは両方指定するか、両方省略してください" + ) + + # 全てNoneの場合はoptionsもNoneにする + options = None + if theme is not None or background_color is not None or custom_size is not None: + options = MermaidToImageOptions( + theme=theme, background_color=background_color, custom_size=custom_size + ) + + with click.progressbar( + length=1, label="画像に変換中...", show_eta=False + ) as bar: + print("APIを呼び出しています...") + image_url = client.mermaid_to_image(mermaid_text, options=options) + bar.update(1) + print(f"変換結果URL: {image_url}") + except MiddlemanBaseException as e: + print(f"エラーが発生しました: {e!s}") + raise click.ClickException(str(e)) from e + except Exception as e: + print(f"予期せぬエラーが発生しました: {e!s}") + raise + + @click.command() def mcp_server() -> None: """Run MCP server as a standalone command.""" diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index 182bb8a..ef254df 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -477,7 +477,7 @@ def mermaid_to_image( request_data = { "content": mermaid_text, } - + if options is not None: options_dict = options.model_dump(exclude_none=True) if options_dict: # 空でない場合のみ追加 diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 4fa7303..8fb2ef9 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -155,3 +155,155 @@ def test_xlsx_to_page_images_cli(runner, mock_client, tmp_path) -> None: assert "Sheet Sheet1: https://example.com/sheet1.png" in result.output assert "Sheet Sheet2: https://example.com/sheet2.png" in result.output mock_client.xlsx_to_page_images.assert_called_once_with(str(xlsx_path)) + + +def test_mermaid_to_image_cli_without_options(runner, mock_client): + """Test mermaid_to_image CLI command without options.""" + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid.png" + + mermaid_input = """graph TD + A[Start] --> B[Process] + B --> C{Decision} + C -->|Yes| D[End] + C -->|No| B""" + + result = runner.invoke(cli, ["mermaid-to-image"], input=mermaid_input) + assert result.exit_code == 0 + assert "https://example.com/mermaid.png" in result.output + mock_client.mermaid_to_image.assert_called_once_with(mermaid_input, options=None) + + +def test_mermaid_to_image_cli_with_all_options(runner, mock_client): + """Test mermaid_to_image CLI command with all options.""" + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid.png" + + mermaid_input = "graph LR; A --> B" + + result = runner.invoke( + cli, + [ + "mermaid-to-image", + "--theme", + "forest", + "--background-color", + "transparent", + "--width", + "800", + "--height", + "600", + ], + input=mermaid_input, + ) + assert result.exit_code == 0 + assert "https://example.com/mermaid.png" in result.output + + # options引数をチェック + call_args = mock_client.mermaid_to_image.call_args + assert call_args[0][0] == mermaid_input + options = call_args[1]["options"] + assert options is not None + assert options.theme == "forest" + assert options.background_color == "transparent" + assert options.custom_size is not None + assert options.custom_size.width == 800 + assert options.custom_size.height == 600 + + +def test_mermaid_to_image_cli_with_theme_option(runner, mock_client): + """Test mermaid_to_image CLI command with theme option.""" + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid.png" + + mermaid_input = "graph LR; A --> B" + + result = runner.invoke( + cli, ["mermaid-to-image", "--theme", "dark"], input=mermaid_input + ) + assert result.exit_code == 0 + assert "https://example.com/mermaid.png" in result.output + + # options引数をチェック + call_args = mock_client.mermaid_to_image.call_args + assert call_args[0][0] == mermaid_input # mermaid_text + options = call_args[1]["options"] # options keyword argument + assert options is not None + assert options.theme == "dark" + assert options.background_color is None + assert options.custom_size is None + + +def test_mermaid_to_image_cli_with_background_color_only(runner, mock_client): + """Test mermaid_to_image CLI command with background-color option only.""" + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid.png" + + mermaid_input = "graph LR; A --> B" + + result = runner.invoke( + cli, ["mermaid-to-image", "--background-color", "#ff0000"], input=mermaid_input + ) + assert result.exit_code == 0 + assert "https://example.com/mermaid.png" in result.output + + # options引数をチェック + call_args = mock_client.mermaid_to_image.call_args + assert call_args[0][0] == mermaid_input + options = call_args[1]["options"] + assert options is not None + assert options.theme is None + assert options.background_color == "#ff0000" + assert options.custom_size is None + + +def test_mermaid_to_image_cli_with_width_height_only(runner, mock_client): + """Test mermaid_to_image CLI command with width and height options only.""" + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid.png" + + mermaid_input = "graph LR; A --> B" + + result = runner.invoke( + cli, + ["mermaid-to-image", "--width", "1000", "--height", "800"], + input=mermaid_input, + ) + assert result.exit_code == 0 + assert "https://example.com/mermaid.png" in result.output + + # options引数をチェック + call_args = mock_client.mermaid_to_image.call_args + assert call_args[0][0] == mermaid_input + options = call_args[1]["options"] + assert options is not None + assert options.theme is None + assert options.background_color is None + assert options.custom_size is not None + assert options.custom_size.width == 1000 + assert options.custom_size.height == 800 + + +def test_mermaid_to_image_cli_width_height_validation(runner, mock_client): + """Test mermaid_to_image CLI command width/height validation.""" + mermaid_input = "graph LR; A --> B" + + # width のみ指定(エラーになるべき) + result = runner.invoke( + cli, ["mermaid-to-image", "--width", "800"], input=mermaid_input + ) + assert result.exit_code != 0 + assert "widthとheightは両方指定するか、両方省略してください" in result.output + + # height のみ指定(エラーになるべき) + result = runner.invoke( + cli, ["mermaid-to-image", "--height", "600"], input=mermaid_input + ) + assert result.exit_code != 0 + assert "widthとheightは両方指定するか、両方省略してください" in result.output + + +def test_mermaid_to_image_cli_invalid_theme_choice(runner, mock_client): + """Test mermaid_to_image CLI command with invalid theme choice.""" + mermaid_input = "graph LR; A --> B" + + result = runner.invoke( + cli, ["mermaid-to-image", "--theme", "invalid"], input=mermaid_input + ) + assert result.exit_code != 0 + assert "Invalid value for '--theme'" in result.output From 459ba034e23b08b9cda1df9c24cedc78f69a71be Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Sat, 5 Jul 2025 01:14:41 +0900 Subject: [PATCH 31/35] =?UTF-8?q?mermaid=E3=83=84=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=82=92mcp=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + CLAUDE.md | 73 +++++++++++++---------- README.md | 3 + examples/client_usage/main.py | 12 ++++ src/middleman_ai/mcp/server.py | 102 +++++++++++++++++++++++++++++++++ tests/data/test.mmd | 5 ++ tests/test_mcp.py | 33 +++++++++++ 7 files changed, 200 insertions(+), 30 deletions(-) create mode 100644 tests/data/test.mmd diff --git a/.gitignore b/.gitignore index a6220d1..3c1c1b7 100644 --- a/.gitignore +++ b/.gitignore @@ -194,3 +194,5 @@ spec.md # Claude Code .claude/ +.cursor/mcp.json + diff --git a/CLAUDE.md b/CLAUDE.md index e4777aa..fcc905c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,10 +1,11 @@ # CLAUDE.md -このファイルはこのリポジトリでコードを扱う際のClaude Code (claude.ai/code) へのガイダンスを提供します。 +このファイルはこのリポジトリでコードを扱う際の Claude Code (claude.ai/code) へのガイダンスを提供します。 ## コマンド ### 開発用コマンド + ```bash # テスト実行 uv run pytest @@ -21,9 +22,11 @@ uv run black . ``` ### ビルドと配布 + 詳細は [README-for-developer.md](README-for-developer.md) の「配布」セクションを参照してください。 -### CLIテスト +### CLI テスト + ```bash # APIキー設定 export MIDDLEMAN_API_KEY=your-api-key @@ -35,62 +38,72 @@ uvx middleman pdf-to-page-images input.pdf ## アーキテクチャ -Middleman.ai API用のPython SDKで、3つの主要なインターフェース層から構成されています: +Middleman.ai API 用の Python SDK で、3 つの主要なインターフェース層から構成されています: ### 1. コアクライアント (`src/middleman_ai/client.py`) -- `ToolsClient`: HTTPセッション管理を含むメインAPIクライアントクラス -- 全APIエンドポイント実装: `md_to_pdf`, `md_to_docx`, `pdf_to_page_images`など + +- `ToolsClient`: HTTP セッション管理を含むメイン API クライアントクラス +- 全 API エンドポイント実装: `md_to_pdf`, `md_to_docx`, `pdf_to_page_images`など - `exceptions.py`でカスタム例外による集約エラーハンドリング -- `models.py`でPydanticモデルとしてレスポンス定義 +- `models.py`で Pydantic モデルとしてレスポンス定義 -### 2. LangChainツール (`src/middleman_ai/langchain_tools/`) -- 各ツールはLangChainの`BaseTool`を継承 -- AIエージェント用にクライアントメソッドをラップ +### 2. LangChain ツール (`src/middleman_ai/langchain_tools/`) + +- 各ツールは LangChain の`BaseTool`を継承 +- AI エージェント用にクライアントメソッドをラップ - `_run`と`_arun`メソッド両方を実装 - ツール例: `MdToPdfTool`, `JsonToPptxAnalyzeTool`など -### 3. MCPサーバー (`src/middleman_ai/mcp/server.py`) -- FastMCPを使用したModel Context Protocol実装 -- Claude Desktopやその他MCPクライアントにツールを公開 +### 3. MCP サーバー (`src/middleman_ai/mcp/server.py`) + +- FastMCP を使用した Model Context Protocol 実装 +- Claude Desktop やその他 MCP クライアントにツールを公開 - `@mcp.tool()`デコレータによる自動登録 - テキスト入力とファイルパス入力の両方をサポート -### 4. CLIインターフェース (`src/middleman_ai/cli/main.py`) -- Clickベースのコマンドラインインターフェース +### 4. CLI インターフェース (`src/middleman_ai/cli/main.py`) + +- Click ベースのコマンドラインインターフェース - 標準入力またはファイル引数からの読み込み - 環境変数設定 (`MIDDLEMAN_API_KEY`, `MIDDLEMAN_BASE_URL`) ## テスト戦略 ### 単体テスト (`tests/test_*.py`) -- pytest-mockを使用してHTTPリクエストをモック -- API呼び出しなしでクライアントロジックをテスト + +- pytest-mock を使用して HTTP リクエストをモック +- API 呼び出しなしでクライアントロジックをテスト - 成功/エラーシナリオとパラメータ検証をカバー -### VCRテスト (`tests/test_*_vcr.py`) -- VCR.pyカセットを使用した実際のAPI統合テスト -- 環境に依存しないアサーション(正確な値ではなくURLパターンをチェック) -- テンプレートIDや機密データには環境変数を使用 +### VCR テスト (`tests/test_*_vcr.py`) + +- VCR.py カセットを使用した実際の API 統合テスト +- 環境に依存しないアサーション(正確な値ではなく URL パターンをチェック) +- テンプレート ID や機密データには環境変数を使用 ### テストデータ + - `tests/data/`にサンプルファイル -- `tests/cassettes/`にVCRカセット +- `tests/cassettes/`に VCR カセット - `vcr_utils.py`にテストユーティリティ ## 主要な実装ルール ### エラーハンドリング + - クライアントで集約例外ハンドリングを使用 -- HTTPステータスコードを特定の例外タイプにマップ -- 適切なエラー伝播でPydanticレスポンスを解析 +- HTTP ステータスコードを特定の例外タイプにマップ +- 適切なエラー伝播で Pydantic レスポンスを解析 ### コードスタイル -- Blackフォーマット(行長: 88) -- 特定のルールセットでRuffリンティング -- 型ヒント必須(mypyで強制) -- 全API リクエスト/レスポンスデータにPydanticモデル + +- Black フォーマット(行長: 88) +- 特定のルールセットで Ruff リンティング +- 型ヒント必須(mypy で強制) +- 全 API リクエスト/レスポンスデータに Pydantic モデル ### 環境設定 -- `MIDDLEMAN_API_KEY`: API認証に必須 -- `MIDDLEMAN_BASE_URL`: APIベースURL(デフォルトは本番環境) -- VCRテストでテンプレートID用のテスト環境変数 \ No newline at end of file + +- `MIDDLEMAN_API_KEY`: API 認証に必須 +- `MIDDLEMAN_BASE_URL`: API ベース URL(デフォルトは本番環境) +- VCR テストでテンプレート ID 用のテスト環境変数 diff --git a/README.md b/README.md index ecee2bb..9d84276 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,9 @@ uvx middleman json-to-pptx-analyze [テンプレートID] # PPTXテンプレート実行 echo '{"slides":[{"type":"title","placeholders":[{"name":"title","content":"テストタイトル"}]}]}' | \ uvx middleman json-to-pptx-execute [テンプレートID] + +# Mermaid図表 → 画像変換 +echo "graph TD; A-->B" | uvx middleman mermaid-to-image ``` 各コマンドは標準入力からテキストを受け取るか、必要に応じてファイルパスやテンプレート ID を引数として受け取ります。 diff --git a/examples/client_usage/main.py b/examples/client_usage/main.py index d912cde..a6d900a 100644 --- a/examples/client_usage/main.py +++ b/examples/client_usage/main.py @@ -42,6 +42,18 @@ def main() -> None: for page in images: print(f"Sheet {page['sheet_name']}: {page['image_url']}") + # Mermaid → Image + mermaid_text = """ +graph TD + A[Start] --> B{Decision} + B -->|Yes| C[Process 1] + B -->|No| D[Process 2] + C --> E[End] + D --> E + """ + image_url = client.mermaid_to_image(mermaid_text) + print(f"Generated Mermaid image URL: {image_url}") + # JSON → PPTX (analyze) pptx_template_id = os.getenv("MIDDLEMAN_PPTX_TEMPLATE_ID", "") slides = client.json_to_pptx_analyze_v2(pptx_template_id) diff --git a/src/middleman_ai/mcp/server.py b/src/middleman_ai/mcp/server.py index c159179..c9635b8 100644 --- a/src/middleman_ai/mcp/server.py +++ b/src/middleman_ai/mcp/server.py @@ -7,6 +7,7 @@ from middleman_ai import ToolsClient from middleman_ai.client import Placeholder, Presentation, Slide +from middleman_ai.models import CustomSize, MermaidToImageOptions print("Starting server.py...", file=sys.stderr) print(f"Python version: {sys.version}", file=sys.stderr) @@ -201,6 +202,107 @@ def json_to_pptx_execute(pptx_template_id: str, slides: List[Dict[str, Any]]) -> return client.json_to_pptx_execute_v2(pptx_template_id, presentation) +@mcp.tool() +def mermaid_to_image( + mermaid_text: str, + theme: str | None = None, + background_color: str | None = None, + width: int = -1, + height: int = -1, +) -> str: + """ + Convert Mermaid diagram text to image and return the download URL. + + Args: + mermaid_text: The Mermaid diagram text to convert + theme: Optional theme for the diagram (default, dark, forest, neutral) + background_color: Optional background color (transparent or RGB color) + width: Image width in pixels (100-1200) + height: Image height in pixels (100-1200) + + Returns: + The URL to download the generated image + """ + options = None + + # 内部で使用する型に変換 + actual_width: int | None = None if width == -1 else width + actual_height: int | None = None if height == -1 else height + + if any([theme, background_color, actual_width, actual_height]): + custom_size = None + if actual_width is not None and actual_height is not None: + custom_size = CustomSize(width=actual_width, height=actual_height) + elif (actual_width is not None) != (actual_height is not None): + raise ValueError( + "Both width and height must be provided together, or both omitted" + ) + + options = MermaidToImageOptions( + theme=theme, + background_color=background_color, + custom_size=custom_size, + ) + + return client.mermaid_to_image(mermaid_text, options=options) + + +@mcp.tool() +def mermaid_file_to_image( + mermaid_file_full_path: str, + theme: str | None = None, + background_color: str | None = None, + width: int = -1, + height: int = -1, +) -> str: + """ + Convert a Mermaid file to image and return the download URL. + + Args: + mermaid_file_full_path: Path to the local Mermaid file + theme: Optional theme for the diagram (default, dark, forest, neutral) + background_color: Optional background color (transparent or RGB color) + width: Image width in pixels (100-1200) + height: Image height in pixels (100-1200) + + Returns: + The URL to download the generated image + """ + file_path = Path(mermaid_file_full_path) + if not file_path.exists(): + raise ValueError(f"File not found: {mermaid_file_full_path}") + if not file_path.is_file(): + raise ValueError(f"Path is not a file: {mermaid_file_full_path}") + if not os.access(file_path, os.R_OK): + raise ValueError(f"File not readable: {mermaid_file_full_path}") + + with file_path.open("r") as f: + mermaid_text = f.read() + + options = None + + # 内部で使用する型に変換 + actual_width: int | None = None if width == -1 else width + actual_height: int | None = None if height == -1 else height + + if any([theme, background_color, actual_width, actual_height]): + custom_size = None + if actual_width is not None and actual_height is not None: + custom_size = CustomSize(width=actual_width, height=actual_height) + elif (actual_width is not None) != (actual_height is not None): + raise ValueError( + "Both width and height must be provided together, or both omitted" + ) + + options = MermaidToImageOptions( + theme=theme, + background_color=background_color, + custom_size=custom_size, + ) + + return client.mermaid_to_image(mermaid_text, options=options) + + def run_server() -> None: """ MCPサーバーを実行します。 diff --git a/tests/data/test.mmd b/tests/data/test.mmd new file mode 100644 index 0000000..68e4697 --- /dev/null +++ b/tests/data/test.mmd @@ -0,0 +1,5 @@ +graph TD + A[Start] --> B[Process] + B --> C{Decision} + C -->|Yes| D[End] + C -->|No| B \ No newline at end of file diff --git a/tests/test_mcp.py b/tests/test_mcp.py index 1bae0ad..4a7d7a8 100644 --- a/tests/test_mcp.py +++ b/tests/test_mcp.py @@ -15,6 +15,8 @@ md_file_to_pdf, md_to_docx, md_to_pdf, + mermaid_file_to_image, + mermaid_to_image, pdf_to_page_images, pptx_to_page_images, run_server, @@ -237,6 +239,37 @@ def test_json_to_pptx_execute_tool_mcp(mocker: "MockerFixture") -> None: mock_execute.assert_called_once_with(template_id, expected_arg) +def test_mermaid_to_image_tool_mcp(mocker: "MockerFixture") -> None: + """mermaid_to_imageツールのテスト。""" + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid.png" + + result = mermaid_to_image("graph TD; A-->B") + + assert result == "https://example.com/mermaid.png" + mock_client.mermaid_to_image.assert_called_once_with( + "graph TD; A-->B", options=None + ) + + +def test_mermaid_file_to_image_tool_mcp(mocker: "MockerFixture") -> None: + """mermaid_file_to_imageツールのテスト。""" + from pathlib import Path + + mock_client = mocker.patch("middleman_ai.mcp.server.client") + mock_client.mermaid_to_image.return_value = "https://example.com/mermaid_file.png" + + # 実際のテストファイルを使用 + test_file = Path(__file__).parent / "data" / "test.mmd" + result = mermaid_file_to_image(str(test_file)) + + assert result == "https://example.com/mermaid_file.png" + # 実際のファイル内容がクライアントに渡されることを確認 + call_args = mock_client.mermaid_to_image.call_args + assert "graph TD" in call_args[0][0] # Mermaidファイルの内容 + assert call_args[1]["options"] is None + + def test_run_server_mcp(mocker: "MockerFixture") -> None: """run_serverのテスト。""" mock_mcp = mocker.patch("middleman_ai.mcp.server.mcp") From 1516fe52ced8fc909078add01e046bad4414b407 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Sat, 5 Jul 2025 01:29:41 +0900 Subject: [PATCH 32/35] =?UTF-8?q?LangChain=E3=83=84=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=81=AE=E3=82=B5=E3=83=9D=E3=83=BC=E3=83=88=E7=B5=82=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/langchaintool.mdc | 64 - .cursor/rules/readme.mdc | 19 +- CLAUDE.md | 11 +- examples/client_usage/uv.lock | 335 +-- examples/langchain_tools/README.md | 35 - examples/langchain_tools/main.py | 91 - examples/langchain_tools/pyproject.toml | 21 - examples/langchain_tools/sample.docx | Bin 36659 -> 0 bytes examples/langchain_tools/sample.pdf | Bin 434665 -> 0 bytes examples/langchain_tools/sample.xlsx | Bin 12042 -> 0 bytes examples/langchain_tools/sample_template.pptx | Bin 24720 -> 0 bytes examples/langchain_tools/uv.lock | 858 ------- examples/web_page_to_slide/.env.sample | 8 - examples/web_page_to_slide/.python-version | 1 - examples/web_page_to_slide/README.md | 51 - .../artifacts/web_template.pptx | Bin 65655 -> 0 bytes examples/web_page_to_slide/langgraph.json | 7 - examples/web_page_to_slide/pyproject.toml | 35 - .../src/web_page_to_slide/__init__.py | 0 .../src/web_page_to_slide/agent.py | 211 -- .../src/web_page_to_slide/prompts/agent.txt | 16 - .../prompts/text_to_slide_json.txt | 98 - examples/web_page_to_slide/uv.lock | 2087 ----------------- pyproject.toml | 1 - src/middleman_ai/client.py | 2 +- src/middleman_ai/langchain_tools/__init__.py | 23 - .../langchain_tools/docx_to_page_images.py | 65 - .../langchain_tools/json_to_pptx.py | 178 -- .../langchain_tools/md_to_docx.py | 80 - src/middleman_ai/langchain_tools/md_to_pdf.py | 77 - .../langchain_tools/pdf_to_page_images.py | 66 - .../langchain_tools/pptx_to_page_images.py | 66 - .../langchain_tools/xlsx_to_page_images.py | 70 - src/middleman_ai/models.py | 14 +- tests/test_client_vcr.py | 4 +- tests/test_langchain_tools.py | 687 ------ tests/test_langchain_tools_vcr.py | 267 --- uv.lock | 220 +- 38 files changed, 29 insertions(+), 5739 deletions(-) delete mode 100644 .cursor/rules/langchaintool.mdc delete mode 100644 examples/langchain_tools/README.md delete mode 100644 examples/langchain_tools/main.py delete mode 100644 examples/langchain_tools/pyproject.toml delete mode 100644 examples/langchain_tools/sample.docx delete mode 100644 examples/langchain_tools/sample.pdf delete mode 100644 examples/langchain_tools/sample.xlsx delete mode 100644 examples/langchain_tools/sample_template.pptx delete mode 100644 examples/langchain_tools/uv.lock delete mode 100644 examples/web_page_to_slide/.env.sample delete mode 100644 examples/web_page_to_slide/.python-version delete mode 100644 examples/web_page_to_slide/README.md delete mode 100644 examples/web_page_to_slide/artifacts/web_template.pptx delete mode 100644 examples/web_page_to_slide/langgraph.json delete mode 100644 examples/web_page_to_slide/pyproject.toml delete mode 100644 examples/web_page_to_slide/src/web_page_to_slide/__init__.py delete mode 100644 examples/web_page_to_slide/src/web_page_to_slide/agent.py delete mode 100644 examples/web_page_to_slide/src/web_page_to_slide/prompts/agent.txt delete mode 100644 examples/web_page_to_slide/src/web_page_to_slide/prompts/text_to_slide_json.txt delete mode 100644 examples/web_page_to_slide/uv.lock delete mode 100644 src/middleman_ai/langchain_tools/__init__.py delete mode 100644 src/middleman_ai/langchain_tools/docx_to_page_images.py delete mode 100644 src/middleman_ai/langchain_tools/json_to_pptx.py delete mode 100644 src/middleman_ai/langchain_tools/md_to_docx.py delete mode 100644 src/middleman_ai/langchain_tools/md_to_pdf.py delete mode 100644 src/middleman_ai/langchain_tools/pdf_to_page_images.py delete mode 100644 src/middleman_ai/langchain_tools/pptx_to_page_images.py delete mode 100644 src/middleman_ai/langchain_tools/xlsx_to_page_images.py delete mode 100644 tests/test_langchain_tools.py delete mode 100644 tests/test_langchain_tools_vcr.py diff --git a/.cursor/rules/langchaintool.mdc b/.cursor/rules/langchaintool.mdc deleted file mode 100644 index 62696a9..0000000 --- a/.cursor/rules/langchaintool.mdc +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: -globs: src/middleman_ai/langchain_tools/*.py -alwaysApply: false ---- -# LangChain Tool実装ルール - -このドキュメントにはMiddleman SDKでLangChain向けに提供されるツール実装に関するルールをまとめます。 - -## 実装の概要 - -LangChainツールは [langchain_tools](mdc:src/middleman_ai/langchain_tools) ディレクトリに実装されており、AIエージェントがMiddleman.ai APIを利用できるように設計されています。 - -## 実装ルール - -- 各ツールはLangChainの`BaseTool`を継承する -- ツールにはわかりやすい名前と説明を付ける -- 入力スキーマはPydanticモデルで定義する -- `_run`メソッドと`_arun`メソッドを実装する(非同期処理がない場合は`_arun`は`_run`を呼び出す) - -## テストルール - -LangChainツール実装のテストは以下の2箇所で実装します。 - -- [test_langchain_tools.py](mdc:tests/test_langchain_tools.py): 単体テスト -- [test_langchain_tools_vcr.py](mdc:tests/test_langchain_tools_vcr.py): VCRテスト - -### test_langchain_tools.py の共通ルール - -APIリクエストをモック化して実装部分のみをテストします。 - -1. **クライアントとAPIのモック**: pytestのモックの仕組みを利用してクライアントのメソッドをモック化し、Tool単体での動作テストにします - ```python - mock_md_to_pdf = mocker.patch.object(client, "md_to_pdf", return_value="https://example.com/test.pdf") - ``` - -2. **複数テストケース**: パラメータパターンがある場合にはパターンごとにテストケースを分け、どんなパターンに対応しているかがわかりやすいテストケース名をつける - ```python - def test_md_to_pdf_tool_with_template_id(client: ToolsClient, mocker: "MockerFixture") -> None: - ``` - -3. **エラーケースのテスト**: バリデーションエラーや不正な入力のチェックが実装されている場合、異常系テストも実装 - ```python - def test_json_to_pptx_analyze_tool_template_id_error(client: ToolsClient, mocker: "MockerFixture") -> None: - ``` - -### test_langchain_tools_vcr.py の共通ルール - -VCRテストでは、以下のルールに従ってテストを実装します。 -なお、 [vcr.mdc](mdc:.cursor/rules/vcr.mdc) に記載の共通ルールも守るようにしてください。 - -1. **テスト関数の命名**: 関数名の末尾に `_vcr` を付与 - ```python - def test_md_to_pdf_tool_vcr(client: ToolsClient) -> None: - ``` - - -2. **テスト実行方法**: ツールの`run`メソッドを直接呼び出し、返り値を検証する。決してプライベートメソッドである `_run` や `_arun` を直接呼び出すテストにしないこと - ```python - tool = MdToPdfTool(client=client) - result = tool.run(test_markdown) - assert isinstance(result, str) - assert result.startswith("https://") - ``` diff --git a/.cursor/rules/readme.mdc b/.cursor/rules/readme.mdc index f773d9e..8d8b6d9 100644 --- a/.cursor/rules/readme.mdc +++ b/.cursor/rules/readme.mdc @@ -1,28 +1,29 @@ --- -description: -globs: +description: +globs: alwaysApply: true --- + # Middleman SDK ## 概要 -このリポジトリではAIエージェントが利用できるツールをAPIとして提供するサービス「Middleman」のAPIを簡単に利用できるようにするためのクライアントコードをSDKとして管理しています。 -Middleman SDKは、以下の4種類の方法でMiddlemanのAPIへのアクセスを提供します。 +このリポジトリでは AI エージェントが利用できるツールを API として提供するサービス「Middleman」の API を簡単に利用できるようにするためのクライアントコードを SDK として管理しています。 -- Pythonクライアント: Pythonコードから簡単にAPI呼び出しができるクライアント(実装: [client.py](mdc:src/middleman_ai/client.py)) -- LangChainツール: AIエージェントを作るためのPythonフレームワークLangChain/LangGraphと結合できるツール(実装: src/middleman_ai/langchain_tools) -- CLI: コマンドラインから簡単にAPI呼び出すことができるCLI(実装: [main.py](mdc:src/middleman_ai/cli/main.py)) -- MCP(Model Context Protocol): AIエージェントが外部APIやツールを呼び出すためのプロトコル(実装: [server.py](mdc:src/middleman_ai/mcp/server.py)) +Middleman SDK は、以下の 3 種類の方法で Middleman の API へのアクセスを提供します。 -※ Model Context Protocol参考サイト: https://modelcontextprotocol.io/introduction +- Python クライアント: Python コードから簡単に API 呼び出しができるクライアント(実装: [client.py](mdc:src/middleman_ai/client.py)) +- CLI: コマンドラインから簡単に API 呼び出すことができる CLI(実装: [main.py](mdc:src/middleman_ai/cli/main.py)) +- MCP(Model Context Protocol): AI エージェントが外部 API やツールを呼び出すためのプロトコル(実装: [server.py](mdc:src/middleman_ai/mcp/server.py)) +※ Model Context Protocol 参考サイト: https://modelcontextprotocol.io/introduction # 開発ルール ## テスト ### ルール + - ユーザーからの依頼に対応後、必ず単体テストを実行し実装が妥当かどうかを確認する - 新しい引数が増えたなど、テストすべき新しい観点が発生した場合にはテストケースの追加・修正が必要である diff --git a/CLAUDE.md b/CLAUDE.md index fcc905c..5da0983 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -47,21 +47,14 @@ Middleman.ai API 用の Python SDK で、3 つの主要なインターフェー - `exceptions.py`でカスタム例外による集約エラーハンドリング - `models.py`で Pydantic モデルとしてレスポンス定義 -### 2. LangChain ツール (`src/middleman_ai/langchain_tools/`) - -- 各ツールは LangChain の`BaseTool`を継承 -- AI エージェント用にクライアントメソッドをラップ -- `_run`と`_arun`メソッド両方を実装 -- ツール例: `MdToPdfTool`, `JsonToPptxAnalyzeTool`など - -### 3. MCP サーバー (`src/middleman_ai/mcp/server.py`) +### 2. MCP サーバー (`src/middleman_ai/mcp/server.py`) - FastMCP を使用した Model Context Protocol 実装 - Claude Desktop やその他 MCP クライアントにツールを公開 - `@mcp.tool()`デコレータによる自動登録 - テキスト入力とファイルパス入力の両方をサポート -### 4. CLI インターフェース (`src/middleman_ai/cli/main.py`) +### 3. CLI インターフェース (`src/middleman_ai/cli/main.py`) - Click ベースのコマンドラインインターフェース - 標準入力またはファイル引数からの読み込み diff --git a/examples/client_usage/uv.lock b/examples/client_usage/uv.lock index f50ec0b..6026a6a 100644 --- a/examples/client_usage/uv.lock +++ b/examples/client_usage/uv.lock @@ -39,63 +39,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - [[package]] name = "charset-normalizer" version = "3.4.1" @@ -253,62 +196,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] -[[package]] -name = "jsonpatch" -version = "1.33" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpointer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, -] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, -] - -[[package]] -name = "langchain-core" -version = "0.3.35" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/5c/5ed0aa88d0ffc52634b97dcd971d675cfc55072b28f7723bba2ef9432bad/langchain_core-0.3.35.tar.gz", hash = "sha256:328688228ece259da734417d477994a69cf8202dea9ed4271f2d792e3575c6fc", size = 525736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/63/be67b8ab4f4cf07b8da65a67ff72ea870ec8cf9f2e95e3a5b837a5604d1b/langchain_core-0.3.35-py3-none-any.whl", hash = "sha256:81a4097226e180fa6c64e2d2ab38dcacbbc23b64fc109fb15622910fe8951670", size = 413151 }, -] - -[[package]] -name = "langsmith" -version = "0.3.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "zstandard" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/1a/974b66a9e7c43f41bec067e1f393a296803aee48fafcf183941c31295b59/langsmith-0.3.8.tar.gz", hash = "sha256:97f9bebe0b7cb0a4f278e6ff30ae7d5ededff3883b014442ec6d7d575b02a0f1", size = 321394 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/e4/5380e8229c442e406404977d2ec71a9db6a3e6a89fce7791c6ad7cd2bdbe/langsmith-0.3.8-py3-none-any.whl", hash = "sha256:fbb9dd97b0f090219447fca9362698d07abaeda1da85aa7cc6ec6517b36581b1", size = 332800 }, -] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -357,11 +244,10 @@ wheels = [ [[package]] name = "middleman-ai" -version = "0.0.4" +version = "0.1.2" source = { editable = "../../" } dependencies = [ { name = "click" }, - { name = "langchain-core" }, { name = "mcp", extra = ["cli"] }, { name = "pydantic" }, { name = "requests" }, @@ -371,7 +257,6 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.0.0" }, - { name = "langchain-core", specifier = ">=0.3" }, { name = "mcp", extras = ["cli"], specifier = ">=1.6.0" }, { name = "pydantic", specifier = ">=2" }, { name = "requests", specifier = ">=2" }, @@ -396,84 +281,6 @@ dev = [ { name = "wheel", specifier = ">=0.45.1" }, ] -[[package]] -name = "orjson" -version = "3.10.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/5dea21763eeff8c1590076918a446ea3d6140743e0e36f58f369928ed0f4/orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e", size = 5282482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/09/e5ff18ad009e6f97eb7edc5f67ef98b3ce0c189da9c3eaca1f9587cd4c61/orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04", size = 249532 }, - { url = "https://files.pythonhosted.org/packages/bd/b8/a75883301fe332bd433d9b0ded7d2bb706ccac679602c3516984f8814fb5/orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8", size = 125229 }, - { url = "https://files.pythonhosted.org/packages/83/4b/22f053e7a364cc9c685be203b1e40fc5f2b3f164a9b2284547504eec682e/orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/63/64/1b54fc75ca328b57dd810541a4035fe48c12a161d466e3cf5b11a8c25649/orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814", size = 139748 }, - { url = "https://files.pythonhosted.org/packages/5e/ff/ff0c5da781807bb0a5acd789d9a7fbcb57f7b0c6e1916595da1f5ce69f3c/orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164", size = 154559 }, - { url = "https://files.pythonhosted.org/packages/4e/9a/11e2974383384ace8495810d4a2ebef5f55aacfc97b333b65e789c9d362d/orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/2d/c4/dd9583aea6aefee1b64d3aed13f51d2aadb014028bc929fe52936ec5091f/orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061", size = 138514 }, - { url = "https://files.pythonhosted.org/packages/53/3e/dcf1729230654f5c5594fc752de1f43dcf67e055ac0d300c8cdb1309269a/orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3", size = 130940 }, - { url = "https://files.pythonhosted.org/packages/e8/2b/b9759fe704789937705c8a56a03f6c03e50dff7df87d65cba9a20fec5282/orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d", size = 414713 }, - { url = "https://files.pythonhosted.org/packages/a7/6b/b9dfdbd4b6e20a59238319eb203ae07c3f6abf07eef909169b7a37ae3bba/orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182", size = 141028 }, - { url = "https://files.pythonhosted.org/packages/7c/b5/40f5bbea619c7caf75eb4d652a9821875a8ed04acc45fe3d3ef054ca69fb/orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e", size = 129715 }, - { url = "https://files.pythonhosted.org/packages/38/60/2272514061cbdf4d672edbca6e59c7e01cd1c706e881427d88f3c3e79761/orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/11/5d/be1490ff7eafe7fef890eb4527cf5bcd8cfd6117f3efe42a3249ec847b60/orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806", size = 133564 }, - { url = "https://files.pythonhosted.org/packages/7a/a2/21b25ce4a2c71dbb90948ee81bd7a42b4fbfc63162e57faf83157d5540ae/orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6", size = 249533 }, - { url = "https://files.pythonhosted.org/packages/b2/85/2076fc12d8225698a51278009726750c9c65c846eda741e77e1761cfef33/orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef", size = 125230 }, - { url = "https://files.pythonhosted.org/packages/06/df/a85a7955f11274191eccf559e8481b2be74a7c6d43075d0a9506aa80284d/orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/37/b3/94c55625a29b8767c0eed194cb000b3787e3c23b4cdd13be17bae6ccbb4b/orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d", size = 139749 }, - { url = "https://files.pythonhosted.org/packages/53/ba/c608b1e719971e8ddac2379f290404c2e914cf8e976369bae3cad88768b1/orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0", size = 154558 }, - { url = "https://files.pythonhosted.org/packages/b2/c4/c1fb835bb23ad788a39aa9ebb8821d51b1c03588d9a9e4ca7de5b354fdd5/orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/78/14/bb2b48b26ab3c570b284eb2157d98c1ef331a8397f6c8bd983b270467f5c/orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5", size = 138513 }, - { url = "https://files.pythonhosted.org/packages/4a/97/d5b353a5fe532e92c46467aa37e637f81af8468aa894cd77d2ec8a12f99e/orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b", size = 130942 }, - { url = "https://files.pythonhosted.org/packages/b5/5d/a067bec55293cca48fea8b9928cfa84c623be0cce8141d47690e64a6ca12/orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399", size = 414717 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/1485b8b05c6b4c4db172c438cf5db5dcfd10e72a9bc23c151a1137e763e0/orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388", size = 141033 }, - { url = "https://files.pythonhosted.org/packages/f8/d2/fc67523656e43a0c7eaeae9007c8b02e86076b15d591e9be11554d3d3138/orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c", size = 129720 }, - { url = "https://files.pythonhosted.org/packages/79/42/f58c7bd4e5b54da2ce2ef0331a39ccbbaa7699b7f70206fbf06737c9ed7d/orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/00/f8/bb60a4644287a544ec81df1699d5b965776bc9848d9029d9f9b3402ac8bb/orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e", size = 133570 }, - { url = "https://files.pythonhosted.org/packages/66/85/22fe737188905a71afcc4bf7cc4c79cd7f5bbe9ed1fe0aac4ce4c33edc30/orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a", size = 249504 }, - { url = "https://files.pythonhosted.org/packages/48/b7/2622b29f3afebe938a0a9037e184660379797d5fd5234e5998345d7a5b43/orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d", size = 125080 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/0b72a48f4403d0b88b2a41450c535b3e8989e8a2d7800659a967efc7c115/orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0", size = 150121 }, - { url = "https://files.pythonhosted.org/packages/06/ec/acb1a20cd49edb2000be5a0404cd43e3c8aad219f376ac8c60b870518c03/orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4", size = 139796 }, - { url = "https://files.pythonhosted.org/packages/33/e1/f7840a2ea852114b23a52a1c0b2bea0a1ea22236efbcdb876402d799c423/orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767", size = 154636 }, - { url = "https://files.pythonhosted.org/packages/fa/da/31543337febd043b8fa80a3b67de627669b88c7b128d9ad4cc2ece005b7a/orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41", size = 130621 }, - { url = "https://files.pythonhosted.org/packages/ed/78/66115dc9afbc22496530d2139f2f4455698be444c7c2475cb48f657cefc9/orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514", size = 138516 }, - { url = "https://files.pythonhosted.org/packages/22/84/cd4f5fb5427ffcf823140957a47503076184cb1ce15bcc1165125c26c46c/orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17", size = 130762 }, - { url = "https://files.pythonhosted.org/packages/93/1f/67596b711ba9f56dd75d73b60089c5c92057f1130bb3a25a0f53fb9a583b/orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b", size = 414700 }, - { url = "https://files.pythonhosted.org/packages/7c/0c/6a3b3271b46443d90efb713c3e4fe83fa8cd71cda0d11a0f69a03f437c6e/orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7", size = 141077 }, - { url = "https://files.pythonhosted.org/packages/3b/9b/33c58e0bfc788995eccd0d525ecd6b84b40d7ed182dd0751cd4c1322ac62/orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a", size = 129898 }, - { url = "https://files.pythonhosted.org/packages/01/c1/d577ecd2e9fa393366a1ea0a9267f6510d86e6c4bb1cdfb9877104cac44c/orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665", size = 142566 }, - { url = "https://files.pythonhosted.org/packages/ed/eb/a85317ee1732d1034b92d56f89f1de4d7bf7904f5c8fb9dcdd5b1c83917f/orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa", size = 133732 }, - { url = "https://files.pythonhosted.org/packages/06/10/fe7d60b8da538e8d3d3721f08c1b7bff0491e8fa4dd3bf11a17e34f4730e/orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6", size = 249399 }, - { url = "https://files.pythonhosted.org/packages/6b/83/52c356fd3a61abd829ae7e4366a6fe8e8863c825a60d7ac5156067516edf/orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a", size = 125044 }, - { url = "https://files.pythonhosted.org/packages/55/b2/d06d5901408e7ded1a74c7c20d70e3a127057a6d21355f50c90c0f337913/orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9", size = 150066 }, - { url = "https://files.pythonhosted.org/packages/75/8c/60c3106e08dc593a861755781c7c675a566445cc39558677d505878d879f/orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0", size = 139737 }, - { url = "https://files.pythonhosted.org/packages/6a/8c/ae00d7d0ab8a4490b1efeb01ad4ab2f1982e69cc82490bf8093407718ff5/orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307", size = 154804 }, - { url = "https://files.pythonhosted.org/packages/22/86/65dc69bd88b6dd254535310e97bc518aa50a39ef9c5a2a5d518e7a223710/orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e", size = 130583 }, - { url = "https://files.pythonhosted.org/packages/bb/00/6fe01ededb05d52be42fabb13d93a36e51f1fd9be173bd95707d11a8a860/orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7", size = 138465 }, - { url = "https://files.pythonhosted.org/packages/db/2f/4cc151c4b471b0cdc8cb29d3eadbce5007eb0475d26fa26ed123dca93b33/orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8", size = 130742 }, - { url = "https://files.pythonhosted.org/packages/9f/13/8a6109e4b477c518498ca37963d9c0eb1508b259725553fb53d53b20e2ea/orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca", size = 414669 }, - { url = "https://files.pythonhosted.org/packages/22/7b/1d229d6d24644ed4d0a803de1b0e2df832032d5beda7346831c78191b5b2/orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561", size = 141043 }, - { url = "https://files.pythonhosted.org/packages/cc/d3/6dc91156cf12ed86bed383bcb942d84d23304a1e57b7ab030bf60ea130d6/orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825", size = 129826 }, - { url = "https://files.pythonhosted.org/packages/b3/38/c47c25b86f6996f1343be721b6ea4367bc1c8bc0fc3f6bbcd995d18cb19d/orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890", size = 142542 }, - { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - [[package]] name = "pydantic" version = "2.10.6" @@ -594,50 +401,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, ] -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - [[package]] name = "requests" version = "2.32.3" @@ -653,18 +416,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, -] - [[package]] name = "rich" version = "14.0.0" @@ -722,15 +473,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, ] -[[package]] -name = "tenacity" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, -] - [[package]] name = "typer" version = "0.15.2" @@ -777,78 +519,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf7 wheels = [ { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404 }, ] - -[[package]] -name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701 }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678 }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098 }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798 }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840 }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337 }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182 }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936 }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705 }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882 }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672 }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043 }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390 }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901 }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596 }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498 }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699 }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681 }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328 }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955 }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944 }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927 }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910 }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544 }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094 }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440 }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091 }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682 }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707 }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792 }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586 }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420 }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, -] diff --git a/examples/langchain_tools/README.md b/examples/langchain_tools/README.md deleted file mode 100644 index 3ef1803..0000000 --- a/examples/langchain_tools/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Minimal LangChain Tools Example - -Middleman.ai の LangChain ツールを直接使用する最小限のサンプルです。 - -## 必要条件 - -- Python 3.10 以上 -- [uv](https://github.com/astral-sh/uv) - -## セットアップ - -1. 環境変数の設定: - -```bash -export MIDDLEMAN_API_KEY="YOUR_API_KEY" -export MIDDLEMAN_TEMPLATE_ID="YOUR_TEMPLATE_ID" # JSON to PPTXの機能を使用する場合sample_template.pptxをMiddleman.aiにアップロードしてそのIDを設定 -``` - -2. 依存関係のインストール: - -```bash -uv sync -``` - -## 使用方法 - -```bash -uv run main.py -``` - -各ツールの\_run メソッドの呼び出し結果(生成されたファイルの URL)が表示されます。 - -## ライセンス - -このプロジェクトは MIT ライセンスの下で公開されています。 diff --git a/examples/langchain_tools/main.py b/examples/langchain_tools/main.py deleted file mode 100644 index dc628de..0000000 --- a/examples/langchain_tools/main.py +++ /dev/null @@ -1,91 +0,0 @@ -import os - -from middleman_ai import ToolsClient -from middleman_ai.langchain_tools import ( - DocxToPageImagesTool, - JsonToPptxAnalyzeTool, - JsonToPptxExecuteTool, - MdToDocxTool, - MdToPdfTool, - PdfToPageImagesTool, - PptxToPageImagesTool, - XlsxToPageImagesTool, -) - - -def main() -> None: - # Initialize client - client = ToolsClient(api_key=os.getenv("MIDDLEMAN_API_KEY", "")) - pdf_template_id = os.getenv("MIDDLEMAN_PDF_TEMPLATE_ID", None) - pptx_template_id = os.getenv("MIDDLEMAN_PPTX_TEMPLATE_ID", None) - - try: - # Initialize all tools - md_to_pdf = MdToPdfTool(client=client, default_template_id=pdf_template_id) - md_to_docx = MdToDocxTool(client=client) - pdf_to_images = PdfToPageImagesTool(client=client) - json_to_pptx_analyze = JsonToPptxAnalyzeTool( - client=client, default_template_id=pptx_template_id - ) - json_to_pptx_execute = JsonToPptxExecuteTool( - client=client, default_template_id=pptx_template_id - ) - pptx_to_images = PptxToPageImagesTool(client=client) - docx_to_images = DocxToPageImagesTool(client=client) - xlsx_to_images = XlsxToPageImagesTool(client=client) - # Test each tool's _run method - markdown_text = "# Sample\nThis is a test." - - # Markdown conversions - pdf_url = md_to_pdf.run( - {"text": markdown_text, "pdf_template_id": pdf_template_id} - ) - print(f"Generated PDF URL: {pdf_url}") - - docx_url = md_to_docx.run(markdown_text) - print(f"Generated DOCX URL: {docx_url}") - - # PDF to images - images_result = pdf_to_images.run("sample.pdf") - print(f"Generated image URLs: {images_result}") - - # PPTX to images - images_result = pptx_to_images.run("sample_template.pptx") - print(f"Generated image URLs: {images_result}") - - # DOCX to images - images_result = docx_to_images.run("sample.docx") - print(f"Generated image URLs: {images_result}") - - # XLSX to images - images_result = xlsx_to_images.run("sample.xlsx") - print(f"Generated image URLs: {images_result}") - - # JSON to PPTX - template_structure = json_to_pptx_analyze.run("") - print(f"Template structure: {template_structure}") - - presentation_json = """ - { - "slides": [ - { - "type": "title", - "placeholders": [ - { - "name": "title", - "content": "Sample Title" - } - ] - } - ] - } - """ - pptx_url = json_to_pptx_execute.run(presentation_json) - print(f"Generated PPTX URL: {pptx_url}") - - except Exception as e: - print(f"Error: {e}") - - -if __name__ == "__main__": - main() diff --git a/examples/langchain_tools/pyproject.toml b/examples/langchain_tools/pyproject.toml deleted file mode 100644 index ce532d5..0000000 --- a/examples/langchain_tools/pyproject.toml +++ /dev/null @@ -1,21 +0,0 @@ -[project] -name = "langchain-tools" -version = "0.1.0" -description = "Minimal example of using LangChain tools directly" -readme = "README.md" -requires-python = ">=3.10" -dependencies = [ - "middleman-ai", - "langchain-core>=0.3.34", -] - -[tool.uv] -[tool.uv.sources] -middleman-ai = { path = "../../", editable = true } - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -include = ["src/minimal_langchain_tools"] diff --git a/examples/langchain_tools/sample.docx b/examples/langchain_tools/sample.docx deleted file mode 100644 index 2f364ca66dd94b18afc4f10b261c035c7dbf41af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36659 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 F4*+AlPAUKZ diff --git a/examples/langchain_tools/sample.pdf b/examples/langchain_tools/sample.pdf deleted file mode 100644 index b83cf7884b1a53cd8dcc5e11fc20cccf587ad173..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434665 zcma%?Wl&sEl&x_mxVtqD!GpWIJA}sF-4YxcX*{?GhsJ}`xHRq(BmqLO1VRYT>v=U* zGq0xV)%34hw{D*wefK$gt#7Yp(NR$1=Hn5;V)u#=4bCi z&#UBS<7cm6Z|iAi&#PhY;ppc?FUgHM6w!`=U2UnmW&O|$}$C2;)ZORw7}c#yrNv?GQ#jarok#1 zu%0mP(aAs%8$MU6V>RCQ^~`kJDOnlRRbw_R@^ThVn(+({{rezG3(~;}ow7oUw63uO zFv85XH1Ci}%Ae0Ck3npL)j#_v@X@?KJYrSJ?ya`ZovihYKh7YNA%0A@ootE)$pK$< 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%0D%vb9nm-o)*9qPHEb( zHR#T9?CW{jL-seLXaE8}5xq)krd|%bmx+TJNy4=RF!C_8h-`LX$g2LHy+t~)% zIf8v9PfMT`r<`rX8cgPR_6-kCISJXCa<_vYZg_6B#nA#|78#QxrsT5mC-y8W!;aAc&^2zyo zrPo5s-ttcdzlyf8PcDp=L<^yNT|bF03SSP(I)mkQp@_`spMNo-WvjW zUGdA256&RHU1-=_{7HXN{&MVti(Dn+Ld;&@PtuE`%i#cLaNsUf?9IZ6N7?0QfC~(R zExg+s`$>6GayjzH8I-sSANM~0WW1=jBx1RTr*k)fiUpyfBbY#!caKAdGl3=#@k~cD zfx-G7wGL|nwKd|Aj%Wh?#ytrg-UQkWgpZDF0wei79GyFQROARn9RWSM#Ct3{9C|c~ z2x}b)JqG=I3bqNJbJX#2oD_@Jw}mx1UgJpR3Zos9ib_@x_dl2 zTvIf42qzt>DF%;w^g3)))E)>^9kD6;lY25cd{eY1h?hEYQ;g>SC||ov9P&SQF0pg( z(ErEIWl+D;KN9_l42L?e<;k+C2<~0Q+!m%HK-|ah3)7+QF=5z+X;27DjJPm^#ywID zvoN&=LKh<}Oh0l@2*WK*JA!b>NDDLa+{4G*t)=2Ys9^+a>B{bLVK{4P$`B41$yx@d zd$btVT52bR2}ZP*e*c~nhPRe>AK{0Qt!1RYhl{!Mf{GrYj1hQ2mwAs3!|{S96Jd*y zc)?(Lj}pW3g4z^eh!J@~zkE*&!}Ef68R3PIdBG@ij|jtbOeKTR!U!GHwcX>xa2?aM zAzUz0#|$s;F=E(`sb3O5W5w9?EY=M9VtuuSZiK}EE_)oSRw(o`d zsrPQWzLD(8SOMo{uFxR$ew1skLA+U5%lrS1>AZb}|y zoR40y&4yR#J#N<|$)Su5SkcO>8GN)~>N+F2n{hIF9rXGG^Lvi2^^%Jj`=f-m1vNwS z`yiv1yvVp5#ol`F-Y>C7=Nc{9m$5dAx0UNYD6ya6Ix4x9aWsmvg?1lk+I#F;E;*aA z3)QB4_o1f!CD(6~rx_QcSGTg^xqDCAHA`|VV`~(DEAME~XTR0;ljQe|(@|XT_z#@# zL6R)_Ipg~%(N@9H(E0vv*FTbfm##U>i^ZnTLGZI3C8sZrtZjP0DQfwOGos-wd=pnGJR+NVmPwpd8WKzvc-E3U zhMG2(Zvey<2U>$wINUT%FVi?{G$ffUmaWZrz>f6)rdw?~++*6wVmg>-+G}k(x?$Qu zZaR=?+M{p!#lHL-P5F*7?+Yi&rs&<~tlgGC+U8i=ma9vF08Lg(b<=+(bPsJ|T8ag~ zTCG$s{cf~-Ukm9{I6UK5OZ8-ah2nmT&{FC*Zm)W&zRX?dwYT6eg?zgU>(AY$UwPe= zTey}Izj1oiwe*_qmb=fk&@Q3Av3k`2rvKI1y`e>FDf1hzS3^tR^6oeH(-zz%6zK{p^|6Rw(?E|y{X&O&20E0;r_pA zed^{d(e~KPnJ*@Jc4%wk^oBQ1o4lEMMVR3f*CzR?sy9p9L$hZUQHC>ITZyNf-sEkn zX4WvAG+nZ(e`@b7(q?StR1s}BTe3BM`oHN`^Anx^6LZWS^OGv(L_Fs7n$|J1)=x66 zlh*}4&9>h8wm#!EGV2mqyFOXpam=c*Z#IIAiRO zepUGUn{(dxb%~GD>?a(k2A1_q1IwpYe1hhS&H;O1TF)pbnVyQj%G-Z+a67Q2XYoC) zSH1XT-WR?D^1!&BLCEY^cZ^%?*BzJy*7VH1r}nDrn6UWbad15_ujdu`n`$~~#7zp@R-5;0QFF4Q*tn7LHp6W~O{RycrRtNlnSv@a- zn)>wqt7rS~4m<-pdY0bPeW|}c`Rt3#0exUn&oHzBs(*|J?LR-T4s7U|e^2wJ?#D#X zmyiS5z@nZ>FhkY+cy+e_>)>HvZ_mnmhA$02Cc)5jOmZ6Yi}j(QTu#w4Br1-LPOE>3 zJ~WprD0)A+>U=D6n)8eIp^02x(K`rO9Q&Pi{gQrYEmu^u0y?K-{L_eE%nuEEvu&0k zZ*i=3TK-G;p;>Rf&HIK`(_@~~j9=UjZ}#Teyo30~vD<0eFUf~iy@fU_f2UhL9K6gC zJX0C`);ajicJO|`7IdQDTij*O*&FLb2x7TZbT0>33l|3IL?gDtAC4zcFSRkb|;UV&-~82eoKeG z=gDQ*{!P=4X~~w(=)g8w%?MW&!Kj(<8>r{W^rEk`+DfJUd+nwm!tb< zLFdnZ%ZB!b_Q~xq99=zAJ1_e!^rtfv4P>t)y))k=NP%^Jl+h{=E3p7rG;N#Bio}Uin+(PuCwbV8D)S&b-b$eoOs%4uyuD&?C7s zoAZX>;(wm~!Tj0%a};_OdfxlHmr)^EP@R;OFcqPJa#T2CR7n(R>@_;yNf|6y&C)i^m``RC|YVXa}NefB^?D?=y{RykL zy?Hw6mT~v7e}tX&qgL$>I0I;TtkyLJQtC z?3J)D{Yk6N2RtWq5JAHJgGSh)1r4%qfRu$GEn*ZyYBwf$Gg}gZG6b(9b}?7%h6IhW zCB}(?@)fa&p|zV3G|iTR+zbKaJTaH-`T^K|gO`|`ATDAMLu@zNXnac&Vl)IVBepPj zc7u(Ew3Bs}lDUC3Z(8{!Jw&QYEf* zB{pNFYpx~q)Fo8rOjkZ%i_qPPwBCtQpo}!2jKV@cUMu$Y20l17A%0X83p!=3%G>`2 zJ1tEj{%{ltI%e&Ow=dwrsde!yqeRd-Yqj3@ZgAw&z^fz*A04q)>g@ycaB6=1tSBCI z#@bWwyPfQoH1+uNQ8eg;wF+-PfQeIk;&((zp$pdPz3+E&EYs}c|A@jtqt;3eyn!uF zO^=@x#eq&+t3L1#V3(#T#Gj0!K*z0>ANT@loEoImQR3*lwYr0Q0USLv;B1b%ijG<< zJMaPWI5m``q6E-cYc&UVPuPQLpzjpLfKFPgJn%bVJEw*UQEdG)TS<7z$TCHPwJLREQEqawBu!ELwg9hX*KbNaey6V;m1IVetfwDOxX z0LD`_uk_V)<{h_IzPI#1*HnF0`fj@Lj#sO|TL!vlLe;2J%yi1m9e-X)`hsX()ymS> z(6Vv|0~Lc+G{0(A>C5Si9aoS_(Z7rKRP88T0^^>izd$zwg!omHN{6S@c3h5m1L+}` zui8*L50xyBWBxz}h}x?bl}=7)?YJHD{iKKVylQXh%5>3=*YQ6BPw^y!F&nJF4m8V` z22EbP(O~t4sL$IQR{64!e~K3w%-P`ec>~~enF*rpc)!7}4QZeEH*E6dAPyCeKNzvW z44}bVmeSzVi`N<~-w^g$?6kC$g>+Or&tS#|x6d44*=6d9=HuN4+cqS9-gR1A%0XBv zo@Ov%gB_@ZW{_$n>WH@(tlPNmv(#y|EDPDGczA+t@cYbnT0r)c=tn%f3^!zbRyu8# z<%aB~+3kfZ>?Lp8U;kh)OKvZeX)j@7FNWPj{;7#5uZaw^kZ7P%e=8mnpxvjejdr|Zk5^$& zUEzQoDM->HNaH6+@l}ukzwugJBPIBS2FUH=n%EW$!8=R~LZJZ@yP763px)E9(=R;& z9gtmK6CcFaXxizP9)thK?pc$}g0(wCJA>3C5dPRjHL)xhK!BT8>M?)f?0Fh67 zkN(*sQ2N+qHSs{!jT(q*kHO(%*U==kU zPoM5P{n;bX^4JwM2|zH8238V}!NX(M+a$MOv&T?)K`)vEO|qeJ@FYN3TB7ihUQ8w0 zXv5{86$lP8g%>BIozWs2W(Tza*QKQju>gXP_S<-H&=VjlEoXf}AesV=zoBwa8X(kj z!}=1urO{d&P6y3^dyuxi2+w0Q&&JJzrvYL;lGa!aG4p7*jk^ck0Wv+ZV7ZSLN7HQR z98?5|^hmtF1k4|_#fHa0JFp>Sz(pT@A1$?EbxJ!mmNyre#Oro7P{0_QK zq=RJ>*KX*pUf}S-tMtKk_95K%xk%xIo8=SD(;4g5nMiX3t+R~wSnju4#)L@sDM_Op zf-gd-E?i(JYgOye>BKh}`GOeCGeh&MZijbI0)w$$5UqrJ4Rx$q9D1DG3&wdt0^EwB zAFDx!Atw(Z_#0QeT#BvcuL+}ti^gDR~(O#n7aGN1`TOPWd+=VPJ z2|zA}0L60{bP@vL-D{!YazjAZIdnepgS0MjXhiQ20CNuSp9DcXm*`J;=nyb)4!ut9 zLmrppPsE=gz}g&!Dqmt|N{Lq2W@Snx9*y2q#$#qniB;Em!Zbs?8-1*d&CHS#GotOt z)J(h>y{Amb%#ji|qO-|#M0^^3u6(hS(IA>ro0KV*crbch8Ml1b(MQV2 zQf7k~_%bs+C7z4^s7z4G4mM_;S*DM~-=cpiW0f+2U|Cy~DVO+F^ao}9QZ{fV>$Ebx zCH@@!T^Xm81vJRoV96tX7rn21wUlEz4xkWBKZ$=u{~owt&nOg4seOehk{A=cHgMUV zRVbEHC!T4Dcq9670AbGz*;8$8rV8TM(Ypgz?Aak~sspVO;;+%C2-Q`D!i6wa&MW9$k)!j*dYNDB2S>W#3ZdWdrp^ z4B3FDJy}!kEu~sEa9zX@45-?ZH06K`n5~^?DTZ!9*Pfy&4-~y@u=|U_8c=|QX!Z?7 zTDC-@;TVzu4Tyy1-cZVCgKuCA{(uT(Kyx}3E!p6+7DF?j1EJ5nP9;zo6a9$68Bl_h zXLf+1G#gZ|V<-l+Al8{1pwz<#gHp`Z0X4{R=A0-(`Iu-WhG9Stf}43KO3(>@j9_F^ zM-Zb}8M)N4Q&FUhZ0blulqe&gI?fF03M0!1LKwx%$TNc7jG|@a7(x1?q!|T9aE?%y ziWxZ(cqry#PEPDt6mc;tCsGq7T+GXfGls$|X0AeTqqvK?tFWJ>wmj{KY&w*xe}lVvZeTAWF7a zUY^INwoNtBf}g zgeaC(&KuZ?D3Vpy8%SN0$SUs*oCy^EDsv}-AH}oE-HBa~qFH6{M0%p6R{1+|_E9*i zOaTab6vrx80CpjYVwEibX^j$Jqsrkmy@WicbicpHD_epkzAN3Ct+Oo1EXJR*T}LX zy|6$|(zqTuBYtYc2-=aTnbRzuS2vSUE46%N#*wO-*DR4&&xDaDHDhE90`%Nw3AMU! z7~N9aM&3HoHS?P#)#_bmq)AN}8FD0nL}0wTZabqzYTd{iN1A57#YA_#dyG=41tSxV z6wN$~346NV8G}-vkGyweXckyZ+SB_xRHF?MOQ|W<43YBifx*M%c2lu zX{@kv8|B+H@udM1g#s*}Ql5>GswV)LmdFT$ zL}jU=kxNypu_U)l#^W({r&3`fv#MHnx=LlB#x%A{eT^Pe^%%=?%iVm$txi^oXQWb9 zYAgf`+%Skpmueb0RW%z+Je9ur_^JBMQf{N0RZroaD|r+3RAa8x)#z?jx3SDq*||rq z>SCqTMmkj$#v)H8=E5LPU21ORQPplN^;Bl=G4T9LC5^1A>fuo=HHQMsercdlNYx8t zxuM54X9Hca+EU&sdsMXRTU2|@-gCuiOM9#G zx#GKiP<6=c!;crhQJ_p$0a3wfhglz(!&4xG=uloLM&_^sV2`GnDK%lSM zYxe#}oNsAARen`Kg0DK%|B@sVJgBufO44RVcQ*a;B-sjLb#*FBUeE0A9Q$KSvJ}Kj zXv4mGW^rfFpHPycAZ|hj*2pubJLmovyBXp2txZu9H#4}i?vLBeY8A_`lU4F^W^3oj zAKA@p6;rQmT2eDJxAW1T0Q53(^*ZwHb6dSUhRDF$M0r)7Yn=J zlBJo?JKz0rx>?@E0PeEn+0470egCW79Pi?QLRoS)^K0k#-zn#cs&0rXVC6pH%B`Tv zEtklxM4CTgGp}H(o8qpUmh_m4zU~s&?hMSP)mg7LqNi z$WWd%J-kbDtnrgHBv)3csC;sIdl&y$ySRGPDxU$o=x!J|iA~jwhN3_+uCt}#-FSP{1DRBbNEr$lnSOm`R)AqwWEtqyNR=&}=` zEF%IdjxkX8ipXRaY710|zmD2{dF=4>Z0B z%ZDp|nG(bK&isNDIa=dRAMpG#x`r&BJq5*cEP(M&2q5#}WoLT9t2t^=C&vAn{$NPj z*;-H_$8_8c7CV^_hI^c41sQVm#+^Ulf6X`@3U+=dD3@b1?)Bm7*R0cFc3YC>n1unr z;&J80>r7PG8Z}oh%(_!w=gUjfnY?W)(wws}?oNK4CokdE#0Oiy=B|ZhclzrBc}cG( z$!+nQBNou^MD3gw@q81Rwpz{Q3o|gE@meJEO`6#9G-oV~xs$bXTO`y?00q3cZQ(79 zYy1{Tb(7a^X_^xjhMK&M32dPwo=Un3lr`X?L12fpC`WC z1~orlcn`yzz*5rZ$-h(1wdb86=C#$xw0Ft0Gs|>%U}CFcV(&!Wj91f4UDJXccPp*! zR^HuPS>J9I5iBGpEM!~t@jFs9#VxY!83K(v->Sdf(X^>%QEbl~hQ-2neV&fuO?iua zdnWg20G{2y?+CY=MVUS8dkoKtWcuhGuQo+3vg{ea89iU7ztB;ysd7R6Q8vx3WbQAnSxBSTZtA_wH@sm}64`d>KOG&L-W?^(d0 zS@^5(p`%<=(W1bfDIB{Ce)a!$3~lONl-slU&XDy;YlLl`*iWPLiKQ^VL{^yAX!*LK zpG#+}r6j*h)?=uitPA^@b=F#5=a2y|DiquQYhq;Zmt(*IKbhcYc)yvF3hEmJAq@Pu1y`^}))I93b=(qJizmU!smU8uS z;(w!@8|8CD&HE9HL~NNvq=Q7_hQwnMiI_Br5w83(m;4DT+I8)Tb@z!i%ZZI({#8Z( zb$g&VCtD2geaQ6I>T+841#ELFEJ8lK@pkLFyBz3=)seC^;PIi|+oH>3`JN|EM;bt} zK798M>IzwYxPJk#$^&#C61~;B9N_$kxStAJlMg`6?($oHuzv}jQUg{W>b*_7+?Ma| zV*@F9@ZE=f@B3Xr%OU$0ej|K4KfshX` zyluL?mhbQ5{78fI+K1oXph>_#Wq2OFJ4p*$l>$Wh;u+dsVsi`e^s$I2c=& z1!nPa=e3rj#gn~YLRpTYxXD-BYhRB}PtIY^X0(YG7^hf^I~qJ$hs80gO{~DHthJX% zTPH^_b~D?=G>n_B)f~;8d<-Ud!EO`R@M?bT)6ut+pD=|ptwei`i?8J!y*l|2jQ@gd zCD!Xz$J)}-=acU+l(VeFd>OyL_U!20$$s$F7aS{bUtaxKJ3IPy^84?UbEStir2DZ7 zH@ONwP!(=T6mBD}H`%N|Ff|--HylcO9Yl*ii0gO|b^k%qkJCq2PotAgk>`pq^k>_k z1-7ydU!Iad4Tua5N|=VN`NL1A1m~)-1ISrHdu??bE}hby>prCD&0E2I+4^yKc8UdW z(QBdEaPZkmIvhSFfzA*q0CzD(Ta$;|r}*b8up!8Slg?Jd;ruDhxz2BLK>0E>(H zv-JlTH#}UCnW-sRS)H4eBo&`4JYA8SsV!Mmo#zS33_ewOydpbOOR~xcHw+y365;uZ z{7fCmY9l-V%fUy6hbc0ZH0mpJa+8w8;Z@|{q?3%{lZD4BvXwOJt5k6t zlRU*23(r;LD{0qPtKyj@`G`*t9;wJu(ln)fhg*~+7oRUYQ<0~nZA$eHPb{tR;Gz!m^)&{_@obHMGN8%z-g% z_bIF|3q+Wr-PRHgOkkZ)0VK2tJ+$*$+`&!Q-%|jfEW!ruwU%^XdcwhejU+Z^V8EVO zs2X-E{6H^>tsa=QrxvQq*3}lceN7}bXJFi(T&MTl`Q3S7TN6PqwF1k07`1#Nf!_G=cgbpvngX`1R5blnB+U6YC}7?^-vOU;7L9zW!} zVxJGZw`XW-SkT)O_&eoXduD!O=4%=$#4agBW+@~O46dmd5IYgY##Y7VR>eg|D;u>c zTlg!R9xK~i8PJa(xMj)6PYQ&?LAG^6*yUJSGS!m;(r{30-Q1_3(|VZ^yxlQ*gM8~I zu-dU&W&)jd%(Fq6b!(rZP8(@PdeW;gQG+b&2C(U|lx8XlkqctgP zNe6k>Z^Gios)q?~?=c;NQtMWSg#k7Iup@0DjuX8<1SAv>bs;}0ACq0I;T)oEf+?-^ocv>n?N)3goJB<~&xiV5U zwVa+b8%k977%M#GyqU_ab@RznL$T^^VS{_f@4W+7|&nkT6gegwT>Pfw!c=fYcC1@6=25N;od0{A5-TQaSx#1d} z%IfmWY?`HPs`hNU>ud_dY#OO-oLs5gE~)%f#Hre&sqUjGmZNFGT*-=DsrD|9TlLLZ z`7$%rwaT4ld|e`14MF9W`9|HX{O(Mk3#!%NEvrW+^j*q5X70H}wHm!;`_*g%XRVK4gU9a4E#&0*`*bs0?neWxT%J0tv?V^qipstbmLfxj^Yv%rL z)Ugq?C^CPmhn9!>UXm!uSJ&m`NJ$$T-Q4uWlPJ&E)a9#8c|EqfdF+cVQI@YU!RwsT zGPbz6=SwJ2nXfg$x1I8J>~!Z<{}TvARl@)jfG(`7-uu^MfybSNXE0Cm*~v z#y)R;_r>WdTh@T&Ps+2gcbogZSGy{gwIGm_ayIsB^Y`B==L)lL2s2^jq;utDQsrbw zWN#(BgF?PJ-0xqkdZa|a*OOp z^FcitI!&@Xr8mH;O=I}ttm>k{S!iVB!YOoo+IWihX=eKB%bWSsaE#MiE@n!VK7S55< zY0CMnhs@x0AD!HyIMO=JI5!6pN5;zNm#wSN@=QB71Gq*;@94@F!;#);*0}}nGBW=3 zBLtbW5hNH^K`w3VGz_UAn>Nx2BPz(Jjq@6FMUZ72A%fu*>;Eu{Ea+&*v~NZjU0Q( zAdGCIz#h&S=At(vEdmF_o=zxZce92o4OFH+MdEC5FnI zJs;_ek?`iv$Jti8vY!0t!v7GJFUIPJ35WlSs2p94%Xdc!r+W$|d&TxL3nd2W&18w7 zz_599Sz>2l$h_Gsk){|iZ$3+$c?^L!%Q8Y7!{^PjjNO5u^X6Da-p9yz3oPUOz+fFP zN+YgfSPnR)v6C<)2dvUaJ&ec!uQbji2LFJ$2O)srIpFTWZotqSu=gOnFj5EnJvd)5 zI0sC@2nGzt0aq|~5r*P`Ef{Ho5kKGy##zB!JzzOU$YBHyc+RnVF$@PB=g3fu+=0M( zC96I$cTD<#CNW!eshxJ)j@PB?YBV_N3v=hBkHgKoCRJy&epBCS6l|$n4wcnv!z){tubi6GQ`Hr zoeG+*7mMAEVP?}?zeXZdeX3Wo(mBBN1b1T=^3O-B5o?IOnQe#$Ig}ycqilvR|xsozC#*DUd zjx3?sZwyA14Dm6Gt%4(KDC--`ausC=jG1ob9a%yD-uNL`Z-(5M%~nyayiOInAxVwK z>=RdEv94T2o$3lhqZ*glR#!=}=eY{6s-T%vV>VmsdR^>UuF|XO4~Bj<4`zE@WyN~U z<@u_}4e@JKW=ma#+B(e@`KqBfTH`d^4DiApbA`Gp=z`YVoPFvl*4AyVR96l4&YHWk z-M}(@@mAiW>bfCKjm~U^t4LedTSbrRc0-FAkJ)xW8$N%l@VV-qp;V34Y`v>^+q1Vy zpR2zc2GxYjzHpUm>y?zJt0FYSsZp9O`6zg|Q&N$xI?+(A#$mPz(!V{D3I$cVh8#6U zv(+C(?{-Tn6;w|cI@kEkb^!u(wcMn=zBM!+t8}K-ekVYZSL;JKp-g^ zynEtl(otnG=kf90-KcJ(cjfygKdOS}LOwnOu%f=q6MB=RDz!O>k3QeR0}W-$3r!}g zoag*LJ^;?5!Sg59CJj}lb8a8+ev1T8X8C&)ND0mbeGCEYqJGE|S(BnFy*cNPe%~T~ z8itg=Fj=Ycn!Eoo2q=sOzn(la0b9zP*T?(cqJA3vD*tWrrz&(V)cg`(3H;Yy%Ql_r zI@-Evj>lJ?si{?0K0V{Q+j?w{%~zJG@v_!wy4iKHb$awkTu)oi%`es! zgHXJdY&zC;uyx%Wx9*9FCQlu7mRz@5kIa#Er6w9RwNOKHoooGQP5{k%t(rP$7P)?F z{b`O>R|0Q{TCwR|*H^6{%<=2W-)OqkwN1Zu{oMN99H*}AjmD?iyVKpS?^^fGuhvz* z(fU;PZThF{uh!pxr<_Y&u|{2TF=3W7;SFWN+>L~Jgw8Ch&YR+jJ5MWIx^Lf67ZKBH z5mWOM)BD;ckKd*q*M@{2x0Lo<7NvZ1nJzEe$lhvtWVD-Gl-13FajuQvt*S>_yV+8y z$6UM1QXAb{U5~7Gi>0#9bKhOg+OXhfGa1}qCQLD5zQbq|*xZ8-3QobvrvP^rvZq03|&#ape<8Q;x=%AU`G zoTu&TTeZ(=-_6cSL*`z%th6z_)%%wP;Ihi`}NmP$m6g;rss{|9(YRe zI_?wOaVk($TCG(DYO-Fx{6uyf3y-j7Yn6tlrmt&0i5=$#@;z_2R%@u4fBoqb!Et0D z3pAvZAr<>N?-So~W+2b=w)d(KbbY<_iS9TtkmGsFdlks8zJB&e=D09W;CaV;HHf3W zKKonc-0Z|p;e`H%mHy_={wCZ0))f8*S^j2G-K90%6`#6GSl-R@y?aCVZcgUiJeJHX zi_9B}9sF-9Kkb2tX>3y=FmJlU^X=wO*N}u4CN`A~^Wr-+-*iC!7x&`kN`=?_{T-=q zRzE#Ml3tjuRDPMix`Xpg>8BkeevIWR80PhMIKCPEbomtz+1SdWd4U~@Z(2W{0H1lY zx58%LYe)Q>1@yuaADZ@7uFOOJ^qbmG2cT&hhgQhVL!|VZ=})&`3E=Rl?45^{=r_He z&H&fE`KKau9)h3WY<_zEO8Ra3$C*`-m^vnYK$V!KI%Qnl^NFA#b#?r#Dm6=8%7nU? zqo6Q#PW-qkIZI8-s}avlL0{^w_+?dkmWGtc5ie3fJnD#ev?@_qmBBctXS$#!b$R@Z zDpgsn!33w5u^=~fM*Ns6S=m#AS5=CG?s)y3a;`15 z=QV6Wb(HWOl+Z1dNPv={vXZbP7Ikb1b#4hw-YwYeiNdlsL1xI> zp{Qx)hApiqAyrfY%aFlFw$Cy^{zY}EDicJ8%r^3U-UGK^6sU;_JVQ4(av^DD2mC;) zjs&S8tBpdRl>l35QF^MR1dbu2jhw^f0J|PhYpR9>@ga+ig2VSGw!xyZR7D8_L#7*f zhwo18&PBmel^{1{v+=(!fcW2bI{ZU8fw&gKsmy}i6s;uvmvADQ^a(S;?uh(lAgo{a zO^%b^EV~fFsVMY+Ljdvr%hP)stEFUd#NGY6P+sn<@egodDhFV!N4wBc?&tCEw{cp^ z7DxBo?+HE2eK)=j_ohnV$9jAhI?Mev{`40l@(TRG|MB$xyPjTx+DH?Ynx?q{AQ-jeTJY6on()-L z%?$xqsO7B%U2UQXM@`Gz;78ZHE!`F}wS^`EH63%qAKkvS{ItNTeGJ)^MzH~ESAv#E z3zpiHH=J&*Vnft!2`xhwB(*VbSlyb%26J6?S}H6=YIEN3y0wc9=eoUW`S4FaFp_ts zl=rPY@0)er_ka0;!!qrwGjH!^+A+Os<$c*s`?5{?Wyd9+R%V{||9E=;T~DugBhA}{ zy`g&~&#K>zdwO;>TD+~>djogFx_1+vUeFJFTd+5AkK$R)yI1?3P}_R@eD6J+5gXo3 z?tA^6a_&FOMt%`SOOW_c|S{_+FUyp64Un_IUOnc)7q-F@kv`}}wJ6~eu##JvUJ z47XA&#(idkIVtD)G9+GGO&4oEi^21<;Q4#N4!4Rg=6&Y-ZW5ID{2iDfTkkJE`z-U_ zI;iOR3Q&k!uP#P?X8CS#mL0MT@z_?q#mdhj@D|Mvc@I$HR)NK=&ph96p5=zTdttZI z>b2PMS?ashSz*WuFp66l7Lz`6d^bA#zv1b9-RH6+>Ps!9lV71L0xDIs%WkW$xs*qK zyRKB_^Vj{mI{>nmvdXX56|a2u8ne55>>DT*lK(^kM)}nfqR!nSn4H~l-`i4t`CSvz&VTuV`K>ptvbIqVnA;jPHwYyTfl@4xHmh5K&_5El2Y`{Z@M zTK)h{kn*K5kI(HsOWmKBzr#7W4Dil-_k5mpzgyn-yxLK@^z!rP?>=YUzm|W)b+{O4 z&wGSEQQes3wf)QYpGb|-eNOZl?%r5Fgky0jz@PV^e%$?fd3XQH{R*j<1)sru-2HX= z^q+p2?n-3c|H}_tQq%dgrmNenb41MQWt-LTU8~7&@A?Sdfgkukp5A}g z(@W433ES(Y`2n|&VqbHE_9-EjZ#Jag|K$fp6|Pqoe%LKsW12kXo%~Ka z`AvHA$0dPdW`Xbj@$~+?o?h_-nx6^hLvYrw22A&U$AQJqy7M;=X?p8cCcM7fKal!a za6SQ7{u-cm@BcUm`uY6){X>S{hLy=LU#=cNqWZiaj{a2u@!n55Q2SYSKK+|Av{r6{ z;fvk@$IrC$Q8)rV1*Z4@@H4jI zXKuq;WK!_!j^L&H!Sg?YSFWBuj@hf)-e8b>FrLZPMj!4&fys#ZL6 z9FMSeg=fVfQ%pOQkRrvg3aeM>C=Qxp*`Wdh3QkDa3x(d|P(emY$}4!-I7(q9{f)K( zg3Odu@p!5@4q;9GowmV(Oxcv$ctYJ;RN(`I*@ooenx+{i)wUO;DQzw?z6~u=zR!pI0KBG?mO;ToDt$a%e8*dqm71C$E>ex9G-bN#j=v~7HBCa?kQzy8%=D8xz97J()`_c7 z6DiG^uDx?llp~ksRosVv`hgM5!llfT_RQDUnPva-1Bay$SErEgrVy2k#Mh1_=8q)w zj3k9|#+Py?{-5*oQgB3*48^Pu_@v%&$>-IjuZ%Vts$QRk7L-Rmzb=Dww8&7-`nXT# z4Yz#03Ht45zoD-6WuL+uUiktO3>4A$LlNs}pOnr!mc0D*SIr|06nR==u74$mDn}3+yvojfM)+djDZ^z#VB`ditbj zwV|^0X^7~!OY_q+KnZdvZGH4GJ-}6(uaF*Ek3%i%i;&pylolvta1i=k#29el0x9-| z3n%~Vh5kb#di|)`%Hlb+L=&VSTTE#Y#y6O0_p*r$jDlqC)E20^!8dlFng|wDAw5jB z6y`D5ZnxA#2T>=AcA6#B=fUrGXF^vnLYG*C@XCa+u_)twD3frrqcyVQxw2zjvJB(mckWG5kSMJrsfBO-UeX+$kB0mcy_6-$Rnbl_-AgD;clJ#3(QVI~|X8siq& z_Jr>t0n~-5cMxyPTj1Nfeh&xOTbO-^tBp|$EPFy=Vvm)<6gmhrX2EAn>^pW)+;hx( z2ZqKZh@^>pN1nxoU|u-LH5M%h?1_KJIg9&+Az8&eR1UC*u0N?>B*(DPD%YVg{7n%Q zlIulP4vVZ(9cl;Mmc}n6n~ZcG_FI)Ww1mI7tA!MkQQO1#tH?t|SSVkHj6#%>bt!JZrLsNYi1rRk1_!0FNF*Yl?=b`C*z>fKq8U%hl5sS4y^;cdaeQ+Baf}>%b~%^o!~37piZ=Se9>Xh6js$p1smF7_Arn@o6QXm@hgakhi~97|D-T|uP@VHWB$P|C=@VGbI(P{xdv1`RC$98) zt#=$O0ZM`Y;nm(GfPt(h9Son4oOAuY5}F8nkM)Lw`4gIRzTbqQNr3EFFFKe!p*ZLH zP4FiXC>-m(2P-EG=K{Zz)a6-OiHTxjSd|T#sZ#RQ6`rsf5>>~DDw{LYr4)|HJF*HB z<;3tRn=sR)6pScrvicHr#Yih#Gc%+Vamtgj;t@r}Fe@9BQX1rQDu9HYs60kk*{qb- zps-3Fyy`?5G2F^GOQ{VCsubW8Ow<-5sccnBZ%}kc9=@tX2{G)-Mx|8Hj#p@9H7BZz zxvp$cN;h4&Bk#{DNmLNSuWVXM108mSV^%1i#Ks3Ao_4Cl)TqyR%*=%8TI}Fo8T`!Ggjb>ph}pF){ zIkot5uI**{MugfyxO{ZD@<_O1Rk-R-xI%Wg%0jqOXSmvlvV1s#^%@b8kk6wV>a@&+ zBx=!R148RJz__fD&#X)09NjV?u`Ue~WpztteiGB@ngOwONgq_F#xk=f$^GbO12XHf zhmQi(rJ3nT^r9;VMAjt^!vZvVn5{{?qB{np)@2SKpQr~j%aYhcHw=icOC6$4G(a#* z5*pn*ASZk=Cs|vWojomCW7N^nR~VU-3idhn*U2uU{*HmdSUD-<%D35DlFdfl9q$R_ z~Y{9rWL@nQ1?vt(Xna`w1nl~H>~9{{SP@~ULAzf5)-^>uvEe90`OR@sET zCi&*5tK;2fY_qgll{f64lJAZNI)*e~TugRXzRsSPtTTGs(XSb~nCh<5&c2lFF?!E2 zs2OW9Wl#AY`?F-LQBTMF%{Yr`dn(`A&yqt%A3BEmUXVzpRVHMQN>&=R+w}HDNTkxL zB(e`DJB<2l20#WbC0|*Wy)xNo)Me8jLT_pLDiiG6$$p~`HiIGMmTala&z_a6HR`nK z3$eCTOO<-|`DC}zyPJWKV@p|9_GE_;{iw(0JqWI)EvxLaL$-Z1Wb+|0i%;sm%8D09 zQ)x%jE^(z2bEW;Otmu+T?vh5hn@Yc%c9AMIS=mu}X!GI`(P17^du&JoLL%(?bMrry+*kuRH9k2p@_AimA?C-qMi0^*oN z8QEZgC{HyQttK_r1OSmi14&77x-H_M+I%vDnx>i}OP z@2S#U`A36q)z}d9B$~^1RTL}FHF#A`Zmji`Y%bSTsjd92!RKm1W3{Iwb2%Rs@0LRr zq?+DX4`3X5AC!BREdtgb6XTOK3~%3+Pm6_4f$`>U*YiB!vnR1Y^@T_aulUuDH~4YPC| ziFB<8>3T?Gbp<>FA~GYKDin0r1@DGSYSNV@8gW#m&2mA0CQ?$Xplrg3qACuahr*D4 z(X=Y7HxjSPo8|j>9pWxp@5=U#u2x0OvVg-e93bOmg+>BZS+hJJ#URk4^}Ou85kplH zyd^~-!J-*b_QFW6s%Tc=qc}uXw0@P5OyTY-``b(67NqN{a#RBFZ`au0Rg$0}Q&+9B zQe=v1SKI%#Bz{50gsO9;-;~6zrN5`-)q<=Ewe3p$DdeuAzg_obt8{)KX34bl}xh zT1@fnn)thQ6THjxRO_genxfm)^>^;Zf0wbZdcQJgN@myE->duTyR3b+AC)*$Si1_x zwt<&r(&<&NR;o?0>>3>33A`ecNw1bv$uUK;t8wfYhzGcJRlQ2*DUn^XWA{Kp;H#@m zR#Hsi@2VWz2jT)yT~(mcbc$#9=CNxa0T9&H8Y;!7Xm)juZwKN7GF{cH^8S?6uGO(; z;8kFxt9_{yqOQdKtE@;p#rtYnns17kZ(8`j%8KkB)7L*w@qeC{rJG_Ra8XwC*Jdcb zIuo^nIVJ)qdc3S|QL)}k<<9G4Dxjbz%Iet^3(REgyaeYLH^d}#SBkx6I(C+h>40;d z^g>Urm|-SqXBZj;To8oN?Jc&MY1o-RrU8<9;zPaAV!4^3oylVgK$j={*8Ni)I@7ze za?Aj%@+6HuR!3r?m>gDZLw2gPe2xAmju55J5!E(lr%Njw?Q?V#7Rt%t)izdKMUwq|EYE8^-Sb;J{j$YIttsGu~;=ju;))D$Yu5!N=VpfxJ2?lX4e7Rt!s z*1lOmZB$U*KkEp&vm8lns|tFfB9}fUgpIARN-a+n|hNGXy})gSMuDpZyu zG=A$gtw>=`pSB}ZD08^Rjc-!}m%D%5@wQM)j>Nd-ZF-R+vp!x&a-p~!wsFJTR6ySD zuXQvLs>u->H@{8SQn=XX?g%&D9KLar+cdz|?%#8Sqi&AOxb9@7~=e4^bKe#P+`iI9-rBRKrp6N;#1myHVnJv$68z4p2y z&e<*F5`fEo+%;lp&o5${T{A8Qd~8(L=(4@1$o=eR<1!y)zdm{}B5hAEqL*DcE&>GX zum__(_SPa^*&X9jfV_TuIudLzD`Jz~FfI;^Yt-rJx&1?t(CprEx#SD1h!}bMWCSa6 zRNgoF(i23rylXP{6XdRZVDd#rM2`IJWTYcs)+VA$-ZL3z6L~8CQ2zocB0}Cy zA3=&7l=soUl#VEuchSdAM{dbK(7$Mm$dGr^M;asNBJ)rY?vg z6677G5TeLe@_tj7S`l^fZd2H;$j|aYQy2Xa1@g{QNPpxz`TJ8?$B5_hUQ;;7$Y1iI zf)}nJP<^(7h$~1;pSR$pctly>9YO4PT>yZN#oce(DQsyy%X|>$}~EbVn}r-D||!Lp*R#`d?pKys@Oo6!3)PVluy*W@3` zBka8|&?2Jx?7R`Q$l*R8?@RfJ%03rw?0n>Q-vjT9mWZrACvT)Ba=!1bH`X$uqtC+| zXBqjUFXZ5YG$N_b;Q%3xob2;ExYUDa=yN;3?m>R(3p%(Mj40}JK0pQ|SNiTBV4Wj+ z`@9Zt&XIo>5blcbh|AVNvpc0VjV_Y9YhEYI%hkbDIK6J#UAzKvbCSHASLoYLElrDy zwC=jsDf04OVLmv0Z8}}N%z;3BcRMmwoRE*~b->1ET_A|5`SSqIgt?N|T^m>tMPx~IZR340aPTNgi7m<64@Jh|LLi0OiHN9LU+ta*9 z_AD1BKd1SoPm2VgYbSY@^A7Fl)X}uGNVlg8N83CY1f77FX%;_d7RF{4TW%JK1;W7ZB0E#eD#dwk!o2Sq)9`QG76%hiRbJr+oEgoljDIux}C zEM)ERd>1>540-v&VWov(Aqj+iB4-i5#vVHKw#Y3M?FoDrKa2YH^7jU@H*S|Q{C?wR zrE3kbZ5w)Xbs1Z_@)KlbY7Lif3wu*_Xdn$+0L=a?;+ZtV3ES-6BwZTIj-Gfx zkR8(5zU?j2Wwz|@NeIZ;;aA(_-uPWA@Bzc^NVgc`+cxp$>AJb>>PgU%X)#>4echX; zOK15u9Q!hshCH_Kc}sO!EqlUsFKcP|^R^)2_T|J)&cqLtgxz8#%Q%XENlO?oydvr6xq)Hw`ZNiINeO*~(<_HF2#2L>JAkHnzK zkX2dVqRz=>3ZStjoK5^%edycUxw6av_|+u6K8{V2!eq;02{kzCeH0 zrq*HksW5akXl)7``b;-@4l_=erzDaYKaLNuw zE~=G$ul|lri^ICp>rm{VTPgg~cYjmru;7$G*z^U>O2L=@ADcmk&rfB8ZC)^}6v2$X ziF1fLWjfb?NGX@k(4Vxac35^Q1T7F+xk4D(H#rW|PPrgtP7SEh{>e?}!Ayv@(wjsKheDx` zb{6z#fK%2^z}JeNy%d`t3=o<`jmw08*;LxlaF0?ittr@P!gtZ zP{nFY{`B(A2v^0sC6W3@Rcy25A1~jH2viIyc|4_mhgFn3_p(mJZAHJ5h$+K6Y^~(r zIf}Ta7*v9qGT34DCx_Q^gs0;DlBg-89kyfgpO-@-9x8^~JrdNXWW7Qjd08pK4()9h zE@()}7EeBO*&)IQ9bgv*h)Py%@`}qw5iV$dyGUSCvW=5N?kwT~I@s=Uqy8;cUh>S# zS`kiYU%QA#!&_{%s1FnYQ@0Or;s;rLV&K+>Q}jO^>a_gq~#ITZ>3 z7gS@B8{M~_LxdAkO@S1iswQ%}oAJ4pa7wBfaJ5q%M4okDeXd;f-o%9O0X0>0WOw)7 z=TEDWOrU&hAE*W*SGq}_KdDMEF)e*yL{$6^G~iQFHnP+zTn& zqZPY8;st-ypQ?frVB%dh;(Qgo=iHG=2I?H_DSB$$`38E<+=wJ2bDI{t)@*nBh6h{~s@NiJ201#5Xo}N>2jDZmkXL1T) z8|AC(*%e0tnIwl{3cwZRL-pK>V-1W^oZ~6Z{oa`>eLtI6kE>Uk8$;fyyqk5UNLuH`F_T02FE8PIc(r9jl! z@^yivEk?|Uo)eM6p+=eibo7N&l$c>Uhh~bsnrOc1sH;<~m~lGiPztpgY5tSZ=T4Dm z11JZ73K)6h8;&|VA<#xp&axCBM$6Y6wReg}8_saJr2t=9zQw4!QykiOhI1!Hh&Y8P zGKnkl11+&yY1h-1hiW+wpH}Coq4J(Ky-+K7@wD#WqS@>051;7qF}){Ohv#*U-q|Sf zeI_H2^Zlly!OGeP*y?}a3-oPl;2Fh2nNnrlHyLx@z>?qSlxvzGUp!|Dg z^|-v=QOb?t!)L()Kt!fqkvBQYuu%qhI)bm>E2w|W8yTh9C;^BZfy?)y>g{=7M_D#1 z4z;ydIg=>+B3B-I>q)0&nrq!JOw#WwUJ>(#N@rzS4zoHWiT0(f@Oc|aXJlFo-(O4e z>1$k(^R|@!m}w=zN|Qv|_ip8Zw{Byqxw*i7@Q&4&zarvo3TRxG<*eYfsV{kj$J?+m z-Q1%5K6n%At6h-+L#%9bD|c4#a?^)c;qcaPOq(-zzYpG5`pQ-$yv-W3<}3k5J_%Ha zRs_6_8#CrC0Np(aDB)KWysa8P&RH?DQY78%3tPFruM?CiXAUlENveIhE5iFGfaGPF z&8nTm*_XJ&y>AedE@uG_Y)KA%H7n9!;*~9DWyva-MAH|&!oIH;l-6Pn?rllNeI+a6 z`_Q1Q7E928Ns{c#SmEC{3d(4)0Oz-)fWGDx`F+cvk1bX`FU&b!=oP$x+P`3}5#c&B> z>`R}u0B{%=P|gn+FPH3#pEbRF+{O(o@&f_O&HM6aZGa=jrI^4npuJqUFM8GpxDVXz z304Ch%k}%RXRQF`!1X#oalmT1VqfyC8PFNH|44W}@Ors@Uy=Pyg3i;theiopPm^D$ zd$Yew(0iJnXEe&?l%pL~rfO#*B02waXRo$N*o}k~CzihP66_or^Jv9F}Jss}6 zdqz=QPm-Ujd*#0ccIW&gBQXC?_ErzdhXG-8o`DfqbSFEj`{joN2Xj8o2#mCogVkT< zzZunW$`dmJQsiWNb)Woqqk2yHXd~b`PWD$1$qxeu$2?!7CN7I)clCgL_^AFy{-F^# zvm}SAzqb2LM29Z#mQgs@<7AtDPrJ7wdUW|QMm=1%$zJ_|b}$j$w7h3V1zh^cPW`@i z;UfBJ`GZEQTt3M`{V(m_RO^`L@fm&K(nz-J_qKait!J8FY6QB#$$tI8c46SMndfQ* z;62H1{r-0FYW?Z_ZKGqZkmOhWp*QqB-~BaK{H=p0vx67*fG6Pr?_XoZ=R6;t^Zr{j ztD~%**VRw3f&{L*(% z@YZN7o73IpIY~P2zqayeUoEIqPB)upBx$Xm6r5SrgUVWT7kKuPPWo@I83+Dz*|;4J{(Wms4|Hcq$s%?5k;c>0o?xG*3JuLJ-%6tjL@2`4TQa0bx8 z_E?gwKT<-2i{4~Ess=nbl%;+}i6ky#lmDm=I2lV8^!G|AaPUpGqbh)hLn-KgED^+| zZ1Nt}{)D_LY198&!h(wf&!8GWi$jI#x0fj5K5hyg)&EqzEcrEd*O9nZ1^S#n@`Hg! z0sEw$BX_L<)R`ag!APSpe^SJeuJ#$!obEsLBm0E)3ms3U)^5!9s&F<}I(VUseBOto52hq7q!=U?DA8SE%uYYFuz zi<>Y8Zm&r~$7{99Gu8k%ZNN}KHVJWLtJMYO(HIFMhC;+7ha+X})0r1;QQ(KAKy%XG zQMA?+NXcR)j57*{CaE1sYoE+KcZ;kuFe~7nG;-vvHJovFL)00W6_!m(I5N~~&e*#} zgP*Jdw@H6T*;R7(& z)JE<2iBLT63AB{y3%N5K-8pjyY+|3umS=s@axO%V&Cu8}E)DfPrhOrMcjz6r9FJ z{*g$qX=|pXWd#zLLN=0*c!CW9JI|ux(aH{M>_-O>^uu*d){nPwawt^Kn zhvR5AqL0|Y&Ni*h-0D*W&UmBbNc<=CRaToNxQ^o_H!_a+e;NTQpT*Ztd$@p&<|Fx^ zmajgxS@rswbN)3}MApa@9yB4NoAL(!9xG-v<8# zE!D%^pTd_7fa_QMaa4QD;jreX^kqw^GMM#_3T_!6mi!dIYyz0S;;*9~TLFj7Kjkmm zekp+p^q(aXkPk6stIk6LYc9M=Doy=?uZ3^u@{id$BP6+a~}n*ju{_>a-o zTdxn>e=4%QiT|SZ;-N$W?Nh`Hh&S82_)#^xJc&_SCxkB~m@O3-pQaZe(O_6g!S#4Go$?kJaCk_6b%BfKF&xiDR9(F+3! z6s;k`8RC~4t~*v_hm!z`YeX>QRqh+?7snT366v&>2z!W6?mO(Lqa9jehSm+?4++T) z!(!K8_)0XWjtkU`*f_h%szNz|R@`6v|1FZ(auE*Q< zUDc?GU8%$btqa1hC)hTu3On_}RRXkC5NIuCj>KXReSn)Ru zeI|whcAq}sKEq#QMH~7LHVm=f=(E2uytzaFMG5kvtA}6->GfI4l~FjBzBgv6hj=N^ zs~?nrgoo+ZVh(z4EaiChfnJYrIsIhJRu9=yf!9ET+nn$&{YlJu&$XpbKR$!@jc_*o zNX%Lf=~DiWe$f07UZCHLIqA8%l>4I(6f%U{=)cD7^-wGo{unrQ11AmoKL)ScKN5{k zn|k&fKpoTihVI#`izcVdJhKI?#k7r~TlNsq#I$LEHx#c)n;v4c*Ah)hn+4QC@q@Ip zp{w@FAON4@drmDLoz^{c*ZwJBAkOgFeh?o>TNxs;e^QfRI$iqQNW3I%e2Cs&6Ce?1 zOKm5_x6+P=2<;!|GTK9>*&XXGJjdksKHoN=|S69?DbA#!`wn#Aep?dSgD;OIKU zY_AP~iL=|b;Le$LIYh9kpl6vo!K3i5s8X zbU3OfG`Uu$JYnq;A&#TBC##2;u$AdfIJ(4$PtZFc>N!j(%brfWaETHhPq){sw>J?j zGo5gCi4~trcNnVwZ`No+r1eD6Xs+lwT2hnJZqpWalN@%_>UOzDC3@0sRb=89h;y7V1i*84~t3xXiDh-IKH6# zhML^xE8U^>rLz-ETjhQuO&;=<%+R>f-U&+ZHaQsV4kq=`iqgpm20$?w4)%CesQ~?0 zIx<1CRdO`+)BUnC6xv?;b%JH9;%G$6niEYq9l7%mKrPa;=77rptv_A7BL=_$Sy>Ci z)(&XV>9id_eGJd0HX~?<>6#tsWAl(~`LF-Y8m-55 zj>C1dz;(vn)w)K);h@esy6(k5-Sd(<`>i^g43Hz$**4cXocmkDCD8Fq(^UYw>Bv$| zF{`?r3u2XqR~-sYAFH)z9ky$ZrO#Uch11chT5#5Qy9E69X##aVr?1r>vjN-9$MWZG z0Ltm8Sj{r4y0_Vd|j!*8Hbv3$!vTp(XE_b~ zI)sakrL7G5gOoWdX!zxSvqt+LM#bMcWimTuVQex9Y_d_gGJhErZDnJZWU`lJ-%!eY zQT~@v@gK9{?2Ow|o!@NZ&OAA&q$JKx@8JFYnj7cmnccNP#5KFKbnFLyVCM;Tl>*)a ztt_7058l{0e+RJEl4NI?mSX*S8<*yZcU1xsz~6B^Fl084&C>yl_6OP7tfgVUwZ?=0 zW{vhgjEXk|w!8)QNXpmM%eQ&TH~%s!mhZ@vZv~g{5xTEGqG<$1#ed9(mM#^D$qARW z+7p>TrdBOWhl=RQ@vT+Ali)!4R!d8dinz(it+k^Q!oX{-%3!h^0ltJ*$xa}FY^}Nr zjvg_R6AWvJ6OKU2)~A3w93?rPv8s7uA1K;ty5Q;&D><35HgxjetkM3rQIR6Bv^S`Q zGcboUsJbu^^|w*6ZY{8UEvStq@Y7BCWnfhN$8303b}12R2BOLZpsG2PJXKxEPt=RbZMIdnLyxs?88{yJOn>wmLG`yWQd#TtdRgSN%!w&j5~e97NN#o4x{ z=C-x-&_%eyVLUJ@f|~R{X2Y55Zejk)=g7xjgxBx+k~dwq2y<6HL8^WcU8g!E|9SmY zSg7(J)=EM`wD)e2hhKjjW`p@|ts*2sOBF-jbKN$~3v+7yNJu#K-ZS!o>-u3%m_uub zkZ3B^AUS|@gau(P{+l)0|1c^l{Z459`^`tJgnFzu)scjM85ON>YAq64F5XlIxE-Z` z85RFA8&1i9-3i(3yPZyQn_iGWOK;!xCu@E;-^pw<0_elC+my#-pmNhm@a=a`9Vscs zyX0i>cb%PgzJ2yIkdk4fj3w)Rx711et;nd7FprDu}->ggMdven@I`O%I^;T zn>E`1Fe+ZZ&)|KZh2#^h`X@%7PxOBo6+bb_d}0Xx#6oC8+j09HFe?6EF&hGF(W6u% zj_{|}da1WK;M~^gsU!vAPS(&=@&Y)WH6)eTKHSvWD3#0}E^V!qO1c^zWNn#Bu?oLo zt!zR>9sa~x*W?y8oZb4V3CV|WJ8M%D@(*w->nA3}M&X9mh9+c2aB*u*6Vi!rKWhsU ziU~NG_2VfbiEvG8{i$0LaDHozDU!NyH*2#g@;W$^wdxeHf4GIU@f4XqT;5uHiu5@A zm9^Cr#WDQaqLLI5dHCZ+9jRO7aJEG?DU#T5+eH&8@>n?KqKXu;R=ED6ffSh*Ty*i7 z6zOod&!V{$#W0+7@lgYjK)A-DUc)T`IPao*14((f%ObRayd2K32x%a84>wyhY9Mom z%Pwj)knVGWWtwinp9)9)Sr|Wh_N>t7|a6++9H{8~hXoA1M z32xngO9T-LzqzO!NW>hjx~Lm?iy6+j_%x6tJKSN>G>|+SPP6zVkk~TZc+oJB%n~lS zs2NDQ5FW5-5lFEBr&xS^N~933y{LbBO93vpsBuct7VfcVc1qp`XIWG|B@PX@S~NZ- z3xz8#YM+w+3V*$5bxOgmM6CNDiI!dYsjf&8W4;o%E>9ADzOs|9OcJx55}htb5}lp0 zsjfs4(~6R`u0RsQigJ*yLJ|v=(hc4F2DDVlPjrP17?YLQb-4}bla=jsr45)3m8f*t z4d@J&4Rys0n8uaFb@>e##+Cha&`di@vRDB$!;W$YRsqdoL!^5B!JT)GU97*EblqnrR#Ul~ z5DzoRyU#@TS%tbfKFoaiKFbX*mD~64eWGPjx{1B-OUtCJiWT-{%u?dSa{JO}DLY`L zeVHwkXt3ud(f5LL{Vqk3BX)bnNg{xY z8at}ul+)Px-vHdD`x!$^GMUQ}P>7HRMO2shOS@)<20t`x2`N1mh$jFiwa~ zSJBM1*F7kDf)fFIgIHiG%JtVhFM5m<-n{1*+oWQV>#loJq>2;Wq&kWPVNq_V?jK;u zBt(CYEH+%_ajp&ayQ7Mj2t5@dwnxP_*9&{<_()7R{hnrQfr@^v6ZX&%A|{$nH53aD zeYru{3ov^Ug5Kkg{h*?eYlq!;e1aB%QkBI{sJP_%VShS4Mhnl}bBnE0G0Szs9y_X{ zMM2gPd#nZ6Acy@#smc@SuxD&z&k=!L4*GQ@IO zRrwx7=#lQdZtR&(u<*U`<&j|mVk5{}&H?t_`g33ICPv^Yf=uRY zVG-;0zPwFLKtBXI$vMY{t=k-O1vAP=WH$gSU2Q~R_t+BMkHJ7AV8x^yL9BHjEZz9=8n#Gq z#g+ETm8pNZL;w0m!XfvdNvqyX(KG^-i)}S3^QS~yrR%PmMS?c5txIJscu>pN5zIz_ z`mn88W!aR3t8Cph&~@tYw+*RmolU6w+W7KgOYC#xOP=JO!;izIKB&7y*=RD ztSVqCWcwPBAijOo0|-e~9#a9^H;*a7OGM8v>(^DU1Fr(wJ&|?{Ck9Muzb^-p0L>u@ z_+Nz?!*6^)3?!6e%O)O)aln9O?f30Kayd?5Bu1=Z4)AB+F9Hbw8lOloh6WRj@BWSt zByM?VNg{|y!3^M6zV8R#024UkiWp-|34Z+hW*}J$2hbNICNW$1qwhZhuK|ue5%^Zb zWZ;LsuLhE~urH8!AnGx*_?_>^fj3*&7Kry^0x-?^`R}`d6fK;4Ng^C~ezH&+e#Em3Y2v9r4Z+$;HC49-&M*KAf^i1)y-*-;QUvjpQ zeno&{DgONX!v_xsW*@x{YX5=8{4j^fw8ADrF*qdwyH7|<2PPk!Gz zCA;7N%4Gy7hvHAZpG$==NxeywdN(E&RwD&JX!tF<;q5>JtVHT}ar0iXxi0>>9;UhO z`@7$WPJUdW_(2r+<0i03-T~kcm|{2h(E34hs&PT}iyqWJyT5+h`#}NPVU)kg(gt(sCgB2z`+fn+@Vv&J&pKIM%Fn9BVeA>FrJ>i5{9DA^+tRJe1*bi;uM znysIbDk4gSJx4_M9Z);7p(w>8(pC6#By{0L8emsNNfr^V!j>b9ee0+$#+FXWAMrtj zH%A;B?x=xgo1tWih*jat5e2`x)P32SDCHxvRRnV+!EYmtL$;rk*CO6@u|5|PeoL!< zi!GdzEh4^)>$#Y4IITtuTMs2=L}b^)=OV)IQq@73ky11wt&8uugfKi+1GE<@Nh98M zJ$No$_0~ik)D&kcUDO29U+-1a2UcGE5yZBS%O$oM?8 zOzq9vh?vs?&9#K)&-2U7-hz#BbK0P)mH_|UxqJuot77D|KsPO+@blO*-9BGXteiF| zqa~z#9$2Q@=LtfzXo2=wLjC92Wu|?Bptu(8KZTf2^&V=9Jk;=hs7;cmrk?kVCr|yV z9-H4NtLEqfx6%6+cN3T+{}y6`y4gQsO536;oRqVi_?vV!(3aBIFDk}~0W5o1`cqJk z()TH9#K}1;)cyuKq&d|38b$fwg-yB^27L+&Q2H)KwKy3-T7NU61{zQLW<_N<34m4) z1H9@SfBlf6R-A&fqTg?zaGFD|uUeD~-tMIQU@}iZiAmp~s0JquXz6d7)Ie)V-?*p* zC%!2ISm#ecO-VnXs2L}}sqm)|^WhU+v2Go{Ze2Ncod@i?BKbNzH@Fa^++iZz(be2= zZ*H}qdpUmzG5--$Mlox~ed--uTK{o)9pJnpv!8)l&FI+r#^Ei%?~cya1U;J3gY~n+ zs{q&?VfhRcXGRCsR{%4Ky*0{G6EtN;x7Lpi2?3Hja^V@M#*EIc?;Mf?26yy=Cg{S9 zp08gX68vNZD*I=k{4(0RzH~?ooGMWYnxO46y0(6Bc;n{-@Phgb)LTX;*S8MIesTaP zwkGJajGnBY|0%>w6nioz_P9n&^#H9DjaC^zKPnMJibD&@X7c!F3Ycc{@9$tE{uW~X zBc`+$6Ah;uh_USvrA&W>MgB9YiS;Dl5RkRsiv?*_5dRhM#V*VqhoWgF? z`t!-gGW{#JuTGrm+rH<|Ba6ry20?vw&D1oYUkS*@WsQJjzB+oU8{87Pn`117K@?wI zGBv(U@6X>HYcT?{_v(zPp>1k^-e$!7FbLbLo2TZtnf(QufF8q%DXZ0 z!{7s>x^QZ2o9>t|BvyU|mqf8*)LfODX^cTK{-0ABTn-@QE!K@TU2* z1zy0%xS?cDd{-tQthsL<@9q=O&^#xmx*#-zhUrK4-4;Xcxz zgBbCD2{Hc>Q%122#eM7DUpoD9aUJNVB0mmle=FP{JKear70RI){c&jI+uHuY>Dk3q z027I@8WjANvOjRTazPTx-X3K&RPk+cf9v$A_0!_TmAm*>COdtC}(>#;7@)# z**`zMyde0+`Z@vtC%?t*_nt0Y5dV7kItmabzm4p#ogQ4=0Aj1i_Cc#}75kH?TNh-% zI9^A$4}s6f{gc!4KZTfya@}Kco&T{`lv@Ddhwy!&^iLhfPi86TmH`tRt0uo7Ev;Q(vhH2w#-Pq&MG&b=?0} z>8S$9gp{$QoNp65xWA!2Apk{4IZR6PHoAlTTeatt1|DO55&c)_}t z^j|_uC6Xj1(wP5TD=K}tZXtACzw)}7=XK-XV4SRf3o-u@Q+8qTv|goBT8x5Pw>hH{ zyZZ3=yiih_nF7PN9inQwrtyqk(|eUQ zXqgMT-*n#VJHRWxYN34-tcD0o*V{?3o0z-Mv-*|)W$ z3cJSebU#W1wd4fBIUp*fYXDF60~M&*BCv4VBdWe@7SHsfJW#tu@J}Hox84JOk^fvP zUe%@a!`{}!-gU#?vA7eJ9r3pi6WqxD5mVacRgFqHwTLN$fm8yAhJIf0sF+ie*yD8W zp#*ykpS;FVIj1(X5|oQSfm%Z&FMm|TsS*7M%3YRVq~VfRJ1XPUidF_|sssrQv%IoV z38!ZC;~8$CPSOa;YaLZ^YWG!=;bKZ4*HF#N9Tnba@O>o1ot2=a;gDA|D!tL-s|==B z2?83%c_pLb8%@5Co4Dr_+%*F7nn&d~+Wr(`=BYeIcm3yD@%lr}QTE3o>>AbVs^08e zL3b1W5@P-%rc`I*{(!v-#BZpF`U$+;NlEHF?6nDyrzLs%qr7xUF<>uTlklVu^+LazS2`(EU4Xql zLA9@BS%07RMiNZ@etxB%3ODMWeiSczQUZ|AqV*u$B}w}Iyi`e1>g@T|dQXZ`2Kp#o z@uYNh{`@*U)#4JI{w6P3Qn)%>eig|1P-6P&y!=TY)Oqu3M zWdB3EYLO>tC;&&|6-`R(=d-I5QB5lu)L-Q#O?ub=z^)1eiYPw)54^ld$^ATbwbc;Q zl2ZK%UWOzDSU}fQKbc0k>eungCS~;t*wt67PL}}7J@3t=u>SiimEJ1SC`SEQUe2UM zpwmTrL!?VG^@n+BlA`bzAOOXl=re| z&$Xfw_MV0C-)hA-QH8AC##h-59#Rf;DV`oUtXBV6t()%L)PvTnk%_ z!8|ot8+72K_YJ|1jxkuACR_D;tiI+yg)}ERgA*{7;ag* zmS%;$jwmV(Hwe&cCFz<&<*PbAs7BnJGqZR_y7o{7wGJuj9j*hA*ovUf_{%@&XrS_O zqt0}-rBE&Y3L_m}R5Gp~1f?jbW?A`!jti<5H{;AyTMpGOtB}xPKp}8FfYVky^USTh zPR9&YhMNG?-7+ARtMJ#6MP=cJ0k*9Kc;d=I&l=T=TX1HntpMt`3UZyBs4yI6^R{1+ z%rmC)SRGYVE)EMOHKj6IOch!>oTx-xA4p_TGMZWC!#WPA8r<|IqhGmh-=6w0CP5`PIH^0g3SJ9+B zU%{+Hfr8^YH}4!31wWH7&(_gK72?J=>5fW+wd5--bp%lK~%6=yBhMBWUe!jL3d&#QE zb%g}>2r0yMH463|DaA#g4%0)5ab4?&c_ZbDuJFLrks?J`Q7~tuOc8-I42qN}y0!@m zMk+X7p@%_`!j4zdVfILAM*=9!2r2G(Z3gC#lwZFh1Jgo^u3v3}xg%xQ34&pkNXhkU zKVhLrMcONbFlB2Y+NeT|6leJ7Lfj!LB zS|at@DlEua!Q=`x?1{Co$<+@qJ8NkZ0wb8AwYbT(37DU?{L~c*n5MPp)YUqeo3-o| zfj`W`T5{^zG3=GKqSO^~*yBYZsjIOt+eIlU0xg*SqL|dRVVKXNT*DOsn8u<=!_{(_ z%c4vJfji7>QKI46E-YkG;rA=#L`qjlzWheOw|Ir(I_p*9&q@S5SCp>F2>nLPXMOEv z!eiU(d>fCVhdpI%XbX)lVNUTuSU zEXtk|gu<*AB~P#Yg8e@yrkuIz_6bLb?RniW!MSlE%eb0A($RN zoh^04);Z6jcV@`l3hOjx%XYBG&gbaM8G;=opfHp&VPl2c5}eGd6`p)VX^$0di5{i_ zUSges>c^6iv9&GI!*}3715y(#gdO>BU?0w(ZF|J z9r~mlWi?i@C3%?flmD_VR2Aqj#`d=UCB)R)Ow!tl8Q#ns-hv5iCJ1arm2WCd`dUc( z>eu_41^61nn+nP|+P7&8m zVe@PB*>C<9V*VeCDL(>&r6Y$3WyaINJP=Scrgc1XDiG1na2iD0%ZRoDprs@D*BPdR zr68|pPU{?W0&zk{&|r(bf@nM7TRKvUkY+p?%mML5gJ}n!(+3fa47;p$W;VwT}HSZ6O= z(+Xgij{YLD85V=(AnRzJ?%Z|))Vz#WgKhSTHSN;BGdhxs+{}19_z6TG4bmNqPO&1Y z8McE}V3E`!jmdP>65-6yA1nq*NRxDDrqi&9Lx#^_Bfwy`HU4hyC?Ga+2o8&N-)Dk${Yl!PZp;pZ1{N;WRt{Rx3INbBMeW6?!ZxVhgC7UtYdYkocIY zJ>;S29vTty<|g;`yMotx=yd6}5jkKf4D`FLRP960 zN-vBEN|1)1d0eTgqM+TScq8JHJi~q-x8$mR=t}9n(T$QE!#K2vUtg1}MO8U;vUF>L48S4=n%w5AcA+Pw=hXJ!sBPk@?Xc9gRn!hY zK3GS7c+m&ciqw^28uhpSRx2V`Oh50J{Z3N$IjZdD#N(~_qp9HMK+tSDQbq$b*U3jS z!M4DgY`RxQF`>GZcr*=E#kFmwU&~k~w6{`@W`RMt_7@;rzV&|~Tb0$N<;+==ILp1A z1aha^tR5|w!kV#Jy6qT$4%wQl?qO$#nwnYZ?Mx6u)o1k%yR6k5%--0B`QLA@wCECW zrm2aZW#3K!sTA6xN5CbeW?+_TJIbHEx!R(;+}XIMWLA7T9fVYM7QN*zlQmnjWZU8X zY=Fnv zCH__`hSxc;&DLL&MYGA)u}o3ys2TN?fH7j$Yf;>Yta;zj16t<9(o4Lv}P`7u@qK}jcn}Q@+6cA%fx^K zZIS38-ENF0L?$;AJ51|PDmqNJ_so++CNZ;b_?`nwbSQ0i(9>R~CUbh2(V<*)ByEq+ zlUgP^vl~=di)#i=cS}8uWJ)r}hv^;4YKBesTsR_-&>xMxkidz*YihkQqfe9M!3k0^FsEp{8I6|boJ`1X4KrB=KtlO4wR zl{oWDWad=RqMR?YbX*qaus+}l%msaG@wJq$$dVj3Tgy6FI9q(_t04U`OK{kDE#qMR z?AwKJsC0Xl;;_})$Bf@K*Ezf?o1f0*fu~4gMu+A`fwz9M(;OPaiLDu!p>=z2(Pq=R zQg;c-=8Vpvja6@-=AgM2cLm9Iv)}pGsl7>?pUmaB3)eT8b?|R|@YZOyo2v$4V~ZK4 zY~9G4x7lzG|WY$@>G2!jf>^Ij0vd6aB-`&lOd6PI*Zv^_xF}@rsiV$9ZN%>25$w`8-~T-mNfKy!2F{Kl?#Ky%1k>#jmTd&uwd z>&)I1&8l;`yTT_8AszA?+1}dC4s$iT(kCq;nAUYmZ^35cxsqM+lctc)){O;kkLG~6 z=3V)dw&=zNjfOmpM)W{K=|E!(Z$l1mV>M7Kl9~^VTXg=dR$LDj@O~xf`B>81_T! z;r0A$0EZ@`#B>P}KO;%RECWU~u|5VTMD~ny408xj(L|z{K_SvXk{Zl5AVw4WVCIA< z21ySv7XTbhM2hLCB;q59#^3=znpgufT6v3)bO5stFw#W4nEpzVQj!wPCZI_ZyI^K2 z$xBJMFh2oQnur0@Q%USfl7U$TY-wUM%tR%bE9ore7$ByJWHG~)q}wFTm|Z}cCJw$0Cbu- z05k7NF-LlWxdiNKA_`3BcOp5GILs12P!nro#=hT@BOSpU01`EkAZFk@Nef8@W(xqR zi9Im0-^p7@_b}(T!=xUv5_79PCaiuRCU*}>#Lo5j2I{sF+2)tuIM7Hkru9ce@)1ai zYqT9iJpf`&#DeMlPW+POBW4Y-tck5Kli$f+l77XU0HigMB4*?}=>9oSkq*blkU0t2+XO5-lxO{#;a5cZY?OYRD^aS!iS@x_F#w#E-OL;i1xDM?%2Ej;k3s_!z}M;q(JT5x*SUqGC z7nM3<6p7|yQjZfs#&A*g$5bOrxfuFmy^)z*H2sKuWD6Hde;f%CR&<*uCJLETM9UMa zj!Y=J$AjocRu?hy#PJ}biteIfP)Jk}Ju222nO;PVLTnB{LmKQN>#s(v^i)c0xKap)kESqtJ$TyC+>0`o? zpB!oFV^lx zp|@;T<0Br4J-;0-)x|~-srE=j?|syj(f6^pUOXV3{;Vtj`}~;bj7#Z$luisY625*X zI3^oexK0-wYl%!*rwT?aAnVteg5wmBaqE;nW7?1v>kL0*Ly;fXX?`MpA=}qK0^IXD z=RW26(~G=N5yi%j9oid(`}*fj7wAwK#a2+^Uw7CSJvY554V6%A{@6LPv9|AX9(2(X zs-V~oV9@I{`=sYjE^2`z7(ZxxMr2#@>FwdB{cUFNN3b|IM~K?yN!kG*9~sJ#tz)a@Hbv znj?5tU2%${csVrrs#EgSK>e%UfLH4w3j41Vzdu&ow*`pmFRzysk3XJjUpoBq`QshH zfUUG2e?9fM4EPlS1`XIhmR}#YpITjd{0jI3{>RuKD}NmSar*l5wK9y=<~^4h<3r*E z!amrtauloGdmc5WJmOKp4cMV_IIHb@?$3-bh^q;wVcW{FtPbyaKQjRb5aAi@Lir8S zT8E2^@g8v$VK)q~9Ep6P!^6dtMBGof0^3)9hkUNXUBqZWj3OL|Z7L&>_By;pOgQ3A z!XwyEA=s*NG}7)1k0TSBc!qEXcB~9X+J50)XY?g*BAkcqD#sxm zzVNOyfqpCDCF~dGH*0GlE?UN0#NmXUuy2?M>lZ>iv`jI?J%mfJADFk+&xN>C8J`gs z5RSn%FfrElLcFO=gT$+Z2e2~?%-W`s%Y>1S_ygepYy}f#ZCA--!cai2G{p6R-!Pjh_IWO&PCntQh|4YZSKZM7!77%(eS%W zASIB%-PjAG!1ONaf0sVJ3*2lszJ{@2Miz~~%K{x5*{^rR9dB)NguDR7o1TL-5zgI_ zWP=j&OXYaRP(V5cr|XEZDG>4jP;YvB(i*sQN2X1=P(Ui@Aj2x@0sKY>%;r<2Ct!Tj zQEA&4BZFe6T60^qb;vWvC;ag)?=;+7wp$03bNMKWQ^uz9ZYFqA~!O_ZW^z z&*9fP-T>IQr_@76dU8@YoUJ4NTal-)6bBuM?G&x@=!h~++3X!wCrRY@swgkxIVlSx`D6HNJb{c=%`mT8@@sg&ELh&t2r}nos z03sK^pbn*Y{Z_Hl>f7FT?NiAM8up00kjR`a-2^VDBtCWK{0KcraSl#5oy#prK%K=d zLIjeQGpPH4%O#1wpLr$18`79Fr<={?ktEp9LKQ&*d6(0n8(-vTz{kU!9H9=$&l%NC zD{?gu;9)V0;DIFP^y?-UIUDe!n8zcWA++#D=6)zMWTFP{u^R)iL$FlP*#w(jaHAj4u2Apl9q8Nep5JNxoCG0#W1L+W#8 zfpO2>SFnl2<_`0nJ9N5tn1t^zc->(kj;DPZ&&VB5|3)qP@N>lA=cw(^k#j^4%eM~{ zNpggua-@Q9%f~Q3iOb~#AVbqbIpFMzv3ydID~X+5w>VVzdHYoi$QE)1v6Jg&hw?w~ zT*iQtf370->$+7Ys}?P16lL#Ie4baeR1ko((-lVP_d4OxUQJT3GVg;=@F>w94 zDBfN}Jj$!KAsCFV=q96Fdj0TCUabwGbFA*Pl2Hu3n)m{*nuZ_%cBiY4GV682*LgKJ zyqdeeOB)a++iQU@_o{CQ0Shgn9OK=H| z1=q$UIE@o%pwY8t&)#)rzInf?Id!V`Idy9CSEoXyilD@9VO&a_8B(THTHC zJsHVHSgocvW8ti+ZVejPZI5+~56#oR0d%&?qj@_T=Ou_4BwI@0YE)v)OVJoE*`7hQ zrTrcW4CV7?H4aMPGcRqazefO5_`F7qrIMqWHvn!u3K+ZRU25Ex+|NASrvNTpCDOcD zje(L)U`L{Hj|2wmd1D&8CFe6Q_Nm+>fJu5@mBw7j!OUxb%^n4e&hw5nu1aoao&m(& za9~!Rm!mOWvO9wYAa)~x;dtJv#!1Q53^Ksfjkr+)M%x-|B_}f&k@?nIEdk=}>@o3Ou!Cu80^p7-KRFMtz}vLjWLP#dE=`lf^Ku3*8$M|C~-SV=&ufDvbH! z;|&o2c@Si_ZbesaRkQ{<#Retj1_iqY72*bY{RU;h21VZnRb=iwNr99H z`GLv*G^GLO4Q3l$C~3ifRU$!tgvKO+b1-cSP@dB!M#_(ZO{O^2l?3R7aYoHQadM`o z5zuiZh71mwo7Hjgr)4R&7j9al5-l+72`L@=U{=P(la`^xTEwdvRysUmw$JrCEfgqza!d!?3~`%faIvPP zC@~lDOo!SGH<&GQk*38e(HC(|hrosaS00yeT8Vz?qgkL!bqiPAmoC)L3(*K}T`q|4Vn*M$V z|2z}Xb7w(4?`7}D`xMZB_R7>nEYR3%@DgTbDR&o{Yu1)7aNFzgMk)^!Srz=%z(w3+ zX<1*RyI^nc!Hb-kING;k3E)N-{Oki7pXh^Fd+{uzYNQuT?VTH+>n8w8Wy|3jiv<^Z zZ=f+BU)if=SzhyT!Pefr@uhwuU|6<1sBvHLvG)fG^dN^`UdzlH7$j|Zj`mc=!i3pR&tfND7r7)My{*0?TsANm31dk`>xuuQE{ zT(CHF@p#de01O-~=W6U0+z)+#E`B^PVX$nf(O+;l^Z-Q6iNHv~@~Xyn!T&Je@`*19 zm?2ok)yOWG9XbPE<^*79U^!l6wcvW_eTn274@?Oxfg_s*yF>TOm%fR>SillE(OB?3 z^uK%x2vmDTEOTpA7px9l0c&#taPV)rR^znbdFXrj>^Amv6g$d zhGn=`h`EM}xt6oMhN-+(z^;bQu9o+p=G{T92yspD>jj-ldg6fx)4=+``7VR!_;FF= zw7;-jBAVsiaij(-4$*EVxH2{;88E%$NexvTmUf0UUl?$wei{C0v0>UgVu1IK8Q?RF zZU1s{X=z?IAbZD_8aF(S`wP`2q!|MEX&AJlna7fUDYz6iPZJM`9!!GHOFBzAD z=E-FOM;5+V;&J6)bS{a_gUfFnnE*`0*yt}ym-^;~WfI4Cd~uoMtiSMFqMG}bu^kzk zqV>lre`&dtH$#CZXV#`z{c(q1ye^r|qsw@X%uO*%V@JO{T-usfmdPC1n&OtmN&ow# zT7OY}#csck-F>dIMWeFwR%M%8Wfy&Hi)CzwWNce#Y!@l^GbR4;{nkda@v_q~##L(E zug$YF#B;!8fki$@zms?>k1+Rh5qSY~5c*ArMG_{Q}cCjSYgo9d*`+zy@NhZ;dn9dQ!KC&$bb$e$t)T z#_81%?d|e2D1yjO88ByOR`<+pADqDvF9B5s7BKFG@NH+FjUw=X%q#9%hEq?|_R`rA z;*Fmy;ITn_g)xZ=@BZpvYhn@8xur>GY|ot?AYR|e0K%Mf;8bP1>1+u>dZ!YA4^ZuTPPVVkZV}G_V+SUHv4fCr z$DIuzaPH(E-U8gZp4{#6vt0z*o%92CU^;LzvR!>PhakRFe!vUN1dc+sPtL9o|7#tW ze{9eEgX;@NWXlYZ>qqh!^*H*t{)mbtAw<~;5|d+~!KMo7mB6Mf1u4nB17m8SmIlvA z5K&fQ(t>fO&?Y5bQWk*Z!?8Hgbb~7-cq!XJl0O-NUObw2aJz&EWtW;51H)TvR5a<} zd0#w2V7G>hOm3I4oxHSrRL57VsrB?R+2CdBs`+^_}E41=pA`10B&B=;CEuzk?{ zgF7We^Sao@2pG_@U!q9{=Rw#_n%N}?7^AUe(9D8sA@5Dv*~QZsl(6a0G=oba+$OE; zl4*=1*p_In!7UIWlg=739R?O`JT%4NLI|fxOO1pMV+FPrnqBaBh=55)jrcr+JvJ|z zesCp(*QBjRa-I>WE~5DccR)l;x;~4&X8^coXtKct5RUcc&l2w$0nizmRd79of4%*) zcr$|m_B%A~;BpAhdh2J&W=7zKfaV$81`%HGJQed|5W*%yQw=VLaILqTN_a80V;iA4 z1vfzi*E>$duNnNXMbM0ct08>rZKsmop6h*juJ!A=5$1Ds&~sh2=O6#JK6Coq_|S)+16w;jTKJ1T2~(5WaGeh`i1`opbiDZb;jDdHrgpV4^IG=w zjrahSrccGxsy1r=;~|{~zHhj2pOL9kZQQ&z;B&-B4u94szVXR9{QU$g=EP#sZ6op~%_7p0h7gEq;t&E>l zH~_<^UfL8i$S<-u#5XD|fsdx%*c3M?F0vlQUn<;!@28%^zPZT>u#m>bDhz-(r%(VF zk%9m#@ZC>g7kobT0+#P4-^yYbU!^byKA3t9D{@n8WnGCsR=5J+PCbL=UC8;c2*>9r zjDvTl&;W6ff)8s){HnqU_-YCnR&XH??s`@wjF!9<`y6aH4Ac1o2|1qd&uJjexZzv9m!G5)KHE8fMFKO*ac3LSl_ z=1<1$4=%R+Fg>Z?Z43T3MCAAx2T+J6kq^dg)Bn~) zqywf+%C02i!Rl?k-};E`J0qaOngpmXx7mOyMCP601EnS>D;FoTD<>OT9fM*W3v(Tl zUEMq4I!66ER>3-E-#RvA&Ui_Ftp~<|!LF^f-{gpD?7Uvh4d%Z#V>IL|Xw(y!29vfF zP-zPj6yz(x>QhYW3Ienp*p=pLoJ{EeZ}8s*ng9KQ3`SDe5H%3llkzST(#&CIOG+JL z-v0hu#=E>-bCsDqDGqQE*8i49lmQY~X3@6_dAKqrxGL+o;#j!y@wn3JxXP2bk{q~- zwYaj*xT`GNi;J`i{wn1nDzMb5FVThC+j{VXWoV8T?r5Etctibc0{{e#8Y>u2E2=~q zYHI8JJy=hJwJ=3%xWoeLV(SeMY1AvhT3Y2LAECCk?%zZ8G%E{dwEzJF)W_Bz0Mw{C zfO)ktOO&COwyxhp7BzsFyw*~Q1JuLT7vR;X1Ic%-wh}|Aqpj!nutm+I!b`2&5`Sob zZ6JWJQ6mMv(F!Y(gqrMsb`KWNAT5m58YnS?I`4Y{G#mA7u!ag$O z9@eV4Qh2O&RpJZv-w%NQ;iD!DCew;5k%gM=JHvwkM^a&q)_92()OFt*9t3EQz(!it zCE8HCeRp^$U@|IP)jBEhg!=CL!@mG>BCv>7ZiyfjzVNR% z>i6IPEkFPSb=voYhbfdc43$(2m9{gLA5BA2b5X182JQg7H+Ns%a;%Z6g}wfV8BPVj1mpf*oT+k{%Q5_Y@h$a%me_!-ZZ$ zia78FO_?@~=;5)Jrzj6sZBMw^wlpm3k+D{%s18@-PN3R`G(hyQDoeDKn5&W}6l@C{ zrt}CaE3{OYt3OUK*(Ns(0i?zkm=!C89_l8A1(#k3=)$(ed2_oB=hJHPq%F|vu~B5f7{Fu8l6LmvChLQzn|G?FkW;z zio4W~o7jY%!Jqp`2*;C^($6OD$-~WkT!ce%G*ktPFU5}>w~nxj8nunRqhA>c?p;($_9hb!N>_!}rgzAXq zlSAWR18|%h`TL{*J<)<(D3C>fqX9?k2?4rY`NmKnUH~V)QNB+Bc3j_x#TB~ChG&FIp8ZnIX7o-~^gPD^6f=$3vV zv(DNdI@T2+J@Yn) zoF2r!(H;FFW?jxd-dmG!z9E*4F6igjYzE+}Hd&l1#8%Pu{rsEl058?rfb$)(c650^ z&t@xtK(zs2F2tVEZT-TVodDI;T8NX3ST(x1pKG(_4B}xY=>meQoW> zDMD-=|R4Sn$w`s^?CRZR3r5c+}|I&=bkg&lpm27T!>`rIkd%|JH|mZ>?%jmRwQk&=E^ZKG!t< zQ3FdyuDJBM5vv_Ow6qta5|$?Q;kq*{mUw)MX|$snmNxa#y0a`+DSXUnxT6Y|7WI+3 z&h9RP#`4c)S&i}Gr=g8X@0hwqw9FV-zT?wQ zV;=puW9u5zGHYN}#mARMJgU57=^E7nUAA=O^Gp*QHQaG@jcb`(wmRm+NJAc#+%Y*1 z_nr~5B;!*}qaW4Wu{n?So)xmn;bTj~A64A3IFIy(wp$wUIi>N9>hCz5$9m7TTdneu zr(ulB?wA3>?HNBy5kBBFZd7~6?mPxD>u1%;2ON@(s_s~wM#(SsRT zgPB2$83~M;k);_KrJ12N87VfIv9OFBSmqb`k%?%YzzpaA@^VS*oK;-^wR92LfUPfI z0S0O>Ey)lC8=%mwZ&T5rm6SZD;3Tb2SP`v7$K3z#?#2Ip_hRRbkwfuom5=SA|DjM2XE|wHlE&E#mOv2RGoEHtxiJu zHmEKXA8}pk-e&o)0zl*jwuRIqWlXw-*QRf9-`urMkUuL+gj{+yScUs z3TNf0uoX8=55NvCTyF%QWqko`DKE zTz%>LO0GqMTv_R3ELM$N1L+4Nt~-KgSs`OoR<-rLy8A4yDT2&d$zx1b-|PEz4=P+| z1&Om_#^`|dP~XBnFc=gR%*q~nXVp|cuy6p(%>aG3MRx=l$LX?XIhWcLWv^F2H2eK->iH64^Uj@m*~`%nptnsZZ^^Vqtk5`W@TF%i zE3X&1X||NEa69Vp4Jq#yc^0goJIe4S5^q|10As{prf>S&xHe z_Z1&Ue*geC;jqQ)k=d-gV(IAG6tXnsu-)jf)av3XK#;r>^8fucpv)#@VE)Xt#=-&&5A1)K)oWQZOU-F%44qCZpHoB$Mb93 zyoXIR_x%J#7bP`6m|KMuJ1!*@b>i_9agS$4(j*!e2hcS?9W$78(N zYQ^=~`zi>?X>1vJR5xp{*d4oHh5Al+Y_EEpG<&Z29{XSYuQe+Ev8z$u(rVXSWY^Mo z&|G!U(n;Lh`+7y^s+f59!6mRQaJkDU7=JwKg!UBMC!$^MPs9Au-mvxyqlVP(;XRAr zrtKp}cx>gVqr=DBr!GD%?aM}FY}Kjb!zZ|>s6HX>5F;$$TlWa_aq_8xPhtC%5n*+O z_89ZY$5SSsMHH=@)Mp@BA=M{ej}Xf(zy}4 zK9%jWM#R;Xb7OWV?xzAi+3jOS_|@feqX)_EjVD>gu`igOk^%FMYnYcLPwV z621}QeXH0`rA;IH$CamAKIQGuRU)U#rZN2!hf`jk%=Xb$Jg4%e(WT>~QxBiE_LWsK zr|PEhrIY_g^%g_iB|#kgecaV^)e9Qc%eSg`~U&Je;FXz6~8v`w800@M2z0!1t@kUuPr)l zHo=z=NB3`lVtwM;!pVjwybZB(PZprsmAbZcvUvr+Mcm&%1@b*0pw_p60S`m;++zXf z+DW2|2!IJkfPAQPC_wXn9~1aCqt-IG431g3T^t!x;BjA)rh%!;s@o&l)$B~%{BN5 z;_4n5a6QLA&IfLY!gCSh_xQkf%;d+#z|AiB8sg+0<3aW@@p0jCBM{z&Si2_|*`5~J z{O3k69MKE2``m!6$Kl7L$Fs+mSmNyz0U!!F0vc4Ruf5_46gD6hIWq7ojhCfCGvXN( z4w$%Lv?=7tzb3@PQ8dZ~5k@Mp;7e0hI~)V^Ep+_isLG)Fp&Kk`LKEs8zhyPH4xu~ViI0O2cS&7jimhEG21)Mjh#^HbnwiuVL0sBe&Eg9^H9e|deTdQX^zs)B44RNvk5%kMK~ zGl2o>J7n#k^6u}yd_Ge*6E34VB6|k4b$9#yy*HW+HH(2z7c;-1K5kOx5EzqDDH4cAw7s!X6rFm|a@8K?|QRH|YN$^he)D({0@!DOYXM4(VGmW@&ds0d7G zqoM~&0pr>zFM=Auq&BJopja>tOsN%A1tx~6_<(Z2_%P)gP$!riruq`}#T=7RDHN1v zPC%$41By3)OQ_rrsx>DeRHXw&m}93a6@g04iPBXpLFwjr>B>8x7IU(6RXk9LIhL+c z3aHSWP*+6@lx&Wxt2_((ZceJJ$_t7y$5~Kn1XY?7FQ|Bcvd!@qlrKRY=Hv^iZ$MwS zF!_~YK?Pd`{3(>=vaeQ27>7i;5#Ca|^FU`54r;Mb@H9 z1`6B4@>a?L6>kxGs~CY&w{X3cS3yl%q~59`ptvm@giFyKLJq%5;Byy&;iKidc>)@7n2YvpkfK# zg`BU4oSFj31rorn5;_MtSdTfi^kQx&1%xS~SCHHFucszJkbwknpoES?cGsg$Ev}jT zNCB-$=n3R%J?zx%n(>YV2rPuIK~C1=K&UVf$^r-tq4ugz4Ru=$1*(PypLjJofqFE7 zvNC~o&;ClDAhdRUoc$f(A9?c_9B4*uy4lwsr;M4&&Z};3Zoe^4Q!8(l*hd$qjFrjB z`_X=Xp1an@tiW`-uP81ib`&#{gICjD$$n>^rB>IhzRxml6f2X9SKI!0UZ~dFj2?{i zNvCyG-C9((n6 z@VIR>)4!rc#3jp(&M!_D;;^mwJ1h*ctfv`E29AawLR}HR)%g|Zj2a&|>gshNHt|sd zEQDQNme?XLXDK20s^)L_=vM0wPp4KE@Kp&Ky_8an>#4#nbQ(=R$3Cj!<3O4wzssH+ z1~9%`xjE)Ixm50&NH@>$qYJ&W!7+4voN2xw-I#*15^FL#8MG2P%fA%1ON*cpQq}N( zD__TVhxjBK(Pg?B$y)A7hoG&9tm5$-_@VE-z~>o``21-j<_*ne@Hxk$-fnK-Oy{J7 zEcsDD^U>-X4$rHYj^%U2ULpt0_V>NUf>`+bser)SG(qHkgZ(qVnX|wAetZ$fT_xv1 zlncwge8C*W+ZZpg5T<^vl3wIv6rF?eSYM@%# zaG7D%rL;1D{B}NSYcENU;BHY&P^6N-S!j_MI{K}3cwIcGoQ+{6@ZB9!`V^y|EQ%6# zbBhrx?BNUqQ9vyetBIbiv~!*%vU`a7QLxQgsMqk8l4 z4S#vac|0|KTzV!V7jn~=8*Bc?igvYa>qlM30{&~_8gqjb;{mFHScBFEr`VI^f*!Ok znY&g@#M+2s7(5@1)+pe5r*26Xq8N`q&Z^T+9hT!Y+58ku&;sGkQKx*n4cuXVsNy~O zKl10{vD?B6)B6u4C8-VB*znA>J@KuFK?yPPS9~c&x56OSjQ;x#N#k=)Pd(Xu3Q2kVI zs3cc&`tczA2=jiNKm0)(Pbv%z`1`f)#bZ^dfj9ZUUh`$HqdOX`~heDa$xM~-~RZ&U;jU~0@tFF zLML63^)kJR=i_kINZ=aLkm?UNMX9aG^ z0j_ls9MApW-GmS6kGYSxT`hN9&z^o_9TS&!k{#$iuD+Wqesa$(JA8GrGWTVCLi$#J z(E|B~NJy4?fEQ^4^XNfrL~cWK`AL%QqB0hBa&Qc;PlAU!jSr`gPUkJrw}64PyLAv& z1yM$7ttumH4++D*8r#$^*pQ1vF%CB^sCGkEL75wi{S*f&dc62CGmRrfijN6)8{Ww5 z*emfd*}?q}-qBi^IaTtQNVmz@8uLBKS5qVxW{;73R=I@0=T#*7b>^grZ=Q>y&kBj-|?UQHkOJekuh82r>ra~eOMifM48<2;Tx1M^hw##QEqjd;` z)o6@Z;4Y$mFw}hOVBzNEWel>zpsEm5E^fAuiWsp&*XEACvVfXe*kOwPtkC=rnOIrl z6Jw?Ds=T3Rfo16vZ{}!4LYrrv{ccBYjR%#JHL+6(>2~|eH%&b&6$j9dkv&F-@FWzg z^ttJ&>hRd9tNpo?*Im}w#8NH5Ja^78 zJH16Ao(p}5?_2f;qXSYSX!%7LsSySV0G^RwE1Oja$ehK=A>}d7aLxaHqMg6hh2-qb z>2|Uws=!1@#B5(#jla}Or_SP$9ycPYs^r(QX~vNt;=E5Vo~B#tp$-vFYE@jB6gfZ=(Q5D+_UkKS_US?GlXw8^lV9RaL#F{a5}>Jn*{FU+|syxnHcUz>CDi7!=V|F^7$wK~kQRaJeOe!|TQiSKcS#~H3PL%Kh)#mRjLd{o4|v1WfML09AYVMh9K6D>k<_|c*~H7CFD)t7rA zi`aXNY{9c9fAaC=_{WbgCodQ8Kl}J{@Njbc?dP{c%TDQo>{}78tK;AHTS(=~QaU}e2>E?`?-Q)qy0)o(Osg0 zRKOfNQKOIrjB~Yz?aL#n-{Rs$^YxT3Zh3?b-ZgrC-v>&aJ~=8%^gH6dq9N4ZPvh6L ze?5yDZo~~)(yYRcn85F3X5_||vRHnPo*tB|6ZGXrAB5>wNKme!Y3X8yvj8UN>=z9! zOP)+O-D%qSMoGu|v_>tpcOjCEPue?|%^A^eS+O2&=u9fgAbPqyi>mx-U6S#Mb-X!t zo9B0)RkBo@;$)kkO0tDaU@f3u0k+{=@ zS$aFr4RcTl=-}9dbIT}m&3{&9zEH=)2-Sb8C)%yOWsqf`t=G`-2VT#utwRaPke(ll z{i!PHwFYNVsTaLKb9nmHo|E5%pw#0g^5g!aU zvz5ftevFGPD;}q2{1K20gjCJl zJ~L%(+zH)`eoJFyfEiD<21*q<3&^c7`Hwd%aEZ%Tgm=8SA($zja?nuaJ(+y(jC}Xm zFDBs=CQZTE59zjJ;p~+v=T^R=2G#(GlFS>wT>ThjEUOtw?x_@|45J1o5`zZk%o4(&ZDplc zX?Y0kc;Iw=1r6$3X#Qj&|B!21nl3yR*}0CE2iLdD-%SmDHq^Ab=WXtjq;F87{N}fB z?W1$YB#MbQad38|iSrvI8b|S#3_g*!dY9Hn=QK7odOSWXE_MWcWox-|mGq(0?{!l$ zJ?Gl~!)We1^H>1B_gQ`K5m@ugJzfCUx$_N>(L$v%^Q%#9Ksuqej6u&4Ooo>hHVDcF zP_(5zXq^~ldVO{}8l=d{tQ0=)3ktC^HJz8hgCH%KB5p#c2L$wzq3+Z~T(zN?svkZ& zx$hAa_DZoxWO;k^^c&tfH15V~<-G3~Tq*b36?DqsU$2@DZCxAZ!e9v4cp1U?#oh>g_Xcp~_?V=D?&#WBA3%w2L!|<%kwic^zyUmB@92vX_zk)V@*@rxgBcbYe z;S+y-sjxKJFH#8{G*SqTuM`9VZA%#Bu;Zi?Pd~TTXTJKQi7SQ@_g_7Xwj962V^}b! ztM|Uvb}cO)2i>=}`^U0)uPouyMMvS>5N%D9xBIhFu}ovvQDr(x&axDmngdW1QF+UZ zDBhf$7lf0;VWBw*d79G644I%XWpnWz=(NI?0asuC71D1f!o>#X3Wa25Dg9TOtR-mQ zV5*FJ4o@UrI)sK2w$gojTb|)_f$Jx%Hl(gCMo->cI5FL`8tJWEX3we88ktW~@kNVY zfip7MD8wMW3tLMImy67Zz~({n(rnhOF=&^Apd<396@5+enkw<<5fu| z6$(kyt3MiFnoWx-`D+ujE6H?_R1*|HFR1pvQ^>G&)61}ZC9nu05E|4veRzV&!a(yU zn+WIs+(iD#V;?8)-)$R)pkdoyinpOxA|b;tQ}$E^OEDyi*1>%IjLWCdWSV*E9G3A- zCzFIl6VFh|9}(j*hM~LN3sMWd7q-DtG42A8{ic#XRM_=p_d{*Vr(%Yx@d#f@o;O#c zq;wOi27fzz*2mMAO_tM;`|C?hQwgOW-*nHMg%nv6X27SXsn*grIkxONd(xrWEl(`^ zJV?0rd5>f-?kxO{pIU1+cfKiT59N`2q25XuUc&Cfgf64{0~RO%Tww*B7Bm|MJ=B)D zW5uQP`RT2A5pyzB9}VQejT@vIOUbQw%jT6IKVF_O+Rblkv0V*YwXhX55;(`XwAG1` ztq3&d@?C=rfpHhBtY5^REG6&1wv=2vf4c)4f<|roC@@2=MEY2q@bS;5J#d3v+6MDQ zxsRR^kp9om-7lc32c z^lBIBU(z0AJa7krF)$+YS_nx(ySdUNX|DN2DZ4@w1u+rR)315h=-Cf*C*`)h`}+Mt zE34CP(-)Nt7iy*D7doYED%#4IBjsyI<-#&UddHd)J6^NvN5S1;6+ zfAjt0pIm#~+?;>6V2Oi~OJbOzCq9uPDsR4mS7(qYUvc4+*J09QOelVrWlxdP7r8!~ z{>Y<5frKXVP}YT)x|lkBU}N}Z@_|KPsE6`*T@g~#kr7q+lT-@_AI2%{IE;MH_L~kH zyWa?B!CyXl=d((Q)`1_-Jd(n^ZZaC57-w9{%B!Wosd66LvzT*FZXe!g>tIasoU>qW z*0$nS$oExto7k=W3Fj9cD4}w$Y$(39 zodZ9+buN5CD zyPEOpPWU~~r{F;y($DVtYOkor`s>PGI(%qXZ-G(?Z!!uU+VvJTC7L;)-BCx_p$n3{ zTa3B>ajic=5S_h#>Q0J{k$ENB{4It;XYNZsqwodQeYpXqR|KhVwj0is+0Y%oh-aJ{ zepLzKHg}Z~6Z+KHPrdlEuO13ej)t4ufTEfArA~x(Z347Sn95LGADXg=obU{Ze8vxG zfRHI+Psxp{>}N#b*CpeY)b_gDZ?StL$c$b>)08&-xXR&83pv^abVV-Pa6P z6=wS!WrEW$XHDkp{GyPZgXP5IRD!_I61gS=;OAdcUUrmRm(e{ps&%j`Ir-g6yEA^) zA`@J+f6o*B=H+e)H{G_Zxv4CzxDM0cL}uXqj>2oL!1CT+tR-2Oreb>5bZb2+4Ow4- z50^VknnQJ0;Xd*aQ_!dx9a_-2m#7|kt=jfI5;NS@?H|{S=U?3O`2POB6TkA8>n`NP zKeA=nh-Jr$&yDi=&?O!IeVz^ZkG(Y17%a1Qzb{GM7bKA1ij47da{ab@T-L|=qw7}s z4S^VOxlq;c4lN`+v9_W@jF8YV$&nvz;C)D#|LgZxT5J^#UjjkRFS~ly4+r!QaoR)4bH3~XFT7%UM7`DZXOx^DZRcQ zEX8&hT)|o*V9oP!V4^JWhPGISwJU_)Q!{7K5PxGv+EyjPEqjjzd!1H2`8$VQ%#ccY z$(RaZc5D2k?pvr?k!w*!DIL}eQ_m(5(_H85E83rk zEW%6vWL5vg?eG7)s^h?wh~9q^fJ)jXS)1ub7=lT#LK}8(vOxBuc6+8~zTX+c`sxvG;2}Omu%fG)G z^O|k^A?oTZ?;NsHfBBbHCF7Afpquy44IAm<2`0~)q{XZ_5Gxq`YGmP+$c03|&^g!Q zINds)(G^?GL-CZ7Mr z8R#cX#(r8Uo|*EDHB~{ltvpyoYJi?<1yh&`Ykx|&sD!f+TdJz$l=}25Zx#~jz&)|>u5x4Ft z@7@2ps-^tJ&5#}G+ovZ4fpJ6y?$q|3s>04)!JoTP41+>Zo)Wz#>=-(wqknE>zNDhL zR^+aj(G>wK>LJ>REx|U=m^f4PRLsxCPz5o&lIN1ek8t3zf_-1MU&!AJ3@hR%lgcYr zz(~$vCXJf@m?(U{-}J*aBEBx=HVMR^$!%|+aJ1A)#83(Vw?q!BG>K;~MaG2r<`T_! zFI(I((yvl#O;}=Uv}HimA+f@jGvVTHAU;8_VyR~cjX!3R)Ze)$}XA zeY-mm!@c~Wll6Ih%*x^|UvyYEY`q*dZ3+0#RmYjgj7P{lpGfGoFl7W2|T~ zR&h}8qkWF!ib9w9oCyPhC#7rVZ10Tya1TqdxBKx^=XtS5xfsw1NblUs%yAqfA$T=G zLh~L4wb}HO7{i-4Z+CwXT8HtynbrA)B$O%^sI>k9(bCt}k9F_|F$u)ty^F1B{<~JM z!vvz|J?~13@HmwJ=csaq3+K>{XNUQ7yW9jXzd%j}=aKLf1Ga%- zTF(t3GV{6ZsUJ4kd)M#C!ICtS-BO+#>pT_yar8KA4t=kHaYM5HwltoU-Aj*eQ} zNgUf_MUdvkv31dRklcdaN1O{0zE;e?Wj!u#{w#iI0X8sEE+MrENmUOjD0B>y7maDE z&;2aUyQ%4jQvO}GopIG=OuyhKMh{7Gv^c)2N}{s|-+rEW*|%{S*r=@HK)d?QO)O&=E|Sv-BcJWuMjTy>s$Xml#A*HJ>TDsUsWkGa zSNZmiTjBhv;~(W)`$OKIrHGF#>5b9yorFhpn|`g51>?qJc{AgBvz!SdNW3c*?-mth zf5xm=E!)n#vy_n?9M3W({Z2n#z6=_-p|Is)Uu9wQm2H8)?pO;2_ zo63m@bl5iT-nnmUD0O_Jtunq|_S@zO-En|22&;8F?epsR?Tknb!`uBpWd=(m)-iUb zkq9?;D#fc#1F&gD;a<83<;*ymp#W90_u*a&u7Oz{JH6bD!(Bp5J!6&BAIuNe&kMie zhFri1_068M#?Ec; zd6m$_&x`uQP4**;`{(tW5U5j_TznxHG4CaPTs8To*&qXHGf0~IzV+>1>>JU}qpVIC zICYSrh^uMF^o=X7Rg@u`nBF1hFEE5^|@e?=z?Z;OrnR3|U54S7G^6$S75 zJY*hh%*YER?AWNG=_sd)#}yac!;naIDYI4Gg>d_rMBLU$?lU#OY8=XWi@+b-63Qx3 z7sUg=JxxYW{!#j&rwsZUW0A^wSfNavYqTAnTp0~hczZr1MEauz|BJ`s2Q(d@0S?ON zMbEf6Ae^JjNcY@mH~qG?GbrD@>Xi+VYiuQ%XFo|Y*WQIb+*wq+u6mQGrbOKCd-nUE z=QkUhE!$qPZoDYR2$~0w=G;>6$i zKPI!}|6cEDR>D31@3uG9u5I}$`8u52=>6&oJr7TRx)tz5T5a+98KMtPnI4#$cKUJF z_RG23?OC*B(hlboE^?IVpRlyfe8U}W#_WYZwf!vRWd1pxTDX_1FYEK2z+9E(Cud#U z{d3Z{H4C0Iu96P(=Dr)eFxY(Mw36nm%-@%P{`+?E@~8Qnwf+mP?6}Vx{NKwU_7wl> zw%5&bOd3`f`#YPTu~S{$s5kXz@C~VG_Sg;l-)F1-PFl>A7c1I6b8{k-!NqmnzgxI3XqC?R_VB`@E&iLtm)3IU#^|cNR8TAT z`S-jqS!x;^ckap$Nwco7FLSK@@N~!K`T{%k|MS^J|0%7wGIRSUAw?F>+OVA(QeJ*i zQ|^lPG6Z^n#CgJq{JtursY{B0s59VT7+k88q>C3g%GcLwfbUn?@+CWi%haEYwcpfN@$CMxasG-T3im-q*f?I8z`6?#_ESFL>np?D;UM<2WM8L z0)_O0^7DapIIx-z0;){QR{-^)g78)7MusT$x#@-7M$Lr+Z6C|+Hx_oabZkB%{^*P- z=tOp}r)D!QYG{N=G&?RV;Ma3F$+P{Tkx$M4bhEShW%IJiRaf3VyQG$r*Z7U`N~ygm zr}ibiGoSi-hU{sJhGvVF!xl}VGDo$p74RJQof>{pCtt<->!CLfbSiK7{F4)(cF&&c z?+pSL(a8IG_WT!+g^V$y+G{wnfFz-a^f2@>-LN9ZS9^h+kTE) z{$nA%+4gnr?;mijn`QsiZd=>y9f|*HL~4b%7f6?%iMPAlo3DP!eg~(96=vubmn0UI XR1~GAahVvK7+D%|sj9mAyKw;kvF|C9 diff --git a/examples/langchain_tools/sample.xlsx b/examples/langchain_tools/sample.xlsx deleted file mode 100644 index 48eba5e1b5e231f8b7c472f7a67cac38c7ac561b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12042 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 S6qH++uhGj|fn5C`pZ*8QI?(+9 diff --git a/examples/langchain_tools/uv.lock b/examples/langchain_tools/uv.lock deleted file mode 100644 index 5346897..0000000 --- a/examples/langchain_tools/uv.lock +++ /dev/null @@ -1,858 +0,0 @@ -version = 1 -revision = 1 -requires-python = ">=3.10" -resolution-markers = [ - "python_full_version >= '3.12.4'", - "python_full_version < '3.12.4'", -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, - { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, - { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, - { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, - { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, - { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, - { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, - { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, - { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, - { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, - { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, - { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, - { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "httpx-sse" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpointer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, -] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, -] - -[[package]] -name = "langchain-core" -version = "0.3.35" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/5c/5ed0aa88d0ffc52634b97dcd971d675cfc55072b28f7723bba2ef9432bad/langchain_core-0.3.35.tar.gz", hash = "sha256:328688228ece259da734417d477994a69cf8202dea9ed4271f2d792e3575c6fc", size = 525736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/63/be67b8ab4f4cf07b8da65a67ff72ea870ec8cf9f2e95e3a5b837a5604d1b/langchain_core-0.3.35-py3-none-any.whl", hash = "sha256:81a4097226e180fa6c64e2d2ab38dcacbbc23b64fc109fb15622910fe8951670", size = 413151 }, -] - -[[package]] -name = "langchain-tools" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "langchain-core" }, - { name = "middleman-ai" }, -] - -[package.metadata] -requires-dist = [ - { name = "langchain-core", specifier = ">=0.3.34" }, - { name = "middleman-ai", editable = "../../" }, -] - -[[package]] -name = "langsmith" -version = "0.3.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "zstandard" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/1a/974b66a9e7c43f41bec067e1f393a296803aee48fafcf183941c31295b59/langsmith-0.3.8.tar.gz", hash = "sha256:97f9bebe0b7cb0a4f278e6ff30ae7d5ededff3883b014442ec6d7d575b02a0f1", size = 321394 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/e4/5380e8229c442e406404977d2ec71a9db6a3e6a89fce7791c6ad7cd2bdbe/langsmith-0.3.8-py3-none-any.whl", hash = "sha256:fbb9dd97b0f090219447fca9362698d07abaeda1da85aa7cc6ec6517b36581b1", size = 332800 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "mcp" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "httpx" }, - { name = "httpx-sse" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, - { name = "sse-starlette" }, - { name = "starlette" }, - { name = "uvicorn" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 }, -] - -[package.optional-dependencies] -cli = [ - { name = "python-dotenv" }, - { name = "typer" }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "middleman-ai" -version = "0.0.4" -source = { editable = "../../" } -dependencies = [ - { name = "click" }, - { name = "langchain-core" }, - { name = "mcp", extra = ["cli"] }, - { name = "pydantic" }, - { name = "requests" }, - { name = "typing-extensions" }, -] - -[package.metadata] -requires-dist = [ - { name = "click", specifier = ">=8.0.0" }, - { name = "langchain-core", specifier = ">=0.3" }, - { name = "mcp", extras = ["cli"], specifier = ">=1.6.0" }, - { name = "pydantic", specifier = ">=2" }, - { name = "requests", specifier = ">=2" }, - { name = "typing-extensions" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "black", specifier = ">=25.1.0" }, - { name = "mypy", specifier = ">=1.14.1" }, - { name = "pytest", specifier = ">=8.3.4" }, - { name = "pytest-cov", specifier = ">=6.0.0" }, - { name = "pytest-mock", specifier = ">=3.14.0" }, - { name = "pytest-vcr", specifier = ">=1.0.2" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "ruff", specifier = ">=0.9.6" }, - { name = "setuptools", specifier = ">=75.8.0" }, - { name = "setuptools-scm", specifier = ">=8.1.0" }, - { name = "twine", specifier = ">=6.1.0" }, - { name = "types-requests", specifier = ">=2.32.0.20241016" }, - { name = "vcrpy", specifier = ">=5.1.0" }, - { name = "wheel", specifier = ">=0.45.1" }, -] - -[[package]] -name = "orjson" -version = "3.10.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/5dea21763eeff8c1590076918a446ea3d6140743e0e36f58f369928ed0f4/orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e", size = 5282482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/09/e5ff18ad009e6f97eb7edc5f67ef98b3ce0c189da9c3eaca1f9587cd4c61/orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04", size = 249532 }, - { url = "https://files.pythonhosted.org/packages/bd/b8/a75883301fe332bd433d9b0ded7d2bb706ccac679602c3516984f8814fb5/orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8", size = 125229 }, - { url = "https://files.pythonhosted.org/packages/83/4b/22f053e7a364cc9c685be203b1e40fc5f2b3f164a9b2284547504eec682e/orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/63/64/1b54fc75ca328b57dd810541a4035fe48c12a161d466e3cf5b11a8c25649/orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814", size = 139748 }, - { url = "https://files.pythonhosted.org/packages/5e/ff/ff0c5da781807bb0a5acd789d9a7fbcb57f7b0c6e1916595da1f5ce69f3c/orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164", size = 154559 }, - { url = "https://files.pythonhosted.org/packages/4e/9a/11e2974383384ace8495810d4a2ebef5f55aacfc97b333b65e789c9d362d/orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/2d/c4/dd9583aea6aefee1b64d3aed13f51d2aadb014028bc929fe52936ec5091f/orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061", size = 138514 }, - { url = "https://files.pythonhosted.org/packages/53/3e/dcf1729230654f5c5594fc752de1f43dcf67e055ac0d300c8cdb1309269a/orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3", size = 130940 }, - { url = "https://files.pythonhosted.org/packages/e8/2b/b9759fe704789937705c8a56a03f6c03e50dff7df87d65cba9a20fec5282/orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d", size = 414713 }, - { url = "https://files.pythonhosted.org/packages/a7/6b/b9dfdbd4b6e20a59238319eb203ae07c3f6abf07eef909169b7a37ae3bba/orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182", size = 141028 }, - { url = "https://files.pythonhosted.org/packages/7c/b5/40f5bbea619c7caf75eb4d652a9821875a8ed04acc45fe3d3ef054ca69fb/orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e", size = 129715 }, - { url = "https://files.pythonhosted.org/packages/38/60/2272514061cbdf4d672edbca6e59c7e01cd1c706e881427d88f3c3e79761/orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/11/5d/be1490ff7eafe7fef890eb4527cf5bcd8cfd6117f3efe42a3249ec847b60/orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806", size = 133564 }, - { url = "https://files.pythonhosted.org/packages/7a/a2/21b25ce4a2c71dbb90948ee81bd7a42b4fbfc63162e57faf83157d5540ae/orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6", size = 249533 }, - { url = "https://files.pythonhosted.org/packages/b2/85/2076fc12d8225698a51278009726750c9c65c846eda741e77e1761cfef33/orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef", size = 125230 }, - { url = "https://files.pythonhosted.org/packages/06/df/a85a7955f11274191eccf559e8481b2be74a7c6d43075d0a9506aa80284d/orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/37/b3/94c55625a29b8767c0eed194cb000b3787e3c23b4cdd13be17bae6ccbb4b/orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d", size = 139749 }, - { url = "https://files.pythonhosted.org/packages/53/ba/c608b1e719971e8ddac2379f290404c2e914cf8e976369bae3cad88768b1/orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0", size = 154558 }, - { url = "https://files.pythonhosted.org/packages/b2/c4/c1fb835bb23ad788a39aa9ebb8821d51b1c03588d9a9e4ca7de5b354fdd5/orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/78/14/bb2b48b26ab3c570b284eb2157d98c1ef331a8397f6c8bd983b270467f5c/orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5", size = 138513 }, - { url = "https://files.pythonhosted.org/packages/4a/97/d5b353a5fe532e92c46467aa37e637f81af8468aa894cd77d2ec8a12f99e/orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b", size = 130942 }, - { url = "https://files.pythonhosted.org/packages/b5/5d/a067bec55293cca48fea8b9928cfa84c623be0cce8141d47690e64a6ca12/orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399", size = 414717 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/1485b8b05c6b4c4db172c438cf5db5dcfd10e72a9bc23c151a1137e763e0/orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388", size = 141033 }, - { url = "https://files.pythonhosted.org/packages/f8/d2/fc67523656e43a0c7eaeae9007c8b02e86076b15d591e9be11554d3d3138/orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c", size = 129720 }, - { url = "https://files.pythonhosted.org/packages/79/42/f58c7bd4e5b54da2ce2ef0331a39ccbbaa7699b7f70206fbf06737c9ed7d/orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/00/f8/bb60a4644287a544ec81df1699d5b965776bc9848d9029d9f9b3402ac8bb/orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e", size = 133570 }, - { url = "https://files.pythonhosted.org/packages/66/85/22fe737188905a71afcc4bf7cc4c79cd7f5bbe9ed1fe0aac4ce4c33edc30/orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a", size = 249504 }, - { url = "https://files.pythonhosted.org/packages/48/b7/2622b29f3afebe938a0a9037e184660379797d5fd5234e5998345d7a5b43/orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d", size = 125080 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/0b72a48f4403d0b88b2a41450c535b3e8989e8a2d7800659a967efc7c115/orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0", size = 150121 }, - { url = "https://files.pythonhosted.org/packages/06/ec/acb1a20cd49edb2000be5a0404cd43e3c8aad219f376ac8c60b870518c03/orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4", size = 139796 }, - { url = "https://files.pythonhosted.org/packages/33/e1/f7840a2ea852114b23a52a1c0b2bea0a1ea22236efbcdb876402d799c423/orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767", size = 154636 }, - { url = "https://files.pythonhosted.org/packages/fa/da/31543337febd043b8fa80a3b67de627669b88c7b128d9ad4cc2ece005b7a/orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41", size = 130621 }, - { url = "https://files.pythonhosted.org/packages/ed/78/66115dc9afbc22496530d2139f2f4455698be444c7c2475cb48f657cefc9/orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514", size = 138516 }, - { url = "https://files.pythonhosted.org/packages/22/84/cd4f5fb5427ffcf823140957a47503076184cb1ce15bcc1165125c26c46c/orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17", size = 130762 }, - { url = "https://files.pythonhosted.org/packages/93/1f/67596b711ba9f56dd75d73b60089c5c92057f1130bb3a25a0f53fb9a583b/orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b", size = 414700 }, - { url = "https://files.pythonhosted.org/packages/7c/0c/6a3b3271b46443d90efb713c3e4fe83fa8cd71cda0d11a0f69a03f437c6e/orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7", size = 141077 }, - { url = "https://files.pythonhosted.org/packages/3b/9b/33c58e0bfc788995eccd0d525ecd6b84b40d7ed182dd0751cd4c1322ac62/orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a", size = 129898 }, - { url = "https://files.pythonhosted.org/packages/01/c1/d577ecd2e9fa393366a1ea0a9267f6510d86e6c4bb1cdfb9877104cac44c/orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665", size = 142566 }, - { url = "https://files.pythonhosted.org/packages/ed/eb/a85317ee1732d1034b92d56f89f1de4d7bf7904f5c8fb9dcdd5b1c83917f/orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa", size = 133732 }, - { url = "https://files.pythonhosted.org/packages/06/10/fe7d60b8da538e8d3d3721f08c1b7bff0491e8fa4dd3bf11a17e34f4730e/orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6", size = 249399 }, - { url = "https://files.pythonhosted.org/packages/6b/83/52c356fd3a61abd829ae7e4366a6fe8e8863c825a60d7ac5156067516edf/orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a", size = 125044 }, - { url = "https://files.pythonhosted.org/packages/55/b2/d06d5901408e7ded1a74c7c20d70e3a127057a6d21355f50c90c0f337913/orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9", size = 150066 }, - { url = "https://files.pythonhosted.org/packages/75/8c/60c3106e08dc593a861755781c7c675a566445cc39558677d505878d879f/orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0", size = 139737 }, - { url = "https://files.pythonhosted.org/packages/6a/8c/ae00d7d0ab8a4490b1efeb01ad4ab2f1982e69cc82490bf8093407718ff5/orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307", size = 154804 }, - { url = "https://files.pythonhosted.org/packages/22/86/65dc69bd88b6dd254535310e97bc518aa50a39ef9c5a2a5d518e7a223710/orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e", size = 130583 }, - { url = "https://files.pythonhosted.org/packages/bb/00/6fe01ededb05d52be42fabb13d93a36e51f1fd9be173bd95707d11a8a860/orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7", size = 138465 }, - { url = "https://files.pythonhosted.org/packages/db/2f/4cc151c4b471b0cdc8cb29d3eadbce5007eb0475d26fa26ed123dca93b33/orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8", size = 130742 }, - { url = "https://files.pythonhosted.org/packages/9f/13/8a6109e4b477c518498ca37963d9c0eb1508b259725553fb53d53b20e2ea/orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca", size = 414669 }, - { url = "https://files.pythonhosted.org/packages/22/7b/1d229d6d24644ed4d0a803de1b0e2df832032d5beda7346831c78191b5b2/orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561", size = 141043 }, - { url = "https://files.pythonhosted.org/packages/cc/d3/6dc91156cf12ed86bed383bcb942d84d23304a1e57b7ab030bf60ea130d6/orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825", size = 129826 }, - { url = "https://files.pythonhosted.org/packages/b3/38/c47c25b86f6996f1343be721b6ea4367bc1c8bc0fc3f6bbcd995d18cb19d/orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890", size = 142542 }, - { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, - { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, - { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, - { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, - { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, - { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, - { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, - { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, - { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, - { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, - { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, - { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, - { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, - { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, - { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, - { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, - { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, - { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, - { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, - { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, - { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, - { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, -] - -[[package]] -name = "pydantic-settings" -version = "2.8.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "python-dotenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "python-dotenv" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, -] - -[[package]] -name = "rich" -version = "14.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, -] - -[[package]] -name = "shellingham" -version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "sse-starlette" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "starlette" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 }, -] - -[[package]] -name = "starlette" -version = "0.46.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, -] - -[[package]] -name = "tenacity" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, -] - -[[package]] -name = "typer" -version = "0.15.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "uvicorn" -version = "0.34.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf74d9999044306e06abe65344ff197864175dbbd91871/uvicorn-0.34.1.tar.gz", hash = "sha256:af981725fc4b7ffc5cb3b0e9eda6258a90c4b52cb2a83ce567ae0a7ae1757afc", size = 76755 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404 }, -] - -[[package]] -name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701 }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678 }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098 }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798 }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840 }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337 }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182 }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936 }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705 }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882 }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672 }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043 }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390 }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901 }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596 }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498 }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699 }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681 }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328 }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955 }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944 }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927 }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910 }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544 }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094 }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440 }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091 }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682 }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707 }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792 }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586 }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420 }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, -] diff --git a/examples/web_page_to_slide/.env.sample b/examples/web_page_to_slide/.env.sample deleted file mode 100644 index 232284d..0000000 --- a/examples/web_page_to_slide/.env.sample +++ /dev/null @@ -1,8 +0,0 @@ -TEMPLATE_SLIDE_ID=your_template_slide_id -MIDDLEMAN_API_KEY=your_middleman_api_key -ANTHROPIC_API_KEY=your_anthropic_api_key - -# LangSmith -LANGSMITH_TRACING_V2=true -LANGSMITH_API_KEY=your_langsmith_api_key -LANGSMITH_PROJECT=your_project_name diff --git a/examples/web_page_to_slide/.python-version b/examples/web_page_to_slide/.python-version deleted file mode 100644 index e4fba21..0000000 --- a/examples/web_page_to_slide/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12 diff --git a/examples/web_page_to_slide/README.md b/examples/web_page_to_slide/README.md deleted file mode 100644 index 91f4c73..0000000 --- a/examples/web_page_to_slide/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Web Page to Slide - -ウェブページの内容を自動的にパワーポイントスライドに変換するエージェントのサンプルです。 - -## 機能 - -- ウェブページのURLからコンテンツを抽出 -- LLMを使用してコンテンツを解析し、スライド形式に最適化 -- middleman.aiのAPIを使用してPowerPointスライドの自動生成 - -## 必要条件 - -- Python 3.10以上 -- [uv](https://github.com/astral-sh/uv) - -## セットアップ - -1. リポジトリをクローン: -```bash -git clone [repository-url] -cd examples/web_page_to_slide -``` - -2. 環境変数の設定: -```bash -cp .env.sample .env -``` -`.env`ファイルを編集し、必要なAPI keyを設定してください。 - -3. 依存関係のインストール: -```bash -uv sync -``` - -## 使用方法 - -1. langgraphサーバーの起動: -```bash -uv run langgraph run dev -``` - -2. スライド生成の実行: -```bash -uv run python -m src.web_page_to_slide.agent -``` - -生成されたスライドはエージェントからの出力として表示されます。 - -## ライセンス - -このプロジェクトはMITライセンスの下で公開されています。 diff --git a/examples/web_page_to_slide/artifacts/web_template.pptx b/examples/web_page_to_slide/artifacts/web_template.pptx deleted file mode 100644 index 36f797433cfe75da777eda4784d53b43cfd16e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65655 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,L-&Ff->c6s_!CECb2U4+E&mwm3 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 diff --git a/examples/web_page_to_slide/langgraph.json b/examples/web_page_to_slide/langgraph.json deleted file mode 100644 index bbf33cb..0000000 --- a/examples/web_page_to_slide/langgraph.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "dependencies": ["."], - "graphs": { - "agent": "./src/web_page_to_slide/agent.py:agent" - }, - "env": ".env" -} diff --git a/examples/web_page_to_slide/pyproject.toml b/examples/web_page_to_slide/pyproject.toml deleted file mode 100644 index ed74ff0..0000000 --- a/examples/web_page_to_slide/pyproject.toml +++ /dev/null @@ -1,35 +0,0 @@ -[project] -name = "web-page-to-slide" -version = "0.1.0" -description = "Add your description here" -readme = "README.md" -requires-python = ">=3.10" -dependencies = [ - "bs4>=0.0.2", - "langchain-anthropic>=0.3.6", - "langchain-community>=0.3.15", - "langchain-core>=0.3.31", - "langgraph>=0.2.69", - "middleman-ai", - "requests>=2.32.3", - "tavily-python>=0.5.0", - "types-requests>=2.32.0.20241016", -] - -[tool.uv] -dev-dependencies = [ - "langgraph-cli[inmem]>=0.1.80", - "python-dotenv>=1.0.1", -] - -[tool.uv.sources] -middleman-ai = { path = "../../", editable = true } - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -include = [ - "src/web_page_to_slide", -] diff --git a/examples/web_page_to_slide/src/web_page_to_slide/__init__.py b/examples/web_page_to_slide/src/web_page_to_slide/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/examples/web_page_to_slide/src/web_page_to_slide/agent.py b/examples/web_page_to_slide/src/web_page_to_slide/agent.py deleted file mode 100644 index 09d8dca..0000000 --- a/examples/web_page_to_slide/src/web_page_to_slide/agent.py +++ /dev/null @@ -1,211 +0,0 @@ -import json -import os - -from dotenv import load_dotenv -from langchain_anthropic import ChatAnthropic -from langchain_core.prompts import ChatPromptTemplate -from langchain_core.tools import BaseTool -from langgraph.checkpoint.memory import MemorySaver -from langgraph.graph.state import CompiledGraph -from langgraph.prebuilt import create_react_agent - -from middleman_ai.client import Presentation, ToolsClient - -load_dotenv() - - -def load_prompt(prompt_name: str) -> str: - """Load a prompt file from the prompts directory. - - Args: - prompt_name: Name of the prompt file (without .txt extension) - - Returns: - str: Content of the prompt file - - Raises: - FileNotFoundError: If the prompt file is not found - """ - current_dir = os.path.dirname(os.path.abspath(__file__)) - prompt_path = os.path.join(current_dir, "prompts", f"{prompt_name}.txt") - - with open(prompt_path) as f: - return f.read() - - -class WebPageAnalysisTool(BaseTool): - """Tool to fetch web pages and extract text and image URLs from a given URL""" - - name: str = "web-page-analyze" - description: str = ( - "Fetches a web page from the specified URL and extracts text and image URLs. " - "Input: Valid URL string. " - "Output: JSON string {text: str, images: list[str]}." - ) - - def _run(self, url: str) -> str: - """Fetch a web page and extract text and image URLs from the specified URL. - - Args: - url: Target URL string - - Returns: - str: Extracted text and image URLs in JSON format - - Raises: - requests.exceptions.RequestException: If the request fails - """ - from typing import Any - - import requests - from bs4 import BeautifulSoup, Tag - - # Get HTML from URL - resp: Any = requests.get(url, timeout=10) - resp.raise_for_status() - html = str(resp.text) - - # Parse HTML and extract text and image URLs - soup = BeautifulSoup(html, "html.parser") - text = str(soup.get_text(separator="\n")) - images = [ - str(tag.get("src", "")) - for tag in soup.find_all("img") - if isinstance(tag, Tag) - ] - - # Return results in JSON format - result = {"text": text[:2000], "images": images[:10]} - return json.dumps(result, ensure_ascii=False) - - async def _arun(self, url: str) -> str: - """Execute asynchronous page analysis. - - Args: - url: Target URL string - - Returns: - str: Extracted text and image URLs in JSON format - """ - return self._run(url) - - -class TextToSlideJsonTool(BaseTool): - """Tool to convert text into slide JSON format""" - - name: str = "text-to-slide-json" - description: str = ( - "Input: Text string that includes content text, source URL, and image URLs with their descriptions. " # noqa: E501 - "The source URL should be in the format 'Source URL: [URL]'. " - "The image information should be in the format 'Image URL: [URL], Description: [description]'. " # noqa: E501 - "Output: JSON string {text: str, images: list[str]}." - ) - client: ToolsClient - llm: ChatAnthropic - template_slide_id: str - - def _run(self, text: str) -> str: - slide_template_str = self.client.json_to_pptx_analyze_v2(self.template_slide_id) - prompt = ChatPromptTemplate.from_template(load_prompt("text_to_slide_json")) - chain = prompt | self.llm.with_structured_output(Presentation) - result: Presentation = Presentation.model_validate( - chain.invoke( - { - "content": text, - "slide_templates": slide_template_str, - } - ) - ) - return json.dumps(result.to_dict(), ensure_ascii=False) - - -class JsonToPptxExecuteTool(BaseTool): - """Tool to generate PPTX from JSON""" - - name: str = "json-to-pptx-execute" - description: str = "Generate PPTX from JSON" - client: ToolsClient - template_slide_id: str - - def _run(self, json_str: str) -> str: - result: str = self.client.json_to_pptx_execute_v2( - pptx_template_id=self.template_slide_id, - presentation=Presentation.model_validate(json.loads(json_str)), - ) - return result - - -def create_slide_agent( - template_slide_id: str, - middleman_api_key: str, - anthropic_api_key: str, -) -> CompiledGraph: - """Create a slide generation agent. - - Args: - template_slide_id: ID of the template slide - middleman_api_key: API key for Middleman service - anthropic_api_key: API key for Anthropic service - - Returns: - CompiledGraph: Compiled agent graph - """ - middleman_client = ToolsClient(api_key=middleman_api_key) - - llm = ChatAnthropic( - model="claude-3-7-sonnet-latest", - temperature=0.0, - api_key=anthropic_api_key, - ) - - tool_page_get = WebPageAnalysisTool() - tool_convert_tpl = TextToSlideJsonTool( - client=middleman_client, - llm=llm, - template_slide_id=template_slide_id, - ) - tool_exec_tpl = JsonToPptxExecuteTool( - client=middleman_client, - template_slide_id=template_slide_id, - ) - tools_list = [tool_page_get, tool_convert_tpl, tool_exec_tpl] - - compiled_graph = create_react_agent( - model=llm, - tools=tools_list, - prompt=load_prompt("agent"), - checkpointer=MemorySaver(), - ) - - return compiled_graph - - -agent = create_slide_agent( - template_slide_id=os.getenv("TEMPLATE_SLIDE_ID") or "", - middleman_api_key=os.getenv("MIDDLEMAN_API_KEY") or "", - anthropic_api_key=os.getenv("ANTHROPIC_API_KEY") or "", -) - -if __name__ == "__main__": - import uuid - - from langchain_core.runnables import RunnableConfig - - config = RunnableConfig({"configurable": {"thread_id": str(uuid.uuid4())}}) - - initial_state = { - "messages": [ - ( - "human", - "Please make slides from https://blog.generative-agents.co.jp/entry/2025/01/30/134659", - ) - ] - } - - for state in agent.stream(initial_state, stream_mode="values", config=config): - # Display the last message of each step (State) - last_msg = state.get("messages", [])[-1] - print(last_msg) - print("-----") - if hasattr(last_msg, "pretty_print"): - last_msg.pretty_print() diff --git a/examples/web_page_to_slide/src/web_page_to_slide/prompts/agent.txt b/examples/web_page_to_slide/src/web_page_to_slide/prompts/agent.txt deleted file mode 100644 index 291f54f..0000000 --- a/examples/web_page_to_slide/src/web_page_to_slide/prompts/agent.txt +++ /dev/null @@ -1,16 +0,0 @@ -You are an AI assistant that can generate a PowerPoint from a given web page URL. -You have the following tools: -1) web-page-analyze: Extract text & images from URL -2) text-to-slide-json: Generate a Slide JSON from text -3) json-to-pptx-execute: Generate a PPTX from Slide JSON - -User will ask: "Please make slides from " - -Steps to do: -- Use web-page-analyze to extract text & images from the URL -- Use text-to-slide-json to generate a Slide JSON from text -- Use json-to-pptx-execute to get the final PPTX - -Respond with the final PPTX link at the end. - -Output MUST be in Japanese. diff --git a/examples/web_page_to_slide/src/web_page_to_slide/prompts/text_to_slide_json.txt b/examples/web_page_to_slide/src/web_page_to_slide/prompts/text_to_slide_json.txt deleted file mode 100644 index 739841b..0000000 --- a/examples/web_page_to_slide/src/web_page_to_slide/prompts/text_to_slide_json.txt +++ /dev/null @@ -1,98 +0,0 @@ - -{content} - - -与えられたWebページの内容に基づいて、PowerPointスライド用のJSON構造を作成してください。 - - -あなたはプレゼンテーション用の構造化データを作成する専門のAIアシスタントです。Webページの内容を分析し、PowerPointスライドのコンテンツを表すJSONオブジェクトを生成することが任務です。JSONの構造は提供された定義に一致させ、内容はWebページの情報に基づいて設定してください。 - - -### スライドテンプレートの定義 - -slide_templatesタグに囲まれたJSONがスライドテンプレートの定義情報です。 - -type: スライドタイプ名 -position: 順番 -description: スライドテンプレートの概要 -placeholders: スライドテンプレート内のプレースホルダーリスト - - name: プレースホルダー名 - - description: どのような内容を載せるか - - -{slide_templates} - - -### 出力形式 - -output_formatの構造に従ってJSONを生成してください: - - -{{ - "slides": [ - {{ - "type": "スライドタイプ名(必須)", - "placeholders": [ - {{ - "name": "プレースホルダー名(必須)", - "content": "内容(必須)" - }} - ] - }} - ] -}} - -各スライドには必ず以下の要素が含まれている必要があります: -1. type: スライドのタイプを示す文字列 -2. placeholders: 配列形式のプレースホルダーリスト - - 各プレースホルダーには name と content が必須 - -例: -{{ - "slides": [ - {{ - "type": "title_slide", - "placeholders": [ - {{ - "name": "title", - "content": "メインタイトル" - }}, - {{ - "name": "subtitle", - "content": "サブタイトル" - }} - ] - }}, - {{ - "type": "content_slide", - "placeholders": [ - {{ - "name": "title", - "content": "セクションタイトル" - }}, - {{ - "name": "content", - "content": "• ポイント1\n• ポイント2\n• ポイント3" - }} - ] - }} - ] -}} - - - -1. 提供されたスライドテンプレート定義に基づいてJSONを作成してください。 -2. 各スライドの "type" と "placeholders" フィールドは必須項目です。 -3. 各プレースホルダーには必ず "name" と "content" フィールドを含めてください。 -4. プレースホルダーの内容は以下のルールに従って設定してください: - - "title" を含むプレースホルダー:ページの主要なタイトルまたはセクションタイトル - - "content" を含むプレースホルダー:重要なポイントを箇条書き形式で簡潔に - - "image" を含むプレースホルダー:関連する画像URL(利用可能な場合) - - "url" または "link" を含むプレースホルダー:適切なWebページのURL -5. プレースホルダーの目的が不明確な場合は、description項目を参考にしてください。 -6. 定義されたJSONの構造を厳密に守り、すべての必須フィールドを含めてください。 - - -NOTICE: 定義されたJSON形式で応答を提供してください。JSON構造の外部に説明文やその他のテキストを含めないでください。 - -先に提供されたWebページの情報に基づいて、PowerPointスライド用のJSON構造を生成してください。 \ No newline at end of file diff --git a/examples/web_page_to_slide/uv.lock b/examples/web_page_to_slide/uv.lock deleted file mode 100644 index da77a2e..0000000 --- a/examples/web_page_to_slide/uv.lock +++ /dev/null @@ -1,2087 +0,0 @@ -version = 1 -requires-python = ">=3.10" -resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.11' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.12.4'", - "python_full_version >= '3.12.4'", -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/55/e4373e888fdacb15563ef6fa9fa8c8252476ea071e96fb46defac9f18bf2/aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745", size = 21977 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/74/fbb6559de3607b3300b9be3cc64e97548d55678e44623db17820dbd20002/aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8", size = 14756 }, -] - -[[package]] -name = "aiohttp" -version = "3.11.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "propcache" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/37/4b/952d49c73084fb790cb5c6ead50848c8e96b4980ad806cf4d2ad341eaa03/aiohttp-3.11.12.tar.gz", hash = "sha256:7603ca26d75b1b86160ce1bbe2787a0b706e592af5b2504e12caa88a217767b0", size = 7673175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/42/3880e133590820aa7bc6d068eb7d8e0ad9fdce9b4663f92b821d3f6b5601/aiohttp-3.11.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aa8a8caca81c0a3e765f19c6953416c58e2f4cc1b84829af01dd1c771bb2f91f", size = 708721 }, - { url = "https://files.pythonhosted.org/packages/d8/8c/04869803bed108b25afad75f94c651b287851843caacbec6677d8f2d572b/aiohttp-3.11.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ede78acde96ca57f6cf8ccb8a13fbaf569f6011b9a52f870c662d4dc8cd854", size = 468596 }, - { url = "https://files.pythonhosted.org/packages/4f/f4/9074011f0d1335b161c953fb32545b6667cf24465e1932b9767874995c7e/aiohttp-3.11.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:584096938a001378484aa4ee54e05dc79c7b9dd933e271c744a97b3b6f644957", size = 455758 }, - { url = "https://files.pythonhosted.org/packages/fd/68/06298c57ef8f534065930b805e6dbd83613f0534447922782fb9920fce28/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:392432a2dde22b86f70dd4a0e9671a349446c93965f261dbaecfaf28813e5c42", size = 1584797 }, - { url = "https://files.pythonhosted.org/packages/bd/1e/cee6b51fcb3b1c4185a7dc62b3113bc136fae07f39386c88c90b7f79f199/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:88d385b8e7f3a870146bf5ea31786ef7463e99eb59e31db56e2315535d811f55", size = 1632535 }, - { url = "https://files.pythonhosted.org/packages/71/1f/42424462b7a09da362e1711090db9f8d68a37a33f0aab51307335517c599/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b10a47e5390c4b30a0d58ee12581003be52eedd506862ab7f97da7a66805befb", size = 1668484 }, - { url = "https://files.pythonhosted.org/packages/f6/79/0e25542bbe3c2bfd7a12c7a49c7bce73b09a836f65079e4b77bc2bafc89e/aiohttp-3.11.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b5263dcede17b6b0c41ef0c3ccce847d82a7da98709e75cf7efde3e9e3b5cae", size = 1589708 }, - { url = "https://files.pythonhosted.org/packages/d1/13/93ae26b75e23f7d3a613872e472fae836ca100dc5bde5936ebc93ada8890/aiohttp-3.11.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50c5c7b8aa5443304c55c262c5693b108c35a3b61ef961f1e782dd52a2f559c7", size = 1544752 }, - { url = "https://files.pythonhosted.org/packages/cf/5e/48847fad1b014ef92ef18ea1339a3b58eb81d3bc717b94c3627f5d2a42c5/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1c031a7572f62f66f1257db37ddab4cb98bfaf9b9434a3b4840bf3560f5e788", size = 1529417 }, - { url = "https://files.pythonhosted.org/packages/ae/56/fbd4ea019303f4877f0e0b8c9de92e9db24338e7545570d3f275f3c74c53/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:7e44eba534381dd2687be50cbd5f2daded21575242ecfdaf86bbeecbc38dae8e", size = 1557808 }, - { url = "https://files.pythonhosted.org/packages/f1/43/112189cf6b3c482ecdd6819b420eaa0c2033426f28d741bb7f19db5dd2bb/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:145a73850926018ec1681e734cedcf2716d6a8697d90da11284043b745c286d5", size = 1536765 }, - { url = "https://files.pythonhosted.org/packages/30/12/59986547de8306e06c7b30e547ccda02d29636e152366caba2dd8627bfe1/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2c311e2f63e42c1bf86361d11e2c4a59f25d9e7aabdbdf53dc38b885c5435cdb", size = 1607621 }, - { url = "https://files.pythonhosted.org/packages/aa/9b/af3b323b20df3318ed20d701d8242e523d59c842ca93f23134b05c9d5054/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ea756b5a7bac046d202a9a3889b9a92219f885481d78cd318db85b15cc0b7bcf", size = 1628977 }, - { url = "https://files.pythonhosted.org/packages/36/62/adf5a331a7bda475cc326dde393fa2bc5849060b1b37ac3d1bee1953f2cd/aiohttp-3.11.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:526c900397f3bbc2db9cb360ce9c35134c908961cdd0ac25b1ae6ffcaa2507ff", size = 1564455 }, - { url = "https://files.pythonhosted.org/packages/90/c4/4a24291f22f111a854dfdb54dc94d4e0a5229ccbb7bc7f0bed972aa50410/aiohttp-3.11.12-cp310-cp310-win32.whl", hash = "sha256:b8d3bb96c147b39c02d3db086899679f31958c5d81c494ef0fc9ef5bb1359b3d", size = 416768 }, - { url = "https://files.pythonhosted.org/packages/51/69/5221c8006acb7bb10d9e8e2238fb216571bddc2e00a8d95bcfbe2f579c57/aiohttp-3.11.12-cp310-cp310-win_amd64.whl", hash = "sha256:7fe3d65279bfbee8de0fb4f8c17fc4e893eed2dba21b2f680e930cc2b09075c5", size = 442170 }, - { url = "https://files.pythonhosted.org/packages/9c/38/35311e70196b6a63cfa033a7f741f800aa8a93f57442991cbe51da2394e7/aiohttp-3.11.12-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87a2e00bf17da098d90d4145375f1d985a81605267e7f9377ff94e55c5d769eb", size = 708797 }, - { url = "https://files.pythonhosted.org/packages/44/3e/46c656e68cbfc4f3fc7cb5d2ba4da6e91607fe83428208028156688f6201/aiohttp-3.11.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b34508f1cd928ce915ed09682d11307ba4b37d0708d1f28e5774c07a7674cac9", size = 468669 }, - { url = "https://files.pythonhosted.org/packages/a0/d6/2088fb4fd1e3ac2bfb24bc172223babaa7cdbb2784d33c75ec09e66f62f8/aiohttp-3.11.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:936d8a4f0f7081327014742cd51d320296b56aa6d324461a13724ab05f4b2933", size = 455739 }, - { url = "https://files.pythonhosted.org/packages/e7/dc/c443a6954a56f4a58b5efbfdf23cc6f3f0235e3424faf5a0c56264d5c7bb/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de1378f72def7dfb5dbd73d86c19eda0ea7b0a6873910cc37d57e80f10d64e1", size = 1685858 }, - { url = "https://files.pythonhosted.org/packages/25/67/2d5b3aaade1d5d01c3b109aa76e3aa9630531252cda10aa02fb99b0b11a1/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9d45dbb3aaec05cf01525ee1a7ac72de46a8c425cb75c003acd29f76b1ffe94", size = 1743829 }, - { url = "https://files.pythonhosted.org/packages/90/9b/9728fe9a3e1b8521198455d027b0b4035522be18f504b24c5d38d59e7278/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:930ffa1925393381e1e0a9b82137fa7b34c92a019b521cf9f41263976666a0d6", size = 1785587 }, - { url = "https://files.pythonhosted.org/packages/ce/cf/28fbb43d4ebc1b4458374a3c7b6db3b556a90e358e9bbcfe6d9339c1e2b6/aiohttp-3.11.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8340def6737118f5429a5df4e88f440746b791f8f1c4ce4ad8a595f42c980bd5", size = 1675319 }, - { url = "https://files.pythonhosted.org/packages/e5/d2/006c459c11218cabaa7bca401f965c9cc828efbdea7e1615d4644eaf23f7/aiohttp-3.11.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4016e383f91f2814e48ed61e6bda7d24c4d7f2402c75dd28f7e1027ae44ea204", size = 1619982 }, - { url = "https://files.pythonhosted.org/packages/9d/83/ca425891ebd37bee5d837110f7fddc4d808a7c6c126a7d1b5c3ad72fc6ba/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c0600bcc1adfaaac321422d615939ef300df81e165f6522ad096b73439c0f58", size = 1654176 }, - { url = "https://files.pythonhosted.org/packages/25/df/047b1ce88514a1b4915d252513640184b63624e7914e41d846668b8edbda/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0450ada317a65383b7cce9576096150fdb97396dcfe559109b403c7242faffef", size = 1660198 }, - { url = "https://files.pythonhosted.org/packages/d3/cc/6ecb8e343f0902528620b9dbd567028a936d5489bebd7dbb0dd0914f4fdb/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:850ff6155371fd802a280f8d369d4e15d69434651b844bde566ce97ee2277420", size = 1650186 }, - { url = "https://files.pythonhosted.org/packages/f8/f8/453df6dd69256ca8c06c53fc8803c9056e2b0b16509b070f9a3b4bdefd6c/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8fd12d0f989c6099e7b0f30dc6e0d1e05499f3337461f0b2b0dadea6c64b89df", size = 1733063 }, - { url = "https://files.pythonhosted.org/packages/55/f8/540160787ff3000391de0e5d0d1d33be4c7972f933c21991e2ea105b2d5e/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:76719dd521c20a58a6c256d058547b3a9595d1d885b830013366e27011ffe804", size = 1755306 }, - { url = "https://files.pythonhosted.org/packages/30/7d/49f3bfdfefd741576157f8f91caa9ff61a6f3d620ca6339268327518221b/aiohttp-3.11.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97fe431f2ed646a3b56142fc81d238abcbaff08548d6912acb0b19a0cadc146b", size = 1692909 }, - { url = "https://files.pythonhosted.org/packages/40/9c/8ce00afd6f6112ce9a2309dc490fea376ae824708b94b7b5ea9cba979d1d/aiohttp-3.11.12-cp311-cp311-win32.whl", hash = "sha256:e10c440d142fa8b32cfdb194caf60ceeceb3e49807072e0dc3a8887ea80e8c16", size = 416584 }, - { url = "https://files.pythonhosted.org/packages/35/97/4d3c5f562f15830de472eb10a7a222655d750839943e0e6d915ef7e26114/aiohttp-3.11.12-cp311-cp311-win_amd64.whl", hash = "sha256:246067ba0cf5560cf42e775069c5d80a8989d14a7ded21af529a4e10e3e0f0e6", size = 442674 }, - { url = "https://files.pythonhosted.org/packages/4d/d0/94346961acb476569fca9a644cc6f9a02f97ef75961a6b8d2b35279b8d1f/aiohttp-3.11.12-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e392804a38353900c3fd8b7cacbea5132888f7129f8e241915e90b85f00e3250", size = 704837 }, - { url = "https://files.pythonhosted.org/packages/a9/af/05c503f1cc8f97621f199ef4b8db65fb88b8bc74a26ab2adb74789507ad3/aiohttp-3.11.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8fa1510b96c08aaad49303ab11f8803787c99222288f310a62f493faf883ede1", size = 464218 }, - { url = "https://files.pythonhosted.org/packages/f2/48/b9949eb645b9bd699153a2ec48751b985e352ab3fed9d98c8115de305508/aiohttp-3.11.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dc065a4285307607df3f3686363e7f8bdd0d8ab35f12226362a847731516e42c", size = 456166 }, - { url = "https://files.pythonhosted.org/packages/14/fb/980981807baecb6f54bdd38beb1bd271d9a3a786e19a978871584d026dcf/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddb31f8474695cd61fc9455c644fc1606c164b93bff2490390d90464b4655df", size = 1682528 }, - { url = "https://files.pythonhosted.org/packages/90/cb/77b1445e0a716914e6197b0698b7a3640590da6c692437920c586764d05b/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dec0000d2d8621d8015c293e24589d46fa218637d820894cb7356c77eca3259", size = 1737154 }, - { url = "https://files.pythonhosted.org/packages/ff/24/d6fb1f4cede9ccbe98e4def6f3ed1e1efcb658871bbf29f4863ec646bf38/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3552fe98e90fdf5918c04769f338a87fa4f00f3b28830ea9b78b1bdc6140e0d", size = 1793435 }, - { url = "https://files.pythonhosted.org/packages/17/e2/9f744cee0861af673dc271a3351f59ebd5415928e20080ab85be25641471/aiohttp-3.11.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dfe7f984f28a8ae94ff3a7953cd9678550dbd2a1f9bda5dd9c5ae627744c78e", size = 1692010 }, - { url = "https://files.pythonhosted.org/packages/90/c4/4a1235c1df544223eb57ba553ce03bc706bdd065e53918767f7fa1ff99e0/aiohttp-3.11.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a481a574af914b6e84624412666cbfbe531a05667ca197804ecc19c97b8ab1b0", size = 1619481 }, - { url = "https://files.pythonhosted.org/packages/60/70/cf12d402a94a33abda86dd136eb749b14c8eb9fec1e16adc310e25b20033/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1987770fb4887560363b0e1a9b75aa303e447433c41284d3af2840a2f226d6e0", size = 1641578 }, - { url = "https://files.pythonhosted.org/packages/1b/25/7211973fda1f5e833fcfd98ccb7f9ce4fbfc0074e3e70c0157a751d00db8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a4ac6a0f0f6402854adca4e3259a623f5c82ec3f0c049374133bcb243132baf9", size = 1684463 }, - { url = "https://files.pythonhosted.org/packages/93/60/b5905b4d0693f6018b26afa9f2221fefc0dcbd3773fe2dff1a20fb5727f1/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c96a43822f1f9f69cc5c3706af33239489a6294be486a0447fb71380070d4d5f", size = 1646691 }, - { url = "https://files.pythonhosted.org/packages/b4/fc/ba1b14d6fdcd38df0b7c04640794b3683e949ea10937c8a58c14d697e93f/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a5e69046f83c0d3cb8f0d5bd9b8838271b1bc898e01562a04398e160953e8eb9", size = 1702269 }, - { url = "https://files.pythonhosted.org/packages/5e/39/18c13c6f658b2ba9cc1e0c6fb2d02f98fd653ad2addcdf938193d51a9c53/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:68d54234c8d76d8ef74744f9f9fc6324f1508129e23da8883771cdbb5818cbef", size = 1734782 }, - { url = "https://files.pythonhosted.org/packages/9f/d2/ccc190023020e342419b265861877cd8ffb75bec37b7ddd8521dd2c6deb8/aiohttp-3.11.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9fd9dcf9c91affe71654ef77426f5cf8489305e1c66ed4816f5a21874b094b9", size = 1694740 }, - { url = "https://files.pythonhosted.org/packages/3f/54/186805bcada64ea90ea909311ffedcd74369bfc6e880d39d2473314daa36/aiohttp-3.11.12-cp312-cp312-win32.whl", hash = "sha256:0ed49efcd0dc1611378beadbd97beb5d9ca8fe48579fc04a6ed0844072261b6a", size = 411530 }, - { url = "https://files.pythonhosted.org/packages/3d/63/5eca549d34d141bcd9de50d4e59b913f3641559460c739d5e215693cb54a/aiohttp-3.11.12-cp312-cp312-win_amd64.whl", hash = "sha256:54775858c7f2f214476773ce785a19ee81d1294a6bedc5cc17225355aab74802", size = 437860 }, - { url = "https://files.pythonhosted.org/packages/c3/9b/cea185d4b543ae08ee478373e16653722c19fcda10d2d0646f300ce10791/aiohttp-3.11.12-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:413ad794dccb19453e2b97c2375f2ca3cdf34dc50d18cc2693bd5aed7d16f4b9", size = 698148 }, - { url = "https://files.pythonhosted.org/packages/91/5c/80d47fe7749fde584d1404a68ade29bcd7e58db8fa11fa38e8d90d77e447/aiohttp-3.11.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a93d28ed4b4b39e6f46fd240896c29b686b75e39cc6992692e3922ff6982b4c", size = 460831 }, - { url = "https://files.pythonhosted.org/packages/8e/f9/de568f8a8ca6b061d157c50272620c53168d6e3eeddae78dbb0f7db981eb/aiohttp-3.11.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d589264dbba3b16e8951b6f145d1e6b883094075283dafcab4cdd564a9e353a0", size = 453122 }, - { url = "https://files.pythonhosted.org/packages/8b/fd/b775970a047543bbc1d0f66725ba72acef788028fce215dc959fd15a8200/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5148ca8955affdfeb864aca158ecae11030e952b25b3ae15d4e2b5ba299bad2", size = 1665336 }, - { url = "https://files.pythonhosted.org/packages/82/9b/aff01d4f9716245a1b2965f02044e4474fadd2bcfe63cf249ca788541886/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:525410e0790aab036492eeea913858989c4cb070ff373ec3bc322d700bdf47c1", size = 1718111 }, - { url = "https://files.pythonhosted.org/packages/e0/a9/166fd2d8b2cc64f08104aa614fad30eee506b563154081bf88ce729bc665/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bd8695be2c80b665ae3f05cb584093a1e59c35ecb7d794d1edd96e8cc9201d7", size = 1775293 }, - { url = "https://files.pythonhosted.org/packages/13/c5/0d3c89bd9e36288f10dc246f42518ce8e1c333f27636ac78df091c86bb4a/aiohttp-3.11.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0203433121484b32646a5f5ea93ae86f3d9559d7243f07e8c0eab5ff8e3f70e", size = 1677338 }, - { url = "https://files.pythonhosted.org/packages/72/b2/017db2833ef537be284f64ead78725984db8a39276c1a9a07c5c7526e238/aiohttp-3.11.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40cd36749a1035c34ba8d8aaf221b91ca3d111532e5ccb5fa8c3703ab1b967ed", size = 1603365 }, - { url = "https://files.pythonhosted.org/packages/fc/72/b66c96a106ec7e791e29988c222141dd1219d7793ffb01e72245399e08d2/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7442662afebbf7b4c6d28cb7aab9e9ce3a5df055fc4116cc7228192ad6cb484", size = 1618464 }, - { url = "https://files.pythonhosted.org/packages/3f/50/e68a40f267b46a603bab569d48d57f23508801614e05b3369898c5b2910a/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8a2fb742ef378284a50766e985804bd6adb5adb5aa781100b09befdbfa757b65", size = 1657827 }, - { url = "https://files.pythonhosted.org/packages/c5/1d/aafbcdb1773d0ba7c20793ebeedfaba1f3f7462f6fc251f24983ed738aa7/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cee3b117a8d13ab98b38d5b6bdcd040cfb4181068d05ce0c474ec9db5f3c5bb", size = 1616700 }, - { url = "https://files.pythonhosted.org/packages/b0/5e/6cd9724a2932f36e2a6b742436a36d64784322cfb3406ca773f903bb9a70/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f6a19bcab7fbd8f8649d6595624856635159a6527861b9cdc3447af288a00c00", size = 1685643 }, - { url = "https://files.pythonhosted.org/packages/8b/38/ea6c91d5c767fd45a18151675a07c710ca018b30aa876a9f35b32fa59761/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e4cecdb52aaa9994fbed6b81d4568427b6002f0a91c322697a4bfcc2b2363f5a", size = 1715487 }, - { url = "https://files.pythonhosted.org/packages/8e/24/e9edbcb7d1d93c02e055490348df6f955d675e85a028c33babdcaeda0853/aiohttp-3.11.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:30f546358dfa0953db92ba620101fefc81574f87b2346556b90b5f3ef16e55ce", size = 1672948 }, - { url = "https://files.pythonhosted.org/packages/25/be/0b1fb737268e003198f25c3a68c2135e76e4754bf399a879b27bd508a003/aiohttp-3.11.12-cp313-cp313-win32.whl", hash = "sha256:ce1bb21fc7d753b5f8a5d5a4bae99566386b15e716ebdb410154c16c91494d7f", size = 410396 }, - { url = "https://files.pythonhosted.org/packages/68/fd/677def96a75057b0a26446b62f8fbb084435b20a7d270c99539c26573bfd/aiohttp-3.11.12-cp313-cp313-win_amd64.whl", hash = "sha256:f7914ab70d2ee8ab91c13e5402122edbc77821c66d2758abb53aabe87f013287", size = 436234 }, -] - -[[package]] -name = "aiosignal" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anthropic" -version = "0.45.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/15/74/2b2485fc120da834c0c5be07462541ec082e9fa8851d845f2587e480535a/anthropic-0.45.2.tar.gz", hash = "sha256:32a18b9ecd12c91b2be4cae6ca2ab46a06937b5aa01b21308d97a6d29794fb5e", size = 200901 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/86/e81814e542d1eaeec84d2312bec93a99b9ef1d78d9bfae1fc5dd74abdf15/anthropic-0.45.2-py3-none-any.whl", hash = "sha256:ecd746f7274451dfcb7e1180571ead624c7e1195d1d46cb7c70143d2aedb4d35", size = 222797 }, -] - -[[package]] -name = "anyio" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, -] - -[[package]] -name = "async-timeout" -version = "4.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", size = 8345 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", size = 5721 }, -] - -[[package]] -name = "attrs" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, -] - -[[package]] -name = "beautifulsoup4" -version = "4.13.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, -] - -[[package]] -name = "bs4" -version = "0.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189 }, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser", marker = "platform_python_implementation == 'PyPy' or python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, - { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, - { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, - { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, - { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, - { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, - { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, - { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, - { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, - { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, - { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, - { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, - { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "cloudpickle" -version = "3.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "cryptography" -version = "43.0.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "python_full_version >= '3.11' and platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", size = 686989 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/f3/01fdf26701a26f4b4dbc337a26883ad5bccaa6f1bbbdd29cd89e22f18a1c/cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", size = 6225303 }, - { url = "https://files.pythonhosted.org/packages/a3/01/4896f3d1b392025d4fcbecf40fdea92d3df8662123f6835d0af828d148fd/cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", size = 3760905 }, - { url = "https://files.pythonhosted.org/packages/0a/be/f9a1f673f0ed4b7f6c643164e513dbad28dd4f2dcdf5715004f172ef24b6/cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", size = 3977271 }, - { url = "https://files.pythonhosted.org/packages/4e/49/80c3a7b5514d1b416d7350830e8c422a4d667b6d9b16a9392ebfd4a5388a/cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", size = 3746606 }, - { url = "https://files.pythonhosted.org/packages/0e/16/a28ddf78ac6e7e3f25ebcef69ab15c2c6be5ff9743dd0709a69a4f968472/cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", size = 3986484 }, - { url = "https://files.pythonhosted.org/packages/01/f5/69ae8da70c19864a32b0315049866c4d411cce423ec169993d0434218762/cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", size = 3852131 }, - { url = "https://files.pythonhosted.org/packages/fd/db/e74911d95c040f9afd3612b1f732e52b3e517cb80de8bf183be0b7d413c6/cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", size = 4075647 }, - { url = "https://files.pythonhosted.org/packages/56/48/7b6b190f1462818b324e674fa20d1d5ef3e24f2328675b9b16189cbf0b3c/cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", size = 2623873 }, - { url = "https://files.pythonhosted.org/packages/eb/b1/0ebff61a004f7f89e7b65ca95f2f2375679d43d0290672f7713ee3162aff/cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", size = 3068039 }, - { url = "https://files.pythonhosted.org/packages/30/d5/c8b32c047e2e81dd172138f772e81d852c51f0f2ad2ae8a24f1122e9e9a7/cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", size = 6222984 }, - { url = "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", size = 3762968 }, - { url = "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", size = 3977754 }, - { url = "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", size = 3749458 }, - { url = "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", size = 3988220 }, - { url = "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", size = 3853898 }, - { url = "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", size = 4076592 }, - { url = "https://files.pythonhosted.org/packages/81/1e/ffcc41b3cebd64ca90b28fd58141c5f68c83d48563c88333ab660e002cd3/cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", size = 2623145 }, - { url = "https://files.pythonhosted.org/packages/87/5c/3dab83cc4aba1f4b0e733e3f0c3e7d4386440d660ba5b1e3ff995feb734d/cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", size = 3068026 }, - { url = "https://files.pythonhosted.org/packages/6f/db/d8b8a039483f25fc3b70c90bc8f3e1d4497a99358d610c5067bf3bd4f0af/cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c", size = 3144545 }, - { url = "https://files.pythonhosted.org/packages/93/90/116edd5f8ec23b2dc879f7a42443e073cdad22950d3c8ee834e3b8124543/cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3", size = 3679828 }, - { url = "https://files.pythonhosted.org/packages/d8/32/1e1d78b316aa22c0ba6493cc271c1c309969e5aa5c22c830a1d7ce3471e6/cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83", size = 3908132 }, - { url = "https://files.pythonhosted.org/packages/91/bb/cd2c13be3332e7af3cdf16154147952d39075b9f61ea5e6b5241bf4bf436/cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7", size = 2988811 }, -] - -[[package]] -name = "dataclasses-json" -version = "0.6.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "marshmallow" }, - { name = "typing-inspect" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, -] - -[[package]] -name = "frozenlist" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/79/29d44c4af36b2b240725dce566b20f63f9b36ef267aaaa64ee7466f4f2f8/frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", size = 94451 }, - { url = "https://files.pythonhosted.org/packages/47/47/0c999aeace6ead8a44441b4f4173e2261b18219e4ad1fe9a479871ca02fc/frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", size = 54301 }, - { url = "https://files.pythonhosted.org/packages/8d/60/107a38c1e54176d12e06e9d4b5d755b677d71d1219217cee063911b1384f/frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", size = 52213 }, - { url = "https://files.pythonhosted.org/packages/17/62/594a6829ac5679c25755362a9dc93486a8a45241394564309641425d3ff6/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", size = 240946 }, - { url = "https://files.pythonhosted.org/packages/7e/75/6c8419d8f92c80dd0ee3f63bdde2702ce6398b0ac8410ff459f9b6f2f9cb/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", size = 264608 }, - { url = "https://files.pythonhosted.org/packages/88/3e/82a6f0b84bc6fb7e0be240e52863c6d4ab6098cd62e4f5b972cd31e002e8/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", size = 261361 }, - { url = "https://files.pythonhosted.org/packages/fd/85/14e5f9ccac1b64ff2f10c927b3ffdf88772aea875882406f9ba0cec8ad84/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", size = 231649 }, - { url = "https://files.pythonhosted.org/packages/ee/59/928322800306f6529d1852323014ee9008551e9bb027cc38d276cbc0b0e7/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", size = 241853 }, - { url = "https://files.pythonhosted.org/packages/7d/bd/e01fa4f146a6f6c18c5d34cab8abdc4013774a26c4ff851128cd1bd3008e/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", size = 243652 }, - { url = "https://files.pythonhosted.org/packages/a5/bd/e4771fd18a8ec6757033f0fa903e447aecc3fbba54e3630397b61596acf0/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", size = 241734 }, - { url = "https://files.pythonhosted.org/packages/21/13/c83821fa5544af4f60c5d3a65d054af3213c26b14d3f5f48e43e5fb48556/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", size = 260959 }, - { url = "https://files.pythonhosted.org/packages/71/f3/1f91c9a9bf7ed0e8edcf52698d23f3c211d8d00291a53c9f115ceb977ab1/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", size = 262706 }, - { url = "https://files.pythonhosted.org/packages/4c/22/4a256fdf5d9bcb3ae32622c796ee5ff9451b3a13a68cfe3f68e2c95588ce/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", size = 250401 }, - { url = "https://files.pythonhosted.org/packages/af/89/c48ebe1f7991bd2be6d5f4ed202d94960c01b3017a03d6954dd5fa9ea1e8/frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", size = 45498 }, - { url = "https://files.pythonhosted.org/packages/28/2f/cc27d5f43e023d21fe5c19538e08894db3d7e081cbf582ad5ed366c24446/frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", size = 51622 }, - { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987 }, - { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584 }, - { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499 }, - { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357 }, - { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516 }, - { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131 }, - { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320 }, - { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877 }, - { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592 }, - { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934 }, - { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859 }, - { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560 }, - { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150 }, - { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244 }, - { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634 }, - { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, - { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, - { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, - { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, - { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, - { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, - { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, - { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, - { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, - { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, - { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, - { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, - { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, - { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, - { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, - { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, - { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, - { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, - { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, - { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, - { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, - { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, - { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, - { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, - { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, - { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, - { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, - { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, - { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, - { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, - { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, -] - -[[package]] -name = "greenlet" -version = "3.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/90/5234a78dc0ef6496a6eb97b67a42a8e96742a56f7dc808cb954a85390448/greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", size = 271235 }, - { url = "https://files.pythonhosted.org/packages/7c/16/cd631fa0ab7d06ef06387135b7549fdcc77d8d859ed770a0d28e47b20972/greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", size = 637168 }, - { url = "https://files.pythonhosted.org/packages/2f/b1/aed39043a6fec33c284a2c9abd63ce191f4f1a07319340ffc04d2ed3256f/greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", size = 648826 }, - { url = "https://files.pythonhosted.org/packages/76/25/40e0112f7f3ebe54e8e8ed91b2b9f970805143efef16d043dfc15e70f44b/greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", size = 644443 }, - { url = "https://files.pythonhosted.org/packages/fb/2f/3850b867a9af519794784a7eeed1dd5bc68ffbcc5b28cef703711025fd0a/greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", size = 643295 }, - { url = "https://files.pythonhosted.org/packages/cf/69/79e4d63b9387b48939096e25115b8af7cd8a90397a304f92436bcb21f5b2/greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", size = 599544 }, - { url = "https://files.pythonhosted.org/packages/46/1d/44dbcb0e6c323bd6f71b8c2f4233766a5faf4b8948873225d34a0b7efa71/greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", size = 1125456 }, - { url = "https://files.pythonhosted.org/packages/e0/1d/a305dce121838d0278cee39d5bb268c657f10a5363ae4b726848f833f1bb/greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", size = 1149111 }, - { url = "https://files.pythonhosted.org/packages/96/28/d62835fb33fb5652f2e98d34c44ad1a0feacc8b1d3f1aecab035f51f267d/greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", size = 298392 }, - { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479 }, - { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404 }, - { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813 }, - { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517 }, - { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831 }, - { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413 }, - { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619 }, - { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198 }, - { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930 }, - { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260 }, - { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064 }, - { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420 }, - { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035 }, - { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105 }, - { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077 }, - { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975 }, - { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955 }, - { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655 }, - { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990 }, - { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175 }, - { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425 }, - { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736 }, - { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347 }, - { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583 }, - { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039 }, - { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716 }, - { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490 }, - { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731 }, - { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304 }, - { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537 }, - { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506 }, - { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753 }, - { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731 }, - { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "httpx-sse" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "jiter" -version = "0.8.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/70/90bc7bd3932e651486861df5c8ffea4ca7c77d28e8532ddefe2abc561a53/jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d", size = 163007 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/f3/8c11e0e87bd5934c414f9b1cfae3cbfd4a938d4669d57cb427e1c4d11a7f/jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b", size = 303381 }, - { url = "https://files.pythonhosted.org/packages/ea/28/4cd3f0bcbf40e946bc6a62a82c951afc386a25673d3d8d5ee461f1559bbe/jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393", size = 311718 }, - { url = "https://files.pythonhosted.org/packages/0d/17/57acab00507e60bd954eaec0837d9d7b119b4117ff49b8a62f2b646f32ed/jiter-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c826a221851a8dc028eb6d7d6429ba03184fa3c7e83ae01cd6d3bd1d4bd17d", size = 335465 }, - { url = "https://files.pythonhosted.org/packages/74/b9/1a3ddd2bc95ae17c815b021521020f40c60b32137730126bada962ef32b4/jiter-0.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d35c864c2dff13dfd79fb070fc4fc6235d7b9b359efe340e1261deb21b9fcb66", size = 355570 }, - { url = "https://files.pythonhosted.org/packages/78/69/6d29e2296a934199a7d0dde673ecccf98c9c8db44caf0248b3f2b65483cb/jiter-0.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f557c55bc2b7676e74d39d19bcb8775ca295c7a028246175d6a8b431e70835e5", size = 381383 }, - { url = "https://files.pythonhosted.org/packages/22/d7/fbc4c3fb1bf65f9be22a32759b539f88e897aeb13fe84ab0266e4423487a/jiter-0.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:580ccf358539153db147e40751a0b41688a5ceb275e6f3e93d91c9467f42b2e3", size = 390454 }, - { url = "https://files.pythonhosted.org/packages/4d/a0/3993cda2e267fe679b45d0bcc2cef0b4504b0aa810659cdae9737d6bace9/jiter-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af102d3372e917cffce49b521e4c32c497515119dc7bd8a75665e90a718bbf08", size = 345039 }, - { url = "https://files.pythonhosted.org/packages/b9/ef/69c18562b4c09ce88fab5df1dcaf643f6b1a8b970b65216e7221169b81c4/jiter-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cadcc978f82397d515bb2683fc0d50103acff2a180552654bb92d6045dec2c49", size = 376200 }, - { url = "https://files.pythonhosted.org/packages/4d/17/0b5a8de46a6ab4d836f70934036278b49b8530c292b29dde3483326d4555/jiter-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba5bdf56969cad2019d4e8ffd3f879b5fdc792624129741d3d83fc832fef8c7d", size = 511158 }, - { url = "https://files.pythonhosted.org/packages/6c/b2/c401a0a2554b36c9e6d6e4876b43790d75139cf3936f0222e675cbc23451/jiter-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b94a33a241bee9e34b8481cdcaa3d5c2116f575e0226e421bed3f7a6ea71cff", size = 503956 }, - { url = "https://files.pythonhosted.org/packages/d4/02/a0291ed7d72c0ac130f172354ee3cf0b2556b69584de391463a8ee534f40/jiter-0.8.2-cp310-cp310-win32.whl", hash = "sha256:6e5337bf454abddd91bd048ce0dca5134056fc99ca0205258766db35d0a2ea43", size = 202846 }, - { url = "https://files.pythonhosted.org/packages/ad/20/8c988831ae4bf437e29f1671e198fc99ba8fe49f2895f23789acad1d1811/jiter-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:4a9220497ca0cb1fe94e3f334f65b9b5102a0b8147646118f020d8ce1de70105", size = 204414 }, - { url = "https://files.pythonhosted.org/packages/cb/b0/c1a7caa7f9dc5f1f6cfa08722867790fe2d3645d6e7170ca280e6e52d163/jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b", size = 303666 }, - { url = "https://files.pythonhosted.org/packages/f5/97/0468bc9eeae43079aaa5feb9267964e496bf13133d469cfdc135498f8dd0/jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15", size = 311934 }, - { url = "https://files.pythonhosted.org/packages/e5/69/64058e18263d9a5f1e10f90c436853616d5f047d997c37c7b2df11b085ec/jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0", size = 335506 }, - { url = "https://files.pythonhosted.org/packages/9d/14/b747f9a77b8c0542141d77ca1e2a7523e854754af2c339ac89a8b66527d6/jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f", size = 355849 }, - { url = "https://files.pythonhosted.org/packages/53/e2/98a08161db7cc9d0e39bc385415890928ff09709034982f48eccfca40733/jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099", size = 381700 }, - { url = "https://files.pythonhosted.org/packages/7a/38/1674672954d35bce3b1c9af99d5849f9256ac8f5b672e020ac7821581206/jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74", size = 389710 }, - { url = "https://files.pythonhosted.org/packages/f8/9b/92f9da9a9e107d019bcf883cd9125fa1690079f323f5a9d5c6986eeec3c0/jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586", size = 345553 }, - { url = "https://files.pythonhosted.org/packages/44/a6/6d030003394e9659cd0d7136bbeabd82e869849ceccddc34d40abbbbb269/jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc", size = 376388 }, - { url = "https://files.pythonhosted.org/packages/ad/8d/87b09e648e4aca5f9af89e3ab3cfb93db2d1e633b2f2931ede8dabd9b19a/jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88", size = 511226 }, - { url = "https://files.pythonhosted.org/packages/77/95/8008ebe4cdc82eac1c97864a8042ca7e383ed67e0ec17bfd03797045c727/jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6", size = 504134 }, - { url = "https://files.pythonhosted.org/packages/26/0d/3056a74de13e8b2562e4d526de6dac2f65d91ace63a8234deb9284a1d24d/jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44", size = 203103 }, - { url = "https://files.pythonhosted.org/packages/4e/1e/7f96b798f356e531ffc0f53dd2f37185fac60fae4d6c612bbbd4639b90aa/jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855", size = 206717 }, - { url = "https://files.pythonhosted.org/packages/a1/17/c8747af8ea4e045f57d6cfd6fc180752cab9bc3de0e8a0c9ca4e8af333b1/jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f", size = 302027 }, - { url = "https://files.pythonhosted.org/packages/3c/c1/6da849640cd35a41e91085723b76acc818d4b7d92b0b6e5111736ce1dd10/jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44", size = 310326 }, - { url = "https://files.pythonhosted.org/packages/06/99/a2bf660d8ccffee9ad7ed46b4f860d2108a148d0ea36043fd16f4dc37e94/jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f", size = 334242 }, - { url = "https://files.pythonhosted.org/packages/a7/5f/cea1c17864828731f11427b9d1ab7f24764dbd9aaf4648a7f851164d2718/jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60", size = 356654 }, - { url = "https://files.pythonhosted.org/packages/e9/13/62774b7e5e7f5d5043efe1d0f94ead66e6d0f894ae010adb56b3f788de71/jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57", size = 379967 }, - { url = "https://files.pythonhosted.org/packages/ec/fb/096b34c553bb0bd3f2289d5013dcad6074948b8d55212aa13a10d44c5326/jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e", size = 389252 }, - { url = "https://files.pythonhosted.org/packages/17/61/beea645c0bf398ced8b199e377b61eb999d8e46e053bb285c91c3d3eaab0/jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887", size = 345490 }, - { url = "https://files.pythonhosted.org/packages/d5/df/834aa17ad5dcc3cf0118821da0a0cf1589ea7db9832589278553640366bc/jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d", size = 376991 }, - { url = "https://files.pythonhosted.org/packages/67/80/87d140399d382fb4ea5b3d56e7ecaa4efdca17cd7411ff904c1517855314/jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152", size = 510822 }, - { url = "https://files.pythonhosted.org/packages/5c/37/3394bb47bac1ad2cb0465601f86828a0518d07828a650722e55268cdb7e6/jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29", size = 503730 }, - { url = "https://files.pythonhosted.org/packages/f9/e2/253fc1fa59103bb4e3aa0665d6ceb1818df1cd7bf3eb492c4dad229b1cd4/jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e", size = 203375 }, - { url = "https://files.pythonhosted.org/packages/41/69/6d4bbe66b3b3b4507e47aa1dd5d075919ad242b4b1115b3f80eecd443687/jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c", size = 204740 }, - { url = "https://files.pythonhosted.org/packages/6c/b0/bfa1f6f2c956b948802ef5a021281978bf53b7a6ca54bb126fd88a5d014e/jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84", size = 301190 }, - { url = "https://files.pythonhosted.org/packages/a4/8f/396ddb4e292b5ea57e45ade5dc48229556b9044bad29a3b4b2dddeaedd52/jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4", size = 309334 }, - { url = "https://files.pythonhosted.org/packages/7f/68/805978f2f446fa6362ba0cc2e4489b945695940656edd844e110a61c98f8/jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587", size = 333918 }, - { url = "https://files.pythonhosted.org/packages/b3/99/0f71f7be667c33403fa9706e5b50583ae5106d96fab997fa7e2f38ee8347/jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c", size = 356057 }, - { url = "https://files.pythonhosted.org/packages/8d/50/a82796e421a22b699ee4d2ce527e5bcb29471a2351cbdc931819d941a167/jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18", size = 379790 }, - { url = "https://files.pythonhosted.org/packages/3c/31/10fb012b00f6d83342ca9e2c9618869ab449f1aa78c8f1b2193a6b49647c/jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6", size = 388285 }, - { url = "https://files.pythonhosted.org/packages/c8/81/f15ebf7de57be488aa22944bf4274962aca8092e4f7817f92ffa50d3ee46/jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef", size = 344764 }, - { url = "https://files.pythonhosted.org/packages/b3/e8/0cae550d72b48829ba653eb348cdc25f3f06f8a62363723702ec18e7be9c/jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1", size = 376620 }, - { url = "https://files.pythonhosted.org/packages/b8/50/e5478ff9d82534a944c03b63bc217c5f37019d4a34d288db0f079b13c10b/jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9", size = 510402 }, - { url = "https://files.pythonhosted.org/packages/8e/1e/3de48bbebbc8f7025bd454cedc8c62378c0e32dd483dece5f4a814a5cb55/jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05", size = 503018 }, - { url = "https://files.pythonhosted.org/packages/d5/cd/d5a5501d72a11fe3e5fd65c78c884e5164eefe80077680533919be22d3a3/jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a", size = 203190 }, - { url = "https://files.pythonhosted.org/packages/51/bf/e5ca301245ba951447e3ad677a02a64a8845b185de2603dabd83e1e4b9c6/jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865", size = 203551 }, - { url = "https://files.pythonhosted.org/packages/2f/3c/71a491952c37b87d127790dd7a0b1ebea0514c6b6ad30085b16bbe00aee6/jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca", size = 308347 }, - { url = "https://files.pythonhosted.org/packages/a0/4c/c02408042e6a7605ec063daed138e07b982fdb98467deaaf1c90950cf2c6/jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0", size = 342875 }, - { url = "https://files.pythonhosted.org/packages/91/61/c80ef80ed8a0a21158e289ef70dac01e351d929a1c30cb0f49be60772547/jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566", size = 202374 }, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpointer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, -] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, -] - -[[package]] -name = "jsonschema-rs" -version = "0.28.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/b1/9e7bbef55625f9305493c7c3ffcb6128a756d43a91c1d87e172758a3325a/jsonschema_rs-0.28.3.tar.gz", hash = "sha256:397dfc6cb636d758debb479b8e7102439c43e4596e5ce070f13ebe0696834fb6", size = 1388776 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/3d/0f400ce4fe253525b503eaebb111ec5762e4ea0c535aca731b60ae9a11f6/jsonschema_rs-0.28.3-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9b618d88953a4a8524bc9f151529841b5d29415ac14aabdbc83a161b9723604c", size = 3799006 }, - { url = "https://files.pythonhosted.org/packages/28/2c/c45cdef4d774a3ebba92527fa680666d2f10e65c3a4d86bd2c93d50c3118/jsonschema_rs-0.28.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:15341621d5c2634476fc8946414004b18609005b4d651f7211fa866c8a446b70", size = 1953805 }, - { url = "https://files.pythonhosted.org/packages/3b/37/334de417391bdaab3827ecc5f34db06139357f862638db4827d9e789eb96/jsonschema_rs-0.28.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3386cbfcd41b54449fce428556bf66d169c06587a613bdf995dbd4760eb5d5d3", size = 2047549 }, - { url = "https://files.pythonhosted.org/packages/de/68/b7619d5ed80b8f139fe73288badce0c2805f19a2536e43bd29b9dbb5d9b5/jsonschema_rs-0.28.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50398d193f88a4ff2a0382d350eea71478c12aa04ef8bb79a97c255114714b26", size = 2048791 }, - { url = "https://files.pythonhosted.org/packages/22/a2/c60a1586362f0d751942fed7de2ff607f4f91069e434c9996da733a672c2/jsonschema_rs-0.28.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ff410bee6278c178bc7f1a23d95526641a05ba1cbf9af53dcce446758b2333e", size = 2065555 }, - { url = "https://files.pythonhosted.org/packages/60/d4/939e32fec0dd59664e5276b3492b260a94c8303ea01bf8e085f1efee760c/jsonschema_rs-0.28.3-cp310-cp310-win32.whl", hash = "sha256:690a46d99b72b761a55c9f1ac2be9bbafac1351ea1c63be3b04a20f871b4b062", size = 1689682 }, - { url = "https://files.pythonhosted.org/packages/0c/81/af0d0726f2bb56c1905fe4896868347dd1c289d16c5d52206e6da80d28b3/jsonschema_rs-0.28.3-cp310-cp310-win_amd64.whl", hash = "sha256:913e167ed94a360c8f4f349e998e7f5f15f75a2be0cda88a33d8dc96391e27cc", size = 1857951 }, - { url = "https://files.pythonhosted.org/packages/1d/71/10a3447a9faad05117469fc8a77b275836afbcae01c8f0a839d6e4141051/jsonschema_rs-0.28.3-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0fae1afa96f20028ead87bbf416875ac6eb9f908b64f02ea1eeb588a7d5d7aa4", size = 3799212 }, - { url = "https://files.pythonhosted.org/packages/be/01/14f3fed2fde345ea3b2d05b819f815a5fb0966f283102b1c332386592a44/jsonschema_rs-0.28.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5883fc72d20f692b6f5bac817e4163acbc0d8c8bd525acea43ceed380e216fb2", size = 1953990 }, - { url = "https://files.pythonhosted.org/packages/6e/6d/c08521bccfeffdc1b673f98ebaefbbca03ce380edc24b06f782c2e41fc69/jsonschema_rs-0.28.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d00356e5da059efd290877a7614be132079170b883afb059cdb1d1a0d9ca2a82", size = 2047754 }, - { url = "https://files.pythonhosted.org/packages/2a/49/043dbdc9946bb3b7e4ac506055af11d4d4ea2ba92109377150bfd3a8508b/jsonschema_rs-0.28.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1363a27a3b8994a7fc1bafdfd746e700576ccb6349301550f7fc566c79e5ee9", size = 2048797 }, - { url = "https://files.pythonhosted.org/packages/a6/16/661d66de6802848502d67a9579234776a18129b7968f6d21112b854ceb71/jsonschema_rs-0.28.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbbfb819ee151fda5ba22caf941045b04cea2cd168c396c757b220c21b573b9c", size = 2065208 }, - { url = "https://files.pythonhosted.org/packages/b4/aa/8b055722949a8658f6f942a537e5e625806c6742ea8bdd9b08af869de550/jsonschema_rs-0.28.3-cp311-cp311-win32.whl", hash = "sha256:88a10a768f1505741faccac4f3f6b47dba30c4e1223f69c7996d3b15df7c7862", size = 1689781 }, - { url = "https://files.pythonhosted.org/packages/a8/8f/0db16c7dd9926bcb13b2f4a8875c6ca31bebbf7db4aa82daa32b77518bb5/jsonschema_rs-0.28.3-cp311-cp311-win_amd64.whl", hash = "sha256:a754afa61a367174ed7426cbce1ad2cb6414aa516fc3a061cc65c719a435cc62", size = 1857950 }, - { url = "https://files.pythonhosted.org/packages/ee/49/b94d3ccfb46fc25f544ff3fd62086a940725127726f906061e48aaea74cf/jsonschema_rs-0.28.3-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:eb568712c5699872c1294d44990e87dbeb6fb589294edd930ef07929119ac30f", size = 3794880 }, - { url = "https://files.pythonhosted.org/packages/14/e7/e7a41d041fd6fab2b8539c55b3bbbc17e75717725de2beb0064cb5ac3284/jsonschema_rs-0.28.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:03f6fa4dc359e0ef5c5e30554d54a977ec96b23be077fcfed1408790038edf21", size = 1950067 }, - { url = "https://files.pythonhosted.org/packages/3b/2b/69a4d0ebac3dac0e34cbe8843541ba36533d1e2a2ff86a9da84016d3e50e/jsonschema_rs-0.28.3-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a081ee97375cc7cf5eb5b6581371057416486479e041e483af9f353f189e7c8c", size = 2043352 }, - { url = "https://files.pythonhosted.org/packages/46/22/764034f82f13319444d84c7258c1928e885ea59391c888df558828d2f8eb/jsonschema_rs-0.28.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e58794cb2d7ea2089d7571c5868c3b26fa72f55e334e3b3416a05e7382012217", size = 2046369 }, - { url = "https://files.pythonhosted.org/packages/10/41/5977df24a80a20cb2b3cf9c957adf7234b7938724893811582db129f853d/jsonschema_rs-0.28.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8137f2be8d59078a0ae8f48dcaceae96084c9d224ca41f86cff898505120854d", size = 2064022 }, - { url = "https://files.pythonhosted.org/packages/b0/1a/959f7617f51c16169b4ee9acbccb457a9d22dde03b8f4c35f64fb42d4979/jsonschema_rs-0.28.3-cp312-cp312-win32.whl", hash = "sha256:5e8ed6749c4ba50199048d9d0ae5924d28e5b2662f9d4d4f3fe28727dddd247d", size = 1688361 }, - { url = "https://files.pythonhosted.org/packages/8a/a4/034961996c6682230943f8327894be5839bfbebfafc8a1e1f4e800ca6b61/jsonschema_rs-0.28.3-cp312-cp312-win_amd64.whl", hash = "sha256:8b09e065f7f8312615bed014e6dc8143d817a312bcf6f778e0dfa3a5e021f4ed", size = 1857887 }, - { url = "https://files.pythonhosted.org/packages/76/be/eede6581024c2b20bd5b487738d0b3c33de9e465903d529255ae9914b924/jsonschema_rs-0.28.3-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f55a7f5bc39bd52b69ec72c5246c671e6a6999881beb9e86d528ce59f71b0c6b", size = 3794390 }, - { url = "https://files.pythonhosted.org/packages/ac/1d/5fe5f29c4cbcaab6e16f5e49b91c10e3719f630b53e4ba970c401fce8afe/jsonschema_rs-0.28.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5bbf37274afa7a5a55ceef6259081b07715aba27526580a39c1a4e6298dac063", size = 1949599 }, - { url = "https://files.pythonhosted.org/packages/f7/a1/711370d23d49b9e00b264f4e1a032121f4d08e08d6c411e8f2180f8a108e/jsonschema_rs-0.28.3-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b442331f7360e88b8243cf6236e35290e086ccca146cc34de5d5c8978cfa6a3c", size = 2042872 }, - { url = "https://files.pythonhosted.org/packages/8b/77/30240b8b40b3fbb27d60c0ba9b9d99ade1a19e60bddf585aec0fcd0e1b86/jsonschema_rs-0.28.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fe51c50f92ca4dcbd8016da06a195db866d018c2d7647ac76a86a286b4c86c3", size = 2046248 }, - { url = "https://files.pythonhosted.org/packages/87/bc/ff47e8227dde029f2a166fd3ca10fc796f0f753d712b9a72685b805f32e7/jsonschema_rs-0.28.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ea43162fb54910a239c939f5ff2f145599a3e88e344d41de02ef3639a116ac", size = 2063387 }, - { url = "https://files.pythonhosted.org/packages/c1/8c/6c09ffafe68b8ae2f83736e429776c2456c82ec6b42b6a9b3fe530b58c9b/jsonschema_rs-0.28.3-cp313-cp313-win32.whl", hash = "sha256:eee26f230abcb3c4919effff9e6bf26e9f0e5c2f827c7f78af43c655c20782a8", size = 1688379 }, - { url = "https://files.pythonhosted.org/packages/c7/28/25570b02c76901633c7da5eebfa580055bd2995a94ed12eced693e653f19/jsonschema_rs-0.28.3-cp313-cp313-win_amd64.whl", hash = "sha256:b6616d25244f81c697f965c6dae9d79d3069c6f26daf7ccdbb8973243a97490f", size = 1857361 }, -] - -[[package]] -name = "langchain" -version = "0.3.17" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "langchain-core" }, - { name = "langchain-text-splitters" }, - { name = "langsmith" }, - { name = "numpy" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, - { name = "tenacity" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/71/7082a79379105c0c3c327a817a58075686e6f31b05f823dbcce3f04831f4/langchain-0.3.17.tar.gz", hash = "sha256:cef56f0a7c8369f35f1fa2690ecf0caa4504a36a5383de0eb29b8a5e26f625a0", size = 421568 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/65/e5cc2876078fa5f1a621c8429f0174855c7e9831060d350626dbf8d2a10c/langchain-0.3.17-py3-none-any.whl", hash = "sha256:4d6d3cf454cc261a5017fd1fa5014cffcc7aeaccd0ec0530fc10c5f71e6e97a0", size = 1010032 }, -] - -[[package]] -name = "langchain-anthropic" -version = "0.3.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anthropic" }, - { name = "defusedxml" }, - { name = "langchain-core" }, - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/fc/5d0d6cd185c803b320ef9c5b0b9fd43c2a43b4622cefd9531d5aae8e8136/langchain_anthropic-0.3.6.tar.gz", hash = "sha256:1cfca1938d26c40c4f3e28a2dcb28860681a606f71b53cd54c340e95b9d366b0", size = 21402 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/d4/57659f4995d9d82a637b39b4de6614e0966b63eaacdf32e48260d9367912/langchain_anthropic-0.3.6-py3-none-any.whl", hash = "sha256:fdd07ba53be38cfe40a22265f1c48fe71a71c0c2b0884702f3de0ff647cf4c89", size = 22817 }, -] - -[[package]] -name = "langchain-community" -version = "0.3.16" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "dataclasses-json" }, - { name = "httpx-sse" }, - { name = "langchain" }, - { name = "langchain-core" }, - { name = "langsmith" }, - { name = "numpy" }, - { name = "pydantic-settings" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, - { name = "tenacity" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/10/981e8980538d622cec2ce312ab5f307bc9b5dc43cf986be89273d6c24ede/langchain_community-0.3.16.tar.gz", hash = "sha256:825709bc328e294942b045d0b7f55053e8e88f7f943576306d778cf56417126c", size = 1729980 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/04/ba77fbbb408b233ac82eeea57ba4d988da67dcf60ad10a165691406f7de6/langchain_community-0.3.16-py3-none-any.whl", hash = "sha256:a702c577b048d48882a46708bb3e08ca9aec79657c421c3241a305409040c0d6", size = 2513021 }, -] - -[[package]] -name = "langchain-core" -version = "0.3.33" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/b3/426268e07273c395affc6dd02cdf89803888121cfc59ce60922f363aeff8/langchain_core-0.3.33.tar.gz", hash = "sha256:b5dd93a4e7f8198d2fc6048723b0bfecf7aaf128b0d268cbac19c34c1579b953", size = 331492 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/463bc92174555cc04b3e234faa169bb8b58f36fff77892d7b8ae2b4f58e4/langchain_core-0.3.33-py3-none-any.whl", hash = "sha256:269706408a2223f863ff1f9616f31903a5712403199d828b50aadbc4c28b553a", size = 412656 }, -] - -[[package]] -name = "langchain-text-splitters" -version = "0.3.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/35/a6f8d6b1bb0e6e8c00b49bce4d1a115f8b68368b1899f65bb34dbbb44160/langchain_text_splitters-0.3.5.tar.gz", hash = "sha256:11cb7ca3694e5bdd342bc16d3875b7f7381651d4a53cbb91d34f22412ae16443", size = 26318 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/83/f8081c3bea416bd9d9f0c26af795c74f42c24f9ad3c4fbf361b7d69de134/langchain_text_splitters-0.3.5-py3-none-any.whl", hash = "sha256:8c9b059827438c5fa8f327b4df857e307828a5ec815163c9b5c9569a3e82c8ee", size = 31620 }, -] - -[[package]] -name = "langgraph" -version = "0.2.69" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "langchain-core" }, - { name = "langgraph-checkpoint", version = "2.0.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "langgraph-checkpoint", version = "2.0.23", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "langgraph-sdk", version = "0.1.51", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "langgraph-sdk", version = "0.1.59", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9b/36/d75836c6c1b4a817bb22f591137dc533be02fdba171df4d80eac49e22043/langgraph-0.2.69.tar.gz", hash = "sha256:77bd6efd967b4f092ec31d2148b3e6ba3c31e202b4f3a975dbb082b19b5bb057", size = 128593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/be/f3489ee7a67bb5bb3dc256b9e95d19a44c31e337f0345a38b443018355e3/langgraph-0.2.69-py3-none-any.whl", hash = "sha256:b64a5755fa2c7f2f67608ff4ce0ef8c168b30a0fb551a6c1d2e19bf1d2268ce4", size = 148716 }, -] - -[[package]] -name = "langgraph-api" -version = "0.0.37" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cloudpickle", marker = "python_full_version >= '3.11'" }, - { name = "cryptography", marker = "python_full_version >= '3.11'" }, - { name = "httpx", marker = "python_full_version >= '3.11'" }, - { name = "jsonschema-rs", marker = "python_full_version >= '3.11'" }, - { name = "langchain-core", marker = "python_full_version >= '3.11'" }, - { name = "langgraph", marker = "python_full_version >= '3.11'" }, - { name = "langgraph-checkpoint", version = "2.0.23", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "langgraph-sdk", version = "0.1.59", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "langsmith", marker = "python_full_version >= '3.11'" }, - { name = "orjson", marker = "python_full_version >= '3.11'" }, - { name = "pyjwt", marker = "python_full_version >= '3.11'" }, - { name = "sse-starlette", marker = "python_full_version >= '3.11'" }, - { name = "starlette", marker = "python_full_version >= '3.11'" }, - { name = "structlog", marker = "python_full_version >= '3.11'" }, - { name = "tenacity", marker = "python_full_version >= '3.11'" }, - { name = "uvicorn", marker = "python_full_version >= '3.11'" }, - { name = "watchfiles", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/bd/88d06841bbc81f2b6efad2f708e307efb720706cc49abb6c2817b6a0093c/langgraph_api-0.0.37.tar.gz", hash = "sha256:2370d461aabace3eca00fb5f28f1da492d3bd57655268e423a4e10448bd54804", size = 192143 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/34/e49f55873cb76cfb344a993558642df955a029e4c2793fa4430ae0fede36/langgraph_api-0.0.37-py3-none-any.whl", hash = "sha256:c6131e904f88a862bc39c7957c336c81f33bb0a35affe43196c436698e4a043a", size = 220987 }, -] - -[[package]] -name = "langgraph-checkpoint" -version = "2.0.10" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.11' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "langchain-core", marker = "python_full_version < '3.11'" }, - { name = "msgpack", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/96/378e06c60d8c8cf44e1d6a2b669e9d5d87236bdee6bf7cfc9125ef5b5d0e/langgraph_checkpoint-2.0.10.tar.gz", hash = "sha256:2dcc04e09091d588bb6209e49d83ff5406d7231c2590d6ff18fb29ab8b140129", size = 33431 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/ef/c320b52035e29081f2693377602289a00545016b4adcc963d5e202ac0c92/langgraph_checkpoint-2.0.10-py3-none-any.whl", hash = "sha256:0d592cfda2df93844c6ea44d142170a8f7e5ba5320274e0e5e60e27f2749392c", size = 37476 }, -] - -[[package]] -name = "langgraph-checkpoint" -version = "2.0.23" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.12.4'", - "python_full_version >= '3.12.4'", -] -dependencies = [ - { name = "langchain-core", marker = "python_full_version >= '3.11'" }, - { name = "ormsgpack", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/86/cca9b5d05c0ea64b03cd9e845da6b37f83a22ea13abb7b328ca5dfe48474/langgraph_checkpoint-2.0.23.tar.gz", hash = "sha256:38bd1fe451b569b773fef6e3daecdeb85f3deac2d94f7551bfd20f1818042c8a", size = 37268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/8d/e23bc15809c4a29e83efab34e7ff1ffb6dadac26b87aca98242ac6033934/langgraph_checkpoint-2.0.23-py3-none-any.whl", hash = "sha256:e54d070124f685eab095bd87e4df35dc5eca11d1e28553d5803c28c5f571b4e0", size = 41941 }, -] - -[[package]] -name = "langgraph-cli" -version = "0.1.80" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b5/2b/ba33e45ea8cca0e11bf3df5b4e1a42c361eca49448b8d6de6b948d9f17dc/langgraph_cli-0.1.80.tar.gz", hash = "sha256:a3ae17586b166a710119cd2d93395e1289e99c2377863544a5e163334fbfdc6a", size = 29823 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/15/63210d45f7205e15c9982b68ea0653d52bcfd2732a42522d6f9780530a8b/langgraph_cli-0.1.80-py3-none-any.whl", hash = "sha256:cf389f108d26cb367ee064d95872199cc77963dd743bbc198c38d798058c5ba3", size = 32305 }, -] - -[package.optional-dependencies] -inmem = [ - { name = "langgraph-api", marker = "python_full_version >= '3.11' and python_full_version < '4.0'" }, - { name = "python-dotenv" }, -] - -[[package]] -name = "langgraph-sdk" -version = "0.1.51" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.11' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "httpx", marker = "python_full_version < '3.11'" }, - { name = "orjson", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/32/d1/95ae599428e8e7d90229e402adf3056072f2ebd0c45c7f7154a5243ff35a/langgraph_sdk-0.1.51.tar.gz", hash = "sha256:dea1363e72562cb1e82a2d156be8d5b1a69ff3fe8815eee0e1e7a2f423242ec1", size = 41591 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/e9/d5d2ea883ddb3e16d4c18213457b3f3d04380089d410db71faae52a3c34a/langgraph_sdk-0.1.51-py3-none-any.whl", hash = "sha256:ce2b58466d1700d06149782ed113157a8694a6d7932c801f316cd13fab315fe4", size = 44652 }, -] - -[[package]] -name = "langgraph-sdk" -version = "0.1.59" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.12.4'", - "python_full_version >= '3.12.4'", -] -dependencies = [ - { name = "httpx", marker = "python_full_version >= '3.11'" }, - { name = "orjson", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/31/09/a26b1ea39acd2c0b86a0334f710c60a3412929566391541a688c146c00b1/langgraph_sdk-0.1.59.tar.gz", hash = "sha256:c125ef6723d7568dd848026c61ac3c671f9bd720ff4867557a2a349b89a822fe", size = 43912 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/d0/bc31180da80787001fb06d519c434b4c4b470487c48ff91594786471cff4/langgraph_sdk-0.1.59-py3-none-any.whl", hash = "sha256:9733f94e50f69de7fb94dbaef809124f96efa5933f54ab8d21f2d185d23e7725", size = 47025 }, -] - -[[package]] -name = "langsmith" -version = "0.3.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "zstandard" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/51/e1ac40ab13a8c13c71b28ab4b71686dfc5f1acd7a8096226d170628d7c3a/langsmith-0.3.6.tar.gz", hash = "sha256:ed2f26fbdf095c588cb1fcc1f98c2dd0de452c76f8496d5ff0557031ecbca095", size = 321431 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/84/5e2f1302d875d2d014778d86de832c95f2d7c30ece6ec1ec1943d78fe9ce/langsmith-0.3.6-py3-none-any.whl", hash = "sha256:f1784472a3bf8d6fe418e914e4d07043ecb1e578aa5fc9e1f116d738dc56d013", size = 332818 }, -] - -[[package]] -name = "marshmallow" -version = "3.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878 }, -] - -[[package]] -name = "middleman-ai" -version = "0.0.4" -source = { editable = "../../" } -dependencies = [ - { name = "click" }, - { name = "langchain-core" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "typing-extensions" }, -] - -[package.metadata] -requires-dist = [ - { name = "click", specifier = ">=8.0.0" }, - { name = "langchain-core", specifier = ">=0.3" }, - { name = "pydantic", specifier = ">=2" }, - { name = "requests", specifier = ">=2" }, - { name = "typing-extensions" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "black", specifier = ">=25.1.0" }, - { name = "mypy", specifier = ">=1.14.1" }, - { name = "pytest", specifier = ">=8.3.4" }, - { name = "pytest-cov", specifier = ">=6.0.0" }, - { name = "pytest-mock", specifier = ">=3.14.0" }, - { name = "pytest-vcr", specifier = ">=1.0.2" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "ruff", specifier = ">=0.9.6" }, - { name = "setuptools", specifier = ">=75.8.0" }, - { name = "setuptools-scm", specifier = ">=8.1.0" }, - { name = "twine", specifier = ">=6.1.0" }, - { name = "types-requests", specifier = ">=2.32.0.20241016" }, - { name = "vcrpy", specifier = ">=5.1.0" }, - { name = "wheel", specifier = ">=0.45.1" }, -] - -[[package]] -name = "msgpack" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/f9/a892a6038c861fa849b11a2bb0502c07bc698ab6ea53359e5771397d883b/msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd", size = 150428 }, - { url = "https://files.pythonhosted.org/packages/df/7a/d174cc6a3b6bb85556e6a046d3193294a92f9a8e583cdbd46dc8a1d7e7f4/msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d", size = 84131 }, - { url = "https://files.pythonhosted.org/packages/08/52/bf4fbf72f897a23a56b822997a72c16de07d8d56d7bf273242f884055682/msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5", size = 81215 }, - { url = "https://files.pythonhosted.org/packages/02/95/dc0044b439b518236aaf012da4677c1b8183ce388411ad1b1e63c32d8979/msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5", size = 371229 }, - { url = "https://files.pythonhosted.org/packages/ff/75/09081792db60470bef19d9c2be89f024d366b1e1973c197bb59e6aabc647/msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e", size = 378034 }, - { url = "https://files.pythonhosted.org/packages/32/d3/c152e0c55fead87dd948d4b29879b0f14feeeec92ef1fd2ec21b107c3f49/msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b", size = 363070 }, - { url = "https://files.pythonhosted.org/packages/d9/2c/82e73506dd55f9e43ac8aa007c9dd088c6f0de2aa19e8f7330e6a65879fc/msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f", size = 359863 }, - { url = "https://files.pythonhosted.org/packages/cb/a0/3d093b248837094220e1edc9ec4337de3443b1cfeeb6e0896af8ccc4cc7a/msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68", size = 368166 }, - { url = "https://files.pythonhosted.org/packages/e4/13/7646f14f06838b406cf5a6ddbb7e8dc78b4996d891ab3b93c33d1ccc8678/msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b", size = 370105 }, - { url = "https://files.pythonhosted.org/packages/67/fa/dbbd2443e4578e165192dabbc6a22c0812cda2649261b1264ff515f19f15/msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044", size = 68513 }, - { url = "https://files.pythonhosted.org/packages/24/ce/c2c8fbf0ded750cb63cbcbb61bc1f2dfd69e16dca30a8af8ba80ec182dcd/msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f", size = 74687 }, - { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803 }, - { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343 }, - { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408 }, - { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096 }, - { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671 }, - { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414 }, - { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759 }, - { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405 }, - { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041 }, - { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538 }, - { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871 }, - { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, - { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, - { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, - { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, - { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, - { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, - { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, - { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, - { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, - { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, - { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, - { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, - { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, - { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, - { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, - { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, - { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, - { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, - { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, - { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, - { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, - { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, -] - -[[package]] -name = "multidict" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/68/259dee7fd14cf56a17c554125e534f6274c2860159692a414d0b402b9a6d/multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", size = 48628 }, - { url = "https://files.pythonhosted.org/packages/50/79/53ba256069fe5386a4a9e80d4e12857ced9de295baf3e20c68cdda746e04/multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", size = 29327 }, - { url = "https://files.pythonhosted.org/packages/ff/10/71f1379b05b196dae749b5ac062e87273e3f11634f447ebac12a571d90ae/multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", size = 29689 }, - { url = "https://files.pythonhosted.org/packages/71/45/70bac4f87438ded36ad4793793c0095de6572d433d98575a5752629ef549/multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", size = 126639 }, - { url = "https://files.pythonhosted.org/packages/80/cf/17f35b3b9509b4959303c05379c4bfb0d7dd05c3306039fc79cf035bbac0/multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", size = 134315 }, - { url = "https://files.pythonhosted.org/packages/ef/1f/652d70ab5effb33c031510a3503d4d6efc5ec93153562f1ee0acdc895a57/multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", size = 129471 }, - { url = "https://files.pythonhosted.org/packages/a6/64/2dd6c4c681688c0165dea3975a6a4eab4944ea30f35000f8b8af1df3148c/multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", size = 124585 }, - { url = "https://files.pythonhosted.org/packages/87/56/e6ee5459894c7e554b57ba88f7257dc3c3d2d379cb15baaa1e265b8c6165/multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", size = 116957 }, - { url = "https://files.pythonhosted.org/packages/36/9e/616ce5e8d375c24b84f14fc263c7ef1d8d5e8ef529dbc0f1df8ce71bb5b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db", size = 128609 }, - { url = "https://files.pythonhosted.org/packages/8c/4f/4783e48a38495d000f2124020dc96bacc806a4340345211b1ab6175a6cb4/multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", size = 123016 }, - { url = "https://files.pythonhosted.org/packages/3e/b3/4950551ab8fc39862ba5e9907dc821f896aa829b4524b4deefd3e12945ab/multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", size = 133542 }, - { url = "https://files.pythonhosted.org/packages/96/4d/f0ce6ac9914168a2a71df117935bb1f1781916acdecbb43285e225b484b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", size = 130163 }, - { url = "https://files.pythonhosted.org/packages/be/72/17c9f67e7542a49dd252c5ae50248607dfb780bcc03035907dafefb067e3/multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", size = 126832 }, - { url = "https://files.pythonhosted.org/packages/71/9f/72d719e248cbd755c8736c6d14780533a1606ffb3fbb0fbd77da9f0372da/multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", size = 26402 }, - { url = "https://files.pythonhosted.org/packages/04/5a/d88cd5d00a184e1ddffc82aa2e6e915164a6d2641ed3606e766b5d2f275a/multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", size = 28800 }, - { url = "https://files.pythonhosted.org/packages/93/13/df3505a46d0cd08428e4c8169a196131d1b0c4b515c3649829258843dde6/multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", size = 48570 }, - { url = "https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", size = 29316 }, - { url = "https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", size = 29640 }, - { url = "https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", size = 131067 }, - { url = "https://files.pythonhosted.org/packages/cc/1e/1b34154fef373371fd6c65125b3d42ff5f56c7ccc6bfff91b9b3c60ae9e0/multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", size = 138507 }, - { url = "https://files.pythonhosted.org/packages/fb/e0/0bc6b2bac6e461822b5f575eae85da6aae76d0e2a79b6665d6206b8e2e48/multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", size = 133905 }, - { url = "https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", size = 129004 }, - { url = "https://files.pythonhosted.org/packages/74/21/23960627b00ed39643302d81bcda44c9444ebcdc04ee5bedd0757513f259/multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", size = 121308 }, - { url = "https://files.pythonhosted.org/packages/8b/5c/cf282263ffce4a596ed0bb2aa1a1dddfe1996d6a62d08842a8d4b33dca13/multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", size = 132608 }, - { url = "https://files.pythonhosted.org/packages/d7/3e/97e778c041c72063f42b290888daff008d3ab1427f5b09b714f5a8eff294/multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", size = 127029 }, - { url = "https://files.pythonhosted.org/packages/47/ac/3efb7bfe2f3aefcf8d103e9a7162572f01936155ab2f7ebcc7c255a23212/multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", size = 137594 }, - { url = "https://files.pythonhosted.org/packages/42/9b/6c6e9e8dc4f915fc90a9b7798c44a30773dea2995fdcb619870e705afe2b/multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", size = 134556 }, - { url = "https://files.pythonhosted.org/packages/1d/10/8e881743b26aaf718379a14ac58572a240e8293a1c9d68e1418fb11c0f90/multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", size = 130993 }, - { url = "https://files.pythonhosted.org/packages/45/84/3eb91b4b557442802d058a7579e864b329968c8d0ea57d907e7023c677f2/multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", size = 26405 }, - { url = "https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", size = 28795 }, - { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, - { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, - { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, - { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, - { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, - { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, - { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, - { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, - { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, - { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, - { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, - { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, - { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, - { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, - { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, - { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, - { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, - { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, - { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, - { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, - { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, - { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, - { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, - { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, - { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, - { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, - { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, - { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, - { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, - { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, -] - -[[package]] -name = "numpy" -version = "1.26.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 }, - { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 }, - { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 }, - { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 }, - { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 }, - { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 }, - { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 }, - { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 }, - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, -] - -[[package]] -name = "orjson" -version = "3.10.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/5dea21763eeff8c1590076918a446ea3d6140743e0e36f58f369928ed0f4/orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e", size = 5282482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/09/e5ff18ad009e6f97eb7edc5f67ef98b3ce0c189da9c3eaca1f9587cd4c61/orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04", size = 249532 }, - { url = "https://files.pythonhosted.org/packages/bd/b8/a75883301fe332bd433d9b0ded7d2bb706ccac679602c3516984f8814fb5/orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8", size = 125229 }, - { url = "https://files.pythonhosted.org/packages/83/4b/22f053e7a364cc9c685be203b1e40fc5f2b3f164a9b2284547504eec682e/orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/63/64/1b54fc75ca328b57dd810541a4035fe48c12a161d466e3cf5b11a8c25649/orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814", size = 139748 }, - { url = "https://files.pythonhosted.org/packages/5e/ff/ff0c5da781807bb0a5acd789d9a7fbcb57f7b0c6e1916595da1f5ce69f3c/orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164", size = 154559 }, - { url = "https://files.pythonhosted.org/packages/4e/9a/11e2974383384ace8495810d4a2ebef5f55aacfc97b333b65e789c9d362d/orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/2d/c4/dd9583aea6aefee1b64d3aed13f51d2aadb014028bc929fe52936ec5091f/orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061", size = 138514 }, - { url = "https://files.pythonhosted.org/packages/53/3e/dcf1729230654f5c5594fc752de1f43dcf67e055ac0d300c8cdb1309269a/orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3", size = 130940 }, - { url = "https://files.pythonhosted.org/packages/e8/2b/b9759fe704789937705c8a56a03f6c03e50dff7df87d65cba9a20fec5282/orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d", size = 414713 }, - { url = "https://files.pythonhosted.org/packages/a7/6b/b9dfdbd4b6e20a59238319eb203ae07c3f6abf07eef909169b7a37ae3bba/orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182", size = 141028 }, - { url = "https://files.pythonhosted.org/packages/7c/b5/40f5bbea619c7caf75eb4d652a9821875a8ed04acc45fe3d3ef054ca69fb/orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e", size = 129715 }, - { url = "https://files.pythonhosted.org/packages/38/60/2272514061cbdf4d672edbca6e59c7e01cd1c706e881427d88f3c3e79761/orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/11/5d/be1490ff7eafe7fef890eb4527cf5bcd8cfd6117f3efe42a3249ec847b60/orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806", size = 133564 }, - { url = "https://files.pythonhosted.org/packages/7a/a2/21b25ce4a2c71dbb90948ee81bd7a42b4fbfc63162e57faf83157d5540ae/orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6", size = 249533 }, - { url = "https://files.pythonhosted.org/packages/b2/85/2076fc12d8225698a51278009726750c9c65c846eda741e77e1761cfef33/orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef", size = 125230 }, - { url = "https://files.pythonhosted.org/packages/06/df/a85a7955f11274191eccf559e8481b2be74a7c6d43075d0a9506aa80284d/orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/37/b3/94c55625a29b8767c0eed194cb000b3787e3c23b4cdd13be17bae6ccbb4b/orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d", size = 139749 }, - { url = "https://files.pythonhosted.org/packages/53/ba/c608b1e719971e8ddac2379f290404c2e914cf8e976369bae3cad88768b1/orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0", size = 154558 }, - { url = "https://files.pythonhosted.org/packages/b2/c4/c1fb835bb23ad788a39aa9ebb8821d51b1c03588d9a9e4ca7de5b354fdd5/orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/78/14/bb2b48b26ab3c570b284eb2157d98c1ef331a8397f6c8bd983b270467f5c/orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5", size = 138513 }, - { url = "https://files.pythonhosted.org/packages/4a/97/d5b353a5fe532e92c46467aa37e637f81af8468aa894cd77d2ec8a12f99e/orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b", size = 130942 }, - { url = "https://files.pythonhosted.org/packages/b5/5d/a067bec55293cca48fea8b9928cfa84c623be0cce8141d47690e64a6ca12/orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399", size = 414717 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/1485b8b05c6b4c4db172c438cf5db5dcfd10e72a9bc23c151a1137e763e0/orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388", size = 141033 }, - { url = "https://files.pythonhosted.org/packages/f8/d2/fc67523656e43a0c7eaeae9007c8b02e86076b15d591e9be11554d3d3138/orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c", size = 129720 }, - { url = "https://files.pythonhosted.org/packages/79/42/f58c7bd4e5b54da2ce2ef0331a39ccbbaa7699b7f70206fbf06737c9ed7d/orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/00/f8/bb60a4644287a544ec81df1699d5b965776bc9848d9029d9f9b3402ac8bb/orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e", size = 133570 }, - { url = "https://files.pythonhosted.org/packages/66/85/22fe737188905a71afcc4bf7cc4c79cd7f5bbe9ed1fe0aac4ce4c33edc30/orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a", size = 249504 }, - { url = "https://files.pythonhosted.org/packages/48/b7/2622b29f3afebe938a0a9037e184660379797d5fd5234e5998345d7a5b43/orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d", size = 125080 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/0b72a48f4403d0b88b2a41450c535b3e8989e8a2d7800659a967efc7c115/orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0", size = 150121 }, - { url = "https://files.pythonhosted.org/packages/06/ec/acb1a20cd49edb2000be5a0404cd43e3c8aad219f376ac8c60b870518c03/orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4", size = 139796 }, - { url = "https://files.pythonhosted.org/packages/33/e1/f7840a2ea852114b23a52a1c0b2bea0a1ea22236efbcdb876402d799c423/orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767", size = 154636 }, - { url = "https://files.pythonhosted.org/packages/fa/da/31543337febd043b8fa80a3b67de627669b88c7b128d9ad4cc2ece005b7a/orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41", size = 130621 }, - { url = "https://files.pythonhosted.org/packages/ed/78/66115dc9afbc22496530d2139f2f4455698be444c7c2475cb48f657cefc9/orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514", size = 138516 }, - { url = "https://files.pythonhosted.org/packages/22/84/cd4f5fb5427ffcf823140957a47503076184cb1ce15bcc1165125c26c46c/orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17", size = 130762 }, - { url = "https://files.pythonhosted.org/packages/93/1f/67596b711ba9f56dd75d73b60089c5c92057f1130bb3a25a0f53fb9a583b/orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b", size = 414700 }, - { url = "https://files.pythonhosted.org/packages/7c/0c/6a3b3271b46443d90efb713c3e4fe83fa8cd71cda0d11a0f69a03f437c6e/orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7", size = 141077 }, - { url = "https://files.pythonhosted.org/packages/3b/9b/33c58e0bfc788995eccd0d525ecd6b84b40d7ed182dd0751cd4c1322ac62/orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a", size = 129898 }, - { url = "https://files.pythonhosted.org/packages/01/c1/d577ecd2e9fa393366a1ea0a9267f6510d86e6c4bb1cdfb9877104cac44c/orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665", size = 142566 }, - { url = "https://files.pythonhosted.org/packages/ed/eb/a85317ee1732d1034b92d56f89f1de4d7bf7904f5c8fb9dcdd5b1c83917f/orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa", size = 133732 }, - { url = "https://files.pythonhosted.org/packages/06/10/fe7d60b8da538e8d3d3721f08c1b7bff0491e8fa4dd3bf11a17e34f4730e/orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6", size = 249399 }, - { url = "https://files.pythonhosted.org/packages/6b/83/52c356fd3a61abd829ae7e4366a6fe8e8863c825a60d7ac5156067516edf/orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a", size = 125044 }, - { url = "https://files.pythonhosted.org/packages/55/b2/d06d5901408e7ded1a74c7c20d70e3a127057a6d21355f50c90c0f337913/orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9", size = 150066 }, - { url = "https://files.pythonhosted.org/packages/75/8c/60c3106e08dc593a861755781c7c675a566445cc39558677d505878d879f/orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0", size = 139737 }, - { url = "https://files.pythonhosted.org/packages/6a/8c/ae00d7d0ab8a4490b1efeb01ad4ab2f1982e69cc82490bf8093407718ff5/orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307", size = 154804 }, - { url = "https://files.pythonhosted.org/packages/22/86/65dc69bd88b6dd254535310e97bc518aa50a39ef9c5a2a5d518e7a223710/orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e", size = 130583 }, - { url = "https://files.pythonhosted.org/packages/bb/00/6fe01ededb05d52be42fabb13d93a36e51f1fd9be173bd95707d11a8a860/orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7", size = 138465 }, - { url = "https://files.pythonhosted.org/packages/db/2f/4cc151c4b471b0cdc8cb29d3eadbce5007eb0475d26fa26ed123dca93b33/orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8", size = 130742 }, - { url = "https://files.pythonhosted.org/packages/9f/13/8a6109e4b477c518498ca37963d9c0eb1508b259725553fb53d53b20e2ea/orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca", size = 414669 }, - { url = "https://files.pythonhosted.org/packages/22/7b/1d229d6d24644ed4d0a803de1b0e2df832032d5beda7346831c78191b5b2/orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561", size = 141043 }, - { url = "https://files.pythonhosted.org/packages/cc/d3/6dc91156cf12ed86bed383bcb942d84d23304a1e57b7ab030bf60ea130d6/orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825", size = 129826 }, - { url = "https://files.pythonhosted.org/packages/b3/38/c47c25b86f6996f1343be721b6ea4367bc1c8bc0fc3f6bbcd995d18cb19d/orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890", size = 142542 }, - { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, -] - -[[package]] -name = "ormsgpack" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/98/e709bdcc729995eb8bc8006429bb5396bf891b3089fdc201bfdeb395b608/ormsgpack-1.9.0.tar.gz", hash = "sha256:015e8e6e74e5a1c2bcb9c25fdd8205cad0e8e2d1d32c6a259615aa189b61b8b4", size = 56839 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/8c/b6442ae25b98afc04f26fa344f8a1c90326434ffd51073185bfd5f4556e6/ormsgpack-1.9.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c7cc221489aaf8bf394225a275edf068f3531529def415a8e6e32d6228ee138", size = 382882 }, - { url = "https://files.pythonhosted.org/packages/8a/e7/376b5cc4fd72c6be06eec53de30027d3f7bc9c5f5f9fb85366822da8f22c/ormsgpack-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42a5c5028417e710e5169c77d90b08891299f77ffd87abbb2855ffc62314740a", size = 213969 }, - { url = "https://files.pythonhosted.org/packages/d9/f8/8da3b89eb48e38cfbe959a1988e5e3a51e545b4ad4ad15c0a1c5e543dd53/ormsgpack-1.9.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:350fdfac11215234b14d7fb484cf8f3f524eb0e7c6a3614bf878f4d034c1cef2", size = 217180 }, - { url = "https://files.pythonhosted.org/packages/34/7e/0daa62c62c0f1477e8d080e3f0603ed21be7b98772b1431d4b4dfa1ae4ee/ormsgpack-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebb49ca6d3f8dca7b667397016cb2cab7e6581b1d85b30f2697824479150e31e", size = 223656 }, - { url = "https://files.pythonhosted.org/packages/6b/d9/0ca6c4353b72d026d722eafa0e7e5d9aed6db493ff10dc41b1d1b9c5f1b9/ormsgpack-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ec9ad897bf00c4933bea519d505b82e20f9e0972bdd458dd1e06d6d5e0b8eec6", size = 125105 }, - { url = "https://files.pythonhosted.org/packages/b3/c5/51ff70be70f98848caffb1b5ec0486f296bda306ab34fd89bd5b997e3b65/ormsgpack-1.9.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5b473282dacddf20f03b99971e3fc3691bbeafc6142c8e51e80f137e35147ec9", size = 382882 }, - { url = "https://files.pythonhosted.org/packages/23/5e/91fcbbc42fcd69168220e937d680775990581253593e7b9dae86fba9d4a5/ormsgpack-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84bbd03ebca6efb38cb697e2e24f9ae22feb58ef1e6e664239ae68f4ccb3db76", size = 213968 }, - { url = "https://files.pythonhosted.org/packages/8a/1d/738ae3cd17ff88c9d0263cb2a424abee5b2954efd8d0205da02763eb603b/ormsgpack-1.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:49e7e3612f1930267ddf85e914ba417bf5fa801e4a045acb466fa8a8bf7f8bf8", size = 217180 }, - { url = "https://files.pythonhosted.org/packages/7a/03/1245444616cf010b5c59fcba4960eec530bb74794d9c539481eac3953344/ormsgpack-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da0aa79373e70c8ad32c0a23f410a7d611a13ea4f1e427f501307a487caf0557", size = 223655 }, - { url = "https://files.pythonhosted.org/packages/51/79/e10e1bb78818c224bcd6efe75ac003712ca36f0b425a8d4217f2ea14eb66/ormsgpack-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:6dfecbe00e504ccf946fc168ad56d038682fd17592da1be44368ab996fbeae3e", size = 125105 }, - { url = "https://files.pythonhosted.org/packages/a6/c4/1c3f83db7c5cadc6b95cc264bfdff1e7acf78423b1fddf0a103c63d5e973/ormsgpack-1.9.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6f13a538674ee42764278b418f9e97743401cd3895c7c473d45abd03f650169b", size = 383300 }, - { url = "https://files.pythonhosted.org/packages/95/07/634a0f346d8c0f1a5e77eab4b34ca0dd1f2f586120f365d66001e2653e7d/ormsgpack-1.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:332d85cbf3775b96b6eacdd0c03758517b530365dfa6e55981190062d840be47", size = 214036 }, - { url = "https://files.pythonhosted.org/packages/d6/34/ca320279514420cab77fbccf418f3d8376eb3649f12524c4bbe7d5ffd316/ormsgpack-1.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4b9de72dc94f73d63047ad40cfdd6e9dd2b28c51e9ccbc72117d5146b4f5fc18", size = 217341 }, - { url = "https://files.pythonhosted.org/packages/5b/5c/3cb8581d1ae367053a088dd9fe70cbfdf0af059625161ea6c9cfa4e4852e/ormsgpack-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4577cf304fa4c079092280e9ed4858cd9bd8b1475a803c206a449a3830b499ef", size = 223818 }, - { url = "https://files.pythonhosted.org/packages/2e/29/ba8da303007087e4a5e9ad84403b3475d2f9efc6e1e655d05708d8d4e707/ormsgpack-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:32302872cf10e4eccc8437cdaf46ac8e5e56cbb7519734a0b8f8a1ed2cbdfd44", size = 125347 }, - { url = "https://files.pythonhosted.org/packages/93/3d/1a1c687f9e1d29555b2ad562a36f0930d7719938530d91e710553041ed27/ormsgpack-1.9.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6ccbdf412af6c46b3549929d90a960ebe1b45f9b3e6c530774cd29de0846ce4d", size = 383299 }, - { url = "https://files.pythonhosted.org/packages/35/9c/9c4ac38aeb53eb9e7c7f3e2baaf2019f56e898b07400f76b1c67bd298a5d/ormsgpack-1.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6e113502c002f12f6bcf100eb8c2ccb85d1e75931ede669765ffaf5cc0e69d", size = 214038 }, - { url = "https://files.pythonhosted.org/packages/f6/64/cea4a859a6e311c543ab2f1452cf5d1a78f0d375efcfcee26f671452f48f/ormsgpack-1.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afd8bc92bb903fc37ce16921bb522d205ba02b90871dc4edc6fac13ac9226481", size = 217340 }, - { url = "https://files.pythonhosted.org/packages/df/9e/453b9c6c51d0bdd5501b1e6d2c9e9066649dcf10c6161014272e7a9e18a1/ormsgpack-1.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800d918e6bca16d01c382015a4c05b00cabafa7c2070126b7feaefe2cf1437f0", size = 223817 }, - { url = "https://files.pythonhosted.org/packages/38/c1/0cd4ffc91809a76e4b4b53d877d46edd0a9bb41ffd247c8b7b476728db01/ormsgpack-1.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:305ec6de5fd687b7de0861673e967b4f6474a634b159a3a82e481707308203c9", size = 125349 }, -] - -[[package]] -name = "packaging" -version = "24.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, -] - -[[package]] -name = "propcache" -version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/a5/0ea64c9426959ef145a938e38c832fc551843481d356713ececa9a8a64e8/propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6", size = 79296 }, - { url = "https://files.pythonhosted.org/packages/76/5a/916db1aba735f55e5eca4733eea4d1973845cf77dfe67c2381a2ca3ce52d/propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2", size = 45622 }, - { url = "https://files.pythonhosted.org/packages/2d/62/685d3cf268b8401ec12b250b925b21d152b9d193b7bffa5fdc4815c392c2/propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea", size = 45133 }, - { url = "https://files.pythonhosted.org/packages/4d/3d/31c9c29ee7192defc05aa4d01624fd85a41cf98e5922aaed206017329944/propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212", size = 204809 }, - { url = "https://files.pythonhosted.org/packages/10/a1/e4050776f4797fc86140ac9a480d5dc069fbfa9d499fe5c5d2fa1ae71f07/propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3", size = 219109 }, - { url = "https://files.pythonhosted.org/packages/c9/c0/e7ae0df76343d5e107d81e59acc085cea5fd36a48aa53ef09add7503e888/propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d", size = 217368 }, - { url = "https://files.pythonhosted.org/packages/fc/e1/e0a2ed6394b5772508868a977d3238f4afb2eebaf9976f0b44a8d347ad63/propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634", size = 205124 }, - { url = "https://files.pythonhosted.org/packages/50/c1/e388c232d15ca10f233c778bbdc1034ba53ede14c207a72008de45b2db2e/propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2", size = 195463 }, - { url = "https://files.pythonhosted.org/packages/0a/fd/71b349b9def426cc73813dbd0f33e266de77305e337c8c12bfb0a2a82bfb/propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958", size = 198358 }, - { url = "https://files.pythonhosted.org/packages/02/f2/d7c497cd148ebfc5b0ae32808e6c1af5922215fe38c7a06e4e722fe937c8/propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c", size = 195560 }, - { url = "https://files.pythonhosted.org/packages/bb/57/f37041bbe5e0dfed80a3f6be2612a3a75b9cfe2652abf2c99bef3455bbad/propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583", size = 196895 }, - { url = "https://files.pythonhosted.org/packages/83/36/ae3cc3e4f310bff2f064e3d2ed5558935cc7778d6f827dce74dcfa125304/propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf", size = 207124 }, - { url = "https://files.pythonhosted.org/packages/8c/c4/811b9f311f10ce9d31a32ff14ce58500458443627e4df4ae9c264defba7f/propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034", size = 210442 }, - { url = "https://files.pythonhosted.org/packages/18/dd/a1670d483a61ecac0d7fc4305d91caaac7a8fc1b200ea3965a01cf03bced/propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b", size = 203219 }, - { url = "https://files.pythonhosted.org/packages/f9/2d/30ced5afde41b099b2dc0c6573b66b45d16d73090e85655f1a30c5a24e07/propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4", size = 40313 }, - { url = "https://files.pythonhosted.org/packages/23/84/bd9b207ac80da237af77aa6e153b08ffa83264b1c7882495984fcbfcf85c/propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba", size = 44428 }, - { url = "https://files.pythonhosted.org/packages/bc/0f/2913b6791ebefb2b25b4efd4bb2299c985e09786b9f5b19184a88e5778dd/propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16", size = 79297 }, - { url = "https://files.pythonhosted.org/packages/cf/73/af2053aeccd40b05d6e19058419ac77674daecdd32478088b79375b9ab54/propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717", size = 45611 }, - { url = "https://files.pythonhosted.org/packages/3c/09/8386115ba7775ea3b9537730e8cf718d83bbf95bffe30757ccf37ec4e5da/propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3", size = 45146 }, - { url = "https://files.pythonhosted.org/packages/03/7a/793aa12f0537b2e520bf09f4c6833706b63170a211ad042ca71cbf79d9cb/propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9", size = 232136 }, - { url = "https://files.pythonhosted.org/packages/f1/38/b921b3168d72111769f648314100558c2ea1d52eb3d1ba7ea5c4aa6f9848/propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787", size = 239706 }, - { url = "https://files.pythonhosted.org/packages/14/29/4636f500c69b5edea7786db3c34eb6166f3384b905665ce312a6e42c720c/propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465", size = 238531 }, - { url = "https://files.pythonhosted.org/packages/85/14/01fe53580a8e1734ebb704a3482b7829a0ef4ea68d356141cf0994d9659b/propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af", size = 231063 }, - { url = "https://files.pythonhosted.org/packages/33/5c/1d961299f3c3b8438301ccfbff0143b69afcc30c05fa28673cface692305/propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7", size = 220134 }, - { url = "https://files.pythonhosted.org/packages/00/d0/ed735e76db279ba67a7d3b45ba4c654e7b02bc2f8050671ec365d8665e21/propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f", size = 220009 }, - { url = "https://files.pythonhosted.org/packages/75/90/ee8fab7304ad6533872fee982cfff5a53b63d095d78140827d93de22e2d4/propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54", size = 212199 }, - { url = "https://files.pythonhosted.org/packages/eb/ec/977ffaf1664f82e90737275873461695d4c9407d52abc2f3c3e24716da13/propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505", size = 214827 }, - { url = "https://files.pythonhosted.org/packages/57/48/031fb87ab6081764054821a71b71942161619549396224cbb242922525e8/propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82", size = 228009 }, - { url = "https://files.pythonhosted.org/packages/1a/06/ef1390f2524850838f2390421b23a8b298f6ce3396a7cc6d39dedd4047b0/propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca", size = 231638 }, - { url = "https://files.pythonhosted.org/packages/38/2a/101e6386d5a93358395da1d41642b79c1ee0f3b12e31727932b069282b1d/propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e", size = 222788 }, - { url = "https://files.pythonhosted.org/packages/db/81/786f687951d0979007e05ad9346cd357e50e3d0b0f1a1d6074df334b1bbb/propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034", size = 40170 }, - { url = "https://files.pythonhosted.org/packages/cf/59/7cc7037b295d5772eceb426358bb1b86e6cab4616d971bd74275395d100d/propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3", size = 44404 }, - { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 }, - { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 }, - { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 }, - { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 }, - { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 }, - { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 }, - { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 }, - { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 }, - { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 }, - { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 }, - { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 }, - { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 }, - { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 }, - { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 }, - { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 }, - { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 }, - { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 }, - { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 }, - { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 }, - { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 }, - { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 }, - { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 }, - { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 }, - { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 }, - { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 }, - { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 }, - { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 }, - { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 }, - { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 }, - { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 }, - { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 }, - { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 }, - { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, - { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, - { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, - { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, - { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, - { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, - { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, - { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, - { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, - { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, - { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, - { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, - { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, - { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, - { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, - { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, - { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, - { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, - { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, - { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, - { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, - { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, -] - -[[package]] -name = "pydantic-settings" -version = "2.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "python-dotenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 }, -] - -[[package]] -name = "pyjwt" -version = "2.10.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, -] - -[[package]] -name = "python-dotenv" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "regex" -version = "2024.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674 }, - { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684 }, - { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589 }, - { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511 }, - { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149 }, - { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707 }, - { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702 }, - { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976 }, - { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397 }, - { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726 }, - { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098 }, - { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325 }, - { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277 }, - { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197 }, - { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714 }, - { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042 }, - { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, - { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, - { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, - { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, - { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, - { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, - { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, - { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, - { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, - { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, - { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, - { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, - { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, - { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, - { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, - { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, - { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, - { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, - { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, - { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, - { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, - { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, - { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, - { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, - { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, - { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, - { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, - { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, - { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, - { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, - { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, - { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, - { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, - { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, - { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, - { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, - { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, - { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, - { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, - { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, - { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, - { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, - { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, - { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, - { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "soupsieve" -version = "2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.37" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { 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')" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3b/20/93ea2518df4d7a14ebe9ace9ab8bb92aaf7df0072b9007644de74172b06c/sqlalchemy-2.0.37.tar.gz", hash = "sha256:12b28d99a9c14eaf4055810df1001557176716de0167b91026e648e65229bffb", size = 9626249 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/21/aaf0cd2e7ee56e464af7cba38a54f9c1203570181ec5d847711f33c9f520/SQLAlchemy-2.0.37-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da36c3b0e891808a7542c5c89f224520b9a16c7f5e4d6a1156955605e54aef0e", size = 2102915 }, - { url = "https://files.pythonhosted.org/packages/fd/01/6615256759515f13bb7d7b49981326f1f4e80ff1bd92dccd53f99dab79ea/SQLAlchemy-2.0.37-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7402ff96e2b073a98ef6d6142796426d705addd27b9d26c3b32dbaa06d7d069", size = 2094095 }, - { url = "https://files.pythonhosted.org/packages/6a/f2/400252bda1bd67da7a35bb2ab84d10a8ad43975d42f15b207a9efb765446/SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f5d254a22394847245f411a2956976401e84da4288aa70cbcd5190744062c1", size = 3076482 }, - { url = "https://files.pythonhosted.org/packages/40/c6/e7e8e894c8f065f96ca202cdb00454d60d4962279b3eb5a81b8766dfa836/SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41296bbcaa55ef5fdd32389a35c710133b097f7b2609d8218c0eabded43a1d84", size = 3084750 }, - { url = "https://files.pythonhosted.org/packages/d6/ee/1cdab04b7760e48273f2592037df156afae044e2e6589157673bd2a830c0/SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bedee60385c1c0411378cbd4dc486362f5ee88deceea50002772912d798bb00f", size = 3040575 }, - { url = "https://files.pythonhosted.org/packages/4d/af/2dd456bfd8d4b9750792ceedd828bddf83860f2420545e5effbaf722dae5/SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6c67415258f9f3c69867ec02fea1bf6508153709ecbd731a982442a590f2b7e4", size = 3066113 }, - { url = "https://files.pythonhosted.org/packages/dd/d7/ad997559574f94d7bd895a8a63996afef518d07e9eaf5a2a9cbbcb877c16/SQLAlchemy-2.0.37-cp310-cp310-win32.whl", hash = "sha256:650dcb70739957a492ad8acff65d099a9586b9b8920e3507ca61ec3ce650bb72", size = 2075239 }, - { url = "https://files.pythonhosted.org/packages/d0/82/141fbed705a21af2d825068831da1d80d720945df60c2b97ddc5133b3714/SQLAlchemy-2.0.37-cp310-cp310-win_amd64.whl", hash = "sha256:93d1543cd8359040c02b6614421c8e10cd7a788c40047dbc507ed46c29ae5636", size = 2099307 }, - { url = "https://files.pythonhosted.org/packages/7c/37/4915290c1849337be6d24012227fb3c30c575151eec2b182ee5f45e96ce7/SQLAlchemy-2.0.37-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78361be6dc9073ed17ab380985d1e45e48a642313ab68ab6afa2457354ff692c", size = 2104098 }, - { url = "https://files.pythonhosted.org/packages/4c/f5/8cce9196434014a24cc65f6c68faa9a887080932361ee285986c0a35892d/SQLAlchemy-2.0.37-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b661b49d0cb0ab311a189b31e25576b7ac3e20783beb1e1817d72d9d02508bf5", size = 2094492 }, - { url = "https://files.pythonhosted.org/packages/9c/54/2df4b3d0d11b384b6e9a8788d0f1123243f2d2356e2ccf626f93dcc1a09f/SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d57bafbab289e147d064ffbd5cca2d7b1394b63417c0636cea1f2e93d16eb9e8", size = 3212789 }, - { url = "https://files.pythonhosted.org/packages/57/4f/e1db9475f940f1c54c365ed02d4f6390f884fc95a6a4022ece7725956664/SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2c0913f02341d25fb858e4fb2031e6b0813494cca1ba07d417674128ce11b", size = 3212784 }, - { url = "https://files.pythonhosted.org/packages/89/57/d93212e827d1f03a6cd4d0ea13775957c2a95161330fa47449b91153bd09/SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9df21b8d9e5c136ea6cde1c50d2b1c29a2b5ff2b1d610165c23ff250e0704087", size = 3149616 }, - { url = "https://files.pythonhosted.org/packages/5f/c2/759347419f69cf0bbb76d330fbdbd24cefb15842095fe86bca623759b9e8/SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db18ff6b8c0f1917f8b20f8eca35c28bbccb9f83afa94743e03d40203ed83de9", size = 3169944 }, - { url = "https://files.pythonhosted.org/packages/22/04/a19ecb53aa19bb8cf491ecdb6bf8c1ac74959cd4962e119e91d4e2b8ecaa/SQLAlchemy-2.0.37-cp311-cp311-win32.whl", hash = "sha256:46954173612617a99a64aee103bcd3f078901b9a8dcfc6ae80cbf34ba23df989", size = 2074686 }, - { url = "https://files.pythonhosted.org/packages/7b/9d/6e030cc2c675539dbc5ef73aa97a3cbe09341e27ad38caed2b70c4273aff/SQLAlchemy-2.0.37-cp311-cp311-win_amd64.whl", hash = "sha256:7b7e772dc4bc507fdec4ee20182f15bd60d2a84f1e087a8accf5b5b7a0dcf2ba", size = 2099891 }, - { url = "https://files.pythonhosted.org/packages/86/62/e5de4a5e0c4f5ceffb2b461aaa2378c0ee00642930a8c38e5b80338add0f/SQLAlchemy-2.0.37-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2952748ecd67ed3b56773c185e85fc084f6bdcdec10e5032a7c25a6bc7d682ef", size = 2102692 }, - { url = "https://files.pythonhosted.org/packages/01/44/3b65f4f16abeffd611da0ebab9e3aadfca45d041a78a67835c41c6d28289/SQLAlchemy-2.0.37-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3151822aa1db0eb5afd65ccfafebe0ef5cda3a7701a279c8d0bf17781a793bb4", size = 2093079 }, - { url = "https://files.pythonhosted.org/packages/a4/d8/e3a6622e86e3ae3a41ba470d1bb095c1f2dedf6b71feae0b4b94b5951017/SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa8039b6d20137a4e02603aba37d12cd2dde7887500b8855356682fc33933f4", size = 3242509 }, - { url = "https://files.pythonhosted.org/packages/3a/ef/5a53a6a60ac5a5d4ed28959317dac1ff72bc16773ccd9b3fe79713fe27f3/SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cdba1f73b64530c47b27118b7053b8447e6d6f3c8104e3ac59f3d40c33aa9fd", size = 3253368 }, - { url = "https://files.pythonhosted.org/packages/67/f2/30f5012379031cd5389eb06455282f926a4f99258e5ee5ccdcea27f30d67/SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1b2690456528a87234a75d1a1644cdb330a6926f455403c8e4f6cad6921f9098", size = 3188655 }, - { url = "https://files.pythonhosted.org/packages/fe/df/905499aa051605aeda62c1faf33d941ffb7fda291159ab1c24ef5207a079/SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf5ae8a9dcf657fd72144a7fd01f243236ea39e7344e579a121c4205aedf07bb", size = 3215281 }, - { url = "https://files.pythonhosted.org/packages/94/54/f2769e7e356520f75016d82ca43ed85e47ba50e636a34124db4625ae5976/SQLAlchemy-2.0.37-cp312-cp312-win32.whl", hash = "sha256:ea308cec940905ba008291d93619d92edaf83232ec85fbd514dcb329f3192761", size = 2072972 }, - { url = "https://files.pythonhosted.org/packages/c2/7f/241f059e0b7edb85845368f43964d6b0b41733c2f7fffaa993f8e66548a5/SQLAlchemy-2.0.37-cp312-cp312-win_amd64.whl", hash = "sha256:635d8a21577341dfe4f7fa59ec394b346da12420b86624a69e466d446de16aff", size = 2098597 }, - { url = "https://files.pythonhosted.org/packages/45/d1/e63e56ceab148e69f545703a74b90c8c6dc0a04a857e4e63a4c07a23cf91/SQLAlchemy-2.0.37-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c4096727193762e72ce9437e2a86a110cf081241919ce3fab8e89c02f6b6658", size = 2097968 }, - { url = "https://files.pythonhosted.org/packages/fd/e5/93ce63310347062bd42aaa8b6785615c78539787ef4380252fcf8e2dcee3/SQLAlchemy-2.0.37-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4fb5ac86d8fe8151966814f6720996430462e633d225497566b3996966b9bdb", size = 2088445 }, - { url = "https://files.pythonhosted.org/packages/1b/8c/d0e0081c09188dd26040fc8a09c7d87f539e1964df1ac60611b98ff2985a/SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e56a139bfe136a22c438478a86f8204c1eb5eed36f4e15c4224e4b9db01cb3e4", size = 3174880 }, - { url = "https://files.pythonhosted.org/packages/79/f7/3396038d8d4ea92c72f636a007e2fac71faae0b59b7e21af46b635243d09/SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f95fc8e3f34b5f6b3effb49d10ac97c569ec8e32f985612d9b25dd12d0d2e94", size = 3188226 }, - { url = "https://files.pythonhosted.org/packages/ef/33/7a1d85716b29c86a744ed43690e243cb0e9c32e3b68a67a97eaa6b49ef66/SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c505edd429abdfe3643fa3b2e83efb3445a34a9dc49d5f692dd087be966020e0", size = 3121425 }, - { url = "https://files.pythonhosted.org/packages/27/11/fa63a77c88eb2f79bb8b438271fbacd66a546a438e4eaba32d62f11298e2/SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12b0f1ec623cccf058cf21cb544f0e74656618165b083d78145cafde156ea7b6", size = 3149589 }, - { url = "https://files.pythonhosted.org/packages/b6/04/fcdd103b6871f2110460b8275d1c4828daa806997b0fa5a01c1cd7fd522d/SQLAlchemy-2.0.37-cp313-cp313-win32.whl", hash = "sha256:293f9ade06b2e68dd03cfb14d49202fac47b7bb94bffcff174568c951fbc7af2", size = 2070746 }, - { url = "https://files.pythonhosted.org/packages/d4/7c/e024719205bdc1465b7b7d3d22ece8e1ad57bc7d76ef6ed78bb5f812634a/SQLAlchemy-2.0.37-cp313-cp313-win_amd64.whl", hash = "sha256:d70f53a0646cc418ca4853da57cf3ddddbccb8c98406791f24426f2dd77fd0e2", size = 2094612 }, - { url = "https://files.pythonhosted.org/packages/3b/36/59cc97c365f2f79ac9f3f51446cae56dfd82c4f2dd98497e6be6de20fb91/SQLAlchemy-2.0.37-py3-none-any.whl", hash = "sha256:a8998bf9f8658bd3839cbc44ddbe982955641863da0c1efe5b00c1ab4f5c16b1", size = 1894113 }, -] - -[[package]] -name = "sse-starlette" -version = "2.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.11'" }, - { name = "starlette", marker = "python_full_version >= '3.11'" }, - { name = "uvicorn", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/fc/56ab9f116b2133521f532fce8d03194cf04dcac25f583cf3d839be4c0496/sse_starlette-2.1.3.tar.gz", hash = "sha256:9cd27eb35319e1414e3d2558ee7414487f9529ce3b3cf9b21434fd110e017169", size = 19678 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/aa/36b271bc4fa1d2796311ee7c7283a3a1c348bad426d37293609ca4300eef/sse_starlette-2.1.3-py3-none-any.whl", hash = "sha256:8ec846438b4665b9e8c560fcdea6bc8081a3abf7942faa95e5a744999d219772", size = 9383 }, -] - -[[package]] -name = "starlette" -version = "0.45.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507 }, -] - -[[package]] -name = "structlog" -version = "25.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/fe/578db23e17392a8693b45a7b7dc6985370f51dd937157def8ecc7b20930d/structlog-25.1.0.tar.gz", hash = "sha256:2ef2a572e0e27f09664965d31a576afe64e46ac6084ef5cec3c2b8cd6e4e3ad3", size = 1364973 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/14/e9aed6c820fa166e8a19a19e663e98bd5538004d68a70c5752458ca3656e/structlog-25.1.0-py3-none-any.whl", hash = "sha256:843fe4f254540329f380812cbe612e1af5ec5b8172205ae634679cd35a6d6321", size = 68921 }, -] - -[[package]] -name = "tavily-python" -version = "0.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "requests" }, - { name = "tiktoken" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/50/7f4acafe72ffd10d3578ddec76f993af5af81504bc7315ea54862f2705b9/tavily_python-0.5.0.tar.gz", hash = "sha256:2c60b88203b630e1b37fc711913a1090ced6719b3f21089f25ec06e9e1602822", size = 16455 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/99/05776f7150a5b3f8d853377144a3a634131964c0fce38307537674a9a674/tavily_python-0.5.0-py3-none-any.whl", hash = "sha256:e874f6a04a56cdda80a505fe0b4f5d61d25372bd52a83e6773926fb297dcaa29", size = 14361 }, -] - -[[package]] -name = "tenacity" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, -] - -[[package]] -name = "tiktoken" -version = "0.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "regex" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2", size = 35107 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/ba/a35fad753bbca8ba0cc1b0f3402a70256a110ced7ac332cf84ba89fc87ab/tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e", size = 1039905 }, - { url = "https://files.pythonhosted.org/packages/91/05/13dab8fd7460391c387b3e69e14bf1e51ff71fe0a202cd2933cc3ea93fb6/tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21", size = 982417 }, - { url = "https://files.pythonhosted.org/packages/e9/98/18ec4a8351a6cf4537e40cd6e19a422c10cce1ef00a2fcb716e0a96af58b/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560", size = 1144915 }, - { url = "https://files.pythonhosted.org/packages/2e/28/cf3633018cbcc6deb7805b700ccd6085c9a5a7f72b38974ee0bffd56d311/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2", size = 1177221 }, - { url = "https://files.pythonhosted.org/packages/57/81/8a5be305cbd39d4e83a794f9e80c7f2c84b524587b7feb27c797b2046d51/tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9", size = 1237398 }, - { url = "https://files.pythonhosted.org/packages/dc/da/8d1cc3089a83f5cf11c2e489332752981435280285231924557350523a59/tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005", size = 884215 }, - { url = "https://files.pythonhosted.org/packages/f6/1e/ca48e7bfeeccaf76f3a501bd84db1fa28b3c22c9d1a1f41af9fb7579c5f6/tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1", size = 1039700 }, - { url = "https://files.pythonhosted.org/packages/8c/f8/f0101d98d661b34534769c3818f5af631e59c36ac6d07268fbfc89e539ce/tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a", size = 982413 }, - { url = "https://files.pythonhosted.org/packages/ac/3c/2b95391d9bd520a73830469f80a96e3790e6c0a5ac2444f80f20b4b31051/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d", size = 1144242 }, - { url = "https://files.pythonhosted.org/packages/01/c4/c4a4360de845217b6aa9709c15773484b50479f36bb50419c443204e5de9/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47", size = 1176588 }, - { url = "https://files.pythonhosted.org/packages/f8/a3/ef984e976822cd6c2227c854f74d2e60cf4cd6fbfca46251199914746f78/tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419", size = 1237261 }, - { url = "https://files.pythonhosted.org/packages/1e/86/eea2309dc258fb86c7d9b10db536434fc16420feaa3b6113df18b23db7c2/tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99", size = 884537 }, - { url = "https://files.pythonhosted.org/packages/c1/22/34b2e136a6f4af186b6640cbfd6f93400783c9ef6cd550d9eab80628d9de/tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586", size = 1039357 }, - { url = "https://files.pythonhosted.org/packages/04/d2/c793cf49c20f5855fd6ce05d080c0537d7418f22c58e71f392d5e8c8dbf7/tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b", size = 982616 }, - { url = "https://files.pythonhosted.org/packages/b3/a1/79846e5ef911cd5d75c844de3fa496a10c91b4b5f550aad695c5df153d72/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab", size = 1144011 }, - { url = "https://files.pythonhosted.org/packages/26/32/e0e3a859136e95c85a572e4806dc58bf1ddf651108ae8b97d5f3ebe1a244/tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04", size = 1175432 }, - { url = "https://files.pythonhosted.org/packages/c7/89/926b66e9025b97e9fbabeaa59048a736fe3c3e4530a204109571104f921c/tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc", size = 1236576 }, - { url = "https://files.pythonhosted.org/packages/45/e2/39d4aa02a52bba73b2cd21ba4533c84425ff8786cc63c511d68c8897376e/tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db", size = 883824 }, - { url = "https://files.pythonhosted.org/packages/e3/38/802e79ba0ee5fcbf240cd624143f57744e5d411d2e9d9ad2db70d8395986/tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24", size = 1039648 }, - { url = "https://files.pythonhosted.org/packages/b1/da/24cdbfc302c98663fbea66f5866f7fa1048405c7564ab88483aea97c3b1a/tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a", size = 982763 }, - { url = "https://files.pythonhosted.org/packages/e4/f0/0ecf79a279dfa41fc97d00adccf976ecc2556d3c08ef3e25e45eb31f665b/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5", size = 1144417 }, - { url = "https://files.pythonhosted.org/packages/ab/d3/155d2d4514f3471a25dc1d6d20549ef254e2aa9bb5b1060809b1d3b03d3a/tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953", size = 1175108 }, - { url = "https://files.pythonhosted.org/packages/19/eb/5989e16821ee8300ef8ee13c16effc20dfc26c777d05fbb6825e3c037b81/tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7", size = 1236520 }, - { url = "https://files.pythonhosted.org/packages/40/59/14b20465f1d1cb89cfbc96ec27e5617b2d41c79da12b5e04e96d689be2a7/tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69", size = 883849 }, -] - -[[package]] -name = "types-requests" -version = "2.32.0.20241016" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fa/3c/4f2a430c01a22abd49a583b6b944173e39e7d01b688190a5618bd59a2e22/types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95", size = 18065 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/01/485b3026ff90e5190b5e24f1711522e06c79f4a56c8f4b95848ac072e20f/types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747", size = 15836 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "typing-inspect" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "uvicorn" -version = "0.34.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click", marker = "python_full_version >= '3.11'" }, - { name = "h11", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, -] - -[[package]] -name = "watchfiles" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/02/22fcaed0396730b0d362bc8d1ffb3be2658fd473eecbb2ba84243e157f11/watchfiles-1.0.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ba5bb3073d9db37c64520681dd2650f8bd40902d991e7b4cfaeece3e32561d08", size = 395212 }, - { url = "https://files.pythonhosted.org/packages/e9/3d/ec5a2369a46edf3ebe092c39d9ae48e8cb6dacbde51c4b4f98936c524269/watchfiles-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f25d0ba0fe2b6d2c921cf587b2bf4c451860086534f40c384329fb96e2044d1", size = 384815 }, - { url = "https://files.pythonhosted.org/packages/df/b4/898991cececbe171e67142c31905510203649569d9817848f47c4177ee42/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47eb32ef8c729dbc4f4273baece89398a4d4b5d21a1493efea77a17059f4df8a", size = 450680 }, - { url = "https://files.pythonhosted.org/packages/58/f7/d4aa3000e812cfb5e5c2c6c0a3ec9d0a46a42489a8727edd160631c4e210/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:076f293100db3b0b634514aa0d294b941daa85fc777f9c698adb1009e5aca0b1", size = 455923 }, - { url = "https://files.pythonhosted.org/packages/dd/95/7e2e4c6aba1b02fb5c76d2f6a450b85215921ec5f8f7ad5efd075369563f/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eacd91daeb5158c598fe22d7ce66d60878b6294a86477a4715154990394c9b3", size = 482339 }, - { url = "https://files.pythonhosted.org/packages/bb/67/4265b0fabcc2ef2c9e3e8802ba7908cf718a357ebfb49c72e53787156a48/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13c2ce7b72026cfbca120d652f02c7750f33b4c9395d79c9790b27f014c8a5a2", size = 519908 }, - { url = "https://files.pythonhosted.org/packages/0d/96/b57802d5f8164bdf070befb4fd3dec4edba5a364ec0670965a97eb8098ce/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90192cdc15ab7254caa7765a98132a5a41471cf739513cc9bcf7d2ffcc0ec7b2", size = 501410 }, - { url = "https://files.pythonhosted.org/packages/8b/18/6db0de4e8911ba14e31853201b40c0fa9fea5ecf3feb86b0ad58f006dfc3/watchfiles-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278aaa395f405972e9f523bd786ed59dfb61e4b827856be46a42130605fd0899", size = 452876 }, - { url = "https://files.pythonhosted.org/packages/df/df/092a961815edf723a38ba2638c49491365943919c3526cc9cf82c42786a6/watchfiles-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a462490e75e466edbb9fc4cd679b62187153b3ba804868452ef0577ec958f5ff", size = 615353 }, - { url = "https://files.pythonhosted.org/packages/f3/cf/b85fe645de4ff82f3f436c5e9032379fce37c303f6396a18f9726cc34519/watchfiles-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8d0d0630930f5cd5af929040e0778cf676a46775753e442a3f60511f2409f48f", size = 613187 }, - { url = "https://files.pythonhosted.org/packages/f6/d4/a9fea27aef4dd69689bc3556718c1157a7accb72aa035ece87c1fa8483b5/watchfiles-1.0.4-cp310-cp310-win32.whl", hash = "sha256:cc27a65069bcabac4552f34fd2dce923ce3fcde0721a16e4fb1b466d63ec831f", size = 270799 }, - { url = "https://files.pythonhosted.org/packages/df/02/dbe9d4439f15dd4ad0720b6e039bde9d66d1f830331f34c18eb70fa6608e/watchfiles-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:8b1f135238e75d075359cf506b27bf3f4ca12029c47d3e769d8593a2024ce161", size = 284145 }, - { url = "https://files.pythonhosted.org/packages/0f/bb/8461adc4b1fed009546fb797fc0d5698dcfe5e289cb37e1b8f16a93cdc30/watchfiles-1.0.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2a9f93f8439639dc244c4d2902abe35b0279102bca7bbcf119af964f51d53c19", size = 394869 }, - { url = "https://files.pythonhosted.org/packages/55/88/9ebf36b3547176d1709c320de78c1fa3263a46be31b5b1267571d9102686/watchfiles-1.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eea33ad8c418847dd296e61eb683cae1c63329b6d854aefcd412e12d94ee235", size = 384905 }, - { url = "https://files.pythonhosted.org/packages/03/8a/04335ce23ef78d8c69f0913e8b20cf7d9233e3986543aeef95ef2d6e43d2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31f1a379c9dcbb3f09cf6be1b7e83b67c0e9faabed0471556d9438a4a4e14202", size = 449944 }, - { url = "https://files.pythonhosted.org/packages/17/4e/c8d5dcd14fe637f4633616dabea8a4af0a10142dccf3b43e0f081ba81ab4/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab594e75644421ae0a2484554832ca5895f8cab5ab62de30a1a57db460ce06c6", size = 456020 }, - { url = "https://files.pythonhosted.org/packages/5e/74/3e91e09e1861dd7fbb1190ce7bd786700dc0fbc2ccd33bb9fff5de039229/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc2eb5d14a8e0d5df7b36288979176fbb39672d45184fc4b1c004d7c3ce29317", size = 482983 }, - { url = "https://files.pythonhosted.org/packages/a1/3d/e64de2d1ce4eb6a574fd78ce3a28c279da263be9ef3cfcab6f708df192f2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f68d8e9d5a321163ddacebe97091000955a1b74cd43724e346056030b0bacee", size = 520320 }, - { url = "https://files.pythonhosted.org/packages/2c/bd/52235f7063b57240c66a991696ed27e2a18bd6fcec8a1ea5a040b70d0611/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9ce064e81fe79faa925ff03b9f4c1a98b0bbb4a1b8c1b015afa93030cb21a49", size = 500988 }, - { url = "https://files.pythonhosted.org/packages/3a/b0/ff04194141a5fe650c150400dd9e42667916bc0f52426e2e174d779b8a74/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b77d5622ac5cc91d21ae9c2b284b5d5c51085a0bdb7b518dba263d0af006132c", size = 452573 }, - { url = "https://files.pythonhosted.org/packages/3d/9d/966164332c5a178444ae6d165082d4f351bd56afd9c3ec828eecbf190e6a/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1941b4e39de9b38b868a69b911df5e89dc43767feeda667b40ae032522b9b5f1", size = 615114 }, - { url = "https://files.pythonhosted.org/packages/94/df/f569ae4c1877f96ad4086c153a8eee5a19a3b519487bf5c9454a3438c341/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f8c4998506241dedf59613082d1c18b836e26ef2a4caecad0ec41e2a15e4226", size = 613076 }, - { url = "https://files.pythonhosted.org/packages/15/ae/8ce5f29e65d5fa5790e3c80c289819c55e12be2e1b9f5b6a0e55e169b97d/watchfiles-1.0.4-cp311-cp311-win32.whl", hash = "sha256:4ebbeca9360c830766b9f0df3640b791be569d988f4be6c06d6fae41f187f105", size = 271013 }, - { url = "https://files.pythonhosted.org/packages/a4/c6/79dc4a7c598a978e5fafa135090aaf7bbb03b8dec7bada437dfbe578e7ed/watchfiles-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:05d341c71f3d7098920f8551d4df47f7b57ac5b8dad56558064c3431bdfc0b74", size = 284229 }, - { url = "https://files.pythonhosted.org/packages/37/3d/928633723211753f3500bfb138434f080363b87a1b08ca188b1ce54d1e05/watchfiles-1.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:32b026a6ab64245b584acf4931fe21842374da82372d5c039cba6bf99ef722f3", size = 276824 }, - { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, - { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, - { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, - { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, - { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, - { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, - { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, - { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, - { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, - { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, - { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, - { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, - { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, - { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, - { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, - { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, - { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, - { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, - { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, - { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, - { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, - { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, - { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, - { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, - { url = "https://files.pythonhosted.org/packages/6f/06/175d5ac6b838fb319008c0cd981d7bf289317c510154d411d3584ca2b67b/watchfiles-1.0.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdcc92daeae268de1acf5b7befcd6cfffd9a047098199056c72e4623f531de18", size = 396269 }, - { url = "https://files.pythonhosted.org/packages/86/ee/5db93b0b57dc0587abdbac4149296ee73275f615d790a82cb5598af0557f/watchfiles-1.0.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8d3d9203705b5797f0af7e7e5baa17c8588030aaadb7f6a86107b7247303817", size = 386010 }, - { url = "https://files.pythonhosted.org/packages/75/61/fe0dc5fedf152bfc085a53711f740701f6bdb8ab6b5c950402b681d4858b/watchfiles-1.0.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdef5a1be32d0b07dcea3318a0be95d42c98ece24177820226b56276e06b63b0", size = 450913 }, - { url = "https://files.pythonhosted.org/packages/9f/dd/3c7731af3baf1a9957afc643d176f94480921a690ec3237c9f9d11301c08/watchfiles-1.0.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:342622287b5604ddf0ed2d085f3a589099c9ae8b7331df3ae9845571586c4f3d", size = 453474 }, -] - -[[package]] -name = "web-page-to-slide" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "bs4" }, - { name = "langchain-anthropic" }, - { name = "langchain-community" }, - { name = "langchain-core" }, - { name = "langgraph" }, - { name = "middleman-ai" }, - { name = "requests" }, - { name = "tavily-python" }, - { name = "types-requests" }, -] - -[package.dev-dependencies] -dev = [ - { name = "langgraph-cli", extra = ["inmem"] }, - { name = "python-dotenv" }, -] - -[package.metadata] -requires-dist = [ - { name = "bs4", specifier = ">=0.0.2" }, - { name = "langchain-anthropic", specifier = ">=0.3.6" }, - { name = "langchain-community", specifier = ">=0.3.15" }, - { name = "langchain-core", specifier = ">=0.3.31" }, - { name = "langgraph", specifier = ">=0.2.69" }, - { name = "middleman-ai", editable = "../../" }, - { name = "requests", specifier = ">=2.32.3" }, - { name = "tavily-python", specifier = ">=0.5.0" }, - { name = "types-requests", specifier = ">=2.32.0.20241016" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "langgraph-cli", extras = ["inmem"], specifier = ">=0.1.80" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, -] - -[[package]] -name = "yarl" -version = "1.18.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/98/e005bc608765a8a5569f58e650961314873c8469c333616eb40bff19ae97/yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34", size = 141458 }, - { url = "https://files.pythonhosted.org/packages/df/5d/f8106b263b8ae8a866b46d9be869ac01f9b3fb7f2325f3ecb3df8003f796/yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7", size = 94365 }, - { url = "https://files.pythonhosted.org/packages/56/3e/d8637ddb9ba69bf851f765a3ee288676f7cf64fb3be13760c18cbc9d10bd/yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed", size = 92181 }, - { url = "https://files.pythonhosted.org/packages/76/f9/d616a5c2daae281171de10fba41e1c0e2d8207166fc3547252f7d469b4e1/yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde", size = 315349 }, - { url = "https://files.pythonhosted.org/packages/bb/b4/3ea5e7b6f08f698b3769a06054783e434f6d59857181b5c4e145de83f59b/yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b", size = 330494 }, - { url = "https://files.pythonhosted.org/packages/55/f1/e0fc810554877b1b67420568afff51b967baed5b53bcc983ab164eebf9c9/yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5", size = 326927 }, - { url = "https://files.pythonhosted.org/packages/a9/42/b1753949b327b36f210899f2dd0a0947c0c74e42a32de3f8eb5c7d93edca/yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc", size = 319703 }, - { url = "https://files.pythonhosted.org/packages/f0/6d/e87c62dc9635daefb064b56f5c97df55a2e9cc947a2b3afd4fd2f3b841c7/yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd", size = 310246 }, - { url = "https://files.pythonhosted.org/packages/e3/ef/e2e8d1785cdcbd986f7622d7f0098205f3644546da7919c24b95790ec65a/yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990", size = 319730 }, - { url = "https://files.pythonhosted.org/packages/fc/15/8723e22345bc160dfde68c4b3ae8b236e868f9963c74015f1bc8a614101c/yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db", size = 321681 }, - { url = "https://files.pythonhosted.org/packages/86/09/bf764e974f1516efa0ae2801494a5951e959f1610dd41edbfc07e5e0f978/yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62", size = 324812 }, - { url = "https://files.pythonhosted.org/packages/f6/4c/20a0187e3b903c97d857cf0272d687c1b08b03438968ae8ffc50fe78b0d6/yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760", size = 337011 }, - { url = "https://files.pythonhosted.org/packages/c9/71/6244599a6e1cc4c9f73254a627234e0dad3883ece40cc33dce6265977461/yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b", size = 338132 }, - { url = "https://files.pythonhosted.org/packages/af/f5/e0c3efaf74566c4b4a41cb76d27097df424052a064216beccae8d303c90f/yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690", size = 331849 }, - { url = "https://files.pythonhosted.org/packages/8a/b8/3d16209c2014c2f98a8f658850a57b716efb97930aebf1ca0d9325933731/yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6", size = 84309 }, - { url = "https://files.pythonhosted.org/packages/fd/b7/2e9a5b18eb0fe24c3a0e8bae994e812ed9852ab4fd067c0107fadde0d5f0/yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8", size = 90484 }, - { url = "https://files.pythonhosted.org/packages/40/93/282b5f4898d8e8efaf0790ba6d10e2245d2c9f30e199d1a85cae9356098c/yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069", size = 141555 }, - { url = "https://files.pythonhosted.org/packages/6d/9c/0a49af78df099c283ca3444560f10718fadb8a18dc8b3edf8c7bd9fd7d89/yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193", size = 94351 }, - { url = "https://files.pythonhosted.org/packages/5a/a1/205ab51e148fdcedad189ca8dd587794c6f119882437d04c33c01a75dece/yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889", size = 92286 }, - { url = "https://files.pythonhosted.org/packages/ed/fe/88b690b30f3f59275fb674f5f93ddd4a3ae796c2b62e5bb9ece8a4914b83/yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8", size = 340649 }, - { url = "https://files.pythonhosted.org/packages/07/eb/3b65499b568e01f36e847cebdc8d7ccb51fff716dbda1ae83c3cbb8ca1c9/yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca", size = 356623 }, - { url = "https://files.pythonhosted.org/packages/33/46/f559dc184280b745fc76ec6b1954de2c55595f0ec0a7614238b9ebf69618/yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8", size = 354007 }, - { url = "https://files.pythonhosted.org/packages/af/ba/1865d85212351ad160f19fb99808acf23aab9a0f8ff31c8c9f1b4d671fc9/yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae", size = 344145 }, - { url = "https://files.pythonhosted.org/packages/94/cb/5c3e975d77755d7b3d5193e92056b19d83752ea2da7ab394e22260a7b824/yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3", size = 336133 }, - { url = "https://files.pythonhosted.org/packages/19/89/b77d3fd249ab52a5c40859815765d35c91425b6bb82e7427ab2f78f5ff55/yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb", size = 347967 }, - { url = "https://files.pythonhosted.org/packages/35/bd/f6b7630ba2cc06c319c3235634c582a6ab014d52311e7d7c22f9518189b5/yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e", size = 346397 }, - { url = "https://files.pythonhosted.org/packages/18/1a/0b4e367d5a72d1f095318344848e93ea70da728118221f84f1bf6c1e39e7/yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59", size = 350206 }, - { url = "https://files.pythonhosted.org/packages/b5/cf/320fff4367341fb77809a2d8d7fe75b5d323a8e1b35710aafe41fdbf327b/yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d", size = 362089 }, - { url = "https://files.pythonhosted.org/packages/57/cf/aadba261d8b920253204085268bad5e8cdd86b50162fcb1b10c10834885a/yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e", size = 366267 }, - { url = "https://files.pythonhosted.org/packages/54/58/fb4cadd81acdee6dafe14abeb258f876e4dd410518099ae9a35c88d8097c/yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a", size = 359141 }, - { url = "https://files.pythonhosted.org/packages/9a/7a/4c571597589da4cd5c14ed2a0b17ac56ec9ee7ee615013f74653169e702d/yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1", size = 84402 }, - { url = "https://files.pythonhosted.org/packages/ae/7b/8600250b3d89b625f1121d897062f629883c2f45339623b69b1747ec65fa/yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5", size = 91030 }, - { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, - { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, - { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, - { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, - { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, - { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, - { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, - { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, - { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, - { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, - { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, - { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, - { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, - { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, - { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, - { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, - { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, - { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, - { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, - { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, - { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, - { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, - { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, - { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, - { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, - { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, - { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, - { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, - { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, - { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, - { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, - { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, - { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, -] - -[[package]] -name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701 }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678 }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098 }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798 }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840 }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337 }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182 }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936 }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705 }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882 }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672 }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043 }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390 }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901 }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596 }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498 }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699 }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681 }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328 }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955 }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944 }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927 }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910 }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544 }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094 }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440 }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091 }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682 }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707 }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792 }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586 }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420 }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, -] diff --git a/pyproject.toml b/pyproject.toml index 9a1c809..8ab5529 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,6 @@ authors = [{ name = "Generative Agents, Inc." }] dependencies = [ "requests>=2", "pydantic>=2", - "langchain-core>=0.3", "typing-extensions", "click>=8.0.0", "mcp[cli]>=1.6.0", diff --git a/src/middleman_ai/client.py b/src/middleman_ai/client.py index ef254df..324cecf 100644 --- a/src/middleman_ai/client.py +++ b/src/middleman_ai/client.py @@ -474,7 +474,7 @@ def mermaid_to_image( その他、_handle_responseで定義される例外 """ try: - request_data = { + request_data: Dict[str, Any] = { "content": mermaid_text, } diff --git a/src/middleman_ai/langchain_tools/__init__.py b/src/middleman_ai/langchain_tools/__init__.py deleted file mode 100644 index b9feb91..0000000 --- a/src/middleman_ai/langchain_tools/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -"""LangChainツール群。 - -このパッケージは、Middleman.aiのAPIをLangChainのツールとして利用するためのクラス群を提供します。 -""" - -from .docx_to_page_images import DocxToPageImagesTool -from .json_to_pptx import JsonToPptxAnalyzeTool, JsonToPptxExecuteTool -from .md_to_docx import MdToDocxTool -from .md_to_pdf import MdToPdfTool -from .pdf_to_page_images import PdfToPageImagesTool -from .pptx_to_page_images import PptxToPageImagesTool -from .xlsx_to_page_images import XlsxToPageImagesTool - -__all__ = [ - "DocxToPageImagesTool", - "JsonToPptxAnalyzeTool", - "JsonToPptxExecuteTool", - "MdToDocxTool", - "MdToPdfTool", - "PdfToPageImagesTool", - "PptxToPageImagesTool", - "XlsxToPageImagesTool", -] diff --git a/src/middleman_ai/langchain_tools/docx_to_page_images.py b/src/middleman_ai/langchain_tools/docx_to_page_images.py deleted file mode 100644 index 0d6d82e..0000000 --- a/src/middleman_ai/langchain_tools/docx_to_page_images.py +++ /dev/null @@ -1,65 +0,0 @@ -"""LangChainのDOCX to Page Images変換ツール。""" - -from typing import Any - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field - -from middleman_ai.client import ToolsClient - - -class DocxToPageImagesInput(BaseModel): - """DOCX to Page Images変換用の入力スキーマ。""" - - docx_file_path: str = Field( - ..., - description="変換対象のDOCXファイルパス。ローカルに存在する有効なDOCXファイルを指定する必要があります。", - ) - - -class DocxToPageImagesTool(BaseTool): - """DOCXをページごとの画像に変換するLangChainツール。""" - - name: str = "docx-to-page-images" - description: str = ( - "DOCXファイルをページごとの画像に変換します。" - "入力はローカルのDOCXファイルパスである必要があります。" - "出力は各ページの画像URLのリストを文字列化したものです。" - ) - args_schema: type[BaseModel] = DocxToPageImagesInput - client: ToolsClient = Field(..., exclude=True) - - def __init__(self, client: ToolsClient, **kwargs: Any) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - super().__init__(**kwargs) - - def _run(self, docx_file_path: str) -> str: - """同期的にDOCXをページごとの画像に変換します。 - - Args: - docx_file_path: 変換対象のDOCXファイルパス - - Returns: - str: 各ページの画像URLのリストを文字列化したもの - """ - result = self.client.docx_to_page_images(docx_file_path) - return "\n".join( - f"Page {page['page_no']}: {page['image_url']}" for page in result - ) - - async def _arun(self, docx_file_path: str) -> str: - """非同期的にDOCXをページごとの画像に変換します。 - - Args: - docx_file_path: 変換対象のDOCXファイルパス - - Returns: - str: 各ページの画像URLのリストを文字列化したもの - """ - return self._run(docx_file_path) diff --git a/src/middleman_ai/langchain_tools/json_to_pptx.py b/src/middleman_ai/langchain_tools/json_to_pptx.py deleted file mode 100644 index 42a1686..0000000 --- a/src/middleman_ai/langchain_tools/json_to_pptx.py +++ /dev/null @@ -1,178 +0,0 @@ -"""LangChainのJSON to PPTX変換ツール。""" - -from typing import Any, List - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field, ValidationError - -from middleman_ai.client import Presentation, ToolsClient - - -class JsonToPptxAnalyzeInput(BaseModel): - """PPTXテンプレート解析用の入力スキーマ。""" - - template_id: str = Field( - default="", - description="PPTXテンプレートのID(UUID形式)。テンプレートの構造を解析するために使用します。省略した場合はデフォルトのテンプレートが利用されます。ユーザーからテンプレートIDの共有がない場合は省略してください。", - ) - - -class JsonToPptxExecuteInput(BaseModel): - """PPTXファイル生成用の入力スキーマ。""" - - template_id: str = Field( - default="", - description="PPTXテンプレートのID(UUID形式)。プレゼンテーションの生成に使用します。省略した場合はデフォルトのテンプレートが利用されます。ユーザーからテンプレートIDの共有がない場合は省略してください。", - ) - presentation: str = Field( - ..., - description=f"プレゼンテーションの内容を表すJSON文字列。各スライドのプレースホルダーに挿入するテキストやイメージを以下のJSONスキーマに従って指定します:\n{Presentation.model_json_schema()}", - ) - - -class JsonToPptxAnalyzeTool(BaseTool): - """PPTXテンプレートを解析するLangChainツール。""" - - name: str = "json-to-pptx-analyze" - description: str = ( - "PPTXテンプレートの構造を解析します。" - "入力はテンプレートID(UUID)である必要があります。" - "出力はテンプレートの構造情報です。" - ) - args_schema: type[BaseModel] = JsonToPptxAnalyzeInput - client: ToolsClient = Field(..., exclude=True) - default_template_id: str | None = Field(..., exclude=True) - - def __init__( - self, - client: ToolsClient, - default_template_id: str | None = None, - **kwargs: Any, - ) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - kwargs["default_template_id"] = default_template_id - super().__init__(**kwargs) - - def _run(self, template_id: str) -> str: - """同期的にPPTXテンプレートを解析します。 - - Args: - template_id: テンプレートID(UUID) - - Returns: - str: テンプレートの構造情報を文字列化したもの - """ - template_id_to_use = template_id or self.default_template_id - if template_id_to_use is None: - raise ValueError("テンプレートIDが指定されていません") - - result: List[dict] = self.client.json_to_pptx_analyze_v2(template_id_to_use) - return "\n".join( - f"Slide{i + 1}: type={slide.get('type', 'Untitled')} description={slide.get('description', 'No description')}" # noqa: E501 - f"(placeholders: {', '.join(str(p) for p in slide.get('placeholders', []))})" # noqa: E501 - for i, slide in enumerate(result) - ) - - async def _arun( - self, - template_id: str, - ) -> str: - """非同期的にPPTXテンプレートを解析します。 - - Args: - template_id: テンプレートID(UUID) - - Returns: - str: テンプレートの構造情報を文字列化したもの - """ - # 現時点では同期メソッドを呼び出し - return self._run(template_id) - - -class JsonToPptxExecuteTool(BaseTool): - """JSONからPPTXを生成するLangChainツール。""" - - name: str = "json-to-pptx-execute" - description: str = ( - "テンプレートIDとプレゼンテーションJSONを指定し、PPTXを生成します。" - "入力は「テンプレートID,JSON」の形式である必要があります(カンマ区切り)。" - "出力は生成されたPPTXのURLです。" - ) - args_schema: type[BaseModel] = JsonToPptxExecuteInput - client: ToolsClient = Field(..., exclude=True) - default_template_id: str | None = Field(..., exclude=True) - - def __init__( - self, - client: ToolsClient, - default_template_id: str | None = None, - **kwargs: Any, - ) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - kwargs["default_template_id"] = default_template_id - super().__init__(**kwargs) - - def _run( - self, - presentation: str, - template_id: str = "", - ) -> str: - """同期的にJSONからPPTXを生成します。 - - Args: - presentation: プレゼンテーションの内容をJSONで表した文字列 - template_id: テンプレートID(UUID) - - Returns: - str: 生成されたPPTXのURL - - Raises: - ValueError: 入力形式が不正な場合 - json.JSONDecodeError: JSON形式が不正な場合 - """ - import json - - template_id_to_use = template_id or self.default_template_id - if not template_id_to_use: - raise ValueError("テンプレートIDが指定されていません") - - try: - presentation_dict = Presentation.model_validate_json(presentation) - except json.JSONDecodeError as e: - raise ValueError("不正なJSON形式です") from e - except ValidationError as e: - raise ValueError("不正なJSON形式です") from e - - return self.client.json_to_pptx_execute_v2( - template_id_to_use, - presentation_dict, - ) - - async def _arun( - self, - presentation: str, - template_id: str, - ) -> str: - """非同期的にJSONからPPTXを生成します。 - - Args: - presentation: プレゼンテーションの内容をJSONで表した文字列 - template_id: テンプレートID(UUID) - - Returns: - str: 生成されたPPTXのURL - """ - # 現時点では同期メソッドを呼び出し - return self._run(presentation, template_id) diff --git a/src/middleman_ai/langchain_tools/md_to_docx.py b/src/middleman_ai/langchain_tools/md_to_docx.py deleted file mode 100644 index 349dd1d..0000000 --- a/src/middleman_ai/langchain_tools/md_to_docx.py +++ /dev/null @@ -1,80 +0,0 @@ -"""LangChainのMarkdown to DOCX変換ツール。""" - -from typing import Any - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field - -from middleman_ai.client import ToolsClient - - -class MdToDocxInput(BaseModel): - """Markdown to DOCX変換用の入力スキーマ。""" - - text: str = Field( - ..., - description="変換対象のMarkdown文字列。有効なMarkdown形式である必要があります。", - ) - docx_template_id: str | None = Field( - None, - description="DOCXテンプレートのID(UUID)。プレゼンテーションの生成に使用します。省略した場合はデフォルトのテンプレートが利用されます。ユーザーからテンプレートIDの共有がない場合は省略してください。", - ) - - -class MdToDocxTool(BaseTool): - """Markdown文字列をDOCXに変換するLangChainツール。""" - - name: str = "md-to-docx" - description: str = ( - "Markdown文字列をDOCXに変換します。" - "入力は有効なMarkdown文字列である必要があります。" - "出力は生成されたDOCXのURLです。" - ) - args_schema: type[BaseModel] = MdToDocxInput - client: ToolsClient = Field(..., exclude=True) - default_template_id: str | None = Field(..., exclude=True) - - def __init__( - self, - client: ToolsClient, - default_template_id: str | None = None, - **kwargs: Any, - ) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - default_template_id: デフォルトのDOCXテンプレートのID(UUID) - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - kwargs["default_template_id"] = default_template_id - super().__init__(**kwargs) - - def _run(self, text: str, docx_template_id: str | None = None) -> str: - """同期的にMarkdown文字列をDOCXに変換します。 - - Args: - text: 変換対象のMarkdown文字列 - - Returns: - str: 生成されたDOCXのURL - """ - docx_template_id_to_use = ( - docx_template_id - if docx_template_id is not None - else self.default_template_id - ) - return self.client.md_to_docx(text, docx_template_id=docx_template_id_to_use) - - async def _arun(self, text: str, docx_template_id: str | None = None) -> str: - """非同期的にMarkdown文字列をDOCXに変換します。 - - Args: - text: 変換対象のMarkdown文字列 - - Returns: - str: 生成されたDOCXのURL - """ - # 現時点では同期メソッドを呼び出し - return self._run(text, docx_template_id) diff --git a/src/middleman_ai/langchain_tools/md_to_pdf.py b/src/middleman_ai/langchain_tools/md_to_pdf.py deleted file mode 100644 index b7e157c..0000000 --- a/src/middleman_ai/langchain_tools/md_to_pdf.py +++ /dev/null @@ -1,77 +0,0 @@ -"""LangChainのMarkdown to PDF変換ツール。""" - -from typing import Any - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field - -from middleman_ai.client import ToolsClient - - -class MdToPdfInput(BaseModel): - """Markdown to PDF変換用の入力スキーマ。""" - - text: str = Field( - ..., - description="変換対象のMarkdown文字列。有効なMarkdown形式である必要があります。", - ) - pdf_template_id: str | None = Field( - None, - description="PDFテンプレートのID(UUID)。プレゼンテーションの生成に使用します。省略した場合はデフォルトのテンプレートが利用されます。ユーザーからテンプレートIDの共有がない場合は省略してください。", - ) - - -class MdToPdfTool(BaseTool): - """Markdown文字列をPDFに変換するLangChainツール。""" - - name: str = "md-to-pdf" - description: str = ( - "Markdown文字列をPDFに変換します。" - "入力は有効なMarkdown文字列である必要があります。" - "出力は生成されたPDFのURLです。" - ) - args_schema: type[BaseModel] = MdToPdfInput - client: ToolsClient = Field(..., exclude=True) - default_template_id: str | None = Field(..., exclude=True) - - def __init__( - self, - client: ToolsClient, - default_template_id: str | None = None, - **kwargs: Any, - ) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - kwargs["default_template_id"] = default_template_id - super().__init__(**kwargs) - - def _run(self, text: str, pdf_template_id: str | None = None) -> str: - """同期的にMarkdown文字列をPDFに変換します。 - - Args: - text: 変換対象のMarkdown文字列 - - Returns: - str: 生成されたPDFのURL - """ - pdf_template_id_to_use = ( - pdf_template_id if pdf_template_id is not None else self.default_template_id - ) - return self.client.md_to_pdf(text, pdf_template_id=pdf_template_id_to_use) - - async def _arun(self, text: str, pdf_template_id: str | None = None) -> str: - """非同期的にMarkdown文字列をPDFに変換します。 - - Args: - text: 変換対象のMarkdown文字列 - - Returns: - str: 生成されたPDFのURL - """ - # 現時点では同期メソッドを呼び出し - return self._run(text, pdf_template_id=pdf_template_id) diff --git a/src/middleman_ai/langchain_tools/pdf_to_page_images.py b/src/middleman_ai/langchain_tools/pdf_to_page_images.py deleted file mode 100644 index 2008b6a..0000000 --- a/src/middleman_ai/langchain_tools/pdf_to_page_images.py +++ /dev/null @@ -1,66 +0,0 @@ -"""LangChainのPDF to Page Images変換ツール。""" - -from typing import Any - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field - -from middleman_ai.client import ToolsClient - - -class PdfToPageImagesInput(BaseModel): - """PDF to Page Images変換用の入力スキーマ。""" - - pdf_file_path: str = Field( - ..., - description="変換対象のPDFファイルパス。ローカルに存在する有効なPDFファイルを指定する必要があります。", - ) - - -class PdfToPageImagesTool(BaseTool): - """PDFをページごとの画像に変換するLangChainツール。""" - - name: str = "pdf-to-page-images" - description: str = ( - "PDFファイルをページごとの画像に変換します。" - "入力はローカルのPDFファイルパスである必要があります。" - "出力は各ページの画像URLのリストを文字列化したものです。" - ) - args_schema: type[BaseModel] = PdfToPageImagesInput - client: ToolsClient = Field(..., exclude=True) - - def __init__(self, client: ToolsClient, **kwargs: Any) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - super().__init__(**kwargs) - - def _run(self, pdf_file_path: str) -> str: - """同期的にPDFをページごとの画像に変換します。 - - Args: - pdf_file_path: 変換対象のPDFファイルパス - - Returns: - str: 各ページの画像URLのリストを文字列化したもの - """ - result = self.client.pdf_to_page_images(pdf_file_path) - return "\n".join( - f"Page {page['page_no']}: {page['image_url']}" for page in result - ) - - async def _arun(self, pdf_file_path: str) -> str: - """非同期的にPDFをページごとの画像に変換します。 - - Args: - pdf_file_path: 変換対象のPDFファイルパス - - Returns: - str: 各ページの画像URLのリストを文字列化したもの - """ - # 現時点では同期メソッドを呼び出し - return self._run(pdf_file_path) diff --git a/src/middleman_ai/langchain_tools/pptx_to_page_images.py b/src/middleman_ai/langchain_tools/pptx_to_page_images.py deleted file mode 100644 index 4675b2b..0000000 --- a/src/middleman_ai/langchain_tools/pptx_to_page_images.py +++ /dev/null @@ -1,66 +0,0 @@ -"""LangChainのPPTX to Page Images変換ツール。""" - -from typing import Any - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field - -from middleman_ai.client import ToolsClient - - -class PptxToPageImagesInput(BaseModel): - """PPTX to Page Images変換用の入力スキーマ。""" - - pptx_file_path: str = Field( - ..., - description="変換対象のPPTXファイルパス。ローカルに存在する有効なPPTXファイルを指定する必要があります。", - ) - - -class PptxToPageImagesTool(BaseTool): - """PPTXをスライドごとの画像に変換するLangChainツール。""" - - name: str = "pptx-to-page-images" - description: str = ( - "PPTXファイルをスライドごとの画像に変換します。" - "入力はローカルのPPTXファイルパスである必要があります。" - "出力は各スライドの画像URLのリストを文字列化したものです。" - ) - args_schema: type[BaseModel] = PptxToPageImagesInput - client: ToolsClient = Field(..., exclude=True) - - def __init__(self, client: ToolsClient, **kwargs: Any) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - super().__init__(**kwargs) - - def _run(self, pptx_file_path: str) -> str: - """同期的にPPTXをスライドごとの画像に変換します。 - - Args: - pptx_file_path: 変換対象のPPTXファイルパス - - Returns: - str: 各スライドの画像URLのリストを文字列化したもの - """ - result = self.client.pptx_to_page_images(pptx_file_path) - return "\n".join( - f"Slide {page['page_no']}: {page['image_url']}" for page in result - ) - - async def _arun(self, pptx_file_path: str) -> str: - """非同期的にPPTXをスライドごとの画像に変換します。 - - Args: - pptx_file_path: 変換対象のPPTXファイルパス - - Returns: - str: 各スライドの画像URLのリストを文字列化したもの - """ - # 現時点では同期メソッドを呼び出し - return self._run(pptx_file_path) diff --git a/src/middleman_ai/langchain_tools/xlsx_to_page_images.py b/src/middleman_ai/langchain_tools/xlsx_to_page_images.py deleted file mode 100644 index b3f398a..0000000 --- a/src/middleman_ai/langchain_tools/xlsx_to_page_images.py +++ /dev/null @@ -1,70 +0,0 @@ -"""LangChainのXLSX to Page Images変換ツール。""" - -from typing import Any - -from langchain_core.tools import BaseTool -from pydantic import BaseModel, Field - -from middleman_ai.client import ToolsClient - - -class XlsxToPageImagesInput(BaseModel): - """XLSX to Page Images変換用の入力スキーマ。""" - - xlsx_file_path: str = Field( - ..., - description="変換対象のXLSXファイルパス。ローカルに存在する有効なXLSXファイルを指定する必要があります。", - ) - - -class XlsxToPageImagesTool(BaseTool): - """XLSXをページごとの画像に変換するLangChainツール。""" - - name: str = "xlsx-to-page-images" - description: str = ( - "XLSXファイルをページごとの画像に変換します。" - "入力はローカルのXLSXファイルパスである必要があります。" - "出力は各ページの画像URLのリストを文字列化したものです。" - ) - args_schema: type[BaseModel] = XlsxToPageImagesInput - client: ToolsClient = Field(..., exclude=True) - - def __init__(self, client: ToolsClient, **kwargs: Any) -> None: - """ツールを初期化します。 - - Args: - client: Middleman.ai APIクライアント - **kwargs: BaseTool用の追加引数 - """ - kwargs["client"] = client - super().__init__(**kwargs) - - def _run(self, xlsx_file_path: str) -> str: - """同期的にXLSXをページごとの画像に変換します。 - - Args: - xlsx_file_path: 変換対象のXLSXファイルパス - - Returns: - str: 各ページの画像URLのリストを文字列化したもの - """ - # 注意: client.xlsx_to_page_images メソッドが存在することを前提としています。 - # 存在しない場合は、適切なメソッド名に修正する必要があります。 - result = self.client.xlsx_to_page_images(xlsx_file_path) - return "\n".join( - f"Sheet {page['sheet_name']}: {page['image_url']}" for page in result - ) - - async def _arun(self, xlsx_file_path: str) -> str: - """非同期的にXLSXをページごとの画像に変換します。 - - Args: - xlsx_file_path: 変換対象のXLSXファイルパス - - Returns: - str: 各ページの画像URLのリストを文字列化したもの - """ - # 注意: client.xlsx_to_page_images メソッドが存在することを前提としています。 - # 存在しない場合は、適切なメソッド名に修正する必要があります。 - # 非同期実装が必要な場合は、client側の対応も確認してください。 - return self._run(xlsx_file_path) diff --git a/src/middleman_ai/models.py b/src/middleman_ai/models.py index 50ac870..9f05ca8 100644 --- a/src/middleman_ai/models.py +++ b/src/middleman_ai/models.py @@ -94,8 +94,18 @@ class XlsxToPageImagesResponse(BaseModel): class CustomSize(BaseModel): """Mermaid画像のカスタムサイズ設定。""" - width: int = Field(..., ge=100, le=1200, description="画像幅(100-1200ピクセル)") - height: int = Field(..., ge=100, le=1200, description="画像高さ(100-1200ピクセル)") + width: int = Field( + ..., + ge=100, + le=1200, + description="画像幅(100-1200ピクセル)", + ) + height: int = Field( + ..., + ge=100, + le=1200, + description="画像高さ(100-1200ピクセル)", + ) class MermaidToImageOptions(BaseModel): diff --git a/tests/test_client_vcr.py b/tests/test_client_vcr.py index 8247ea0..3f0bd8e 100644 --- a/tests/test_client_vcr.py +++ b/tests/test_client_vcr.py @@ -1,4 +1,4 @@ -"""LangChainツール群のVCRテストモジュール。""" +"""Pythonクライアント用のVCRテストモジュール。""" import os from typing import TYPE_CHECKING @@ -286,7 +286,7 @@ def test_mermaid_to_image_with_options_vcr(client: ToolsClient) -> None: options = MermaidToImageOptions( theme="dark", background_color="transparent", - custom_size=CustomSize(width=800, height=600) + custom_size=CustomSize(width=800, height=600), ) image_url = client.mermaid_to_image(mermaid_text=test_mermaid, options=options) diff --git a/tests/test_langchain_tools.py b/tests/test_langchain_tools.py deleted file mode 100644 index a559bfd..0000000 --- a/tests/test_langchain_tools.py +++ /dev/null @@ -1,687 +0,0 @@ -"""LangChainツール群のテストモジュール。""" - -from typing import TYPE_CHECKING - -import pytest - -from middleman_ai.client import Presentation, ToolsClient -from middleman_ai.langchain_tools.docx_to_page_images import DocxToPageImagesTool -from middleman_ai.langchain_tools.json_to_pptx import ( - JsonToPptxAnalyzeTool, - JsonToPptxExecuteTool, -) -from middleman_ai.langchain_tools.md_to_docx import MdToDocxTool -from middleman_ai.langchain_tools.md_to_pdf import MdToPdfTool -from middleman_ai.langchain_tools.pdf_to_page_images import PdfToPageImagesTool -from middleman_ai.langchain_tools.pptx_to_page_images import PptxToPageImagesTool -from middleman_ai.langchain_tools.xlsx_to_page_images import XlsxToPageImagesTool - -if TYPE_CHECKING: - from pytest_mock import MockerFixture - - -@pytest.fixture -def client() -> ToolsClient: - """テスト用のToolsClientインスタンスを生成します。""" - return ToolsClient(api_key="test_api_key") - - -def test_md_to_pdf_tool(client: ToolsClient, mocker: "MockerFixture") -> None: - """MdToPdfToolのテスト。""" - mock_md_to_pdf = mocker.patch.object( - client, - "md_to_pdf", - return_value="https://example.com/test.pdf", - ) - - tool = MdToPdfTool(client=client) - result = tool.run("# Test") - - assert result == "https://example.com/test.pdf" - mock_md_to_pdf.assert_called_once_with("# Test", pdf_template_id=None) - - -def test_md_to_pdf_tool_with_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """MdToPdfToolのテスト。""" - mock_md_to_pdf = mocker.patch.object( - client, - "md_to_pdf", - return_value="https://example.com/test.pdf", - ) - - tool = MdToPdfTool(client=client) - result = tool.run( - { - "text": "# Test", - "pdf_template_id": "00000000-0000-0000-0000-000000000001", - } - ) - - assert result == "https://example.com/test.pdf" - mock_md_to_pdf.assert_called_once_with( - "# Test", - pdf_template_id="00000000-0000-0000-0000-000000000001", - ) - - -def test_md_to_pdf_tool_with_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """MdToPdfToolのテスト。""" - mock_md_to_pdf = mocker.patch.object( - client, - "md_to_pdf", - return_value="https://example.com/test.pdf", - ) - - tool = MdToPdfTool( - client=client, - default_template_id="00000000-0000-0000-0000-000000000001", - ) - result = tool.run("# Test") - - assert result == "https://example.com/test.pdf" - mock_md_to_pdf.assert_called_once_with( - "# Test", - pdf_template_id="00000000-0000-0000-0000-000000000001", - ) - - -def test_md_to_pdf_tool_with_both_template_id_and_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """MdToPdfToolのテスト。""" - mock_md_to_pdf = mocker.patch.object( - client, - "md_to_pdf", - return_value="https://example.com/test.pdf", - ) - - tool = MdToPdfTool( - client=client, - default_template_id="00000000-0000-0000-0000-000000000001", - ) - result = tool.run( - { - "text": "# Test", - "pdf_template_id": "00000000-0000-0000-0000-000000000002", - } - ) - - assert result == "https://example.com/test.pdf" - mock_md_to_pdf.assert_called_once_with( - "# Test", - pdf_template_id="00000000-0000-0000-0000-000000000002", - ) - - -def test_md_to_docx_tool(client: ToolsClient, mocker: "MockerFixture") -> None: - """MdToDocxToolのテスト。""" - mock_md_to_docx = mocker.patch.object( - client, - "md_to_docx", - return_value="https://example.com/test.docx", - ) - - tool = MdToDocxTool(client=client) - result = tool.run("# Test") - - assert result == "https://example.com/test.docx" - mock_md_to_docx.assert_called_once_with("# Test", docx_template_id=None) - - -def test_md_to_docx_tool_with_template_id( - client: ToolsClient, - mocker: "MockerFixture", -) -> None: - """MdToDocxToolのテスト。""" - mock_md_to_docx = mocker.patch.object( - client, - "md_to_docx", - return_value="https://example.com/test.docx", - ) - - tool = MdToDocxTool(client=client) - result = tool.run( - { - "text": "# Test", - "docx_template_id": "00000000-0000-0000-0000-000000000001", - } - ) - - assert result == "https://example.com/test.docx" - mock_md_to_docx.assert_called_once_with( - "# Test", - docx_template_id="00000000-0000-0000-0000-000000000001", - ) - - -def test_md_to_docx_tool_with_default_template_id( - client: ToolsClient, - mocker: "MockerFixture", -) -> None: - """MdToDocxToolのテスト。""" - mock_md_to_docx = mocker.patch.object( - client, - "md_to_docx", - return_value="https://example.com/test.docx", - ) - - tool = MdToDocxTool( - client=client, - default_template_id="00000000-0000-0000-0000-000000000001", - ) - result = tool.run("# Test") - - assert result == "https://example.com/test.docx" - mock_md_to_docx.assert_called_once_with( - "# Test", - docx_template_id="00000000-0000-0000-0000-000000000001", - ) - - -def test_md_to_docx_tool_with_both_template_id_and_default_template_id( - client: ToolsClient, - mocker: "MockerFixture", -) -> None: - """MdToDocxToolのテスト。""" - mock_md_to_docx = mocker.patch.object( - client, - "md_to_docx", - return_value="https://example.com/test.docx", - ) - - tool = MdToDocxTool( - client=client, - default_template_id="00000000-0000-0000-0000-000000000001", - ) - result = tool.run( - { - "text": "# Test", - "docx_template_id": "00000000-0000-0000-0000-000000000002", - } - ) - - assert result == "https://example.com/test.docx" - mock_md_to_docx.assert_called_once_with( - "# Test", - docx_template_id="00000000-0000-0000-0000-000000000002", - ) - - -def test_pdf_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") -> None: - """PdfToPageImagesToolのテスト。""" - expected_result = [ - {"page_no": 1, "image_url": "https://example.com/page1.png"}, - {"page_no": 2, "image_url": "https://example.com/page2.png"}, - ] - mock_pdf_to_page_images = mocker.patch.object( - client, - "pdf_to_page_images", - return_value=expected_result, - ) - - tool = PdfToPageImagesTool(client=client) - result = tool.run("/path/to/test.pdf") - - assert isinstance(result, str) - assert "https://example.com/page1.png" in result - assert "https://example.com/page2.png" in result - mock_pdf_to_page_images.assert_called_once_with("/path/to/test.pdf") - - -def test_pptx_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") -> None: - """PptxToPageImagesToolのテスト。""" - expected_result = [ - {"page_no": 1, "image_url": "https://example.com/slide1.png"}, - {"page_no": 2, "image_url": "https://example.com/slide2.png"}, - ] - mock_pptx_to_page_images = mocker.patch.object( - client, - "pptx_to_page_images", - return_value=expected_result, - ) - - tool = PptxToPageImagesTool(client=client) - result = tool.run("/path/to/test.pptx") - - assert isinstance(result, str) - assert "https://example.com/slide1.png" in result - assert "https://example.com/slide2.png" in result - mock_pptx_to_page_images.assert_called_once_with("/path/to/test.pptx") - - -def test_docx_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") -> None: - """DocxToPageImagesToolのテスト。""" - expected_result = [ - {"page_no": 1, "image_url": "https://example.com/page1.png"}, - {"page_no": 2, "image_url": "https://example.com/page2.png"}, - ] - mock_docx_to_page_images = mocker.patch.object( - client, - "docx_to_page_images", - return_value=expected_result, - ) - - tool = DocxToPageImagesTool(client=client) - result = tool.run("/path/to/test.docx") - - assert isinstance(result, str) - assert "https://example.com/page1.png" in result - assert "https://example.com/page2.png" in result - mock_docx_to_page_images.assert_called_once_with("/path/to/test.docx") - - -def test_xlsx_to_page_images_tool(client: ToolsClient, mocker: "MockerFixture") -> None: - """XlsxToPageImagesToolのテスト。""" - expected_result = [ - {"sheet_name": "Sheet1", "image_url": "https://example.com/sheet1.png"}, - {"sheet_name": "Sheet2", "image_url": "https://example.com/sheet2.png"}, - ] - mock_xlsx_to_page_images = mocker.patch.object( - client, - "xlsx_to_page_images", - return_value=expected_result, - ) - - tool = XlsxToPageImagesTool(client=client) - result = tool.run("/path/to/test.xlsx") - - assert isinstance(result, str) - assert "https://example.com/sheet1.png" in result - assert "https://example.com/sheet2.png" in result - mock_xlsx_to_page_images.assert_called_once_with("/path/to/test.xlsx") - - -def test_json_to_pptx_analyze_tool_without_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxAnalyzeToolのテスト。""" - template_structure = [ - { - "type": "Title Slide", - "description": "Description1", - "placeholders": [ - { - "name": "title", - "description": "スライドのタイトル", - }, - { - "name": "subtitle", - "description": "スライドのサブタイトル", - }, - ], - }, - { - "type": "Content Slide", - "description": "Description2", - "placeholders": [ - { - "name": "title", - "description": "スライドのタイトル", - }, - { - "name": "content", - "description": "スライドの内容", - }, - ], - }, - ] - mock_analyze = mocker.patch.object( - client, - "json_to_pptx_analyze_v2", - return_value=template_structure, - ) - - tool = JsonToPptxAnalyzeTool(client=client) - - # テンプレートIDが指定されていない場合はエラー - with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool.run("") - - # テンプレートIDが指定された場合は成功 - result = tool.run("template-123") - assert isinstance(result, str) - assert "Title Slide" in result - assert "Content Slide" in result - assert "Description1" in result - assert "Description2" in result - assert "title" in result - assert "subtitle" in result - assert "content" in result - assert "スライドのタイトル" in result - assert "スライドのサブタイトル" in result - assert "スライドの内容" in result - mock_analyze.assert_called_once_with("template-123") - - -def test_json_to_pptx_analyze_tool_with_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxAnalyzeToolのテスト。""" - template_structure = [ - { - "type": "Title Slide", - "description": "Description1", - "placeholders": [ - { - "name": "title", - "description": "スライドのタイトル", - }, - { - "name": "subtitle", - "description": "スライドのサブタイトル", - }, - ], - }, - { - "type": "Content Slide", - "description": "Description2", - "placeholders": [ - { - "name": "title", - "description": "スライドのタイトル", - }, - { - "name": "content", - "description": "スライドの内容", - }, - ], - }, - ] - mock_analyze = mocker.patch.object( - client, - "json_to_pptx_analyze_v2", - return_value=template_structure, - ) - - tool = JsonToPptxAnalyzeTool(client=client, default_template_id="template-123") - result = tool.run("") - - assert isinstance(result, str) - assert "Title Slide" in result - assert "Content Slide" in result - assert "Description1" in result - assert "Description2" in result - assert "title" in result - assert "subtitle" in result - assert "content" in result - assert "スライドのタイトル" in result - assert "スライドのサブタイトル" in result - assert "スライドの内容" in result - mock_analyze.assert_called_once_with("template-123") - - -def test_json_to_pptx_analyze_tool_with_both_template_id_and_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxAnalyzeToolのテスト。""" - template_structure = [ - { - "type": "Title Slide", - "description": "Description1", - "placeholders": [ - { - "name": "title", - "description": "スライドのタイトル", - }, - { - "name": "subtitle", - "description": "スライドのサブタイトル", - }, - ], - }, - { - "type": "Content Slide", - "description": "Description2", - "placeholders": [ - { - "name": "title", - "description": "スライドのタイトル", - }, - { - "name": "content", - "description": "スライドの内容", - }, - ], - }, - ] - mock_analyze = mocker.patch.object( - client, - "json_to_pptx_analyze_v2", - return_value=template_structure, - ) - - tool = JsonToPptxAnalyzeTool(client=client, default_template_id="template-123") - result = tool.run("template-456") - - assert isinstance(result, str) - assert "Title Slide" in result - assert "Content Slide" in result - assert "Description1" in result - assert "Description2" in result - assert "title" in result - assert "subtitle" in result - assert "content" in result - assert "スライドのタイトル" in result - assert "スライドのサブタイトル" in result - assert "スライドの内容" in result - mock_analyze.assert_called_once_with("template-456") - - -def test_json_to_pptx_execute_tool_without_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxExecuteToolのテスト。""" - template_id = "template-123" - presentation_data = { - "slides": [ - { - "type": "Title Slide", - "placeholders": [ - {"name": "title", "content": "My Title"}, - {"name": "subtitle", "content": "My Subtitle"}, - ], - }, - { - "type": "Content Slide", - "placeholders": [ - {"name": "title", "content": "My Title"}, - {"name": "content", "content": "Some content"}, - ], - }, - ], - } - mock_execute = mocker.patch.object( - client, - "json_to_pptx_execute_v2", - return_value="https://example.com/result.pptx", - ) - - tool = JsonToPptxExecuteTool(client=client) - - # テンプレートIDが指定されていない場合はエラー - with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool.run( - { - "presentation": Presentation.model_validate( - presentation_data, - ).model_dump_json(), - } - ) - - # テンプレートIDが指定された場合は成功 - result = tool.run( - { - "presentation": Presentation.model_validate( - presentation_data, - ).model_dump_json(), - "template_id": template_id, - } - ) - assert result == "https://example.com/result.pptx" - mock_execute.assert_called_once_with( - template_id, - Presentation.model_validate( - presentation_data, - ), - ) - - -def test_json_to_pptx_execute_tool_with_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxExecuteToolのテスト。""" - template_id = "template-123" - presentation_data = { - "slides": [ - { - "type": "Title Slide", - "placeholders": [ - {"name": "title", "content": "My Title"}, - {"name": "subtitle", "content": "My Subtitle"}, - ], - }, - { - "type": "Content Slide", - "placeholders": [ - {"name": "title", "content": "My Title"}, - {"name": "content", "content": "Some content"}, - ], - }, - ], - } - mock_execute = mocker.patch.object( - client, - "json_to_pptx_execute_v2", - return_value="https://example.com/result.pptx", - ) - - tool = JsonToPptxExecuteTool(client=client, default_template_id=template_id) - result = tool.run( - { - "presentation": Presentation.model_validate( - presentation_data, - ).model_dump_json(), - } - ) - - assert result == "https://example.com/result.pptx" - mock_execute.assert_called_once_with( - template_id, - Presentation.model_validate( - presentation_data, - ), - ) - - -def test_json_to_pptx_execute_tool_with_both_template_id_and_default_template_id( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxExecuteToolのテスト。""" - presentation_data = { - "slides": [ - { - "type": "Title Slide", - "placeholders": [ - {"name": "title", "content": "My Title"}, - {"name": "subtitle", "content": "My Subtitle"}, - ], - }, - { - "type": "Content Slide", - "placeholders": [ - {"name": "title", "content": "My Title"}, - {"name": "content", "content": "Some content"}, - ], - }, - ], - } - mock_execute = mocker.patch.object( - client, - "json_to_pptx_execute_v2", - return_value="https://example.com/result.pptx", - ) - - tool = JsonToPptxExecuteTool(client=client, default_template_id="template-123") - result = tool.run( - { - "presentation": Presentation.model_validate( - presentation_data, - ).model_dump_json(), - "template_id": "template-456", - } - ) - - assert result == "https://example.com/result.pptx" - mock_execute.assert_called_once_with( - "template-456", - Presentation.model_validate( - presentation_data, - ), - ) - - -def test_json_to_pptx_analyze_tool_template_id_error( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxAnalyzeToolのテンプレートIDエラーのテスト。""" - mock_analyze = mocker.patch.object( - client, - "json_to_pptx_analyze_v2", - return_value=[], - ) - - # テンプレートIDが指定されていない場合 - tool = JsonToPptxAnalyzeTool(client=client) - with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool.run("") - - mock_analyze.assert_not_called() - - -def test_json_to_pptx_execute_tool_template_id_error( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxExecuteToolのテンプレートIDエラーのテスト。""" - mock_execute = mocker.patch.object( - client, - "json_to_pptx_execute_v2", - return_value="https://example.com/result.pptx", - ) - - # テンプレートIDが指定されていない場合 - tool = JsonToPptxExecuteTool(client=client) - test_json = '{"slides": []}' - with pytest.raises(ValueError, match="テンプレートIDが指定されていません"): - tool.run( - { - "presentation": test_json, - } - ) - - mock_execute.assert_not_called() - - -def test_json_to_pptx_execute_tool_json_error( - client: ToolsClient, mocker: "MockerFixture" -) -> None: - """JsonToPptxExecuteToolのJSON形式エラーのテスト。""" - mock_execute = mocker.patch.object( - client, - "json_to_pptx_execute_v2", - return_value="https://example.com/result.pptx", - ) - - tool = JsonToPptxExecuteTool(client=client) - with pytest.raises(ValueError, match="不正なJSON形式です"): - tool.run( - { - "presentation": "invalid json", - "template_id": "template-123", - } - ) - - mock_execute.assert_not_called() diff --git a/tests/test_langchain_tools_vcr.py b/tests/test_langchain_tools_vcr.py deleted file mode 100644 index 3adca34..0000000 --- a/tests/test_langchain_tools_vcr.py +++ /dev/null @@ -1,267 +0,0 @@ -"""LangChainツール群のVCRテストモジュール。""" - -import logging -import os -from typing import TYPE_CHECKING - -import pytest - -import middleman_ai.exceptions -from middleman_ai.client import Presentation, ToolsClient -from middleman_ai.langchain_tools.docx_to_page_images import DocxToPageImagesTool -from middleman_ai.langchain_tools.json_to_pptx import ( - JsonToPptxAnalyzeTool, - JsonToPptxExecuteTool, -) -from middleman_ai.langchain_tools.md_to_docx import MdToDocxTool -from middleman_ai.langchain_tools.md_to_pdf import MdToPdfTool -from middleman_ai.langchain_tools.pdf_to_page_images import PdfToPageImagesTool -from middleman_ai.langchain_tools.pptx_to_page_images import PptxToPageImagesTool -from middleman_ai.langchain_tools.xlsx_to_page_images import XlsxToPageImagesTool - -if TYPE_CHECKING: - from _pytest.fixtures import FixtureRequest # noqa: F401 - - -@pytest.fixture -def client() -> ToolsClient: - """テスト用のToolsClientインスタンスを生成します。 - - Returns: - ToolsClient: テスト用のクライアントインスタンス - """ - return ToolsClient( - base_url=os.getenv("MIDDLEMAN_BASE_URL") or "https://middleman-ai.com", - api_key=os.getenv("MIDDLEMAN_API_KEY") or "", - ) - - -@pytest.mark.vcr() -def test_md_to_pdf_tool_vcr(client: ToolsClient) -> None: - """MdToPdfToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - test_markdown = """# Test Heading - - This is a test markdown document. - - ## Section 1 - - Item 1 - - Item 2 - """ - - tool = MdToPdfTool(client=client) - result = tool._run(test_markdown) - - assert isinstance(result, str) - assert result.startswith("https://") - assert "/s/" in result - - -@pytest.mark.vcr() -def test_md_to_pdf_tool_with_template_id_vcr(client: ToolsClient) -> None: - """MdToPdfToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - test_markdown = """# Test Heading - - This is a test markdown document. - - ## Section 1 - - Item 1 - - Item 2 - """ - - tool = MdToPdfTool(client=client) - result = tool._run( - test_markdown, - pdf_template_id=os.getenv("MIDDLEMAN_TEST_PDF_TEMPLATE_ID") or "", - ) - - assert isinstance(result, str) - assert result.startswith("https://") - assert "/s/" in result - - -@pytest.mark.vcr() -def test_md_to_docx_tool_vcr(client: ToolsClient) -> None: - """MdToDocxToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - test_markdown = """# Test Heading - - This is a test markdown document. - - ## Section 1 - - Item 1 - - Item 2 - """ - - tool = MdToDocxTool(client=client) - result = tool._run(test_markdown) - - assert isinstance(result, str) - assert result.startswith("https://") - assert "/s/" in result - - -@pytest.mark.vcr(match_on=["method", "path", "query"]) -def test_xlsx_to_page_images_tool_vcr(client: ToolsClient) -> None: - """XlsxToPageImagesToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - """ - xlsx_path = "tests/data/test.xlsx" - - tool = XlsxToPageImagesTool(client=client) - result = tool._run(xlsx_path) - - assert isinstance(result, str) - assert "/s/" in result - - -@pytest.mark.vcr(match_on=["method", "path", "query"]) -def test_pdf_to_page_images_tool_vcr(client: ToolsClient) -> None: - """PdfToPageImagesToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - pdf_path = "tests/data/test.pdf" - - tool = PdfToPageImagesTool(client=client) - result = tool._run(pdf_path) - - assert isinstance(result, str) - assert "/s/" in result - - -@pytest.mark.vcr() -def test_json_to_pptx_analyze_tool_vcr(client: ToolsClient) -> None: - """JsonToPptxAnalyzeToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - # 環境変数が設定されていない場合は、ダミーのUUIDを使用 - template_id = ( - os.getenv("MIDDLEMAN_TEST_PPTX_TEMPLATE_ID") - or "00000000-0000-0000-0000-000000000000" - ) # テスト用のテンプレートID - tool = JsonToPptxAnalyzeTool(client=client) - - try: - result = tool._run(template_id) - assert isinstance(result, str) - assert "Slide" in result - except middleman_ai.exceptions.InternalError as e: - logging.error(f"エラー詳細: {e!s}") - pytest.skip(f"サーバーエラーが発生したためテストをスキップします: {e!s}") - - -@pytest.mark.vcr() -def test_json_to_pptx_execute_tool_vcr(client: ToolsClient) -> None: - """JsonToPptxExecuteToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - presentation_data = { - "slides": [ - { - "type": "title", - "placeholders": [ - {"name": "title", "content": "Test Title"}, - {"name": "subtitle", "content": "Test Subtitle"}, - ], - } - ] - } - # 環境変数が設定されていない場合は、ダミーのUUIDを使用 - template_id = ( - os.getenv("MIDDLEMAN_TEST_PPTX_TEMPLATE_ID") - or "00000000-0000-0000-0000-000000000000" - ) # テスト用のテンプレートID - tool = JsonToPptxExecuteTool(client=client) - result = tool._run( - presentation=Presentation.model_validate( - presentation_data, - ).model_dump_json(), - template_id=template_id, - ) - - assert isinstance(result, str) - assert result.startswith("https://") - assert "/s/" in result - - -@pytest.mark.vcr(match_on=["method", "path", "query"]) -def test_pptx_to_page_images_tool_vcr(client: ToolsClient) -> None: - """PptxToPageImagesToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - pptx_path = "tests/data/test.pptx" - - tool = PptxToPageImagesTool(client=client) - result = tool._run(pptx_path) - - assert isinstance(result, str) - assert "/s/" in result - - -@pytest.mark.vcr(match_on=["method", "path", "query"]) -def test_docx_to_page_images_tool_vcr(client: ToolsClient) -> None: - """DocxToPageImagesToolの実際のAPIを使用したテスト。 - - Note: - このテストは実際のAPIを呼び出し、レスポンスをキャッシュします。 - 初回実行時のみAPIを呼び出し、以降はキャッシュを使用します。 - - Args: - client: テスト用のクライアントインスタンス - """ - docx_path = "tests/data/test.docx" - - tool = DocxToPageImagesTool(client=client) - result = tool._run(docx_path) - - assert isinstance(result, str) - assert "/s/" in result diff --git a/uv.lock b/uv.lock index 7e16f28..87b848d 100644 --- a/uv.lock +++ b/uv.lock @@ -88,12 +88,10 @@ name = "cffi" version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser" }, + { name = "pycparser", marker = "python_full_version >= '3.12.4' or platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, @@ -102,10 +100,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, @@ -114,10 +108,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, @@ -125,10 +115,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { 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 }, - { 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 }, { 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 }, { 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 }, { 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 }, @@ -136,8 +122,6 @@ wheels = [ { 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 }, { 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 }, { 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 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, ] [[package]] @@ -471,27 +455,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", size = 48435 }, ] -[[package]] -name = "jsonpatch" -version = "1.33" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpointer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, -] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, -] - [[package]] name = "keyring" version = "25.6.0" @@ -510,41 +473,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd", size = 39085 }, ] -[[package]] -name = "langchain-core" -version = "0.3.31" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonpatch" }, - { name = "langsmith" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "tenacity" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7b/ad/b8b70ce5c0660b7cd945a49417c9321716d8866b5a4581927fcd90a620f8/langchain_core-0.3.31.tar.gz", hash = "sha256:5ffa56354c07de9efaa4139609659c63e7d9b29da2c825f6bab9392ec98300df", size = 331162 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/96/2c727ade8d8a47569c869aaa45e72f3ee6d6cc6faa9198091c8b97c286e9/langchain_core-0.3.31-py3-none-any.whl", hash = "sha256:882e64ad95887c951dce8e835889e43263b11848c394af3b73e06912624bd743", size = 412215 }, -] - -[[package]] -name = "langsmith" -version = "0.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy'" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "requests-toolbelt" }, - { name = "zstandard" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/30/40/05dad022faf53fc2f4da484196ecdb2b021c70b6d88c60cb98bf87af0ffa/langsmith-0.3.1.tar.gz", hash = "sha256:9242a49d37e2176a344ddec97bf57b958dc0e1f0437e150cefd0fb70195f0e26", size = 321277 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/94/4825a96fa22df1e180cdf05a9fa39bfc6675b2d3b074fa98061f606de221/langsmith-0.3.1-py3-none-any.whl", hash = "sha256:b6afbb214ae82b6d96b8134718db3a7d2598b2a7eb4ab1212bcd6d96e04eda10", size = 332741 }, -] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -597,7 +525,6 @@ version = "0.1.2" source = { editable = "." } dependencies = [ { name = "click" }, - { name = "langchain-core" }, { name = "mcp", extra = ["cli"] }, { name = "pydantic" }, { name = "requests" }, @@ -626,7 +553,6 @@ dev = [ [package.metadata] requires-dist = [ { name = "click", specifier = ">=8.0.0" }, - { name = "langchain-core", specifier = ">=0.3" }, { name = "mcp", extras = ["cli"], specifier = ">=1.6.0" }, { name = "pydantic", specifier = ">=2" }, { name = "requests", specifier = ">=2" }, @@ -810,66 +736,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/31/d65594efd3b42b1de2335d576eb77525691fc320dbf8617948ee05c008e5/nh3-0.2.20-cp38-abi3-win_amd64.whl", hash = "sha256:da87573f03084edae8eb87cfe811ec338606288f81d333c07d2a9a0b9b976c0b", size = 541249 }, ] -[[package]] -name = "orjson" -version = "3.10.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/5dea21763eeff8c1590076918a446ea3d6140743e0e36f58f369928ed0f4/orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e", size = 5282482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/09/e5ff18ad009e6f97eb7edc5f67ef98b3ce0c189da9c3eaca1f9587cd4c61/orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04", size = 249532 }, - { url = "https://files.pythonhosted.org/packages/bd/b8/a75883301fe332bd433d9b0ded7d2bb706ccac679602c3516984f8814fb5/orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8", size = 125229 }, - { url = "https://files.pythonhosted.org/packages/83/4b/22f053e7a364cc9c685be203b1e40fc5f2b3f164a9b2284547504eec682e/orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/63/64/1b54fc75ca328b57dd810541a4035fe48c12a161d466e3cf5b11a8c25649/orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814", size = 139748 }, - { url = "https://files.pythonhosted.org/packages/5e/ff/ff0c5da781807bb0a5acd789d9a7fbcb57f7b0c6e1916595da1f5ce69f3c/orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164", size = 154559 }, - { url = "https://files.pythonhosted.org/packages/4e/9a/11e2974383384ace8495810d4a2ebef5f55aacfc97b333b65e789c9d362d/orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/2d/c4/dd9583aea6aefee1b64d3aed13f51d2aadb014028bc929fe52936ec5091f/orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061", size = 138514 }, - { url = "https://files.pythonhosted.org/packages/53/3e/dcf1729230654f5c5594fc752de1f43dcf67e055ac0d300c8cdb1309269a/orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3", size = 130940 }, - { url = "https://files.pythonhosted.org/packages/e8/2b/b9759fe704789937705c8a56a03f6c03e50dff7df87d65cba9a20fec5282/orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d", size = 414713 }, - { url = "https://files.pythonhosted.org/packages/a7/6b/b9dfdbd4b6e20a59238319eb203ae07c3f6abf07eef909169b7a37ae3bba/orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182", size = 141028 }, - { url = "https://files.pythonhosted.org/packages/7c/b5/40f5bbea619c7caf75eb4d652a9821875a8ed04acc45fe3d3ef054ca69fb/orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e", size = 129715 }, - { url = "https://files.pythonhosted.org/packages/38/60/2272514061cbdf4d672edbca6e59c7e01cd1c706e881427d88f3c3e79761/orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/11/5d/be1490ff7eafe7fef890eb4527cf5bcd8cfd6117f3efe42a3249ec847b60/orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806", size = 133564 }, - { url = "https://files.pythonhosted.org/packages/7a/a2/21b25ce4a2c71dbb90948ee81bd7a42b4fbfc63162e57faf83157d5540ae/orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6", size = 249533 }, - { url = "https://files.pythonhosted.org/packages/b2/85/2076fc12d8225698a51278009726750c9c65c846eda741e77e1761cfef33/orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef", size = 125230 }, - { url = "https://files.pythonhosted.org/packages/06/df/a85a7955f11274191eccf559e8481b2be74a7c6d43075d0a9506aa80284d/orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/37/b3/94c55625a29b8767c0eed194cb000b3787e3c23b4cdd13be17bae6ccbb4b/orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d", size = 139749 }, - { url = "https://files.pythonhosted.org/packages/53/ba/c608b1e719971e8ddac2379f290404c2e914cf8e976369bae3cad88768b1/orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0", size = 154558 }, - { url = "https://files.pythonhosted.org/packages/b2/c4/c1fb835bb23ad788a39aa9ebb8821d51b1c03588d9a9e4ca7de5b354fdd5/orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/78/14/bb2b48b26ab3c570b284eb2157d98c1ef331a8397f6c8bd983b270467f5c/orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5", size = 138513 }, - { url = "https://files.pythonhosted.org/packages/4a/97/d5b353a5fe532e92c46467aa37e637f81af8468aa894cd77d2ec8a12f99e/orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b", size = 130942 }, - { url = "https://files.pythonhosted.org/packages/b5/5d/a067bec55293cca48fea8b9928cfa84c623be0cce8141d47690e64a6ca12/orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399", size = 414717 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/1485b8b05c6b4c4db172c438cf5db5dcfd10e72a9bc23c151a1137e763e0/orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388", size = 141033 }, - { url = "https://files.pythonhosted.org/packages/f8/d2/fc67523656e43a0c7eaeae9007c8b02e86076b15d591e9be11554d3d3138/orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c", size = 129720 }, - { url = "https://files.pythonhosted.org/packages/79/42/f58c7bd4e5b54da2ce2ef0331a39ccbbaa7699b7f70206fbf06737c9ed7d/orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/00/f8/bb60a4644287a544ec81df1699d5b965776bc9848d9029d9f9b3402ac8bb/orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e", size = 133570 }, - { url = "https://files.pythonhosted.org/packages/66/85/22fe737188905a71afcc4bf7cc4c79cd7f5bbe9ed1fe0aac4ce4c33edc30/orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a", size = 249504 }, - { url = "https://files.pythonhosted.org/packages/48/b7/2622b29f3afebe938a0a9037e184660379797d5fd5234e5998345d7a5b43/orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d", size = 125080 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/0b72a48f4403d0b88b2a41450c535b3e8989e8a2d7800659a967efc7c115/orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0", size = 150121 }, - { url = "https://files.pythonhosted.org/packages/06/ec/acb1a20cd49edb2000be5a0404cd43e3c8aad219f376ac8c60b870518c03/orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4", size = 139796 }, - { url = "https://files.pythonhosted.org/packages/33/e1/f7840a2ea852114b23a52a1c0b2bea0a1ea22236efbcdb876402d799c423/orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767", size = 154636 }, - { url = "https://files.pythonhosted.org/packages/fa/da/31543337febd043b8fa80a3b67de627669b88c7b128d9ad4cc2ece005b7a/orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41", size = 130621 }, - { url = "https://files.pythonhosted.org/packages/ed/78/66115dc9afbc22496530d2139f2f4455698be444c7c2475cb48f657cefc9/orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514", size = 138516 }, - { url = "https://files.pythonhosted.org/packages/22/84/cd4f5fb5427ffcf823140957a47503076184cb1ce15bcc1165125c26c46c/orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17", size = 130762 }, - { url = "https://files.pythonhosted.org/packages/93/1f/67596b711ba9f56dd75d73b60089c5c92057f1130bb3a25a0f53fb9a583b/orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b", size = 414700 }, - { url = "https://files.pythonhosted.org/packages/7c/0c/6a3b3271b46443d90efb713c3e4fe83fa8cd71cda0d11a0f69a03f437c6e/orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7", size = 141077 }, - { url = "https://files.pythonhosted.org/packages/3b/9b/33c58e0bfc788995eccd0d525ecd6b84b40d7ed182dd0751cd4c1322ac62/orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a", size = 129898 }, - { url = "https://files.pythonhosted.org/packages/01/c1/d577ecd2e9fa393366a1ea0a9267f6510d86e6c4bb1cdfb9877104cac44c/orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665", size = 142566 }, - { url = "https://files.pythonhosted.org/packages/ed/eb/a85317ee1732d1034b92d56f89f1de4d7bf7904f5c8fb9dcdd5b1c83917f/orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa", size = 133732 }, - { url = "https://files.pythonhosted.org/packages/06/10/fe7d60b8da538e8d3d3721f08c1b7bff0491e8fa4dd3bf11a17e34f4730e/orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6", size = 249399 }, - { url = "https://files.pythonhosted.org/packages/6b/83/52c356fd3a61abd829ae7e4366a6fe8e8863c825a60d7ac5156067516edf/orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a", size = 125044 }, - { url = "https://files.pythonhosted.org/packages/55/b2/d06d5901408e7ded1a74c7c20d70e3a127057a6d21355f50c90c0f337913/orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9", size = 150066 }, - { url = "https://files.pythonhosted.org/packages/75/8c/60c3106e08dc593a861755781c7c675a566445cc39558677d505878d879f/orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0", size = 139737 }, - { url = "https://files.pythonhosted.org/packages/6a/8c/ae00d7d0ab8a4490b1efeb01ad4ab2f1982e69cc82490bf8093407718ff5/orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307", size = 154804 }, - { url = "https://files.pythonhosted.org/packages/22/86/65dc69bd88b6dd254535310e97bc518aa50a39ef9c5a2a5d518e7a223710/orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e", size = 130583 }, - { url = "https://files.pythonhosted.org/packages/bb/00/6fe01ededb05d52be42fabb13d93a36e51f1fd9be173bd95707d11a8a860/orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7", size = 138465 }, - { url = "https://files.pythonhosted.org/packages/db/2f/4cc151c4b471b0cdc8cb29d3eadbce5007eb0475d26fa26ed123dca93b33/orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8", size = 130742 }, - { url = "https://files.pythonhosted.org/packages/9f/13/8a6109e4b477c518498ca37963d9c0eb1508b259725553fb53d53b20e2ea/orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca", size = 414669 }, - { url = "https://files.pythonhosted.org/packages/22/7b/1d229d6d24644ed4d0a803de1b0e2df832032d5beda7346831c78191b5b2/orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561", size = 141043 }, - { url = "https://files.pythonhosted.org/packages/cc/d3/6dc91156cf12ed86bed383bcb942d84d23304a1e57b7ab030bf60ea130d6/orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825", size = 129826 }, - { url = "https://files.pythonhosted.org/packages/b3/38/c47c25b86f6996f1343be721b6ea4367bc1c8bc0fc3f6bbcd995d18cb19d/orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890", size = 142542 }, - { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, -] - [[package]] name = "packaging" version = "24.2" @@ -1385,15 +1251,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, ] -[[package]] -name = "tenacity" -version = "9.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/94/91fccdb4b8110642462e653d5dcb27e7b674742ad68efd146367da7bdb10/tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b", size = 47421 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/cb/b86984bed139586d01532a587464b5805f12e397594f19f931c4c2fbfa61/tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539", size = 28169 }, -] - [[package]] name = "tomli" version = "2.2.1" @@ -1707,78 +1564,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e wheels = [ { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, ] - -[[package]] -name = "zstandard" -version = "0.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation == 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/2ac0287b442160a89d726b17a9184a4c615bb5237db763791a7fd16d9df1/zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", size = 681701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/55/bd0487e86679db1823fc9ee0d8c9c78ae2413d34c0b461193b5f4c31d22f/zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", size = 788701 }, - { url = "https://files.pythonhosted.org/packages/e1/8a/ccb516b684f3ad987dfee27570d635822e3038645b1a950c5e8022df1145/zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", size = 633678 }, - { url = "https://files.pythonhosted.org/packages/12/89/75e633d0611c028e0d9af6df199423bf43f54bea5007e6718ab7132e234c/zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", size = 4941098 }, - { url = "https://files.pythonhosted.org/packages/4a/7a/bd7f6a21802de358b63f1ee636ab823711c25ce043a3e9f043b4fcb5ba32/zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", size = 5308798 }, - { url = "https://files.pythonhosted.org/packages/79/3b/775f851a4a65013e88ca559c8ae42ac1352db6fcd96b028d0df4d7d1d7b4/zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", size = 5341840 }, - { url = "https://files.pythonhosted.org/packages/09/4f/0cc49570141dd72d4d95dd6fcf09328d1b702c47a6ec12fbed3b8aed18a5/zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", size = 5440337 }, - { url = "https://files.pythonhosted.org/packages/e7/7c/aaa7cd27148bae2dc095191529c0570d16058c54c4597a7d118de4b21676/zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", size = 4861182 }, - { url = "https://files.pythonhosted.org/packages/ac/eb/4b58b5c071d177f7dc027129d20bd2a44161faca6592a67f8fcb0b88b3ae/zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", size = 4932936 }, - { url = "https://files.pythonhosted.org/packages/44/f9/21a5fb9bb7c9a274b05ad700a82ad22ce82f7ef0f485980a1e98ed6e8c5f/zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", size = 5464705 }, - { url = "https://files.pythonhosted.org/packages/49/74/b7b3e61db3f88632776b78b1db597af3f44c91ce17d533e14a25ce6a2816/zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", size = 4857882 }, - { url = "https://files.pythonhosted.org/packages/4a/7f/d8eb1cb123d8e4c541d4465167080bec88481ab54cd0b31eb4013ba04b95/zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", size = 4697672 }, - { url = "https://files.pythonhosted.org/packages/5e/05/f7dccdf3d121309b60342da454d3e706453a31073e2c4dac8e1581861e44/zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", size = 5206043 }, - { url = "https://files.pythonhosted.org/packages/86/9d/3677a02e172dccd8dd3a941307621c0cbd7691d77cb435ac3c75ab6a3105/zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", size = 5667390 }, - { url = "https://files.pythonhosted.org/packages/41/7e/0012a02458e74a7ba122cd9cafe491facc602c9a17f590367da369929498/zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", size = 5198901 }, - { url = "https://files.pythonhosted.org/packages/65/3a/8f715b97bd7bcfc7342d8adcd99a026cb2fb550e44866a3b6c348e1b0f02/zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", size = 430596 }, - { url = "https://files.pythonhosted.org/packages/19/b7/b2b9eca5e5a01111e4fe8a8ffb56bdcdf56b12448a24effe6cfe4a252034/zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", size = 495498 }, - { url = "https://files.pythonhosted.org/packages/9e/40/f67e7d2c25a0e2dc1744dd781110b0b60306657f8696cafb7ad7579469bd/zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", size = 788699 }, - { url = "https://files.pythonhosted.org/packages/e8/46/66d5b55f4d737dd6ab75851b224abf0afe5774976fe511a54d2eb9063a41/zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", size = 633681 }, - { url = "https://files.pythonhosted.org/packages/63/b6/677e65c095d8e12b66b8f862b069bcf1f1d781b9c9c6f12eb55000d57583/zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", size = 4944328 }, - { url = "https://files.pythonhosted.org/packages/59/cc/e76acb4c42afa05a9d20827116d1f9287e9c32b7ad58cc3af0721ce2b481/zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", size = 5311955 }, - { url = "https://files.pythonhosted.org/packages/78/e4/644b8075f18fc7f632130c32e8f36f6dc1b93065bf2dd87f03223b187f26/zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", size = 5344944 }, - { url = "https://files.pythonhosted.org/packages/76/3f/dbafccf19cfeca25bbabf6f2dd81796b7218f768ec400f043edc767015a6/zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", size = 5442927 }, - { url = "https://files.pythonhosted.org/packages/0c/c3/d24a01a19b6733b9f218e94d1a87c477d523237e07f94899e1c10f6fd06c/zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", size = 4864910 }, - { url = "https://files.pythonhosted.org/packages/1c/a9/cf8f78ead4597264f7618d0875be01f9bc23c9d1d11afb6d225b867cb423/zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", size = 4935544 }, - { url = "https://files.pythonhosted.org/packages/2c/96/8af1e3731b67965fb995a940c04a2c20997a7b3b14826b9d1301cf160879/zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", size = 5467094 }, - { url = "https://files.pythonhosted.org/packages/ff/57/43ea9df642c636cb79f88a13ab07d92d88d3bfe3e550b55a25a07a26d878/zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", size = 4860440 }, - { url = "https://files.pythonhosted.org/packages/46/37/edb78f33c7f44f806525f27baa300341918fd4c4af9472fbc2c3094be2e8/zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", size = 4700091 }, - { url = "https://files.pythonhosted.org/packages/c1/f1/454ac3962671a754f3cb49242472df5c2cced4eb959ae203a377b45b1a3c/zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", size = 5208682 }, - { url = "https://files.pythonhosted.org/packages/85/b2/1734b0fff1634390b1b887202d557d2dd542de84a4c155c258cf75da4773/zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", size = 5669707 }, - { url = "https://files.pythonhosted.org/packages/52/5a/87d6971f0997c4b9b09c495bf92189fb63de86a83cadc4977dc19735f652/zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", size = 5201792 }, - { url = "https://files.pythonhosted.org/packages/79/02/6f6a42cc84459d399bd1a4e1adfc78d4dfe45e56d05b072008d10040e13b/zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", size = 430586 }, - { url = "https://files.pythonhosted.org/packages/be/a2/4272175d47c623ff78196f3c10e9dc7045c1b9caf3735bf041e65271eca4/zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", size = 495420 }, - { url = "https://files.pythonhosted.org/packages/7b/83/f23338c963bd9de687d47bf32efe9fd30164e722ba27fb59df33e6b1719b/zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", size = 788713 }, - { url = "https://files.pythonhosted.org/packages/5b/b3/1a028f6750fd9227ee0b937a278a434ab7f7fdc3066c3173f64366fe2466/zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", size = 633459 }, - { url = "https://files.pythonhosted.org/packages/26/af/36d89aae0c1f95a0a98e50711bc5d92c144939efc1f81a2fcd3e78d7f4c1/zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", size = 4945707 }, - { url = "https://files.pythonhosted.org/packages/cd/2e/2051f5c772f4dfc0aae3741d5fc72c3dcfe3aaeb461cc231668a4db1ce14/zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", size = 5306545 }, - { url = "https://files.pythonhosted.org/packages/0a/9e/a11c97b087f89cab030fa71206963090d2fecd8eb83e67bb8f3ffb84c024/zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", size = 5337533 }, - { url = "https://files.pythonhosted.org/packages/fc/79/edeb217c57fe1bf16d890aa91a1c2c96b28c07b46afed54a5dcf310c3f6f/zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", size = 5436510 }, - { url = "https://files.pythonhosted.org/packages/81/4f/c21383d97cb7a422ddf1ae824b53ce4b51063d0eeb2afa757eb40804a8ef/zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", size = 4859973 }, - { url = "https://files.pythonhosted.org/packages/ab/15/08d22e87753304405ccac8be2493a495f529edd81d39a0870621462276ef/zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", size = 4936968 }, - { url = "https://files.pythonhosted.org/packages/eb/fa/f3670a597949fe7dcf38119a39f7da49a8a84a6f0b1a2e46b2f71a0ab83f/zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", size = 5467179 }, - { url = "https://files.pythonhosted.org/packages/4e/a9/dad2ab22020211e380adc477a1dbf9f109b1f8d94c614944843e20dc2a99/zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", size = 4848577 }, - { url = "https://files.pythonhosted.org/packages/08/03/dd28b4484b0770f1e23478413e01bee476ae8227bbc81561f9c329e12564/zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", size = 4693899 }, - { url = "https://files.pythonhosted.org/packages/2b/64/3da7497eb635d025841e958bcd66a86117ae320c3b14b0ae86e9e8627518/zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", size = 5199964 }, - { url = "https://files.pythonhosted.org/packages/43/a4/d82decbab158a0e8a6ebb7fc98bc4d903266bce85b6e9aaedea1d288338c/zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", size = 5655398 }, - { url = "https://files.pythonhosted.org/packages/f2/61/ac78a1263bc83a5cf29e7458b77a568eda5a8f81980691bbc6eb6a0d45cc/zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", size = 5191313 }, - { url = "https://files.pythonhosted.org/packages/e7/54/967c478314e16af5baf849b6ee9d6ea724ae5b100eb506011f045d3d4e16/zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", size = 430877 }, - { url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", size = 495595 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { 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 }, - { url = "https://files.pythonhosted.org/packages/b0/4c/315ca5c32da7e2dc3455f3b2caee5c8c2246074a61aac6ec3378a97b7136/zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", size = 430862 }, - { url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", size = 495578 }, -] From 24e60a22c63b89689269f350fcc4762a88a492af Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Sat, 5 Jul 2025 01:32:52 +0900 Subject: [PATCH 33/35] =?UTF-8?q?CHANGELOG=E3=81=AE=E6=9B=B4=E6=96=B0=20+?= =?UTF-8?q?=20=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E3=82=A2?= =?UTF-8?q?=E3=83=83=E3=83=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 ++++++++++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43db13a..3b929fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ フォーマットは[Keep a Changelog](https://keepachangelog.com/ja/)に基づいています。 +## [v0.2.0] - 2025-07-05 + +### 追加 + +- Mermaid 図表 → 画像変換機能を追加 + +### 削除 + +- LangChain ツール実装はサポート対象外とし削除 + ## [v0.1.1] - 2025-05-09 ### 追加 diff --git a/pyproject.toml b/pyproject.toml index 8ab5529..fc21cfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "middleman-ai" -version = "0.1.2" +version = "0.2.0" description = "Python client SDK for Middleman.ai API" authors = [{ name = "Generative Agents, Inc." }] dependencies = [ diff --git a/uv.lock b/uv.lock index 87b848d..80baeb1 100644 --- a/uv.lock +++ b/uv.lock @@ -521,7 +521,7 @@ wheels = [ [[package]] name = "middleman-ai" -version = "0.1.2" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "click" }, From 04376d1fb654be0bea65bd5d19f47528b644cc8d Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Sat, 5 Jul 2025 02:19:20 +0900 Subject: [PATCH 34/35] fix CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b929fc..1ec1c6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ ### 追加 -- Mermaid 図表 → 画像変換機能を追加 +- 「Mermaid ダイアグラムを画像変換」ツールとの連携を追加 +- 「DOCX → ページ画像変換」にテンプレート ID 指定機能を追加 ### 削除 From 680557e8c0e74cc37a57027be56c6095b17226e3 Mon Sep 17 00:00:00 2001 From: Yutaka Omido Date: Mon, 7 Jul 2025 14:24:17 +0900 Subject: [PATCH 35/35] fix CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ec1c6e..b65f4a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ ### 追加 - 「Mermaid ダイアグラムを画像変換」ツールとの連携を追加 -- 「DOCX → ページ画像変換」にテンプレート ID 指定機能を追加 +- 「マークダウン → DOCX変換」にテンプレート ID 指定機能を追加 ### 削除