├── src └── findata │ ├── __init__.py │ ├── providers │ ├── _wind │ │ ├── __init__.py │ │ └── getData.py │ └── _tushare │ │ ├── __init__.py │ │ ├── common.py │ │ ├── marketData.py │ │ ├── fundamentalData.py │ │ ├── macroeconomicData.py │ │ └── financialData.py │ ├── utils │ ├── auth.py │ ├── findata_log.py │ └── date_processor.py │ └── server.py ├── .python-version ├── assets └── logo.png ├── .gitignore ├── pyproject.toml ├── README_zh.md ├── README.md ├── LICENSE └── uv.lock /src/findata/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.11 2 | -------------------------------------------------------------------------------- /src/findata/providers/_wind/__init__.py: -------------------------------------------------------------------------------- 1 | from .getData import sayHiWind -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zlinzzzz/finData-mcp-server/HEAD/assets/logo.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python-generated files 2 | __pycache__/ 3 | *.py[oc] 4 | build/ 5 | dist/ 6 | wheels/ 7 | *.egg-info 8 | *.log 9 | 10 | # Virtual environments 11 | .venv 12 | -------------------------------------------------------------------------------- /src/findata/providers/_wind/getData.py: -------------------------------------------------------------------------------- 1 | async def sayHiWind() -> str: 2 | """ 3 | Name: 4 | 打招呼专用 5 | 6 | Description: 7 | 礼貌的回应用户的打招呼 8 | """ 9 | 10 | return "欢迎使用Wind!" -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "findata" 3 | version = "0.1.0" 4 | description = "Add your description here" 5 | readme = "README.md" 6 | requires-python = ">=3.11" 7 | dependencies = [ 8 | "mcp[cli]>=1.6.0", 9 | "pandas>=2.2.3", 10 | "tushare>=1.4.21", 11 | ] 12 | -------------------------------------------------------------------------------- /src/findata/providers/_tushare/__init__.py: -------------------------------------------------------------------------------- 1 | from .fundamentalData import stock_basic 2 | from .fundamentalData import stock_company 3 | from .fundamentalData import bak_basic 4 | 5 | from .marketData import daily 6 | 7 | from .macroeconomicData import shibor_lpr 8 | from .macroeconomicData import cn_gdp 9 | from .macroeconomicData import cn_cpi 10 | from .macroeconomicData import cn_ppi 11 | from .macroeconomicData import cn_m 12 | from .macroeconomicData import sf_month 13 | from .macroeconomicData import cn_pmi 14 | 15 | from .financialData import income 16 | from .financialData import balancesheet 17 | from .financialData import cashflow -------------------------------------------------------------------------------- /src/findata/providers/_tushare/common.py: -------------------------------------------------------------------------------- 1 | from utils.date_processor import standardize_date 2 | from utils.auth import login 3 | 4 | def get_trade_dates( 5 | start_date: str = "", 6 | end_date: str = "" , 7 | exchange: str = "", 8 | is_open: str = "1" 9 | ) -> dict: 10 | """ 11 | 获取各大交易所交易日历数据,默认提取的是上交所 12 | """ 13 | # 登录tushare 14 | try: 15 | tsObj = login() 16 | 17 | # 日期标准化 18 | if start_date: 19 | start_date = standardize_date(start_date) 20 | 21 | if end_date: 22 | end_date = standardize_date(end_date) 23 | 24 | df = tsObj.trade_cal(exchange=exchange, start_date=start_date, end_date=end_date, is_open=is_open) 25 | 26 | return df['cal_date'].dropna().unique().tolist() 27 | 28 | except Exception as e: 29 | raise Exception(f"获取交易日列表失败!\n {str(e)}") from e 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/findata/utils/auth.py: -------------------------------------------------------------------------------- 1 | import os 2 | from abc import ABC, abstractmethod 3 | from typing import Dict, Type 4 | import tushare as ts 5 | from utils.findata_log import setup_logger 6 | 7 | logger = setup_logger() 8 | 9 | class LoginHandler(ABC): 10 | @abstractmethod 11 | def login(self): 12 | pass 13 | 14 | class TushareLoginHandler(LoginHandler): 15 | """Tushare 登录处理器""" 16 | def login(self,): 17 | api_token = os.getenv("DATA_API_TOKEN") 18 | ts.set_token(api_token) 19 | pro = ts.pro_api() 20 | 21 | return pro 22 | 23 | 24 | class LoginFactory: 25 | """登录工厂类,负责创建合适的登录处理器""" 26 | 27 | _handlers = { 28 | "tushare": TushareLoginHandler, 29 | } 30 | 31 | @classmethod 32 | def get_handler(cls, provider: str) -> LoginHandler: 33 | """获取适合指定平台的登录处理器""" 34 | provider = provider.lower() 35 | if provider not in cls._handlers: 36 | logger.error(f"不支持的登录平台:{provider}") 37 | raise ValueError(f"不支持的登录平台: {provider}") 38 | return cls._handlers[provider]() 39 | 40 | 41 | def login() -> object: 42 | """ 43 | 登录函数 44 | """ 45 | # 从环境变量获取平台设置 46 | provider = os.getenv("PROVIDER").lower() 47 | if not provider: 48 | logger.error(f"请设置环境变量 PROVIDER 来指定数据供应商") 49 | raise ValueError("请设置环境变量 PROVIDER 来指定数据供应商") 50 | 51 | try: 52 | handler = LoginFactory.get_handler(provider) 53 | return handler.login() 54 | except Exception as e: 55 | logger.error(f"登录失败!\n ", exc_info=True) 56 | return False 57 | 58 | -------------------------------------------------------------------------------- /src/findata/utils/findata_log.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import logging.handlers 3 | import os 4 | from datetime import datetime 5 | 6 | def setup_logger(log_dir='logs', log_name='findata', max_days=7, level='INFO'): 7 | """ 8 | 设置日志记录器 9 | 10 | 参数: 11 | log_dir (str): 日志目录 12 | log_name (str): 日志文件名前缀 13 | max_days (int): 最大保存天数 14 | """ 15 | # 确保日志目录存在 16 | if not os.path.exists(log_dir): 17 | os.makedirs(log_dir) 18 | 19 | # 创建日志文件名,格式为: 日志名_年月日.log 20 | log_filename = f"{log_name}_{datetime.now().strftime('%Y%m%d')}.log" 21 | log_path = os.path.join(log_dir, log_filename) 22 | 23 | # 创建日志记录器 24 | logger = logging.getLogger(log_name) 25 | logger.setLevel(level) 26 | 27 | # 如果已经有处理器,先清除(避免重复添加) 28 | if logger.handlers: 29 | logger.handlers = [] 30 | 31 | # 创建文件处理器,使用TimedRotatingFileHandler实现按日期滚动 32 | file_handler = logging.handlers.TimedRotatingFileHandler( 33 | filename=log_path, 34 | when='midnight', # 每天午夜滚动 35 | interval=1, # 每天 36 | backupCount=max_days, # 最多保留7天 37 | encoding='utf-8' 38 | ) 39 | file_handler.suffix = "%Y%m%d.log" # 设置滚动文件的后缀 40 | 41 | # 创建控制台处理器 42 | console_handler = logging.StreamHandler() 43 | 44 | # 设置日志格式 45 | formatter = logging.Formatter( 46 | '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s', 47 | datefmt='%Y-%m-%d %H:%M:%S' 48 | ) 49 | file_handler.setFormatter(formatter) 50 | console_handler.setFormatter(formatter) 51 | 52 | # 添加处理器到记录器 53 | logger.addHandler(file_handler) 54 | logger.addHandler(console_handler) 55 | 56 | return logger 57 | -------------------------------------------------------------------------------- /src/findata/utils/date_processor.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import re 3 | 4 | 5 | # 标准化日期 6 | def standardize_date(input_date): 7 | """ 8 | 将各种格式的日期标准化为 YYYYMMDD 格式 9 | 10 | 参数: 11 | input_date (str): 输入的日期字符串,可以是各种格式 12 | 13 | 返回: 14 | str: 标准化后的日期,格式为 YYYYMMDD 15 | """ 16 | if len(input_date) == 8: 17 | 18 | input_date = str(input_date) 19 | 20 | # 尝试常见日期格式 21 | common_formats = [ 22 | '%Y-%m-%d', # 2023-04-15 23 | '%Y/%m/%d', # 2023/04/15 24 | '%m/%d/%Y', # 04/15/2023 25 | '%d-%m-%Y', # 15-04-2023 26 | '%d.%m.%Y', # 15.04.2023 27 | '%Y%m%d', # 20230415 (已经是目标格式) 28 | '%b %d, %Y', # Apr 15, 2023 29 | '%B %d, %Y', # April 15, 2023 30 | '%d %b %Y', # 15 Apr 2023 31 | '%d %B %Y', # 15 April 2023 32 | ] 33 | 34 | # 尝试解析日期 35 | for fmt in common_formats: 36 | try: 37 | dt = datetime.strptime(input_date, fmt) 38 | return dt.strftime('%Y%m%d') 39 | except ValueError: 40 | continue 41 | 42 | 43 | # 尝试处理中文日期(如2023年4月15日) 44 | cn_match = re.match(r'(\d{4})年(\d{1,2})月(\d{1,2})日', input_date) 45 | if cn_match: 46 | year = cn_match.group(1) 47 | month = cn_match.group(2).zfill(2) 48 | day = cn_match.group(3).zfill(2) 49 | try: 50 | datetime.strptime(f"{year}{month}{day}", '%Y%m%d') 51 | return f"{year}{month}{day}" 52 | except ValueError: 53 | pass 54 | 55 | # 如果所有尝试都失败,抛出异常 56 | raise ValueError(f"无法解析日期: {input_date}") -------------------------------------------------------------------------------- /src/findata/providers/_tushare/marketData.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | from typing import Optional 4 | from utils.date_processor import standardize_date 5 | from utils.auth import login 6 | 7 | 8 | async def daily( 9 | ts_code: Optional[str] = "", 10 | trade_date: Optional[str] = "", 11 | start_date: Optional[str] = "", 12 | end_date: Optional[str] = "", 13 | fields: Optional[list] = [], 14 | ) -> dict: 15 | 16 | """ 17 | Name: 18 | A股日线行情。 19 | 20 | Description: 21 | 获取股票未复权的日线行情数据。 22 | 23 | Args: 24 | | 名称 | 类型 | 必填 | 描述 | 25 | |------------|-------|------|----------------------------------------| 26 | | ts_code | str | 否 | 股票代码(支持多个股票同时提取,逗号分隔) | 27 | | trade_date | str | 否 | 交易日期(YYYYMMDD),不与start_date和end_date同时出现 | 28 | | start_date | str | 否 | 开始日期(YYYYMMDD),与end_date同时出现 | 29 | | end_date | str | 否 | 结束日期(YYYYMMDD),与start_date同时出现 | 30 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 31 | 32 | Fields: 33 | - ts_code: 股票代码 34 | - trade_date: 交易日期 35 | - open: 开盘价 36 | - high: 最高价 37 | - low: 最低价 38 | - close: 收盘价 39 | - pre_close: 昨收价【除权价,前复权】 40 | - change: 涨跌额 41 | - pct_chg: 涨跌幅 【基于除权后的昨收计算的涨跌幅:(今收-除权昨收)/除权昨收】 42 | - vol: 成交量 (手) 43 | - amount: 成交额 (千元) 44 | 45 | """ 46 | try: 47 | # 登录tushare 48 | tsObj = login() 49 | 50 | # 日期标准化 51 | if trade_date: 52 | trade_date = standardize_date(trade_date) 53 | 54 | if start_date: 55 | start_date = standardize_date(start_date) 56 | 57 | if end_date: 58 | end_date = standardize_date(end_date) 59 | 60 | 61 | #TODO 股票代码 标准化 62 | 63 | 64 | # 添加交易日 65 | if fields: 66 | fields.append('trade_date') 67 | fields = list(set(fields)) 68 | 69 | 70 | df = tsObj.daily(ts_code=ts_code, trade_date=trade_date, start_date=start_date, end_date=end_date, fields=fields) 71 | return df 72 | # return df.to_json() 73 | except Exception as e: 74 | raise Exception(f"获取股票日线行情数据失败!\n {str(e)}") from e 75 | 76 | -------------------------------------------------------------------------------- /src/findata/server.py: -------------------------------------------------------------------------------- 1 | import os 2 | import importlib 3 | import argparse 4 | import inspect 5 | from types import ModuleType 6 | from mcp.server.fastmcp import FastMCP 7 | from utils.findata_log import setup_logger 8 | 9 | logger = setup_logger() 10 | 11 | def decorate_async_functions(module: ModuleType, tool_decorator): 12 | for name, func in inspect.getmembers(module, inspect.iscoroutinefunction): 13 | setattr(module, name, tool_decorator(func)) 14 | 15 | 16 | def run(args): 17 | try: 18 | logger.info("Init finData MCP Server") 19 | 20 | # 获取数据供应商 21 | data_provider = os.getenv("PROVIDER").lower() 22 | logger.debug("data provider: " + data_provider) 23 | 24 | if not data_provider: 25 | logger.error("请设置环境变量 PROVIDER 来指定数据供应商") 26 | raise ValueError("请设置环境变量 PROVIDER 来指定数据供应商") 27 | 28 | module = importlib.import_module("providers._"+data_provider) 29 | 30 | if args.transport == 'stdio': 31 | # 创建MCP服务器实例 32 | mcp = FastMCP("finData") 33 | # 添加MCP装饰器 34 | decorate_async_functions(module, mcp.tool()) 35 | mcp.run(transport="stdio") 36 | 37 | 38 | elif args.transport == 'sse': 39 | # 创建MCP服务器实例 40 | mcp = FastMCP( 41 | "finDatta", 42 | host=args.sse_host, 43 | port=args.sse_port, 44 | ) 45 | # 添加MCP装饰器 46 | decorate_async_functions(module, mcp.tool()) 47 | mcp.run(transport='sse') 48 | 49 | except Exception as e: 50 | logger.error(f"初始化失败!\n ", exc_info=True) 51 | raise Exception(f"初始化失败!\n {str(e)}") from e 52 | 53 | 54 | if __name__ == "__main__": 55 | 56 | parser = argparse.ArgumentParser(description="finData MCP Server") 57 | 58 | parser.add_argument( 59 | "--transport", 60 | type=str, 61 | choices=["stdio", "sse"], 62 | default="stdio", 63 | help="Select MCP transport: stdio (default) or sse", 64 | ) 65 | 66 | parser.add_argument( 67 | "--sse-host", 68 | type=str, 69 | default="localhost", 70 | help="Host to bind SSE server to (default: localhost)", 71 | ) 72 | 73 | parser.add_argument( 74 | "--sse-port", 75 | type=int, 76 | default=8000, 77 | help="Port for SSE server (default: 8000)", 78 | ) 79 | 80 | args = parser.parse_args() 81 | 82 | logger.info(f"Running MCP Server with parameters: {args}") 83 | 84 | run(args) 85 | -------------------------------------------------------------------------------- /README_zh.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |


4 | 5 |
6 | 7 | 8 | [![English](https://img.shields.io/badge/English-Click-yellow 9 | )](README.md) 10 | [![Chinese](https://img.shields.io/badge/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87-%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B-orange)](README_zh.md) 11 | [![License](https://img.shields.io/badge/License-Apache--2.0-green)](LICENSE) 12 | [![Python Versions](https://img.shields.io/badge/python-3.11-blue)]() 13 | [![Tushare](https://img.shields.io/badge/Tushare-purple)]() 14 | 15 | 16 |
17 | 18 |
19 | 概述 • 20 | 演示 • 21 | 快速开始 • 22 | 已支持的数据供应商 • 23 | 工具列表 24 |
25 | 26 | 27 | # 概述 28 | 29 | **finData**是一个开源的金融数据查询**Model Context Protocol(MCP) Server**,向大模型提供专业级金融数据访问的能力。支持**Tushare**、**Wind**、**通联**等多种数据供应商接口,助力用户在AI应用中快速获取金融数据。 30 | 31 | 全面支持**Stdio**和**SSE**两种通信模式,灵活满足本地部署与远程调用等多样化的使用需求。 32 | 33 | # 演示 34 | 35 | https://github.com/user-attachments/assets/1a6d02af-22a3-44a0-ada7-a771a1c4818d 36 | 37 | # 快速开始 38 | 39 | ## 环境准备 40 | 41 | 开始前,请先安装下列工具包: 42 | 43 | - python => 3.11 44 | - mcp[cli]>=1.6.0 45 | - pandas>=2.2.3 46 | - [uv](https://docs.astral.sh/uv/getting-started/installation/) 47 | 48 | 根据所使用的数据供应商,请自行选择安装 49 | - tushare>=1.4.21 50 | 51 | ## 配置MCP Server 52 | 53 | ### Stdio模式 54 | 55 | 将下面的内容添加到MCP client的配置文件中来调用MCP Server。 56 | 57 | ```JSON 58 | { 59 | "mcpServers": { 60 | "finData": { 61 | "command": "uv", 62 | "args": [ 63 | "--directory", 64 | "/ABSOLUTE/PATH/TO/PARENT/FOLDER/finData-mcp-server/src/findata", // finData MCP Server所在目录 65 | "run", 66 | "server.py" 67 | ], 68 | "env": { 69 | "DATA_API_TOKEN": "", // 访问数据供应商的API Token 70 | "PROVIDER": "tushare" // 指定数据供应商 71 | } 72 | } 73 | } 74 | } 75 | ``` 76 | 77 | ### SSE模式 78 | 79 | 在运行MCP Server的服务器上,设置数据供应商相关的环境变量`DATA_API_TOKEN`和`PROVIDER`: 80 | 81 | **Windows** 82 | ```bash 83 | set DATA_API_TOKEN=<访问数据供应商的API Token> 84 | set PROVIDER=<指定数据供应商> 85 | ``` 86 | 87 | **Linux** 88 | ```bash 89 | export DATA_API_TOKEN=<访问数据供应商的API Token> 90 | export PROVIDER=<指定数据供应商> 91 | ``` 92 | 93 | 然后启动MCP Server: 94 | 95 | ```bash 96 | uv run server.py --transport sse 97 | ``` 98 | 99 | - 可选参数 100 | 101 | `--sse-host` SSE服务绑定的主机,默认为localhost 102 | 103 | `--sse-port` SSE服务端口,默认为8000 104 | 105 | 106 | MCP Server启动成功后,将下面的内容添加到MCP client的配置文件中来调用MCP Server。不同client配置文件中的变量名会有细微的差异,请根据client的说明进行调整。 107 | 108 | ```JSON 109 | { 110 | "mcpServers": { 111 | "finData": { 112 | "name": "finData", 113 | "type": "sse", 114 | "baseUrl": "http://localhost:8000/sse" 115 | } 116 | } 117 | } 118 | ``` 119 | 120 | 121 | # 已支持的数据供应商 122 | 123 | 通过环境变量`PROVIDER`使用指定的供应商 124 | 125 | - tushare 126 | 127 | # 工具列表 128 | 129 | ## Tushare 130 | 131 | ### 行情数据 132 | 133 | - `daily` 获取股票未复权的日线行情数据。 134 | 135 | ### 基础数据 136 | 137 | - `stock_basic` 获取股票的名称、代码等基础信息。 138 | - `stock_company` 获取上市公司基础信息。 139 | - `bak_basic` 获取某支股票在指定时间范围内的基本面数据。 140 | 141 | ### 财务数据 142 | 143 | - `income` 获取上市公司利润表数据。 144 | - `balancesheet` 获取上市公司资产负债表数据。 145 | - `cashflow` 获取上市公司现金流量表数据。 146 | 147 | ### 宏观数据 148 | 149 | - `shibor_lpr` 获取LPR贷款基础利率。 150 | - `cn_gdp` 获取GDP数据。 151 | - `cn_cpi` 获取CPI居民消费价格数据。 152 | - `cn_ppi` 获取PPI工业生产者出厂价格指数数据。 153 | - `cn_m` 获取货币供应量数据。 154 | - `sf_month` 获取社会融资数据。 155 | - `cn_pmi` 获取采购经理人指数(PMI)数据。 156 | 157 | # DataCanvas 158 | 159 | 160 | 161 | ![datacanvas](https://raw.githubusercontent.com/DataCanvasIO/HyperTS/main/docs/static/images/dc_logo_1.png) 162 | 163 | 本项目由[DataCanvas](https://datacanvas.com/)开源 164 | 165 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |


4 | 5 |
6 | 7 | [![English](https://img.shields.io/badge/English-Click-yellow 8 | )](README.md) 9 | [![English](https://img.shields.io/badge/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87-%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B-orange)](README_zh.md) 10 | [![License](https://img.shields.io/badge/License-Apache--2.0-green)](LICENSE) 11 | [![Python Versions](https://img.shields.io/badge/python-3.11-blue)]() 12 | [![Tushare](https://img.shields.io/badge/Tushare-purple)]() 13 | 14 |
15 | 16 |
17 | Overview • 18 | Demo • 19 | Quick Start • 20 | Supported Data Providers • 21 | Tools 22 |
23 | 24 | 25 | # Overview 26 | 27 | **FinData** is an open-source **Model Context Protocol(MCP) Server** that provides professional financial data access capabilities for LLM. It supports various data providers such as **Tushare**, **Wind**, **DataYes**, etc. This enables AI applications to quickly retrieve financial data. 28 | 29 | Fully supports both **Stdio** and **SSE** transports, offering flexibility for different environments. 30 | 31 | 32 | # Demonstration 33 | 34 | https://github.com/user-attachments/assets/1a6d02af-22a3-44a0-ada7-a771a1c4818d 35 | 36 | # Quick Start 37 | 38 | ## Prerequisites 39 | 40 | Before getting started, please complete the following preparations: 41 | 42 | - python => 3.11 43 | - mcp[cli]>=1.6.0 44 | - pandas>=2.2.3 45 | - [uv](https://docs.astral.sh/uv/getting-started/installation/) 46 | 47 | Depending on your data provider, install optional packages such as: 48 | 49 | - tushare>=1.4.21 50 | 51 | ## Configuration 52 | 53 | ### Stdio Transport 54 | 55 | You will need to edit the MCP client configuration file to add finData: 56 | 57 | ```JSON 58 | { 59 | "mcpServers": { 60 | "finData": { 61 | "command": "uv", 62 | "args": [ 63 | "--directory", 64 | "/ABSOLUTE/PATH/TO/PARENT/FOLDER/finData-mcp-server/src/findata", 65 | "run", 66 | "server.py" 67 | ], 68 | "env": { 69 | "DATA_API_TOKEN": "", // API Token for accessing data provider 70 | "PROVIDER": "tushare" // Specified data provider 71 | } 72 | } 73 | } 74 | } 75 | ``` 76 | 77 | ### SSE Transport 78 | 79 | Set the environment variables `DATA_API_TOKEN` and `PROVIDER` on the server hosting the MCP Server: 80 | 81 | **Windows** 82 | ```bash 83 | set DATA_API_TOKEN= 84 | set PROVIDER= 85 | ``` 86 | 87 | **Linux** 88 | ```bash 89 | export DATA_API_TOKEN= 90 | export PROVIDER= 91 | ``` 92 | 93 | Then, start the MCP Server: 94 | 95 | ```bash 96 | uv run server.py --transport sse 97 | ``` 98 | 99 | - Optional Arguments: 100 | 101 | `--sse-host` Host to bind SSE server to (default: localhost) 102 | 103 | `--sse-port` Port for SSE server (default: 8000) 104 | 105 | 106 | Once the MCP Server is running, update your MCP client's configuration with the following settings to connect to it. 107 | 108 | ```JSON 109 | { 110 | "mcpServers": { 111 | "finData": { 112 | "name": "finData", 113 | "type": "sse", 114 | "baseUrl": "http://localhost:8000/sse" 115 | } 116 | } 117 | } 118 | ``` 119 | 120 | **Note:** Variable names in configuration files may vary slightly between MCP clients. Refer to each client's documentation for proper configuration. 121 | 122 | # Supported Data Providers 123 | 124 | Set the `PROVIDER` environment variable to specify your provider: 125 | 126 | - tushare 127 | 128 | # Tools 129 | 130 | ## Tushare 131 | 132 | ### Market Data 133 | 134 | - `daily` Get unadjusted daily stock market data. 135 | 136 | ### Fundamental Data 137 | 138 | - `stock_basic` Get stock basic information including name, code, etc. 139 | - `stock_company` Get listed company basic information. 140 | - `bak_basic` Get fundamental data for specific stocks within a given time range. 141 | 142 | ### Financial Data 143 | 144 | - `income` Get company income statement data. 145 | - `balancesheet` Get company balance sheet data. 146 | - `cashflow` Get company cash flow statement data. 147 | 148 | ### Macroeconomic Data 149 | 150 | - `shibor_lpr` Get Loan Prime Rate (LPR) data. 151 | - `cn_gdp` Get Gross Domestic Product (GDP) data. 152 | - `cn_cpi` Get Consumer Price Index (CPI) data. 153 | - `cn_ppi` Get Producer Price Index (PPI) data. 154 | - `cn_m` Get Money Supply data. 155 | - `sf_month` Get Social Financing data. 156 | - `cn_pmi` Get Purchasing Managers' Index (PMI) data. 157 | 158 | # DataCanvas 159 | 160 | 161 | ![datacanvas](https://raw.githubusercontent.com/DataCanvasIO/HyperTS/main/docs/static/images/dc_logo_1.png) 162 | 163 | This project is open-sourced by [DataCanvas](https://datacanvas.com/) 164 | 165 | 166 | -------------------------------------------------------------------------------- /src/findata/providers/_tushare/fundamentalData.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | from typing import Optional 4 | from utils.date_processor import standardize_date 5 | from .common import get_trade_dates 6 | from utils.auth import login 7 | from utils.findata_log import setup_logger 8 | 9 | logger = setup_logger() 10 | 11 | async def stock_basic( 12 | ts_code: Optional[str] = "", 13 | name: Optional[str] = "", 14 | market: Optional[str] = "", 15 | list_status: Optional[str] = "", 16 | exchange: Optional[str] = "", 17 | is_hs: Optional[str] = "", 18 | fields: Optional[list] = [], 19 | ) -> dict: 20 | """ 21 | Name: 22 | 股票基础信息。 23 | 24 | Description: 25 | 获取股票的名称、代码等基础信息。 26 | 27 | Args: 28 | | 名称 | 类型 | 必填 | 描述 | 29 | |------------|-------|------|----------------------------------------| 30 | | ts_code | str | 否 | 股票代码,每次只能查询一支股票 | 31 | | name | str | 否 | 股票名称 | 32 | | market | str | 否 | 市场类别 (主板/创业板/科创板/CDR/北交所) | 33 | | list_status | str | 否 | 上市状态(L:上市,D:退市,P:暂停上市。默认是L) | 34 | | exchange | str | 否 | 交易所代码 (上交所:SSE, 深交所:SZSE 北交所:BSE) | 35 | | is_hs | str | 否 | 是否沪深港通标的(N:否,H:沪股通,S:深股通) | 36 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 37 | 38 | Fields: 39 | - ts_code: TS代码 40 | - symbol: 股票代码 41 | - name: 股票名称 42 | - area: 地域 43 | - industry: 所属行业 44 | - fullname: 股票全称 45 | - enname: 英文全称 46 | - cnspell: 拼音缩写 47 | - market: 市场类型(主板/创业板/科创板/CDR) 48 | - exchange: 交易所代码 49 | - curr_type: 交易货币 50 | - list_status: 上市状态 L上市 D退市 P暂停上市 51 | - list_date: 上市日期 52 | - delist_date: 退市日期 53 | - is_hs: 是否沪深港通标的,N否 H沪股通 S深股通 54 | - act_name: 实控人名称 55 | - act_ent_type: 实控人企业性质 56 | """ 57 | try: 58 | logger.debug("call stock basic!") 59 | # 登录tushare 60 | tsObj = login() 61 | 62 | #TODO 股票代码 标准化 63 | 64 | df = tsObj.stock_basic(ts_code=ts_code, name=name, market=market, list_status=list_status, exchange=exchange, is_hs=is_hs, fields=fields) 65 | # return df.to_json() 66 | return df 67 | 68 | except Exception as e: 69 | logger.error(f"获取股票基本信息失败!\n ", exc_info=True) 70 | raise Exception(f"获取股票基本信息失败!\n {str(e)}") from e 71 | 72 | 73 | async def stock_company( 74 | ts_code: Optional[str] = "", 75 | exchange: Optional[str] = "", 76 | fields: Optional[list] = [], 77 | ) -> dict: 78 | """ 79 | Name: 80 | 上市公司基本信息。 81 | 82 | Description: 83 | 获取上市公司基础信息。 84 | 85 | Args: 86 | | 名称 | 类型 | 必填 | 描述 | 87 | |------------|-------|------|----------------------------------------| 88 | | ts_code | str | 否 | 股票代码,每次只能查询一家公司 | 89 | | exchange | str | 否 | 交易所代码 (上交所:SSE, 深交所:SZSE 北交所:BSE) | 90 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 91 | 92 | Fields: 93 | - ts_code:股票代码 94 | - com_name:公司全称 95 | - com_id:统一社会信用代码 96 | - exchange:交易所代码 97 | - chairman:法人代表 98 | - manager:总经理 99 | - secretary:董秘 100 | - reg_capital:注册资本(万元) 101 | - setup_date:注册日期 102 | - province:所在省份 103 | - city:所在城市 104 | - introduction:公司介绍 105 | - website:公司主页 106 | - email:电子邮件 107 | - office:办公室 108 | - employees:员工人数 109 | - main_business:主要业务及产品 110 | - business_scope:经营范围 111 | 112 | """ 113 | try: 114 | # 登录tushare 115 | tsObj = login() 116 | 117 | #TODO 股票代码 标准化 118 | 119 | df = tsObj.stock_company(ts_code=ts_code, exchange=exchange, fields=fields) 120 | # return df.to_json() 121 | return df 122 | 123 | except Exception as e: 124 | logger.error(f"获取上市公司基本信息数据失败!\n ", exc_info=True) 125 | raise Exception(f"获取上市公司基本信息数据失败!\n {str(e)}") from e 126 | 127 | 128 | 129 | 130 | async def bak_basic( 131 | ts_code: str, 132 | start_date: str, 133 | end_date: str, 134 | fields: Optional[list] = [], 135 | ) -> dict: 136 | """ 137 | Name: 138 | 股票基本面信息。 139 | 140 | Description: 141 | 获取某支股票在指定时间范围内的基本面数据,数据从2016年开始。 142 | 143 | Args: 144 | | 名称 | 类型 | 必填 | 描述 | 145 | |------------|-------|------|----------------------------------------| 146 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 | 147 | | start_date | str | 是 | 开始日期(YYYYMMDD) | 148 | | end_date | str | 是 | 开始日期(YYYYMMDD) | 149 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 150 | 151 | Fields: 152 | - trade_date:交易日期 153 | - ts_code:TS股票代码 154 | - name:股票名称 155 | - industry:行业 156 | - area:地域 157 | - pe:市盈率(动) 158 | - float_share:流通股本(亿) 159 | - total_share:总股本(亿) 160 | - total_assets:总资产(亿) 161 | - liquid_assets:流动资产(亿) 162 | - fixed_assets:固定资产(亿) 163 | - reserved:公积金 164 | - reserved_pershare:每股公积金 165 | - eps:每股收益 166 | - bvps:每股净资产 167 | - pb:市净率 168 | - list_date:上市日期 169 | - undp:未分配利润 170 | - per_undp:每股未分配利润 171 | - rev_yoy:收入同比(%) 172 | - profit_yoy:利润同比(%) 173 | - gpr:毛利率(%) 174 | - npr:净利润率(%) 175 | - holder_num:股东人数 176 | 177 | """ 178 | try: 179 | # 登录tushare 180 | tsObj = login() 181 | 182 | # 日期标准化 183 | start_date = standardize_date(start_date) 184 | 185 | end_date = standardize_date(end_date) 186 | 187 | #TODO 股票代码 标准化 188 | 189 | # 获取指定时间范围内的交易日 190 | trade_dates = get_trade_dates(start_date=start_date, end_date=end_date) 191 | 192 | if not trade_dates: 193 | raise ValueError(f"指定的时间范围内,没有交易日") 194 | 195 | # 查询单支股票所有的基本面数据 196 | if fields: 197 | fields.append('trade_date') 198 | fields = list(set(fields)) 199 | 200 | df = tsObj.bak_basic(ts_code=ts_code, fields=fields) 201 | 202 | res = df[df['trade_date'].isin(trade_dates)] 203 | 204 | # return res.to_json() 205 | return res 206 | 207 | except Exception as e: 208 | logger.error(f"获取股票基本面数据失败!\n ", exc_info=True) 209 | raise Exception(f"获取股票基本面数据失败!\n {str(e)}") from e 210 | 211 | 212 | 213 | 214 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/findata/providers/_tushare/macroeconomicData.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | from typing import Optional 4 | from utils.date_processor import standardize_date 5 | from utils.auth import login 6 | 7 | 8 | # LPR 9 | async def shibor_lpr( 10 | start_date: Optional[str] = "", 11 | end_date: Optional[str] = "", 12 | fields: Optional[list] = [], 13 | ) -> dict: 14 | 15 | """ 16 | Name: 17 | LPR贷款基础利率。 18 | 19 | Description: 20 | 获取LPR贷款基础利率。贷款基础利率(Loan Prime Rate,简称LPR),是基于报价行自主报出的最优贷款利率计算并发布的贷款市场参考利率。 21 | 22 | Args: 23 | | 名称 | 类型 | 必填 | 描述 | 24 | |------------|-------|------|----------------------------------------| 25 | | start_date | str | 否 | 开始日期(YYYYMMDD),与end_date同时出现 | 26 | | end_date | str | 否 | 结束日期(YYYYMMDD),与start_date同时出现 | 27 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 28 | 29 | Fields: 30 | - date:日期 31 | - 1y:1年贷款利率 32 | - 5y:5年贷款利率 33 | 34 | """ 35 | try: 36 | # 登录tushare 37 | tsObj = login() 38 | 39 | # 日期标准化 40 | if start_date: 41 | start_date = standardize_date(start_date) 42 | 43 | if end_date: 44 | end_date = standardize_date(end_date) 45 | 46 | 47 | #TODO 股票代码 标准化 48 | 49 | 50 | df = tsObj.shibor_lpr(start_date=start_date, end_date=end_date, fields=fields) 51 | # return df.to_json() 52 | return df 53 | except Exception as e: 54 | raise Exception(f"获取LPR贷款基础利率失败!\n {str(e)}") from e 55 | 56 | 57 | # GDP 58 | async def cn_gdp( 59 | q: Optional[str] = "", 60 | start_q: Optional[str] = "", 61 | end_q: Optional[str] = "", 62 | fields: Optional[list] = [], 63 | ) -> dict: 64 | 65 | """ 66 | Name: 67 | GDP数据。 68 | 69 | Description: 70 | 获取国民经济之GDP数据。 71 | 72 | Args: 73 | | 名称 | 类型 | 必填 | 描述 | 74 | |------------|-------|------|----------------------------------------| 75 | | q | str | 否 | 季度(2019Q1表示,2019年第一季度),支持多个季度同时输入,逗号分隔 | 76 | | start_q | str | 否 | 开始季度(2019Q1表示,2019年第一季度),与end_q同时使用 | 77 | | end_q | str | 否 | 结束季度(2019Q1表示,2019年第一季度),与start_q同时使用 | 78 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 79 | 80 | Fields: 81 | - quarter: 季度 82 | - gdp: GDP累计值(亿元) 83 | - gdp_yoy: 当季同比增速(%) 84 | - pi: 第一产业累计值(亿元) 85 | - pi_yoy: 第一产业同比增速(%) 86 | - si: 第二产业累计值(亿元) 87 | - si_yoy: 第二产业同比增速(%) 88 | - ti: 第三产业累计值(亿元) 89 | - ti_yoy: 第三产业同比增速(%) 90 | 91 | """ 92 | try: 93 | # 登录tushare 94 | tsObj = login() 95 | 96 | # 添加季度字段 97 | if fields: 98 | fields.append('quarter') 99 | fields = list(set(fields)) 100 | 101 | df = tsObj.cn_gdp(q=q, start_q=start_q, end_q=end_q, fields=fields) 102 | # return df.to_json() 103 | return df 104 | except Exception as e: 105 | raise Exception(f"获取GDP数据失败!\n {str(e)}") from e 106 | 107 | # CPI 108 | async def cn_cpi( 109 | m: Optional[str] = "", 110 | start_m: Optional[str] = "", 111 | end_m: Optional[str] = "", 112 | fields: Optional[list] = [], 113 | ) -> dict: 114 | """ 115 | Name: 116 | 居民消费价格指数。 117 | 118 | Description: 119 | 获取CPI居民消费价格数据,包括全国、城市和农村的数据。 120 | 121 | Args: 122 | | 名称 | 类型 | 必填 | 描述 | 123 | |------------|-------|------|----------------------------------------| 124 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 | 125 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 | 126 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 | 127 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 128 | 129 | Fields: 130 | - month: 月份 131 | - nt_val: 全国当月值 132 | - nt_yoy: 全国同比(%) 133 | - nt_mom: 全国环比(%) 134 | - nt_accu: 全国累计值 135 | - town_val: 城市当月值 136 | - town_yoy: 城市同比(%) 137 | - town_mom: 城市环比(%) 138 | - town_accu: 城市累计值 139 | - cnt_val: 农村当月值 140 | - cnt_yoy: 农村同比(%) 141 | - cnt_mom: 农村环比(%) 142 | - cnt_accu: 农村累计值 143 | """ 144 | try: 145 | # 登录tushare 146 | tsObj = login() 147 | 148 | # 添加季度字段 149 | if fields: 150 | fields.append('month') 151 | fields = list(set(fields)) 152 | 153 | df = tsObj.cn_cpi(m=m, start_m=start_m, end_m=end_m, fields=fields) 154 | # return df.to_json() 155 | return df 156 | except Exception as e: 157 | raise Exception(f"获取CPI数据失败!\n {str(e)}") from e 158 | 159 | # PPI 160 | async def cn_ppi( 161 | m: Optional[str] = "", 162 | start_m: Optional[str] = "", 163 | end_m: Optional[str] = "", 164 | fields: Optional[list] = [], 165 | ) -> dict: 166 | """ 167 | Name: 168 | 工业生产者出厂价格指数。 169 | 170 | Description: 171 | 获取PPI工业生产者出厂价格指数数据。 172 | 173 | Args: 174 | | 名称 | 类型 | 必填 | 描述 | 175 | |------------|-------|------|----------------------------------------| 176 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 | 177 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 | 178 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 | 179 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 180 | 181 | Fields: 182 | - month: 月份(格式为YYYYMM) 183 | - ppi_yoy: 工业品出厂价格指数(PPI)-全部工业品-当月同比 184 | - ppi_mp_yoy: PPI-生产资料-当月同比 185 | - ppi_mp_qm_yoy: PPI-生产资料-采掘业-当月同比 186 | - ppi_mp_rm_yoy: PPI-生产资料-原料业-当月同比 187 | - ppi_mp_p_yoy: PPI-生产资料-加工业-当月同比 188 | - ppi_cg_yoy: PPI-生活资料-当月同比 189 | - ppi_cg_f_yoy: PPI-生活资料-食品类-当月同比 190 | - ppi_cg_c_yoy: PPI-生活资料-衣着类-当月同比 191 | - ppi_cg_adu_yoy: PPI-生活资料-一般日用品类-当月同比 192 | - ppi_cg_dcg_yoy: PPI-生活资料-耐用消费品类-当月同比 193 | 194 | - ppi_mom: PPI-全部工业品-环比 195 | - ppi_mp_mom: PPI-生产资料-环比 196 | - ppi_mp_qm_mom: PPI-生产资料-采掘业-环比 197 | - ppi_mp_rm_mom: PPI-生产资料-原料业-环比 198 | - ppi_mp_p_mom: PPI-生产资料-加工业-环比 199 | - ppi_cg_mom: PPI-生活资料-环比 200 | - ppi_cg_f_mom: PPI-生活资料-食品类-环比 201 | - ppi_cg_c_mom: PPI-生活资料-衣着类-环比 202 | - ppi_cg_adu_mom: PPI-生活资料-一般日用品类-环比 203 | - ppi_cg_dcg_mom: PPI-生活资料-耐用消费品类-环比 204 | 205 | - ppi_accu: PPI-全部工业品-累计同比 206 | - ppi_mp_accu: PPI-生产资料-累计同比 207 | - ppi_mp_qm_accu: PPI-生产资料-采掘业-累计同比 208 | - ppi_mp_rm_accu: PPI-生产资料-原料业-累计同比 209 | - ppi_mp_p_accu: PPI-生产资料-加工业-累计同比 210 | - ppi_cg_accu: PPI-生活资料-累计同比 211 | - ppi_cg_f_accu: PPI-生活资料-食品类-累计同比 212 | - ppi_cg_c_accu: PPI-生活资料-衣着类-累计同比 213 | - ppi_cg_adu_accu: PPI-生活资料-一般日用品类-累计同比 214 | - ppi_cg_dcg_accu: PPI-生活资料-耐用消费品类-累计同比 215 | """ 216 | 217 | try: 218 | # 登录tushare 219 | tsObj = login() 220 | 221 | # 添加季度字段 222 | if fields: 223 | fields.append('month') 224 | fields = list(set(fields)) 225 | 226 | df = tsObj.cn_ppi(m=m, start_m=start_m, end_m=end_m, fields=fields) 227 | # return df.to_json() 228 | return df 229 | except Exception as e: 230 | raise Exception(f"获取PPI数据失败!\n {str(e)}") from e 231 | 232 | 233 | # 货币供应量 234 | async def cn_m( 235 | m: Optional[str] = "", 236 | start_m: Optional[str] = "", 237 | end_m: Optional[str] = "", 238 | fields: Optional[list] = [], 239 | ) -> dict: 240 | """ 241 | Name: 242 | 货币供应量。 243 | 244 | Description: 245 | 获取货币供应量之月度数据。 246 | 247 | Args: 248 | | 名称 | 类型 | 必填 | 描述 | 249 | |------------|-------|------|----------------------------------------| 250 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 | 251 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 | 252 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 | 253 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 254 | 255 | Fields: 256 | - month: 月份(YYYYMM) 257 | - m0: M0(亿元) 258 | - m0_yoy: M0同比(%) 259 | - m0_mom: M0环比(%) 260 | - m1: M1(亿元) 261 | - m1_yoy: M1同比(%) 262 | - m1_mom: M1环比(%) 263 | - m2: M2(亿元) 264 | - m2_yoy: M2同比(%) 265 | - m2_mom: M2环比(%) 266 | """ 267 | try: 268 | # 登录tushare 269 | tsObj = login() 270 | 271 | # 添加季度字段 272 | if fields: 273 | fields.append('month') 274 | fields = list(set(fields)) 275 | 276 | df = tsObj.cn_m(m=m, start_m=start_m, end_m=end_m, fields=fields) 277 | # return df.to_json() 278 | return df 279 | except Exception as e: 280 | raise Exception(f"获取货币供应量数据失败!\n {str(e)}") from e 281 | 282 | 283 | # 社融数据(月度) 284 | async def sf_month( 285 | m: Optional[str] = "", 286 | start_m: Optional[str] = "", 287 | end_m: Optional[str] = "", 288 | fields: Optional[list] = [], 289 | ) -> dict: 290 | """ 291 | Name: 292 | 社融数据(月度)。 293 | 294 | Description: 295 | 获取月度社会融资数据。 296 | 297 | Args: 298 | | 名称 | 类型 | 必填 | 描述 | 299 | |------------|-------|------|----------------------------------------| 300 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 | 301 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 | 302 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 | 303 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 304 | 305 | Fields: 306 | - month: 月度 307 | - inc_month: 社融增量当月值(亿元) 308 | - inc_cumval: 社融增量累计值(亿元) 309 | - stk_endval: 社融存量期末值(万亿元) 310 | """ 311 | try: 312 | # 登录tushare 313 | tsObj = login() 314 | 315 | # 添加季度字段 316 | if fields: 317 | fields.append('month') 318 | fields = list(set(fields)) 319 | 320 | df = tsObj.sf_month(m=m, start_m=start_m, end_m=end_m, fields=fields) 321 | # return df.to_json() 322 | return df 323 | except Exception as e: 324 | raise Exception(f"获取社融数据数据失败!\n {str(e)}") from e 325 | 326 | # pmi 327 | async def cn_pmi( 328 | m: Optional[str] = "", 329 | start_m: Optional[str] = "", 330 | end_m: Optional[str] = "", 331 | fields: Optional[list] = [], 332 | ) -> dict: 333 | """ 334 | Name: 335 | 采购经理人指数(PMI)。 336 | 337 | Description: 338 | 获取采购经理人指数(PMI)数据。 339 | 340 | Args: 341 | | 名称 | 类型 | 必填 | 描述 | 342 | |------------|-------|------|----------------------------------------| 343 | | m | str | 否 | 月份(YYYYMM),支持多个月份同时输入,逗号分隔 | 344 | | start_m | str | 否 | 开始月份(YYYYMM),与end_m同时使用 | 345 | | end_m | str | 否 | 结束月份(YYYYMM),与start_m同时使用 | 346 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 347 | 348 | Fields: 349 | - month - 月份YYYYMM 350 | - pmi010000 - 制造业PMI 351 | - pmi010100 - 制造业PMI-企业规模-大型企业 352 | - pmi010200 - 制造业PMI-企业规模-中型企业 353 | - pmi010300 - 制造业PMI-企业规模-小型企业 354 | - pmi010400 - 制造业PMI-构成指数-生产指数 355 | - pmi010401 - 制造业PMI-构成指数-生产指数-企业规模-大型企业 356 | - pmi010402 - 制造业PMI-构成指数-生产指数-企业规模-中型企业 357 | - pmi010403 - 制造业PMI-构成指数-生产指数-企业规模-小型企业 358 | - pmi010500 - 制造业PMI-构成指数-新订单指数 359 | - pmi010501 - 制造业PMI-构成指数-新订单指数-企业规模-大型企业 360 | - pmi010502 - 制造业PMI-构成指数-新订单指数-企业规模-中型企业 361 | - pmi010503 - 制造业PMI-构成指数-新订单指数-企业规模-小型企业 362 | - pmi010600 - 制造业PMI-构成指数-供应商配送时间指数 363 | - pmi010601 - 制造业PMI-构成指数-供应商配送时间指数-企业规模-大型企业 364 | - pmi010602 - 制造业PMI-构成指数-供应商配送时间指数-企业规模-中型企业 365 | - pmi010603 - 制造业PMI-构成指数-供应商配送时间指数-企业规模-小型企业 366 | - pmi010700 - 制造业PMI-构成指数-原材料库存指数 367 | - pmi010701 - 制造业PMI-构成指数-原材料库存指数-企业规模-大型企业 368 | - pmi010702 - 制造业PMI-构成指数-原材料库存指数-企业规模-中型企业 369 | - pmi010703 - 制造业PMI-构成指数-原材料库存指数-企业规模-小型企业 370 | - pmi010800 - 制造业PMI-构成指数-从业人员指数 371 | - pmi010801 - 制造业PMI-构成指数-从业人员指数-企业规模-大型企业 372 | - pmi010802 - 制造业PMI-构成指数-从业人员指数-企业规模-中型企业 373 | - pmi010803 - 制造业PMI-构成指数-从业人员指数-企业规模-小型企业 374 | - pmi010900 - 制造业PMI-其他-新出口订单 375 | - pmi011000 - 制造业PMI-其他-进口 376 | - pmi011100 - 制造业PMI-其他-采购量 377 | - pmi011200 - 制造业PMI-其他-主要原材料购进价格 378 | - pmi011300 - 制造业PMI-其他-出厂价格 379 | - pmi011400 - 制造业PMI-其他-产成品库存 380 | - pmi011500 - 制造业PMI-其他-在手订单 381 | - pmi011600 - 制造业PMI-其他-生产经营活动预期 382 | - pmi011700 - 制造业PMI-分行业-装备制造业 383 | - pmi011800 - 制造业PMI-分行业-高技术制造业 384 | - pmi011900 - 制造业PMI-分行业-基础原材料制造业 385 | - pmi012000 - 制造业PMI-分行业-消费品制造业 386 | - pmi020100 - 非制造业PMI-商务活动 387 | - pmi020101 - 非制造业PMI-商务活动-分行业-建筑业 388 | - pmi020102 - 非制造业PMI-商务活动-分行业-服务业业 389 | - pmi020200 - 非制造业PMI-新订单指数 390 | - pmi020201 - 非制造业PMI-新订单指数-分行业-建筑业 391 | - pmi020202 - 非制造业PMI-新订单指数-分行业-服务业 392 | - pmi020300 - 非制造业PMI-投入品价格指数 393 | - pmi020301 - 非制造业PMI-投入品价格指数-分行业-建筑业 394 | - pmi020302 - 非制造业PMI-投入品价格指数-分行业-服务业 395 | - pmi020400 - 非制造业PMI-销售价格指数 396 | - pmi020401 - 非制造业PMI-销售价格指数-分行业-建筑业 397 | - pmi020402 - 非制造业PMI-销售价格指数-分行业-服务业 398 | - pmi020500 - 非制造业PMI-从业人员指数 399 | - pmi020501 - 非制造业PMI-从业人员指数-分行业-建筑业 400 | - pmi020502 - 非制造业PMI-从业人员指数-分行业-服务业 401 | - pmi020600 - 非制造业PMI-业务活动预期指数 402 | - pmi020601 - 非制造业PMI-业务活动预期指数-分行业-建筑业 403 | - pmi020602 - 非制造业PMI-业务活动预期指数-分行业-服务业 404 | - pmi020700 - 非制造业PMI-新出口订单 405 | - pmi020800 - 非制造业PMI-在手订单 406 | - pmi020900 - 非制造业PMI-存货 407 | - pmi021000 - 非制造业PMI-供应商配送时间 408 | - pmi030000 - 中国综合PMI-产出指数 409 | """ 410 | 411 | try: 412 | # 登录tushare 413 | tsObj = login() 414 | 415 | # 添加季度字段 416 | if fields: 417 | fields.append('month') 418 | fields = list(set(fields)) 419 | 420 | df = tsObj.cn_pmi(m=m, start_m=start_m, end_m=end_m, fields=fields) 421 | # return df.to_json() 422 | return df 423 | except Exception as e: 424 | raise Exception(f"获取PMI数据失败!\n {str(e)}") from e 425 | 426 | 427 | -------------------------------------------------------------------------------- /src/findata/providers/_tushare/financialData.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | from typing import Optional 4 | from utils.date_processor import standardize_date 5 | from utils.auth import login 6 | 7 | 8 | # 利润表 9 | async def income( 10 | ts_code: str = "", 11 | ann_date: Optional[str] = "", 12 | f_ann_date: Optional[str] = "", 13 | start_date: Optional[str] = "", 14 | end_date: Optional[str] = "", 15 | period: Optional[str] = "", 16 | report_type: Optional[str] = "", 17 | comp_type: Optional[str] = "", 18 | fields: Optional[list] = [], 19 | ) -> dict: 20 | """ 21 | Name: 22 | 上市公司财务利润表。 23 | 24 | Description: 25 | 获取上市公司财务三大报表之利润表数据。 26 | 27 | Args: 28 | | 名称 | 类型 | 必选 | 描述 | 29 | |------------|--------|------|----------------------------------------------------------------------| 30 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 | 31 | | ann_date | str | 否 | 公告日期(YYYYMMDD格式) | 32 | | f_ann_date | str | 否 | 实际公告日期(YYYYMMDD格式) | 33 | | start_date | str | 否 | 公告开始日期(YYYYMMDD格式) | 34 | | end_date | str | 否 | 公告结束日期 (YYYYMMDD格式) | 35 | | period | str | 否 | 报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) | 36 | | report_type| str | 否 | 报告类型,参考文档最下方说明 | 37 | | comp_type | str | 否 | 公司类型(一般工商业:1,银行:2,保险:3,证券:4) | 38 | | fields | list | 否 | 从Fields中选取需要查询的字段 | 39 | 40 | Fields: 41 | - ts_code:TS代码 42 | - ann_date:公告日期 43 | - f_ann_date:实际公告日期 44 | - end_date:报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) 45 | - report_type:报告类型 见底部表 46 | - comp_type:公司类型(1一般工商业2银行3保险4证券) 47 | - end_type:报告期类型 48 | - basic_eps:基本每股收益 49 | - diluted_eps:稀释每股收益 50 | - total_revenue:营业总收入 51 | - revenue:营业收入 52 | - int_income:利息收入 53 | - prem_earned:已赚保费 54 | - comm_income:手续费及佣金收入 55 | - n_commis_income:手续费及佣金净收入 56 | - n_oth_income:其他经营净收益 57 | - n_oth_b_income:加:其他业务净收益 58 | - prem_income:保险业务收入 59 | - out_prem:减:分出保费 60 | - une_prem_reser:提取未到期责任准备金 61 | - reins_income:其中:分保费收入 62 | - n_sec_tb_income:代理买卖证券业务净收入 63 | - n_sec_uw_income:证券承销业务净收入 64 | - n_asset_mg_income:受托客户资产管理业务净收入 65 | - oth_b_income:其他业务收入 66 | - fv_value_chg_gain:加:公允价值变动净收益 67 | - invest_income:加:投资净收益 68 | - ass_invest_income:其中:对联营企业和合营企业的投资收益 69 | - forex_gain:加:汇兑净收益 70 | - total_cogs:营业总成本 71 | - oper_cost:减:营业成本 72 | - int_exp:减:利息支出 73 | - comm_exp:减:手续费及佣金支出 74 | - biz_tax_surchg:减:营业税金及附加 75 | - sell_exp:减:销售费用 76 | - admin_exp:减:管理费用 77 | - fin_exp:减:财务费用 78 | - assets_impair_loss:减:资产减值损失 79 | - prem_refund:退保金 80 | - compens_payout:赔付总支出 81 | - reser_insur_liab:提取保险责任准备金 82 | - div_payt:保户红利支出 83 | - reins_exp:分保费用 84 | - oper_exp:营业支出 85 | - compens_payout_refu:减:摊回赔付支出 86 | - insur_reser_refu:减:摊回保险责任准备金 87 | - reins_cost_refund:减:摊回分保费用 88 | - other_bus_cost:其他业务成本 89 | - operate_profit:营业利润 90 | - non_oper_income:加:营业外收入 91 | - non_oper_exp:减:营业外支出 92 | - nca_disploss:其中:减:非流动资产处置净损失 93 | - total_profit:利润总额 94 | - income_tax:所得税费用 95 | - n_income:净利润(含少数股东损益) 96 | - n_income_attr_p:净利润(不含少数股东损益) 97 | - minority_gain:少数股东损益 98 | - oth_compr_income:其他综合收益 99 | - t_compr_income:综合收益总额 100 | - compr_inc_attr_p:归属于母公司(或股东)的综合收益总额 101 | - compr_inc_attr_m_s:归属于少数股东的综合收益总额 102 | - ebit:息税前利润 103 | - ebitda:息税折旧摊销前利润 104 | - insurance_exp:保险业务支出 105 | - undist_profit:年初未分配利润 106 | - distable_profit:可分配利润 107 | - rd_exp:研发费用 108 | - fin_exp_int_exp:财务费用:利息费用 109 | - fin_exp_int_inc:财务费用:利息收入 110 | - transfer_surplus_rese:盈余公积转入 111 | - transfer_housing_imprest:住房周转金转入 112 | - transfer_oth:其他转入 113 | - adj_lossgain:调整以前年度损益 114 | - withdra_legal_surplus:提取法定盈余公积 115 | - withdra_legal_pubfund:提取法定公益金 116 | - withdra_biz_devfund:提取企业发展基金 117 | - withdra_rese_fund:提取储备基金 118 | - withdra_oth_ersu:提取任意盈余公积金 119 | - workers_welfare:职工奖金福利 120 | - distr_profit_shrhder:可供股东分配的利润 121 | - prfshare_payable_dvd:应付优先股股利 122 | - comshare_payable_dvd:应付普通股股利 123 | - capit_comstock_div:转作股本的普通股股利 124 | - net_after_nr_lp_correct:扣除非经常性损益后的净利润(更正前) 125 | - credit_impa_loss:信用减值损失 126 | - net_expo_hedging_benefits:净敞口套期收益 127 | - oth_impair_loss_assets:其他资产减值损失 128 | - total_opcost:营业总成本(二) 129 | - amodcost_fin_assets:以摊余成本计量的金融资产终止确认收益 130 | - oth_income:其他收益 131 | - asset_disp_income:资产处置收益 132 | - continued_net_profit:持续经营净利润 133 | - end_net_profit:终止经营净利润 134 | - update_flag:更新标识 135 | """ 136 | try: 137 | # 登录tushare 138 | tsObj = login() 139 | 140 | # 日期标准化 141 | if ann_date: 142 | ann_date = standardize_date(ann_date) 143 | 144 | if start_date: 145 | start_date = standardize_date(start_date) 146 | 147 | if end_date: 148 | end_date = standardize_date(end_date) 149 | 150 | if f_ann_date: 151 | f_ann_date = standardize_date(f_ann_date) 152 | 153 | #TODO 股票代码 标准化 154 | 155 | # 添加必须存在的字段 156 | if fields: 157 | fields.append('ann_date') 158 | fields.append('f_ann_date') 159 | fields.append('end_date') 160 | fields = list(set(fields)) 161 | 162 | df = tsObj.income(ts_code=ts_code, ann_date=ann_date, f_ann_date=f_ann_date, start_date=start_date, end_date=end_date, period=period, report_type=report_type, comp_type=comp_type, fields=fields) 163 | # return df.to_json() 164 | return df 165 | 166 | except Exception as e: 167 | raise Exception(f"获取上市公司财务利润表数据失败!\n {str(e)}") from e 168 | 169 | 170 | # 资产负债表 171 | async def balancesheet( 172 | ts_code: str = "", 173 | ann_date: Optional[str] = "", 174 | start_date: Optional[str] = "", 175 | end_date: Optional[str] = "", 176 | period: Optional[str] = "", 177 | report_type: Optional[str] = "", 178 | comp_type: Optional[str] = "", 179 | fields: Optional[list] = [], 180 | ) -> dict: 181 | """ 182 | Name: 183 | 上市公司资产负债表。 184 | 185 | Description: 186 | 获取上市公司财务三大报表之资产负债表数据。 187 | 188 | Args: 189 | | 名称 | 类型 | 必选 | 描述 | 190 | |------------|--------|------|----------------------------------------------------------------------| 191 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 | 192 | | ann_date | str | 否 | 公告日期(YYYYMMDD格式) | 193 | | start_date | str | 否 | 公告开始日期(YYYYMMDD格式) | 194 | | end_date | str | 否 | 公告结束日期 (YYYYMMDD格式) | 195 | | period | str | 否 | 报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) | 196 | | report_type| str | 否 | 报告类型,参考文档最下方说明 | 197 | | comp_type | str | 否 | 公司类型(一般工商业:1,银行:2,保险:3,证券:4) | 198 | | fields | list | 否 | 从Fields中选取需要查询的字段,必须包含ann_date、f_ann_date、end_date | 199 | 200 | Fields: 201 | - ts_code:TS股票代码 202 | - ann_date:公告日期 203 | - f_ann_date:实际公告日期 204 | - end_date:报告期 205 | - report_type:报表类型 206 | - comp_type:公司类型(1一般工商业2银行3保险4证券) 207 | - end_type:报告期类型 208 | - total_share:期末总股本 209 | - cap_rese:资本公积金 210 | - undistr_porfit:未分配利润 211 | - surplus_rese:盈余公积金 212 | - special_rese:专项储备 213 | - money_cap:货币资金 214 | - trad_asset:交易性金融资产 215 | - notes_receiv:应收票据 216 | - accounts_receiv:应收账款 217 | - oth_receiv:其他应收款 218 | - prepayment:预付款项 219 | - div_receiv:应收股利 220 | - int_receiv:应收利息 221 | - inventories:存货 222 | - amor_exp:待摊费用 223 | - nca_within_1y:一年内到期的非流动资产 224 | - sett_rsrv:结算备付金 225 | - loanto_oth_bank_fi:拆出资金 226 | - premium_receiv:应收保费 227 | - reinsur_receiv:应收分保账款 228 | - reinsur_res_receiv:应收分保合同准备金 229 | - pur_resale_fa:买入返售金融资产 230 | - oth_cur_assets:其他流动资产 231 | - total_cur_assets:流动资产合计 232 | - fa_avail_for_sale:可供出售金融资产 233 | - htm_invest:持有至到期投资 234 | - lt_eqt_invest:长期股权投资 235 | - invest_real_estate:投资性房地产 236 | - time_deposits:定期存款 237 | - oth_assets:其他资产 238 | - lt_rec:长期应收款 239 | - fix_assets:固定资产 240 | - cip:在建工程 241 | - const_materials:工程物资 242 | - fixed_assets_disp:固定资产清理 243 | - produc_bio_assets:生产性生物资产 244 | - oil_and_gas_assets:油气资产 245 | - intan_assets:无形资产 246 | - r_and_d:研发支出 247 | - goodwill:商誉 248 | - lt_amor_exp:长期待摊费用 249 | - defer_tax_assets:递延所得税资产 250 | - decr_in_disbur:发放贷款及垫款 251 | - oth_nca:其他非流动资产 252 | - total_nca:非流动资产合计 253 | - cash_reser_cb:现金及存放中央银行款项 254 | - depos_in_oth_bfi:存放同业和其它金融机构款项 255 | - prec_metals:贵金属 256 | - deriv_assets:衍生金融资产 257 | - rr_reins_une_prem:应收分保未到期责任准备金 258 | - rr_reins_outstd_cla:应收分保未决赔款准备金 259 | - rr_reins_lins_liab:应收分保寿险责任准备金 260 | - rr_reins_lthins_liab:应收分保长期健康险责任准备金 261 | - refund_depos:存出保证金 262 | - ph_pledge_loans:保户质押贷款 263 | - refund_cap_depos:存出资本保证金 264 | - indep_acct_assets:独立账户资产 265 | - client_depos:其中:客户资金存款 266 | - client_prov:其中:客户备付金 267 | - transac_seat_fee:其中:交易席位费 268 | - invest_as_receiv:应收款项类投资 269 | - total_assets:资产总计 270 | - lt_borr:长期借款 271 | - st_borr:短期借款 272 | - cb_borr:向中央银行借款 273 | - depos_ib_deposits:吸收存款及同业存放 274 | - loan_oth_bank:拆入资金 275 | - trading_fl:交易性金融负债 276 | - notes_payable:应付票据 277 | - acct_payable:应付账款 278 | - adv_receipts:预收款项 279 | - sold_for_repur_fa:卖出回购金融资产款 280 | - comm_payable:应付手续费及佣金 281 | - payroll_payable:应付职工薪酬 282 | - taxes_payable:应交税费 283 | - int_payable:应付利息 284 | - div_payable:应付股利 285 | - oth_payable:其他应付款 286 | - acc_exp:预提费用 287 | - deferred_inc:递延收益 288 | - st_bonds_payable:应付短期债券 289 | - payable_to_reinsurer:应付分保账款 290 | - rsrv_insur_cont:保险合同准备金 291 | - acting_trading_sec:代理买卖证券款 292 | - acting_uw_sec:代理承销证券款 293 | - non_cur_liab_due_1y:一年内到期的非流动负债 294 | - oth_cur_liab:其他流动负债 295 | - total_cur_liab:流动负债合计 296 | - bond_payable:应付债券 297 | - lt_payable:长期应付款 298 | - specific_payables:专项应付款 299 | - estimated_liab:预计负债 300 | - defer_tax_liab:递延所得税负债 301 | - defer_inc_non_cur_liab:递延收益-非流动负债 302 | - oth_ncl:其他非流动负债 303 | - total_ncl:非流动负债合计 304 | - depos_oth_bfi:同业和其它金融机构存放款项 305 | - deriv_liab:衍生金融负债 306 | - depos:吸收存款 307 | - agency_bus_liab:代理业务负债 308 | - oth_liab:其他负债 309 | - prem_receiv_adva:预收保费 310 | - depos_received:存入保证金 311 | - ph_invest:保户储金及投资款 312 | - reser_une_prem:未到期责任准备金 313 | - reser_outstd_claims:未决赔款准备金 314 | - reser_lins_liab:寿险责任准备金 315 | - reser_lthins_liab:长期健康险责任准备金 316 | - indept_acc_liab:独立账户负债 317 | - pledge_borr:其中:质押借款 318 | - indem_payable:应付赔付款 319 | - policy_div_payable:应付保单红利 320 | - total_liab:负债合计 321 | - treasury_share:减:库存股 322 | - ordin_risk_reser:一般风险准备 323 | - forex_differ:外币报表折算差额 324 | - invest_loss_unconf:未确认的投资损失 325 | - minority_int:少数股东权益 326 | - total_hldr_eqy_exc_min_int:股东权益合计(不含少数股东权益) 327 | - total_hldr_eqy_inc_min_int:股东权益合计(含少数股东权益) 328 | - total_liab_hldr_eqy:负债及股东权益总计 329 | - lt_payroll_payable:长期应付职工薪酬 330 | - oth_comp_income:其他综合收益 331 | - oth_eqt_tools:其他权益工具 332 | - oth_eqt_tools_p_shr:其他权益工具(优先股) 333 | - lending_funds:融出资金 334 | - acc_receivable:应收款项 335 | - st_fin_payable:应付短期融资款 336 | - payables:应付款项 337 | - hfs_assets:持有待售的资产 338 | - hfs_sales:持有待售的负债 339 | - cost_fin_assets:以摊余成本计量的金融资产 340 | - fair_value_fin_assets:以公允价值计量且其变动计入其他综合收益的金融资产 341 | - cip_total:在建工程(合计)(元) 342 | - oth_pay_total:其他应付款(合计)(元) 343 | - long_pay_total:长期应付款(合计)(元) 344 | - debt_invest:债权投资(元) 345 | - oth_debt_invest:其他债权投资(元) 346 | - oth_eq_invest:其他权益工具投资(元) 347 | - oth_illiq_fin_assets:其他非流动金融资产(元) 348 | - oth_eq_ppbond:其他权益工具:永续债(元) 349 | - receiv_financing:应收款项融资 350 | - use_right_assets:使用权资产 351 | - lease_liab:租赁负债 352 | - contract_assets:合同资产 353 | - contract_liab:合同负债 354 | - accounts_receiv_bill:应收票据及应收账款 355 | - accounts_pay:应付票据及应付账款 356 | - oth_rcv_total:其他应收款(合计)(元) 357 | - fix_assets_total:固定资产(合计)(元) 358 | - update_flag:更新标识 359 | 360 | """ 361 | try: 362 | # 登录tushare 363 | tsObj = login() 364 | 365 | # 日期标准化 366 | if ann_date: 367 | ann_date = standardize_date(ann_date) 368 | 369 | if start_date: 370 | start_date = standardize_date(start_date) 371 | 372 | if end_date: 373 | end_date = standardize_date(end_date) 374 | 375 | #TODO 股票代码 标准化 376 | 377 | # 添加必须存在的字段 378 | if fields: 379 | fields.append('ann_date') 380 | fields.append('f_ann_date') 381 | fields.append('end_date') 382 | fields = list(set(fields)) 383 | 384 | df = tsObj.balancesheet(ts_code=ts_code, ann_date=ann_date, start_date=start_date, end_date=end_date, period=period, report_type=report_type, comp_type=comp_type, fields=fields) 385 | # return df.to_json() 386 | return df 387 | 388 | except Exception as e: 389 | raise Exception(f"获取上市公司财务利润表数据失败!\n {str(e)}") from e 390 | 391 | # 现金流量表 392 | async def cashflow( 393 | ts_code: str = "", 394 | ann_date: Optional[str] = "", 395 | f_ann_date: Optional[str] = "", 396 | start_date: Optional[str] = "", 397 | end_date: Optional[str] = "", 398 | period: Optional[str] = "", 399 | report_type: Optional[str] = "", 400 | comp_type: Optional[str] = "", 401 | is_calc: Optional[int] = 0, 402 | fields: Optional[list] = [], 403 | ) -> dict: 404 | """ 405 | Name: 406 | 上市公司现金流量表。 407 | 408 | Description: 409 | 获取上市公司财务三大报表之现金流量表数据。 410 | 411 | Args: 412 | | 名称 | 类型 | 必选 | 描述 | 413 | |------------|--------|------|----------------------------------------------------------------------| 414 | | ts_code | str | 是 | 股票代码,每次只能查询一支股票 | 415 | | ann_date | str | 否 | 公告日期(YYYYMMDD格式) | 416 | | f_ann_date | str | 否 | 实际公告日期(YYYYMMDD格式) | 417 | | start_date | str | 否 | 公告开始日期(YYYYMMDD格式) | 418 | | end_date | str | 否 | 公告结束日期 (YYYYMMDD格式) | 419 | | period | str | 否 | 报告期(每个季度最后一天的日期,比如20171231表示年报,20170630半年报,20170930三季报) | 420 | | report_type| str | 否 | 报告类型,参考文档最下方说明 | 421 | | comp_type | str | 否 | 公司类型(一般工商业:1,银行:2,保险:3,证券:4) | 422 | | is_calc | int | 否 | 是否计算报表 | 423 | | fields | list | 否 | 从Fields中选取需要查询的字段,必须包含ann_date、f_ann_date、end_date | 424 | 425 | Fields: 426 | - ts_code:TS股票代码 427 | - ann_date:公告日期 428 | - f_ann_date:实际公告日期 429 | - end_date:报告期 430 | - comp_type:公司类型(1一般工商业2银行3保险4证券) 431 | - report_type:报表类型 432 | - end_type:报告期类型 433 | - net_profit:净利润 434 | - finan_exp:财务费用 435 | - c_fr_sale_sg:销售商品、提供劳务收到的现金 436 | - recp_tax_rends:收到的税费返还 437 | - n_depos_incr_fi:客户存款和同业存放款项净增加额 438 | - n_incr_loans_cb:向中央银行借款净增加额 439 | - n_inc_borr_oth_fi:向其他金融机构拆入资金净增加额 440 | - prem_fr_orig_contr:收到原保险合同保费取得的现金 441 | - n_incr_insured_dep:保户储金净增加额 442 | - n_reinsur_prem:收到再保业务现金净额 443 | - n_incr_disp_tfa:处置交易性金融资产净增加额 444 | - ifc_cash_incr:收取利息和手续费净增加额 445 | - n_incr_disp_faas:处置可供出售金融资产净增加额 446 | - n_incr_loans_oth_bank:拆入资金净增加额 447 | - n_cap_incr_repur:回购业务资金净增加额 448 | - c_fr_oth_operate_a:收到其他与经营活动有关的现金 449 | - c_inf_fr_operate_a:经营活动现金流入小计 450 | - c_paid_goods_s:购买商品、接受劳务支付的现金 451 | - c_paid_to_for_empl:支付给职工以及为职工支付的现金 452 | - c_paid_for_taxes:支付的各项税费 453 | - n_incr_clt_loan_adv:客户贷款及垫款净增加额 454 | - n_incr_dep_cbob:存放央行和同业款项净增加额 455 | - c_pay_claims_orig_inco:支付原保险合同赔付款项的现金 456 | - pay_handling_chrg:支付手续费的现金 457 | - pay_comm_insur_plcy:支付保单红利的现金 458 | - oth_cash_pay_oper_act:支付其他与经营活动有关的现金 459 | - st_cash_out_act:经营活动现金流出小计 460 | - n_cashflow_act:经营活动产生的现金流量净额 461 | - oth_recp_ral_inv_act:收到其他与投资活动有关的现金 462 | - c_disp_withdrwl_invest:收回投资收到的现金 463 | - c_recp_return_invest:取得投资收益收到的现金 464 | - n_recp_disp_fiolta:处置固定资产、无形资产和其他长期资产收回的现金净额 465 | - n_recp_disp_sobu:处置子公司及其他营业单位收到的现金净额 466 | - stot_inflows_inv_act:投资活动现金流入小计 467 | - c_pay_acq_const_fiolta:购建固定资产、无形资产和其他长期资产支付的现金 468 | - c_paid_invest:投资支付的现金 469 | - n_disp_subs_oth_biz:取得子公司及其他营业单位支付的现金净额 470 | - oth_pay_ral_inv_act:支付其他与投资活动有关的现金 471 | - n_incr_pledge_loan:质押贷款净增加额 472 | - stot_out_inv_act:投资活动现金流出小计 473 | - n_cashflow_inv_act:投资活动产生的现金流量净额 474 | - c_recp_borrow:取得借款收到的现金 475 | - proc_issue_bonds:发行债券收到的现金 476 | - oth_cash_recp_ral_fnc_act:收到其他与筹资活动有关的现金 477 | - stot_cash_in_fnc_act:筹资活动现金流入小计 478 | - free_cashflow:企业自由现金流量 479 | - c_prepay_amt_borr:偿还债务支付的现金 480 | - c_pay_dist_dpcp_int_exp:分配股利、利润或偿付利息支付的现金 481 | - incl_dvd_profit_paid_sc_ms:其中:子公司支付给少数股东的股利、利润 482 | - oth_cashpay_ral_fnc_act:支付其他与筹资活动有关的现金 483 | - stot_cashout_fnc_act:筹资活动现金流出小计 484 | - n_cash_flows_fnc_act:筹资活动产生的现金流量净额 485 | - eff_fx_flu_cash:汇率变动对现金的影响 486 | - n_incr_cash_cash_equ:现金及现金等价物净增加额 487 | - c_cash_equ_beg_period:期初现金及现金等价物余额 488 | - c_cash_equ_end_period:期末现金及现金等价物余额 489 | - c_recp_cap_contrib:吸收投资收到的现金 490 | - incl_cash_rec_saims:其中:子公司吸收少数股东投资收到的现金 491 | - uncon_invest_loss:未确认投资损失 492 | - prov_depr_assets:加:资产减值准备 493 | - depr_fa_coga_dpba:固定资产折旧、油气资产折耗、生产性生物资产折旧 494 | - amort_intang_assets:无形资产摊销 495 | - lt_amort_deferred_exp:长期待摊费用摊销 496 | - decr_deferred_exp:待摊费用减少 497 | - incr_acc_exp:预提费用增加 498 | - loss_disp_fiolta:处置固定、无形资产和其他长期资产的损失 499 | - loss_scr_fa:固定资产报废损失 500 | - loss_fv_chg:公允价值变动损失 501 | - invest_loss:投资损失 502 | - decr_def_inc_tax_assets:递延所得税资产减少 503 | - incr_def_inc_tax_liab:递延所得税负债增加 504 | - decr_inventories:存货的减少 505 | - decr_oper_payable:经营性应收项目的减少 506 | - incr_oper_payable:经营性应付项目的增加 507 | - others:其他 508 | - im_net_cashflow_oper_act:经营活动产生的现金流量净额(间接法) 509 | - conv_debt_into_cap:债务转为资本 510 | - conv_copbonds_due_within_1y:一年内到期的可转换公司债券 511 | - fa_fnc_leases:融资租入固定资产 512 | - im_n_incr_cash_equ:现金及现金等价物净增加额(间接法) 513 | - net_dism_capital_add:拆出资金净增加额 514 | - net_cash_rece_sec:代理买卖证券收到的现金净额(元) 515 | - credit_impa_loss:信用减值损失 516 | - use_right_asset_dep:使用权资产折旧 517 | - oth_loss_asset:其他资产减值损失 518 | - end_bal_cash:现金的期末余额 519 | - beg_bal_cash:减:现金的期初余额 520 | - end_bal_cash_equ:加:现金等价物的期末余额 521 | - beg_bal_cash_equ:减:现金等价物的期初余额 522 | - update_flag:更新标志(1最新) 523 | 524 | """ 525 | 526 | try: 527 | # 登录tushare 528 | tsObj = login() 529 | 530 | # 日期标准化 531 | if ann_date: 532 | ann_date = standardize_date(ann_date) 533 | 534 | if f_ann_date: 535 | f_ann_date = standardize_date(f_ann_date) 536 | 537 | if start_date: 538 | start_date = standardize_date(start_date) 539 | 540 | if end_date: 541 | end_date = standardize_date(end_date) 542 | 543 | #TODO 股票代码 标准化 544 | 545 | 546 | # 添加必须存在的字段 547 | if fields: 548 | fields.append('ann_date') 549 | fields.append('f_ann_date') 550 | fields.append('end_date') 551 | fields = list(set(fields)) 552 | 553 | df = tsObj.cashflow(ts_code=ts_code, ann_date=ann_date, f_ann_date=f_ann_date, start_date=start_date, end_date=end_date, period=period, report_type=report_type, comp_type=comp_type, is_calc=is_calc, fields=fields) 554 | # return df.to_json() 555 | return df 556 | 557 | except Exception as e: 558 | raise Exception(f"获取上市公司现金流量表数据失败!\n {str(e)}") from e 559 | 560 | 561 | 562 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 1 3 | requires-python = ">=3.11" 4 | resolution-markers = [ 5 | "python_full_version >= '3.12'", 6 | "python_full_version < '3.12'", 7 | ] 8 | 9 | [[package]] 10 | name = "annotated-types" 11 | version = "0.7.0" 12 | source = { registry = "https://pypi.org/simple" } 13 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } 14 | wheels = [ 15 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, 16 | ] 17 | 18 | [[package]] 19 | name = "anyio" 20 | version = "4.9.0" 21 | source = { registry = "https://pypi.org/simple" } 22 | dependencies = [ 23 | { name = "idna" }, 24 | { name = "sniffio" }, 25 | { name = "typing-extensions", marker = "python_full_version < '3.13'" }, 26 | ] 27 | sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } 28 | wheels = [ 29 | { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, 30 | ] 31 | 32 | [[package]] 33 | name = "beautifulsoup4" 34 | version = "4.13.3" 35 | source = { registry = "https://pypi.org/simple" } 36 | dependencies = [ 37 | { name = "soupsieve" }, 38 | { name = "typing-extensions" }, 39 | ] 40 | sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } 41 | wheels = [ 42 | { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, 43 | ] 44 | 45 | [[package]] 46 | name = "bs4" 47 | version = "0.0.2" 48 | source = { registry = "https://pypi.org/simple" } 49 | dependencies = [ 50 | { name = "beautifulsoup4" }, 51 | ] 52 | sdist = { url = "https://files.pythonhosted.org/packages/c9/aa/4acaf814ff901145da37332e05bb510452ebed97bc9602695059dd46ef39/bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925", size = 698 } 53 | wheels = [ 54 | { url = "https://files.pythonhosted.org/packages/51/bb/bf7aab772a159614954d84aa832c129624ba6c32faa559dfb200a534e50b/bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc", size = 1189 }, 55 | ] 56 | 57 | [[package]] 58 | name = "certifi" 59 | version = "2025.1.31" 60 | source = { registry = "https://pypi.org/simple" } 61 | sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } 62 | wheels = [ 63 | { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, 64 | ] 65 | 66 | [[package]] 67 | name = "charset-normalizer" 68 | version = "3.4.1" 69 | source = { registry = "https://pypi.org/simple" } 70 | sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } 71 | wheels = [ 72 | { 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 }, 73 | { 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 }, 74 | { 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 }, 75 | { 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 }, 76 | { 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 }, 77 | { 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 }, 78 | { 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 }, 79 | { 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 }, 80 | { 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 }, 81 | { 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 }, 82 | { 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 }, 83 | { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, 84 | { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, 85 | { 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 }, 86 | { 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 }, 87 | { 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 }, 88 | { 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 }, 89 | { 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 }, 90 | { 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 }, 91 | { 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 }, 92 | { 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 }, 93 | { 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 }, 94 | { 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 }, 95 | { 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 }, 96 | { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, 97 | { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, 98 | { 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 }, 99 | { 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 }, 100 | { 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 }, 101 | { 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 }, 102 | { 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 }, 103 | { 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 }, 104 | { 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 }, 105 | { 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 }, 106 | { 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 }, 107 | { 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 }, 108 | { 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 }, 109 | { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, 110 | { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, 111 | { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, 112 | ] 113 | 114 | [[package]] 115 | name = "click" 116 | version = "8.1.8" 117 | source = { registry = "https://pypi.org/simple" } 118 | dependencies = [ 119 | { name = "colorama", marker = "sys_platform == 'win32'" }, 120 | ] 121 | sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } 122 | wheels = [ 123 | { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, 124 | ] 125 | 126 | [[package]] 127 | name = "colorama" 128 | version = "0.4.6" 129 | source = { registry = "https://pypi.org/simple" } 130 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } 131 | wheels = [ 132 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, 133 | ] 134 | 135 | [[package]] 136 | name = "findata" 137 | version = "0.1.0" 138 | source = { virtual = "." } 139 | dependencies = [ 140 | { name = "mcp", extra = ["cli"] }, 141 | { name = "pandas" }, 142 | { name = "tushare" }, 143 | ] 144 | 145 | [package.metadata] 146 | requires-dist = [ 147 | { name = "mcp", extras = ["cli"], specifier = ">=1.6.0" }, 148 | { name = "pandas", specifier = ">=2.2.3" }, 149 | { name = "tushare", specifier = ">=1.4.21" }, 150 | ] 151 | 152 | [[package]] 153 | name = "h11" 154 | version = "0.14.0" 155 | source = { registry = "https://pypi.org/simple" } 156 | sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } 157 | wheels = [ 158 | { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, 159 | ] 160 | 161 | [[package]] 162 | name = "httpcore" 163 | version = "1.0.8" 164 | source = { registry = "https://pypi.org/simple" } 165 | dependencies = [ 166 | { name = "certifi" }, 167 | { name = "h11" }, 168 | ] 169 | sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385 } 170 | wheels = [ 171 | { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732 }, 172 | ] 173 | 174 | [[package]] 175 | name = "httpx" 176 | version = "0.28.1" 177 | source = { registry = "https://pypi.org/simple" } 178 | dependencies = [ 179 | { name = "anyio" }, 180 | { name = "certifi" }, 181 | { name = "httpcore" }, 182 | { name = "idna" }, 183 | ] 184 | sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } 185 | wheels = [ 186 | { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, 187 | ] 188 | 189 | [[package]] 190 | name = "httpx-sse" 191 | version = "0.4.0" 192 | source = { registry = "https://pypi.org/simple" } 193 | sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } 194 | wheels = [ 195 | { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, 196 | ] 197 | 198 | [[package]] 199 | name = "idna" 200 | version = "3.10" 201 | source = { registry = "https://pypi.org/simple" } 202 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } 203 | wheels = [ 204 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, 205 | ] 206 | 207 | [[package]] 208 | name = "lxml" 209 | version = "5.3.2" 210 | source = { registry = "https://pypi.org/simple" } 211 | sdist = { url = "https://files.pythonhosted.org/packages/80/61/d3dc048cd6c7be6fe45b80cedcbdd4326ba4d550375f266d9f4246d0f4bc/lxml-5.3.2.tar.gz", hash = "sha256:773947d0ed809ddad824b7b14467e1a481b8976e87278ac4a730c2f7c7fcddc1", size = 3679948 } 212 | wheels = [ 213 | { url = "https://files.pythonhosted.org/packages/84/b8/2b727f5a90902f7cc5548349f563b60911ca05f3b92e35dfa751349f265f/lxml-5.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d61a7d0d208ace43986a92b111e035881c4ed45b1f5b7a270070acae8b0bfb4", size = 8163457 }, 214 | { url = "https://files.pythonhosted.org/packages/91/84/23135b2dc72b3440d68c8f39ace2bb00fe78e3a2255f7c74f7e76f22498e/lxml-5.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856dfd7eda0b75c29ac80a31a6411ca12209183e866c33faf46e77ace3ce8a79", size = 4433445 }, 215 | { url = "https://files.pythonhosted.org/packages/c9/1c/6900ade2294488f80598af7b3229669562166384bb10bf4c915342a2f288/lxml-5.3.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a01679e4aad0727bedd4c9407d4d65978e920f0200107ceeffd4b019bd48529", size = 5029603 }, 216 | { url = "https://files.pythonhosted.org/packages/2f/e9/31dbe5deaccf0d33ec279cf400306ad4b32dfd1a0fee1fca40c5e90678fe/lxml-5.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b37b4c3acb8472d191816d4582379f64d81cecbdce1a668601745c963ca5cc", size = 4771236 }, 217 | { url = "https://files.pythonhosted.org/packages/68/41/c3412392884130af3415af2e89a2007e00b2a782be6fb848a95b598a114c/lxml-5.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3df5a54e7b7c31755383f126d3a84e12a4e0333db4679462ef1165d702517477", size = 5369815 }, 218 | { url = "https://files.pythonhosted.org/packages/34/0a/ba0309fd5f990ea0cc05aba2bea225ef1bcb07ecbf6c323c6b119fc46e7f/lxml-5.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c09a40f28dcded933dc16217d6a092be0cc49ae25811d3b8e937c8060647c353", size = 4843663 }, 219 | { url = "https://files.pythonhosted.org/packages/b6/c6/663b5d87d51d00d4386a2d52742a62daa486c5dc6872a443409d9aeafece/lxml-5.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1ef20f1851ccfbe6c5a04c67ec1ce49da16ba993fdbabdce87a92926e505412", size = 4918028 }, 220 | { url = "https://files.pythonhosted.org/packages/75/5f/f6a72ccbe05cf83341d4b6ad162ed9e1f1ffbd12f1c4b8bc8ae413392282/lxml-5.3.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f79a63289dbaba964eb29ed3c103b7911f2dce28c36fe87c36a114e6bd21d7ad", size = 4792005 }, 221 | { url = "https://files.pythonhosted.org/packages/37/7b/8abd5b332252239ffd28df5842ee4e5bf56e1c613c323586c21ccf5af634/lxml-5.3.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:75a72697d95f27ae00e75086aed629f117e816387b74a2f2da6ef382b460b710", size = 5405363 }, 222 | { url = "https://files.pythonhosted.org/packages/5a/79/549b7ec92b8d9feb13869c1b385a0749d7ccfe5590d1e60f11add9cdd580/lxml-5.3.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:b9b00c9ee1cc3a76f1f16e94a23c344e0b6e5c10bec7f94cf2d820ce303b8c01", size = 4932915 }, 223 | { url = "https://files.pythonhosted.org/packages/57/eb/4fa626d0bac8b4f2aa1d0e6a86232db030fd0f462386daf339e4a0ee352b/lxml-5.3.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:77cbcab50cbe8c857c6ba5f37f9a3976499c60eada1bf6d38f88311373d7b4bc", size = 4983473 }, 224 | { url = "https://files.pythonhosted.org/packages/1b/c8/79d61d13cbb361c2c45fbe7c8bd00ea6a23b3e64bc506264d2856c60d702/lxml-5.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29424058f072a24622a0a15357bca63d796954758248a72da6d512f9bd9a4493", size = 4855284 }, 225 | { url = "https://files.pythonhosted.org/packages/80/16/9f84e1ef03a13136ab4f9482c9adaaad425c68b47556b9d3192a782e5d37/lxml-5.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7d82737a8afe69a7c80ef31d7626075cc7d6e2267f16bf68af2c764b45ed68ab", size = 5458355 }, 226 | { url = "https://files.pythonhosted.org/packages/aa/6d/f62860451bb4683e87636e49effb76d499773337928e53356c1712ccec24/lxml-5.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:95473d1d50a5d9fcdb9321fdc0ca6e1edc164dce4c7da13616247d27f3d21e31", size = 5300051 }, 227 | { url = "https://files.pythonhosted.org/packages/3f/5f/3b6c4acec17f9a57ea8bb89a658a70621db3fb86ea588e7703b6819d9b03/lxml-5.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2162068f6da83613f8b2a32ca105e37a564afd0d7009b0b25834d47693ce3538", size = 5033481 }, 228 | { url = "https://files.pythonhosted.org/packages/79/bd/3c4dd7d903bb9981f4876c61ef2ff5d5473e409ef61dc7337ac207b91920/lxml-5.3.2-cp311-cp311-win32.whl", hash = "sha256:f8695752cf5d639b4e981afe6c99e060621362c416058effd5c704bede9cb5d1", size = 3474266 }, 229 | { url = "https://files.pythonhosted.org/packages/1f/ea/9311fa1ef75b7d601c89600fc612838ee77ad3d426184941cba9cf62641f/lxml-5.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:d1a94cbb4ee64af3ab386c2d63d6d9e9cf2e256ac0fd30f33ef0a3c88f575174", size = 3815230 }, 230 | { url = "https://files.pythonhosted.org/packages/0d/7e/c749257a7fabc712c4df57927b0f703507f316e9f2c7e3219f8f76d36145/lxml-5.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:16b3897691ec0316a1aa3c6585f61c8b7978475587c5b16fc1d2c28d283dc1b0", size = 8193212 }, 231 | { url = "https://files.pythonhosted.org/packages/a8/50/17e985ba162c9f1ca119f4445004b58f9e5ef559ded599b16755e9bfa260/lxml-5.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8d4b34a0eeaf6e73169dcfd653c8d47f25f09d806c010daf074fba2db5e2d3f", size = 4451439 }, 232 | { url = "https://files.pythonhosted.org/packages/c2/b5/4960ba0fcca6ce394ed4a2f89ee13083e7fcbe9641a91166e8e9792fedb1/lxml-5.3.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cd7a959396da425022e1e4214895b5cfe7de7035a043bcc2d11303792b67554", size = 5052146 }, 233 | { url = "https://files.pythonhosted.org/packages/5f/d1/184b04481a5d1f5758916de087430752a7b229bddbd6c1d23405078c72bd/lxml-5.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cac5eaeec3549c5df7f8f97a5a6db6963b91639389cdd735d5a806370847732b", size = 4789082 }, 234 | { url = "https://files.pythonhosted.org/packages/7d/75/1a19749d373e9a3d08861addccdf50c92b628c67074b22b8f3c61997cf5a/lxml-5.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29b5f7d77334877c2146e7bb8b94e4df980325fab0a8af4d524e5d43cd6f789d", size = 5312300 }, 235 | { url = "https://files.pythonhosted.org/packages/fb/00/9d165d4060d3f347e63b219fcea5c6a3f9193e9e2868c6801e18e5379725/lxml-5.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13f3495cfec24e3d63fffd342cc8141355d1d26ee766ad388775f5c8c5ec3932", size = 4836655 }, 236 | { url = "https://files.pythonhosted.org/packages/b8/e9/06720a33cc155966448a19677f079100517b6629a872382d22ebd25e48aa/lxml-5.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e70ad4c9658beeff99856926fd3ee5fde8b519b92c693f856007177c36eb2e30", size = 4961795 }, 237 | { url = "https://files.pythonhosted.org/packages/2d/57/4540efab2673de2904746b37ef7f74385329afd4643ed92abcc9ec6e00ca/lxml-5.3.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:507085365783abd7879fa0a6fa55eddf4bdd06591b17a2418403bb3aff8a267d", size = 4779791 }, 238 | { url = "https://files.pythonhosted.org/packages/99/ad/6056edf6c9f4fa1d41e6fbdae52c733a4a257fd0d7feccfa26ae051bb46f/lxml-5.3.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:5bb304f67cbf5dfa07edad904732782cbf693286b9cd85af27059c5779131050", size = 5346807 }, 239 | { url = "https://files.pythonhosted.org/packages/a1/fa/5be91fc91a18f3f705ea5533bc2210b25d738c6b615bf1c91e71a9b2f26b/lxml-5.3.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:3d84f5c093645c21c29a4e972b84cb7cf682f707f8706484a5a0c7ff13d7a988", size = 4909213 }, 240 | { url = "https://files.pythonhosted.org/packages/f3/74/71bb96a3b5ae36b74e0402f4fa319df5559a8538577f8c57c50f1b57dc15/lxml-5.3.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bdc13911db524bd63f37b0103af014b7161427ada41f1b0b3c9b5b5a9c1ca927", size = 4987694 }, 241 | { url = "https://files.pythonhosted.org/packages/08/c2/3953a68b0861b2f97234b1838769269478ccf872d8ea7a26e911238220ad/lxml-5.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ec944539543f66ebc060ae180d47e86aca0188bda9cbfadff47d86b0dc057dc", size = 4862865 }, 242 | { url = "https://files.pythonhosted.org/packages/e0/9a/52e48f7cfd5a5e61f44a77e679880580dfb4f077af52d6ed5dd97e3356fe/lxml-5.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:59d437cc8a7f838282df5a199cf26f97ef08f1c0fbec6e84bd6f5cc2b7913f6e", size = 5423383 }, 243 | { url = "https://files.pythonhosted.org/packages/17/67/42fe1d489e4dcc0b264bef361aef0b929fbb2b5378702471a3043bc6982c/lxml-5.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e275961adbd32e15672e14e0cc976a982075208224ce06d149c92cb43db5b93", size = 5286864 }, 244 | { url = "https://files.pythonhosted.org/packages/29/e4/03b1d040ee3aaf2bd4e1c2061de2eae1178fe9a460d3efc1ea7ef66f6011/lxml-5.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:038aeb6937aa404480c2966b7f26f1440a14005cb0702078c173c028eca72c31", size = 5056819 }, 245 | { url = "https://files.pythonhosted.org/packages/83/b3/e2ec8a6378e4d87da3af9de7c862bcea7ca624fc1a74b794180c82e30123/lxml-5.3.2-cp312-cp312-win32.whl", hash = "sha256:3c2c8d0fa3277147bff180e3590be67597e17d365ce94beb2efa3138a2131f71", size = 3486177 }, 246 | { url = "https://files.pythonhosted.org/packages/d5/8a/6a08254b0bab2da9573735725caab8302a2a1c9b3818533b41568ca489be/lxml-5.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:77809fcd97dfda3f399102db1794f7280737b69830cd5c961ac87b3c5c05662d", size = 3817134 }, 247 | { url = "https://files.pythonhosted.org/packages/19/fe/904fd1b0ba4f42ed5a144fcfff7b8913181892a6aa7aeb361ee783d441f8/lxml-5.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77626571fb5270ceb36134765f25b665b896243529eefe840974269b083e090d", size = 8173598 }, 248 | { url = "https://files.pythonhosted.org/packages/97/e8/5e332877b3ce4e2840507b35d6dbe1cc33b17678ece945ba48d2962f8c06/lxml-5.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78a533375dc7aa16d0da44af3cf6e96035e484c8c6b2b2445541a5d4d3d289ee", size = 4441586 }, 249 | { url = "https://files.pythonhosted.org/packages/de/f4/8fe2e6d8721803182fbce2325712e98f22dbc478126070e62731ec6d54a0/lxml-5.3.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6f62b2404b3f3f0744bbcabb0381c5fe186fa2a9a67ecca3603480f4846c585", size = 5038447 }, 250 | { url = "https://files.pythonhosted.org/packages/a6/ac/fa63f86a1a4b1ba8b03599ad9e2f5212fa813223ac60bfe1155390d1cc0c/lxml-5.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea918da00091194526d40c30c4996971f09dacab032607581f8d8872db34fbf", size = 4783583 }, 251 | { url = "https://files.pythonhosted.org/packages/1a/7a/08898541296a02c868d4acc11f31a5839d80f5b21d4a96f11d4c0fbed15e/lxml-5.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c35326f94702a7264aa0eea826a79547d3396a41ae87a70511b9f6e9667ad31c", size = 5305684 }, 252 | { url = "https://files.pythonhosted.org/packages/0b/be/9a6d80b467771b90be762b968985d3de09e0d5886092238da65dac9c1f75/lxml-5.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3bef90af21d31c4544bc917f51e04f94ae11b43156356aff243cdd84802cbf2", size = 4830797 }, 253 | { url = "https://files.pythonhosted.org/packages/8d/1c/493632959f83519802637f7db3be0113b6e8a4e501b31411fbf410735a75/lxml-5.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52fa7ba11a495b7cbce51573c73f638f1dcff7b3ee23697467dc063f75352a69", size = 4950302 }, 254 | { url = "https://files.pythonhosted.org/packages/c7/13/01aa3b92a6b93253b90c061c7527261b792f5ae7724b420cded733bfd5d6/lxml-5.3.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ad131e2c4d2c3803e736bb69063382334e03648de2a6b8f56a878d700d4b557d", size = 4775247 }, 255 | { url = "https://files.pythonhosted.org/packages/60/4a/baeb09fbf5c84809e119c9cf8e2e94acec326a9b45563bf5ae45a234973b/lxml-5.3.2-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:00a4463ca409ceacd20490a893a7e08deec7870840eff33dc3093067b559ce3e", size = 5338824 }, 256 | { url = "https://files.pythonhosted.org/packages/69/c7/a05850f169ad783ed09740ac895e158b06d25fce4b13887a8ac92a84d61c/lxml-5.3.2-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:87e8d78205331cace2b73ac8249294c24ae3cba98220687b5b8ec5971a2267f1", size = 4899079 }, 257 | { url = "https://files.pythonhosted.org/packages/de/48/18ca583aba5235582db0e933ed1af6540226ee9ca16c2ee2d6f504fcc34a/lxml-5.3.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bf6389133bb255e530a4f2f553f41c4dd795b1fbb6f797aea1eff308f1e11606", size = 4978041 }, 258 | { url = "https://files.pythonhosted.org/packages/b6/55/6968ddc88554209d1dba0dca196360c629b3dfe083bc32a3370f9523a0c4/lxml-5.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b3709fc752b42fb6b6ffa2ba0a5b9871646d97d011d8f08f4d5b3ee61c7f3b2b", size = 4859761 }, 259 | { url = "https://files.pythonhosted.org/packages/2e/52/d2d3baa1e0b7d04a729613160f1562f466fb1a0e45085a33acb0d6981a2b/lxml-5.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:abc795703d0de5d83943a4badd770fbe3d1ca16ee4ff3783d7caffc252f309ae", size = 5418209 }, 260 | { url = "https://files.pythonhosted.org/packages/d3/50/6005b297ba5f858a113d6e81ccdb3a558b95a615772e7412d1f1cbdf22d7/lxml-5.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98050830bb6510159f65d9ad1b8aca27f07c01bb3884ba95f17319ccedc4bcf9", size = 5274231 }, 261 | { url = "https://files.pythonhosted.org/packages/fb/33/6f40c09a5f7d7e7fcb85ef75072e53eba3fbadbf23e4991ca069ab2b1abb/lxml-5.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ba465a91acc419c5682f8b06bcc84a424a7aa5c91c220241c6fd31de2a72bc6", size = 5051899 }, 262 | { url = "https://files.pythonhosted.org/packages/8b/3a/673bc5c0d5fb6596ee2963dd016fdaefaed2c57ede82c7634c08cbda86c1/lxml-5.3.2-cp313-cp313-win32.whl", hash = "sha256:56a1d56d60ea1ec940f949d7a309e0bff05243f9bd337f585721605670abb1c1", size = 3485315 }, 263 | { url = "https://files.pythonhosted.org/packages/8c/be/cab8dd33b0dbe3af5b5d4d24137218f79ea75d540f74eb7d8581195639e0/lxml-5.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:1a580dc232c33d2ad87d02c8a3069d47abbcdce974b9c9cc82a79ff603065dbe", size = 3814639 }, 264 | ] 265 | 266 | [[package]] 267 | name = "markdown-it-py" 268 | version = "3.0.0" 269 | source = { registry = "https://pypi.org/simple" } 270 | dependencies = [ 271 | { name = "mdurl" }, 272 | ] 273 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } 274 | wheels = [ 275 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, 276 | ] 277 | 278 | [[package]] 279 | name = "mcp" 280 | version = "1.6.0" 281 | source = { registry = "https://pypi.org/simple" } 282 | dependencies = [ 283 | { name = "anyio" }, 284 | { name = "httpx" }, 285 | { name = "httpx-sse" }, 286 | { name = "pydantic" }, 287 | { name = "pydantic-settings" }, 288 | { name = "sse-starlette" }, 289 | { name = "starlette" }, 290 | { name = "uvicorn" }, 291 | ] 292 | sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 } 293 | wheels = [ 294 | { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 }, 295 | ] 296 | 297 | [package.optional-dependencies] 298 | cli = [ 299 | { name = "python-dotenv" }, 300 | { name = "typer" }, 301 | ] 302 | 303 | [[package]] 304 | name = "mdurl" 305 | version = "0.1.2" 306 | source = { registry = "https://pypi.org/simple" } 307 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } 308 | wheels = [ 309 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, 310 | ] 311 | 312 | [[package]] 313 | name = "numpy" 314 | version = "2.2.4" 315 | source = { registry = "https://pypi.org/simple" } 316 | sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } 317 | wheels = [ 318 | { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, 319 | { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, 320 | { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, 321 | { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, 322 | { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, 323 | { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, 324 | { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, 325 | { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, 326 | { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, 327 | { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, 328 | { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, 329 | { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, 330 | { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, 331 | { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, 332 | { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, 333 | { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, 334 | { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, 335 | { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, 336 | { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, 337 | { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, 338 | { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, 339 | { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, 340 | { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, 341 | { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, 342 | { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, 343 | { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, 344 | { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, 345 | { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, 346 | { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, 347 | { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, 348 | { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, 349 | { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, 350 | { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, 351 | { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, 352 | { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, 353 | { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, 354 | { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, 355 | { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, 356 | { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, 357 | { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, 358 | ] 359 | 360 | [[package]] 361 | name = "pandas" 362 | version = "2.2.3" 363 | source = { registry = "https://pypi.org/simple" } 364 | dependencies = [ 365 | { name = "numpy" }, 366 | { name = "python-dateutil" }, 367 | { name = "pytz" }, 368 | { name = "tzdata" }, 369 | ] 370 | sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } 371 | wheels = [ 372 | { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 }, 373 | { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 }, 374 | { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 }, 375 | { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 }, 376 | { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 }, 377 | { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 }, 378 | { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 }, 379 | { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, 380 | { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, 381 | { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, 382 | { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, 383 | { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, 384 | { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, 385 | { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, 386 | { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, 387 | { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, 388 | { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, 389 | { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, 390 | { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, 391 | { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, 392 | { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, 393 | { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, 394 | { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, 395 | { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, 396 | { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, 397 | { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, 398 | { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, 399 | ] 400 | 401 | [[package]] 402 | name = "pydantic" 403 | version = "2.11.3" 404 | source = { registry = "https://pypi.org/simple" } 405 | dependencies = [ 406 | { name = "annotated-types" }, 407 | { name = "pydantic-core" }, 408 | { name = "typing-extensions" }, 409 | { name = "typing-inspection" }, 410 | ] 411 | sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } 412 | wheels = [ 413 | { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, 414 | ] 415 | 416 | [[package]] 417 | name = "pydantic-core" 418 | version = "2.33.1" 419 | source = { registry = "https://pypi.org/simple" } 420 | dependencies = [ 421 | { name = "typing-extensions" }, 422 | ] 423 | sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 } 424 | wheels = [ 425 | { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224 }, 426 | { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845 }, 427 | { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029 }, 428 | { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784 }, 429 | { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075 }, 430 | { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849 }, 431 | { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794 }, 432 | { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237 }, 433 | { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351 }, 434 | { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914 }, 435 | { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385 }, 436 | { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765 }, 437 | { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688 }, 438 | { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185 }, 439 | { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 }, 440 | { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 }, 441 | { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 }, 442 | { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 }, 443 | { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 }, 444 | { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 }, 445 | { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 }, 446 | { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 }, 447 | { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 }, 448 | { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 }, 449 | { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 }, 450 | { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 }, 451 | { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 }, 452 | { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 }, 453 | { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 }, 454 | { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 }, 455 | { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 }, 456 | { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 }, 457 | { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 }, 458 | { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 }, 459 | { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 }, 460 | { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 }, 461 | { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 }, 462 | { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 }, 463 | { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 }, 464 | { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 }, 465 | { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 }, 466 | { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 }, 467 | { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 }, 468 | { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 }, 469 | { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 }, 470 | { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858 }, 471 | { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745 }, 472 | { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188 }, 473 | { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479 }, 474 | { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415 }, 475 | { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623 }, 476 | { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175 }, 477 | { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674 }, 478 | { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951 }, 479 | ] 480 | 481 | [[package]] 482 | name = "pydantic-settings" 483 | version = "2.8.1" 484 | source = { registry = "https://pypi.org/simple" } 485 | dependencies = [ 486 | { name = "pydantic" }, 487 | { name = "python-dotenv" }, 488 | ] 489 | sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } 490 | wheels = [ 491 | { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, 492 | ] 493 | 494 | [[package]] 495 | name = "pygments" 496 | version = "2.19.1" 497 | source = { registry = "https://pypi.org/simple" } 498 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } 499 | wheels = [ 500 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, 501 | ] 502 | 503 | [[package]] 504 | name = "python-dateutil" 505 | version = "2.9.0.post0" 506 | source = { registry = "https://pypi.org/simple" } 507 | dependencies = [ 508 | { name = "six" }, 509 | ] 510 | sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } 511 | wheels = [ 512 | { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, 513 | ] 514 | 515 | [[package]] 516 | name = "python-dotenv" 517 | version = "1.1.0" 518 | source = { registry = "https://pypi.org/simple" } 519 | sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } 520 | wheels = [ 521 | { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, 522 | ] 523 | 524 | [[package]] 525 | name = "pytz" 526 | version = "2025.2" 527 | source = { registry = "https://pypi.org/simple" } 528 | sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } 529 | wheels = [ 530 | { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, 531 | ] 532 | 533 | [[package]] 534 | name = "requests" 535 | version = "2.32.3" 536 | source = { registry = "https://pypi.org/simple" } 537 | dependencies = [ 538 | { name = "certifi" }, 539 | { name = "charset-normalizer" }, 540 | { name = "idna" }, 541 | { name = "urllib3" }, 542 | ] 543 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } 544 | wheels = [ 545 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, 546 | ] 547 | 548 | [[package]] 549 | name = "rich" 550 | version = "14.0.0" 551 | source = { registry = "https://pypi.org/simple" } 552 | dependencies = [ 553 | { name = "markdown-it-py" }, 554 | { name = "pygments" }, 555 | ] 556 | sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } 557 | wheels = [ 558 | { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, 559 | ] 560 | 561 | [[package]] 562 | name = "shellingham" 563 | version = "1.5.4" 564 | source = { registry = "https://pypi.org/simple" } 565 | sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } 566 | wheels = [ 567 | { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, 568 | ] 569 | 570 | [[package]] 571 | name = "simplejson" 572 | version = "3.20.1" 573 | source = { registry = "https://pypi.org/simple" } 574 | sdist = { url = "https://files.pythonhosted.org/packages/af/92/51b417685abd96b31308b61b9acce7ec50d8e1de8fbc39a7fd4962c60689/simplejson-3.20.1.tar.gz", hash = "sha256:e64139b4ec4f1f24c142ff7dcafe55a22b811a74d86d66560c8815687143037d", size = 85591 } 575 | wheels = [ 576 | { url = "https://files.pythonhosted.org/packages/76/59/74bc90d1c051bc2432c96b34bd4e8036875ab58b4fcbe4d6a5a76985f853/simplejson-3.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:325b8c107253d3217e89d7b50c71015b5b31e2433e6c5bf38967b2f80630a8ca", size = 92132 }, 577 | { url = "https://files.pythonhosted.org/packages/71/c7/1970916e0c51794fff89f76da2f632aaf0b259b87753c88a8c409623d3e1/simplejson-3.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88a7baa8211089b9e58d78fbc1b0b322103f3f3d459ff16f03a36cece0d0fcf0", size = 74956 }, 578 | { url = "https://files.pythonhosted.org/packages/c8/0d/98cc5909180463f1d75fac7180de62d4cdb4e82c4fef276b9e591979372c/simplejson-3.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:299b1007b8101d50d95bc0db1bf5c38dc372e85b504cf77f596462083ee77e3f", size = 74772 }, 579 | { url = "https://files.pythonhosted.org/packages/e1/94/a30a5211a90d67725a3e8fcc1c788189f2ae2ed2b96b63ed15d0b7f5d6bb/simplejson-3.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ec618ed65caab48e81e3ed29586236a8e57daef792f1f3bb59504a7e98cd10", size = 143575 }, 580 | { url = "https://files.pythonhosted.org/packages/ee/08/cdb6821f1058eb5db46d252de69ff7e6c53f05f1bae6368fe20d5b51d37e/simplejson-3.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2cdead1d3197f0ff43373cf4730213420523ba48697743e135e26f3d179f38", size = 153241 }, 581 | { url = "https://files.pythonhosted.org/packages/4c/2d/ca3caeea0bdc5efc5503d5f57a2dfb56804898fb196dfada121323ee0ccb/simplejson-3.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3466d2839fdc83e1af42e07b90bc8ff361c4e8796cd66722a40ba14e458faddd", size = 141500 }, 582 | { url = "https://files.pythonhosted.org/packages/e1/33/d3e0779d5c58245e7370c98eb969275af6b7a4a5aec3b97cbf85f09ad328/simplejson-3.20.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d492ed8e92f3a9f9be829205f44b1d0a89af6582f0cf43e0d129fa477b93fe0c", size = 144757 }, 583 | { url = "https://files.pythonhosted.org/packages/54/53/2d93128bb55861b2fa36c5944f38da51a0bc6d83e513afc6f7838440dd15/simplejson-3.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f924b485537b640dc69434565463fd6fc0c68c65a8c6e01a823dd26c9983cf79", size = 144409 }, 584 | { url = "https://files.pythonhosted.org/packages/99/4c/dac310a98f897ad3435b4bdc836d92e78f09e38c5dbf28211ed21dc59fa2/simplejson-3.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e8eacf6a3491bf76ea91a8d46726368a6be0eb94993f60b8583550baae9439e", size = 146082 }, 585 | { url = "https://files.pythonhosted.org/packages/ee/22/d7ba958cfed39827335b82656b1c46f89678faecda9a7677b47e87b48ee6/simplejson-3.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d34d04bf90b4cea7c22d8b19091633908f14a096caa301b24c2f3d85b5068fb8", size = 154339 }, 586 | { url = "https://files.pythonhosted.org/packages/b8/c8/b072b741129406a7086a0799c6f5d13096231bf35fdd87a0cffa789687fc/simplejson-3.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:69dd28d4ce38390ea4aaf212902712c0fd1093dc4c1ff67e09687c3c3e15a749", size = 147915 }, 587 | { url = "https://files.pythonhosted.org/packages/6c/46/8347e61e9cf3db5342a42f7fd30a81b4f5cf85977f916852d7674a540907/simplejson-3.20.1-cp311-cp311-win32.whl", hash = "sha256:dfe7a9da5fd2a3499436cd350f31539e0a6ded5da6b5b3d422df016444d65e43", size = 73972 }, 588 | { url = "https://files.pythonhosted.org/packages/01/85/b52f24859237b4e9d523d5655796d911ba3d46e242eb1959c45b6af5aedd/simplejson-3.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:896a6c04d7861d507d800da7642479c3547060bf97419d9ef73d98ced8258766", size = 75595 }, 589 | { url = "https://files.pythonhosted.org/packages/8d/eb/34c16a1ac9ba265d024dc977ad84e1659d931c0a700967c3e59a98ed7514/simplejson-3.20.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f31c4a3a7ab18467ee73a27f3e59158255d1520f3aad74315edde7a940f1be23", size = 93100 }, 590 | { url = "https://files.pythonhosted.org/packages/41/fc/2c2c007d135894971e6814e7c0806936e5bade28f8db4dd7e2a58b50debd/simplejson-3.20.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884e6183d16b725e113b83a6fc0230152ab6627d4d36cb05c89c2c5bccfa7bc6", size = 75464 }, 591 | { url = "https://files.pythonhosted.org/packages/0f/05/2b5ecb33b776c34bb5cace5de5d7669f9b60e3ca13c113037b2ca86edfbd/simplejson-3.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03d7a426e416fe0d3337115f04164cd9427eb4256e843a6b8751cacf70abc832", size = 75112 }, 592 | { url = "https://files.pythonhosted.org/packages/fe/36/1f3609a2792f06cd4b71030485f78e91eb09cfd57bebf3116bf2980a8bac/simplejson-3.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000602141d0bddfcff60ea6a6e97d5e10c9db6b17fd2d6c66199fa481b6214bb", size = 150182 }, 593 | { url = "https://files.pythonhosted.org/packages/2f/b0/053fbda38b8b602a77a4f7829def1b4f316cd8deb5440a6d3ee90790d2a4/simplejson-3.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af8377a8af78226e82e3a4349efdde59ffa421ae88be67e18cef915e4023a595", size = 158363 }, 594 | { url = "https://files.pythonhosted.org/packages/d1/4b/2eb84ae867539a80822e92f9be4a7200dffba609275faf99b24141839110/simplejson-3.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c7de4c88ab2fbcb8781a3b982ef883696736134e20b1210bca43fb42ff1acf", size = 148415 }, 595 | { url = "https://files.pythonhosted.org/packages/e0/bd/400b0bd372a5666addf2540c7358bfc3841b9ce5cdbc5cc4ad2f61627ad8/simplejson-3.20.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:455a882ff3f97d810709f7b620007d4e0aca8da71d06fc5c18ba11daf1c4df49", size = 152213 }, 596 | { url = "https://files.pythonhosted.org/packages/50/12/143f447bf6a827ee9472693768dc1a5eb96154f8feb140a88ce6973a3cfa/simplejson-3.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc0f523ce923e7f38eb67804bc80e0a028c76d7868500aa3f59225574b5d0453", size = 150048 }, 597 | { url = "https://files.pythonhosted.org/packages/5e/ea/dd9b3e8e8ed710a66f24a22c16a907c9b539b6f5f45fd8586bd5c231444e/simplejson-3.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76461ec929282dde4a08061071a47281ad939d0202dc4e63cdd135844e162fbc", size = 151668 }, 598 | { url = "https://files.pythonhosted.org/packages/99/af/ee52a8045426a0c5b89d755a5a70cc821815ef3c333b56fbcad33c4435c0/simplejson-3.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19c2da8c043607bde4d4ef3a6b633e668a7d2e3d56f40a476a74c5ea71949f", size = 158840 }, 599 | { url = "https://files.pythonhosted.org/packages/68/db/ab32869acea6b5de7d75fa0dac07a112ded795d41eaa7e66c7813b17be95/simplejson-3.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2578bedaedf6294415197b267d4ef678fea336dd78ee2a6d2f4b028e9d07be3", size = 154212 }, 600 | { url = "https://files.pythonhosted.org/packages/fa/7a/e3132d454977d75a3bf9a6d541d730f76462ebf42a96fea2621498166f41/simplejson-3.20.1-cp312-cp312-win32.whl", hash = "sha256:339f407373325a36b7fd744b688ba5bae0666b5d340ec6d98aebc3014bf3d8ea", size = 74101 }, 601 | { url = "https://files.pythonhosted.org/packages/bc/5d/4e243e937fa3560107c69f6f7c2eed8589163f5ed14324e864871daa2dd9/simplejson-3.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:627d4486a1ea7edf1f66bb044ace1ce6b4c1698acd1b05353c97ba4864ea2e17", size = 75736 }, 602 | { url = "https://files.pythonhosted.org/packages/c4/03/0f453a27877cb5a5fff16a975925f4119102cc8552f52536b9a98ef0431e/simplejson-3.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:71e849e7ceb2178344998cbe5ade101f1b329460243c79c27fbfc51c0447a7c3", size = 93109 }, 603 | { url = "https://files.pythonhosted.org/packages/74/1f/a729f4026850cabeaff23e134646c3f455e86925d2533463420635ae54de/simplejson-3.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b63fdbab29dc3868d6f009a59797cefaba315fd43cd32ddd998ee1da28e50e29", size = 75475 }, 604 | { url = "https://files.pythonhosted.org/packages/e2/14/50a2713fee8ff1f8d655b1a14f4a0f1c0c7246768a1b3b3d12964a4ed5aa/simplejson-3.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1190f9a3ce644fd50ec277ac4a98c0517f532cfebdcc4bd975c0979a9f05e1fb", size = 75112 }, 605 | { url = "https://files.pythonhosted.org/packages/45/86/ea9835abb646755140e2d482edc9bc1e91997ed19a59fd77ae4c6a0facea/simplejson-3.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1336ba7bcb722ad487cd265701ff0583c0bb6de638364ca947bb84ecc0015d1", size = 150245 }, 606 | { url = "https://files.pythonhosted.org/packages/12/b4/53084809faede45da829fe571c65fbda8479d2a5b9c633f46b74124d56f5/simplejson-3.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e975aac6a5acd8b510eba58d5591e10a03e3d16c1cf8a8624ca177491f7230f0", size = 158465 }, 607 | { url = "https://files.pythonhosted.org/packages/a9/7d/d56579468d1660b3841e1f21c14490d103e33cf911886b22652d6e9683ec/simplejson-3.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a6dd11ee282937ad749da6f3b8d87952ad585b26e5edfa10da3ae2536c73078", size = 148514 }, 608 | { url = "https://files.pythonhosted.org/packages/19/e3/874b1cca3d3897b486d3afdccc475eb3a09815bf1015b01cf7fcb52a55f0/simplejson-3.20.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab980fcc446ab87ea0879edad41a5c28f2d86020014eb035cf5161e8de4474c6", size = 152262 }, 609 | { url = "https://files.pythonhosted.org/packages/32/84/f0fdb3625292d945c2bd13a814584603aebdb38cfbe5fe9be6b46fe598c4/simplejson-3.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f5aee2a4cb6b146bd17333ac623610f069f34e8f31d2f4f0c1a2186e50c594f0", size = 150164 }, 610 | { url = "https://files.pythonhosted.org/packages/95/51/6d625247224f01eaaeabace9aec75ac5603a42f8ebcce02c486fbda8b428/simplejson-3.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:652d8eecbb9a3b6461b21ec7cf11fd0acbab144e45e600c817ecf18e4580b99e", size = 151795 }, 611 | { url = "https://files.pythonhosted.org/packages/7f/d9/bb921df6b35be8412f519e58e86d1060fddf3ad401b783e4862e0a74c4c1/simplejson-3.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c09948f1a486a89251ee3a67c9f8c969b379f6ffff1a6064b41fea3bce0a112", size = 159027 }, 612 | { url = "https://files.pythonhosted.org/packages/03/c5/5950605e4ad023a6621cf4c931b29fd3d2a9c1f36be937230bfc83d7271d/simplejson-3.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cbbd7b215ad4fc6f058b5dd4c26ee5c59f72e031dfda3ac183d7968a99e4ca3a", size = 154380 }, 613 | { url = "https://files.pythonhosted.org/packages/66/ad/b74149557c5ec1e4e4d55758bda426f5d2ec0123cd01a53ae63b8de51fa3/simplejson-3.20.1-cp313-cp313-win32.whl", hash = "sha256:ae81e482476eaa088ef9d0120ae5345de924f23962c0c1e20abbdff597631f87", size = 74102 }, 614 | { url = "https://files.pythonhosted.org/packages/db/a9/25282fdd24493e1022f30b7f5cdf804255c007218b2bfaa655bd7ad34b2d/simplejson-3.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b9fd15853b90aec3b1739f4471efbf1ac05066a2c7041bf8db821bb73cd2ddc", size = 75736 }, 615 | { url = "https://files.pythonhosted.org/packages/4b/30/00f02a0a921556dd5a6db1ef2926a1bc7a8bbbfb1c49cfed68a275b8ab2b/simplejson-3.20.1-py3-none-any.whl", hash = "sha256:8a6c1bbac39fa4a79f83cbf1df6ccd8ff7069582a9fd8db1e52cea073bc2c697", size = 57121 }, 616 | ] 617 | 618 | [[package]] 619 | name = "six" 620 | version = "1.17.0" 621 | source = { registry = "https://pypi.org/simple" } 622 | sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } 623 | wheels = [ 624 | { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, 625 | ] 626 | 627 | [[package]] 628 | name = "sniffio" 629 | version = "1.3.1" 630 | source = { registry = "https://pypi.org/simple" } 631 | sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } 632 | wheels = [ 633 | { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, 634 | ] 635 | 636 | [[package]] 637 | name = "soupsieve" 638 | version = "2.6" 639 | source = { registry = "https://pypi.org/simple" } 640 | sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } 641 | wheels = [ 642 | { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, 643 | ] 644 | 645 | [[package]] 646 | name = "sse-starlette" 647 | version = "2.2.1" 648 | source = { registry = "https://pypi.org/simple" } 649 | dependencies = [ 650 | { name = "anyio" }, 651 | { name = "starlette" }, 652 | ] 653 | sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 } 654 | wheels = [ 655 | { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 }, 656 | ] 657 | 658 | [[package]] 659 | name = "starlette" 660 | version = "0.46.2" 661 | source = { registry = "https://pypi.org/simple" } 662 | dependencies = [ 663 | { name = "anyio" }, 664 | ] 665 | sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 } 666 | wheels = [ 667 | { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, 668 | ] 669 | 670 | [[package]] 671 | name = "tqdm" 672 | version = "4.67.1" 673 | source = { registry = "https://pypi.org/simple" } 674 | dependencies = [ 675 | { name = "colorama", marker = "sys_platform == 'win32'" }, 676 | ] 677 | sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } 678 | wheels = [ 679 | { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, 680 | ] 681 | 682 | [[package]] 683 | name = "tushare" 684 | version = "1.4.21" 685 | source = { registry = "https://pypi.org/simple" } 686 | dependencies = [ 687 | { name = "bs4" }, 688 | { name = "lxml" }, 689 | { name = "pandas" }, 690 | { name = "requests" }, 691 | { name = "simplejson" }, 692 | { name = "tqdm" }, 693 | { name = "websocket-client" }, 694 | ] 695 | sdist = { url = "https://files.pythonhosted.org/packages/da/3e/c1818c73861273f7f75b059c8c0f54741387b279d34bdd1a2491ab94e728/tushare-1.4.21.tar.gz", hash = "sha256:3c08bf2596d7cf6e002bb4f5b56f00916622928b8881d22dbb942009a3cf6fee", size = 127673 } 696 | wheels = [ 697 | { url = "https://files.pythonhosted.org/packages/38/33/0b4ed09bff3b69887c2545f1c587420c89685d36c377095e465cc000759b/tushare-1.4.21-py3-none-any.whl", hash = "sha256:2014c3866d8cee36da7325efff9b174dd458a1896aac39225944ab0e40593f7c", size = 142762 }, 698 | ] 699 | 700 | [[package]] 701 | name = "typer" 702 | version = "0.15.2" 703 | source = { registry = "https://pypi.org/simple" } 704 | dependencies = [ 705 | { name = "click" }, 706 | { name = "rich" }, 707 | { name = "shellingham" }, 708 | { name = "typing-extensions" }, 709 | ] 710 | sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } 711 | wheels = [ 712 | { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, 713 | ] 714 | 715 | [[package]] 716 | name = "typing-extensions" 717 | version = "4.13.2" 718 | source = { registry = "https://pypi.org/simple" } 719 | sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } 720 | wheels = [ 721 | { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, 722 | ] 723 | 724 | [[package]] 725 | name = "typing-inspection" 726 | version = "0.4.0" 727 | source = { registry = "https://pypi.org/simple" } 728 | dependencies = [ 729 | { name = "typing-extensions" }, 730 | ] 731 | sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } 732 | wheels = [ 733 | { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, 734 | ] 735 | 736 | [[package]] 737 | name = "tzdata" 738 | version = "2025.2" 739 | source = { registry = "https://pypi.org/simple" } 740 | sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } 741 | wheels = [ 742 | { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, 743 | ] 744 | 745 | [[package]] 746 | name = "urllib3" 747 | version = "2.4.0" 748 | source = { registry = "https://pypi.org/simple" } 749 | sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } 750 | wheels = [ 751 | { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, 752 | ] 753 | 754 | [[package]] 755 | name = "uvicorn" 756 | version = "0.34.1" 757 | source = { registry = "https://pypi.org/simple" } 758 | dependencies = [ 759 | { name = "click" }, 760 | { name = "h11" }, 761 | ] 762 | sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf74d9999044306e06abe65344ff197864175dbbd91871/uvicorn-0.34.1.tar.gz", hash = "sha256:af981725fc4b7ffc5cb3b0e9eda6258a90c4b52cb2a83ce567ae0a7ae1757afc", size = 76755 } 763 | wheels = [ 764 | { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404 }, 765 | ] 766 | 767 | [[package]] 768 | name = "websocket-client" 769 | version = "1.8.0" 770 | source = { registry = "https://pypi.org/simple" } 771 | sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 } 772 | wheels = [ 773 | { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, 774 | ] 775 | --------------------------------------------------------------------------------