From 41f69d862f662889a8f6f75ed6575ac4ba49cec4 Mon Sep 17 00:00:00 2001 From: Marongkun Date: Wed, 1 Apr 2026 17:16:38 +0800 Subject: [PATCH] feat: update search_infinity mcp --- .../README.md | 36 ++++--- .../pyproject.toml | 4 +- .../api/api_key_auth.py | 5 +- .../api/volcengine_auth.py | 47 +++++---- .../model.py | 95 +++++++++++++++++-- .../server.py | 43 ++++----- .../uv.lock | 32 +------ 7 files changed, 164 insertions(+), 98 deletions(-) diff --git a/server/mcp_server_askecho_search_infinity/README.md b/server/mcp_server_askecho_search_infinity/README.md index 838a60a6..0c565033 100644 --- a/server/mcp_server_askecho_search_infinity/README.md +++ b/server/mcp_server_askecho_search_infinity/README.md @@ -1,8 +1,8 @@ -# 融合信息搜索 MCP Server +# 联网搜索API MCP Server ## 版本信息 v0.1.0 ## 产品描述 -依托字节强大的搜索能力,提供适配大模型数据结构的联网搜索内容,助力提升大模型知识获取、时效性及回答准确性。 +火山引擎联网搜索API,提供网页与图片搜索能力,帮助大模型获取更准确、更新鲜的外部信息。 ## 分类 火山引擎云原生 ## 标签 @@ -16,7 +16,7 @@ v0.1.0 #### 类型 saas #### 详细描述 -根据用户输入问题,提供基于联网搜索的大模型总结后回复内容 +根据用户输入问题,返回联网搜索结果,支持网页和图片搜索 #### 调试所需的输入参数: 输入: ```json @@ -28,22 +28,34 @@ saas ], "properties": { "Query": { - "description": "用户搜索 query,1~100 个字符 (过长会截断),不支持多词搜索", + "description": "用户搜索 query,1~100 个字符", "type": "string" }, "Count": { - "description": "返回条数,最多50条,不传默认10条", + "description": "返回条数;web 最多 50 条,image 最多 5 条,不传默认 10 条", + "type": "number" + }, + "SearchType": { + "description": "搜索类型,仅支持 web 或 image,默认 web", + "type": "string" + }, + "TimeRange": { + "description": "web 搜索时间范围,可选 OneDay/OneWeek/OneMonth/OneYear 或 YYYY-MM-DD..YYYY-MM-DD", + "type": "string" + }, + "AuthLevel": { + "description": "权威等级过滤,0 为默认,1 为非常权威", "type": "number" } } }, "name": "web_search", - "description": "联网搜索能力调用" + "description": "联网搜索 API 调用" } ``` 输出: ```json -联网搜索结果,结构参考文档的响应体部分 https://www.volcengine.com/docs/85508/1650263 +联网搜索结果,结构参考官方 API 文档 https://www.volcengine.com/docs/87772/2272953 ``` #### 最容易被唤起的 Prompt示例 @@ -51,13 +63,15 @@ saas ## 可适配平台 Trae,Cursor,Python ## 服务开通链接 (整体产品) -登录火山控制台,开通【融合信息检索】,服务开通链接:https://console.volcengine.com/ask-echo/web-search +登录火山控制台,开通【联网搜索API】,服务开通链接:https://console.volcengine.com/search-infinity/web-search +API Key 创建链接:https://console.volcengine.com/search-infinity/api-key ## 鉴权方式 - API Key鉴权 - 火山引擎的AKSK鉴权体系 ## 安装部署 ### 前置准备 -- Python 3.12+ +- Python 3.12 / 3.13 +- 当前不支持 Python 3.14 beta,`mcp` / `pydantic` 依赖链在该版本上仍存在兼容性问题 - UV **Linux/macOS:** ```bash @@ -84,7 +98,7 @@ uv run mcp-server-askecho-search-infinity -t streamable-http ``` ## 部署 ### UVX -鉴权信息,火山引擎AK SK,与ASK_ECHO_SEARCH_INFINITY_API_KEY接入二选一即可 +鉴权信息,火山引擎 AK/SK 与 `ASK_ECHO_SEARCH_INFINITY_API_KEY` 二选一即可 ```json { "mcpServers": { @@ -105,4 +119,4 @@ uv run mcp-server-askecho-search-infinity -t streamable-http } ``` ## License -volcengine/mcp-server is licensed under the [MIT License](https://github.com/volcengine/mcp-server/blob/main/LICENSE) \ No newline at end of file +volcengine/mcp-server is licensed under the [MIT License](https://github.com/volcengine/mcp-server/blob/main/LICENSE) diff --git a/server/mcp_server_askecho_search_infinity/pyproject.toml b/server/mcp_server_askecho_search_infinity/pyproject.toml index d542deb4..e0026d70 100644 --- a/server/mcp_server_askecho_search_infinity/pyproject.toml +++ b/server/mcp_server_askecho_search_infinity/pyproject.toml @@ -1,9 +1,9 @@ [project] name = "mcp-server-askecho-search-infinity" version = "0.1.0" -description = "Search Infinity MCP Server" +description = "Web Search API MCP Server" readme = "README.md" -requires-python = ">=3.12" +requires-python = ">=3.12,<3.14" dependencies = [ "mcp>=1.9.4", "aiohttp>=3.9.0", diff --git a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/api_key_auth.py b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/api_key_auth.py index 23ba65fb..6704a4f4 100644 --- a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/api_key_auth.py +++ b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/api_key_auth.py @@ -1,4 +1,3 @@ -from dataclasses import asdict import json import aiohttp from ..model import * @@ -19,11 +18,11 @@ async def web_search_api_key_auth(api_key: str, req: WebSearchRequest, tool_name url=f"https://{Host}/search_api/web_search", headers=header, timeout=aiohttp.ClientTimeout(total=3000), - data=json.dumps(asdict(req)) + data=json.dumps(req.to_payload()) ) as response: # 在上下文内读取所有数据,避免连接关闭问题 response.raise_for_status() # 手动调用 data = await response.json() return data return None - return None \ No newline at end of file + return None diff --git a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/volcengine_auth.py b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/volcengine_auth.py index f07e8143..cd9a9153 100644 --- a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/volcengine_auth.py +++ b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/api/volcengine_auth.py @@ -1,7 +1,6 @@ import datetime import hashlib import hmac -from dataclasses import asdict import json from urllib.parse import quote from ..model import * @@ -10,7 +9,7 @@ Service = "volc_torchlight_api" Version = "2025-01-01" -Region = "cn-north-1" +Region = "cn-beijing" Host = "mercury.volcengineapi.com" ContentType = "application/json" @@ -20,19 +19,25 @@ async def web_search_volcengine_auth(ak: str, sk: str, req: WebSearchRequest, to headers = { "X-Traffic-Tag": f"ark_mcp_server_{tool_name}", } - return await volcengine_auth_request("POST", now, {}, headers, ak, sk, "WebSearch", json.dumps(asdict(req))) + return await volcengine_auth_request("POST", now, {}, headers, ak, sk, "WebSearch", json.dumps(req.to_payload())) def norm_query(params): query = "" for key in sorted(params.keys()): - if type(params[key]) == list: - for k in params[key]: + if isinstance(params[key], list): + for value in params[key]: query = ( - query + quote(key, safe="-_.~") + "=" + quote(k, safe="-_.~") + "&" + query + quote(key, safe="-_.~") + "=" + quote(value, safe="-_.~") + "&" ) else: - query = (query + quote(key, safe="-_.~") + "=" + quote(params[key], safe="-_.~") + "&") + query = ( + query + + quote(key, safe="-_.~") + + "=" + + quote(str(params[key]), safe="-_.~") + + "&" + ) query = query[:-1] return query.replace("+", "%20") @@ -72,21 +77,25 @@ async def volcengine_auth_request(method, date, query, header, ak, sk, action, b "X-Date": x_date, "Content-Type": request_param["content_type"], } - signed_headers_str = ";".join( - ["content-type", "host", "x-content-sha256", "x-date"] - ) + signed_header_keys = ["content-type", "host", "x-content-sha256", "x-date"] + canonical_header_lines = [ + "content-type:" + request_param["content_type"], + "host:" + request_param["host"], + "x-content-sha256:" + x_content_sha256, + "x-date:" + x_date, + ] + traffic_tag = header.get("X-Traffic-Tag") + if traffic_tag: + signed_header_keys.append("x-traffic-tag") + canonical_header_lines.append("x-traffic-tag:" + traffic_tag) + signed_header_keys.sort() + canonical_header_lines.sort() + signed_headers_str = ";".join(signed_header_keys) canonical_request_str = "\n".join( [request_param["method"].upper(), request_param["path"], norm_query(request_param["query"]), - "\n".join( - [ - "content-type:" + request_param["content_type"], - "host:" + request_param["host"], - "x-content-sha256:" + x_content_sha256, - "x-date:" + x_date, - ] - ), + "\n".join(canonical_header_lines), "", signed_headers_str, x_content_sha256, @@ -122,4 +131,4 @@ async def volcengine_auth_request(method, date, query, header, ak, sk, action, b data = await response.json() return data return None - return None \ No newline at end of file + return None diff --git a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/model.py b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/model.py index 01412cbe..e8f019de 100644 --- a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/model.py +++ b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/model.py @@ -1,6 +1,12 @@ +import datetime +import re from dataclasses import dataclass from typing import Optional, List +TIME_RANGE_SHORTCUTS = {"OneDay", "OneWeek", "OneMonth", "OneYear"} +DATE_RANGE_PATTERN = re.compile(r"^(\d{4}-\d{2}-\d{2})\.\.(\d{4}-\d{2}-\d{2})$") +SUPPORTED_SEARCH_TYPES = {"web", "image"} + @dataclass class Error: @@ -32,16 +38,22 @@ class WebSearchRequest: SearchType: str = "web" Count: int = 10 Filter: Optional[dict] = None - NeedSummary: bool = True - TimeRange: str = "" + NeedSummary: Optional[bool] = None + TimeRange: Optional[str] = None - def __post_init__(self): - if self.Filter is None: - self.Filter = { - "NeedContent": True, - "NeedUrl": True, - "Sites": "" - } + def to_payload(self): + payload = { + "Query": self.Query, + "SearchType": self.SearchType, + "Count": self.Count, + } + if self.SearchType == "web": + payload["NeedSummary"] = True + if self.Filter: + payload["Filter"] = self.Filter + if self.TimeRange: + payload["TimeRange"] = self.TimeRange + return payload @dataclass @@ -61,4 +73,67 @@ class SearchResult: @dataclass class WebSearchResponse: - results: List[SearchResult] \ No newline at end of file + results: List[SearchResult] + + +def validate_time_range(time_range: Optional[str]) -> Optional[str]: + if not time_range: + return None + if time_range in TIME_RANGE_SHORTCUTS: + return time_range + + match = DATE_RANGE_PATTERN.match(time_range) + if not match: + raise ValueError( + "TimeRange 需为 OneDay/OneWeek/OneMonth/OneYear,或日期区间 YYYY-MM-DD..YYYY-MM-DD。" + ) + + start_text, end_text = match.groups() + try: + start_date = datetime.date.fromisoformat(start_text) + end_date = datetime.date.fromisoformat(end_text) + except ValueError as exc: + raise ValueError("TimeRange 中的日期需为有效的 YYYY-MM-DD。") from exc + + if start_date > end_date: + raise ValueError("TimeRange 的开始日期不能晚于结束日期。") + + return time_range + + +def build_web_search_request( + query: str, + count: int = 10, + search_type: str = "web", + time_range: Optional[str] = None, + auth_level: int = 0, +) -> WebSearchRequest: + normalized_query = (query or "").strip() + if not normalized_query: + raise ValueError("Query 不能为空。") + if len(normalized_query) > 100: + raise ValueError("Query 长度需为 1~100 个字符。") + + if search_type not in SUPPORTED_SEARCH_TYPES: + raise ValueError("SearchType 仅支持 web 或 image。") + + if count < 1: + raise ValueError("Count 需大于等于 1。") + max_count = 50 if search_type == "web" else 5 + if count > max_count: + raise ValueError(f"{search_type} 类型最多返回 {max_count} 条。") + + if auth_level not in {0, 1}: + raise ValueError("AuthLevel 仅支持 0 或 1。") + + normalized_time_range = validate_time_range(time_range) if search_type == "web" else None + filters = {"AuthInfoLevel": auth_level} if search_type == "web" and auth_level > 0 else None + + return WebSearchRequest( + Query=normalized_query, + SearchType=search_type, + Count=count, + Filter=filters, + NeedSummary=True if search_type == "web" else None, + TimeRange=normalized_time_range, + ) diff --git a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/server.py b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/server.py index aa80c817..8b886a15 100644 --- a/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/server.py +++ b/server/mcp_server_askecho_search_infinity/src/mcp_server_askecho_search_infinity/server.py @@ -1,10 +1,6 @@ import logging import argparse -import dataclasses -import asyncio from mcp.server import FastMCP -from mcp.server.fastmcp import Context -from mcp import types from typing import Dict, Any from .model import * @@ -18,19 +14,25 @@ logger = logging.getLogger(__name__) config = None -mcp = FastMCP("AskEcho Search Infinity MCP Server") +mcp = FastMCP("联网搜索API MCP Server") @mcp.tool() async def web_search( Query: str, - Count: int = 10 + Count: int = 10, + SearchType: str = "web", + TimeRange: str = "", + AuthLevel: int = 0, ) -> Dict[str, Any]: """ - 联网搜索能力调用,基于用户query搜索网络结果 + 联网搜索 API 调用,支持网页和图片搜索 Args: - Query (str): 用户搜索 query,1~100 个字符 (过长会截断),不支持多词搜索 - Count (int): 返回条数,最多50条,不传默认10条 + Query (str): 搜索 query,1~100 个字符 + Count (int): 返回条数,web 最多 50 条,image 最多 5 条 + SearchType (str): 搜索类型,仅支持 web 或 image + TimeRange (str): web 搜索时间范围,可选 OneDay/OneWeek/OneMonth/OneYear 或日期区间 + AuthLevel (int): 权威等级过滤,0 为默认,1 为非常权威 Returns: 联网搜索结果返回结构 """ @@ -40,15 +42,12 @@ async def web_search( if config is None: raise ValueError("config not loaded") - # Validate Count parameter - if Count > 50: - Count = 50 - elif Count < 1: - Count = 10 - - req = WebSearchRequest( - Query=Query, - Count=Count + req = build_web_search_request( + query=Query, + count=Count, + search_type=SearchType, + time_range=TimeRange or None, + auth_level=AuthLevel, ) if config.api_key is not None and len(config.api_key) > 0: @@ -69,7 +68,7 @@ async def web_search( def main(): """Main entry point for the MCP server.""" - parser = argparse.ArgumentParser(description="Run the AskEchoSearchInfinity MCP Server") + parser = argparse.ArgumentParser(description="Run the Web Search API MCP Server") parser.add_argument( "--transport", "-t", @@ -85,12 +84,12 @@ def main(): global config config = load_config() # Run the MCP server - logger.info(f"Starting AskEchoSearchInfinity MCP Server with {args.transport} transport") + logger.info(f"Starting Web Search API MCP Server with {args.transport} transport") mcp.run(transport=args.transport) except Exception as e: - logger.error(f"Error starting AskEchoSearchInfinity MCP Server: {str(e)}") + logger.error(f"Error starting Web Search API MCP Server: {str(e)}") raise if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/server/mcp_server_askecho_search_infinity/uv.lock b/server/mcp_server_askecho_search_infinity/uv.lock index 29991f74..f8f2392e 100644 --- a/server/mcp_server_askecho_search_infinity/uv.lock +++ b/server/mcp_server_askecho_search_infinity/uv.lock @@ -1,6 +1,6 @@ version = 1 revision = 2 -requires-python = ">=3.12" +requires-python = ">=3.12, <3.14" [[package]] name = "aiohappyeyeballs" @@ -536,9 +536,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, - { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, ] [[package]] @@ -602,33 +599,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload-time = "2025-07-01T15:55:13.004Z" }, { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload-time = "2025-07-01T15:55:14.486Z" }, { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload-time = "2025-07-01T15:55:15.745Z" }, - { url = "https://files.pythonhosted.org/packages/55/07/029b7c45db910c74e182de626dfdae0ad489a949d84a468465cd0ca36355/rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a", size = 364292, upload-time = "2025-07-01T15:55:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/13/d1/9b3d3f986216b4d1f584878dca15ce4797aaf5d372d738974ba737bf68d6/rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf", size = 350334, upload-time = "2025-07-01T15:55:18.922Z" }, - { url = "https://files.pythonhosted.org/packages/18/98/16d5e7bc9ec715fa9668731d0cf97f6b032724e61696e2db3d47aeb89214/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12", size = 384875, upload-time = "2025-07-01T15:55:20.399Z" }, - { url = "https://files.pythonhosted.org/packages/f9/13/aa5e2b1ec5ab0e86a5c464d53514c0467bec6ba2507027d35fc81818358e/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20", size = 399993, upload-time = "2025-07-01T15:55:21.729Z" }, - { url = "https://files.pythonhosted.org/packages/17/03/8021810b0e97923abdbab6474c8b77c69bcb4b2c58330777df9ff69dc559/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331", size = 516683, upload-time = "2025-07-01T15:55:22.918Z" }, - { url = "https://files.pythonhosted.org/packages/dc/b1/da8e61c87c2f3d836954239fdbbfb477bb7b54d74974d8f6fcb34342d166/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f", size = 408825, upload-time = "2025-07-01T15:55:24.207Z" }, - { url = "https://files.pythonhosted.org/packages/38/bc/1fc173edaaa0e52c94b02a655db20697cb5fa954ad5a8e15a2c784c5cbdd/rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246", size = 387292, upload-time = "2025-07-01T15:55:25.554Z" }, - { url = "https://files.pythonhosted.org/packages/7c/eb/3a9bb4bd90867d21916f253caf4f0d0be7098671b6715ad1cead9fe7bab9/rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387", size = 420435, upload-time = "2025-07-01T15:55:27.798Z" }, - { url = "https://files.pythonhosted.org/packages/cd/16/e066dcdb56f5632713445271a3f8d3d0b426d51ae9c0cca387799df58b02/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af", size = 562410, upload-time = "2025-07-01T15:55:29.057Z" }, - { url = "https://files.pythonhosted.org/packages/60/22/ddbdec7eb82a0dc2e455be44c97c71c232983e21349836ce9f272e8a3c29/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33", size = 590724, upload-time = "2025-07-01T15:55:30.719Z" }, - { url = "https://files.pythonhosted.org/packages/2c/b4/95744085e65b7187d83f2fcb0bef70716a1ea0a9e5d8f7f39a86e5d83424/rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953", size = 558285, upload-time = "2025-07-01T15:55:31.981Z" }, - { url = "https://files.pythonhosted.org/packages/37/37/6309a75e464d1da2559446f9c811aa4d16343cebe3dbb73701e63f760caa/rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9", size = 223459, upload-time = "2025-07-01T15:55:33.312Z" }, - { url = "https://files.pythonhosted.org/packages/d9/6f/8e9c11214c46098b1d1391b7e02b70bb689ab963db3b19540cba17315291/rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37", size = 236083, upload-time = "2025-07-01T15:55:34.933Z" }, - { url = "https://files.pythonhosted.org/packages/47/af/9c4638994dd623d51c39892edd9d08e8be8220a4b7e874fa02c2d6e91955/rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867", size = 223291, upload-time = "2025-07-01T15:55:36.202Z" }, - { url = "https://files.pythonhosted.org/packages/4d/db/669a241144460474aab03e254326b32c42def83eb23458a10d163cb9b5ce/rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da", size = 361445, upload-time = "2025-07-01T15:55:37.483Z" }, - { url = "https://files.pythonhosted.org/packages/3b/2d/133f61cc5807c6c2fd086a46df0eb8f63a23f5df8306ff9f6d0fd168fecc/rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7", size = 347206, upload-time = "2025-07-01T15:55:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/05/bf/0e8fb4c05f70273469eecf82f6ccf37248558526a45321644826555db31b/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad", size = 380330, upload-time = "2025-07-01T15:55:40.175Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a8/060d24185d8b24d3923322f8d0ede16df4ade226a74e747b8c7c978e3dd3/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d", size = 392254, upload-time = "2025-07-01T15:55:42.015Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/7c2e8a9ee3e6bc0bae26bf29f5219955ca2fbb761dca996a83f5d2f773fe/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca", size = 516094, upload-time = "2025-07-01T15:55:43.603Z" }, - { url = "https://files.pythonhosted.org/packages/75/d6/f61cafbed8ba1499b9af9f1777a2a199cd888f74a96133d8833ce5eaa9c5/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19", size = 402889, upload-time = "2025-07-01T15:55:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/92/19/c8ac0a8a8df2dd30cdec27f69298a5c13e9029500d6d76718130f5e5be10/rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8", size = 384301, upload-time = "2025-07-01T15:55:47.098Z" }, - { url = "https://files.pythonhosted.org/packages/41/e1/6b1859898bc292a9ce5776016c7312b672da00e25cec74d7beced1027286/rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b", size = 412891, upload-time = "2025-07-01T15:55:48.412Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b9/ceb39af29913c07966a61367b3c08b4f71fad841e32c6b59a129d5974698/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a", size = 557044, upload-time = "2025-07-01T15:55:49.816Z" }, - { url = "https://files.pythonhosted.org/packages/2f/27/35637b98380731a521f8ec4f3fd94e477964f04f6b2f8f7af8a2d889a4af/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170", size = 585774, upload-time = "2025-07-01T15:55:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/52/d9/3f0f105420fecd18551b678c9a6ce60bd23986098b252a56d35781b3e7e9/rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e", size = 554886, upload-time = "2025-07-01T15:55:52.541Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c5/347c056a90dc8dd9bc240a08c527315008e1b5042e7a4cf4ac027be9d38a/rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f", size = 219027, upload-time = "2025-07-01T15:55:53.874Z" }, - { url = "https://files.pythonhosted.org/packages/75/04/5302cea1aa26d886d34cadbf2dc77d90d7737e576c0065f357b96dc7a1a6/rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7", size = 232821, upload-time = "2025-07-01T15:55:55.167Z" }, ] [[package]]