From cfbd9e47ac010ac24ca9d8872e85cfe869daefd0 Mon Sep 17 00:00:00 2001 From: zcr Date: Thu, 23 Apr 2026 17:10:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Enacos=20=E9=85=8D=E7=BD=AE=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 142 +++++++++++++++++++++++++++++++++ app/main.py | 64 ++++++++------- pyproject.toml | 1 + uv.lock | 195 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 372 insertions(+), 30 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index f3c1f69..813b651 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -1,5 +1,21 @@ +import logging +from typing import Dict, Any + +import yaml from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict +from v2.nacos import ClientConfigBuilder, GRPCConfig, NacosConfigService, ConfigParam, NacosNamingService, RegisterInstanceParam, DeregisterInstanceParam + +logger = logging.getLogger(__name__) + +# ====================== Nacos 配置 ====================== +NACOS_SERVER_ADDRESSES = "18.167.251.121:28848" +NACOS_NAMESPACE = "zcr" +NACOS_USERNAME = "nacos" +NACOS_PASSWORD = "Aidlab123123!" +NACOS_GROUP = "LOCAL" +NACOS_DATA_ID = "aida.python" +SERVICE_NAME = "fastapi-service" # ←←← 必须修改!建议格式:项目名-环境,例如 ai-image-service-dev class Settings(BaseSettings): @@ -81,6 +97,132 @@ class Settings(BaseSettings): settings = Settings() +# ====================== Nacos 配置管理 ====================== + +client_config = (ClientConfigBuilder() + .server_address(NACOS_SERVER_ADDRESSES) + .username(NACOS_USERNAME) + .password(NACOS_PASSWORD) + .namespace_id(NACOS_NAMESPACE) + .log_level('INFO') + .grpc_config(GRPCConfig(grpc_timeout=50000)) + .build()) + +# ====================== Nacos 配置管理 ====================== +nacos_config_data: Dict[str, Any] = {} + + +async def register_service_to_nacos(): + """启动时把服务注册到 Nacos""" + if not nacos_initialized_successfully: + logger.warning("Nacos 未初始化成功,跳过服务注册") + return + + nacos_config_client = await NacosConfigService.create_config_service(client_config) + + if not nacos_config_client: # 如果配置客户端都没连上,就不注册 + logger.warning("Nacos 配置客户端未初始化,跳过服务注册") + return + + try: + nacos_naming_client = await NacosNamingService.create_naming_service(client_config) + param = RegisterInstanceParam( + service_name="aida.python", + group_name=NACOS_GROUP, + ip="210.0.194.163", + port=1671, + cluster_name="DEFAULT", + weight=1.0, + metadata={ + "version": "1.0.0", + "env": settings.SERVE_ENV, + "framework": "fastapi", + "debug": str(settings.DEBUG), + }, + enabled=True, + healthy=True, + ephemeral=True, # 临时实例,推荐生产使用 + ) + + await nacos_naming_client.register_instance(request=param) + logger.info(f"✅ 服务已成功注册到 Nacos! → {SERVICE_NAME} | {"10.1.1.249"}:{settings.PORT} | env={settings.SERVE_ENV}") + + except Exception as e: + logger.error(f"❌ 服务注册到 Nacos 失败: {e}") + + +async def deregister_service_from_nacos(): + """服务关闭时优雅注销(防止 Nacos 长时间显示不健康实例)""" + try: + nacos_naming_client = await NacosNamingService.create_naming_service(client_config) + param = DeregisterInstanceParam( + service_name=SERVICE_NAME, + group_name=NACOS_GROUP, + ip="210.0.194.163", + port=1671, + cluster_name='c1', + ephemeral=True, + ) + await nacos_naming_client.deregister_instance(request=param) + logger.info(f"✅ 服务已从 Nacos 注销 → {SERVICE_NAME}") + except Exception as e: + logger.warning(f"服务注销时出现异常(通常可忽略): {e}") + + +nacos_initialized_successfully = False + + +async def load_nacos_config() -> None: + """初始化 Nacos 配置并监听变化""" + global nacos_config_data, settings + global nacos_initialized_successfully + + try: + client = await NacosConfigService.create_config_service(client_config) + # 1. 第一次获取配置 + content = await client.get_config(ConfigParam(data_id=NACOS_DATA_ID, group=NACOS_GROUP)) + if content: + loaded = yaml.safe_load(content) or {} + nacos_config_data = loaded + # 用 Nacos 配置覆盖 settings + for key, value in loaded.items(): + if hasattr(settings, key): + setattr(settings, key, value) + logger.info(f"✅ Nacos 配置加载成功: {NACOS_DATA_ID} | 覆盖字段数量: {len(loaded)}") + else: + logger.warning("Nacos 返回配置为空,使用 .env + 默认值") + + # 2. 注册动态监听器(配置变更自动刷新) + async def listener(tenant: str, data_id: str, group: str, content: str): + global nacos_config_data, settings + try: + new_config = yaml.safe_load(content) if content else {} + nacos_config_data = new_config + # 实时覆盖 settings + for key, value in new_config.items(): + if hasattr(settings, key): + old_val = getattr(settings, key) + setattr(settings, key, value) + if old_val != value: + logger.info(f"🔄 配置更新 → {key}: {old_val} → {value}") + logger.info(f"【Nacos 动态更新】{NACOS_DATA_ID}") + except Exception as e: + logger.error(f"Nacos 配置解析失败: {e}") + + await client.add_listener(NACOS_DATA_ID, NACOS_GROUP, listener) + logger.info("✅ Nacos 配置监听器已注册(支持热更新)") + nacos_initialized_successfully = True + await register_service_to_nacos() + except Exception as e: + logger.error(f"❌ Nacos 初始化失败: {e}") + nacos_initialized_successfully = False + + +# 提供给 FastAPI 的依赖 +def get_settings() -> Settings: + return settings + + """Design 服务""" # 推荐服装类别映射 TABLE_CATEGORIES = { diff --git a/app/main.py b/app/main.py index e88321b..6a496d7 100644 --- a/app/main.py +++ b/app/main.py @@ -1,5 +1,5 @@ -# 1. 这里的顺序至关重要!必须在最顶端 import sys +from contextlib import asynccontextmanager try: import asyncore @@ -10,16 +10,14 @@ except ImportError: import logging.config import uvicorn -from fastapi import FastAPI +from fastapi import FastAPI, Depends from fastapi import HTTPException from fastapi.responses import JSONResponse from app.api.api_route import router -from app.core.config import settings -# from app.core.record_api_count import count_api_calls +from app.core.config import settings, load_nacos_config, get_settings, Settings, register_service_to_nacos, deregister_service_from_nacos, nacos_initialized_successfully from app.schemas.response_template import ResponseModel from logging_env import LOGGER_CONFIG_DICT -from dotenv import load_dotenv from starlette.middleware.cors import CORSMiddleware logging.config.dictConfig(LOGGER_CONFIG_DICT) @@ -27,33 +25,28 @@ logging.getLogger("pika").setLevel(logging.WARNING) logger = logging.getLogger(__name__) -load_dotenv() + +@asynccontextmanager +async def lifespan(app: FastAPI): + # 启动阶段 + try: + await load_nacos_config() # 里面已包含配置加载 + 服务注册 + logger.info(f"🚀 服务启动完成 | SERVE_ENV={settings.SERVE_ENV} | PORT={settings.PORT} | Nacos={'已连接' if nacos_initialized_successfully else '未连接(使用.env)'}") + except Exception as e: + logger.error(f"启动时发生严重错误: {e}") + raise + + yield + + # 关闭阶段(优雅下线) + await deregister_service_from_nacos() + # 如果有 nacos client,可以在这里 shutdown + logger.info("✅ 服务已优雅关闭") -def get_application() -> FastAPI: - application = FastAPI( - docs_url="/docs", - redoc_url='/re-docs', - openapi_url=f"/openapi.json", - description=''' - Base frame with FastAPI - - Super Resolution API - - ''' - ) - application.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - # application.middleware("http")(count_api_calls) - application.include_router(router=router) - return application - - -app = get_application() +app = FastAPI(lifespan=lifespan, docs_url="/docs", redoc_url='/re-docs', openapi_url=f"/openapi.json", description=''' Base frame with FastAPI - Super Resolution API ''') +app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) +app.include_router(router=router) @app.exception_handler(HTTPException) @@ -64,5 +57,16 @@ async def http_exception_handler(exc: HTTPException): ) +@app.get("/health") +async def health(): + return {"status": "ok", "env": settings.SERVE_ENV} + + +@app.get("/config") +async def show_config(s: Settings = Depends(get_settings)): + """查看当前完整配置(生产环境建议加权限)""" + return s.model_dump() + + if __name__ == '__main__': uvicorn.run(app, host="0.0.0.0", port=settings.PORT) diff --git a/pyproject.toml b/pyproject.toml index 61e4f8a..a305404 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ dependencies = [ "loguru>=0.7.3", "minio>=7.2.20", "moviepy==1.0.3", + "nacos-sdk-python==2.0.1", "np>=1.0.2", "numpy<2", "ollama>=0.6.1", diff --git a/uv.lock b/uv.lock index 02a7447..b2b4364 100755 --- a/uv.lock +++ b/uv.lock @@ -62,6 +62,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/91/513971861d845d28160ecb205ae2cfaf618b16918a9cd4e0b832b5360ce7/aio_pika-9.5.8-py3-none-any.whl", hash = "sha256:f4c6cb8a6c5176d00f39fd7431e9702e638449bc6e86d1769ad7548b2a506a8d", size = 54397, upload-time = "2025-11-12T10:37:08.374Z" }, ] +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -131,6 +140,154 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] +[[package]] +name = "alibabacloud-credentials" +version = "0.3.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-tea" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/92/7cb0807d6d380fa09cbad6d4fe983781e657dcc16d60fc559d6575bf98be/alibabacloud_credentials-0.3.6.tar.gz", hash = "sha256:caa82cf258648dcbe1ca14aeba50ba21845567d6ac3cd48d318e0a445fff7f96", size = 18771, upload-time = "2024-10-28T03:40:03.806Z" } + +[[package]] +name = "alibabacloud-darabonba-array" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/be/1813d7553e11e20a1422ffaaead392cfa7239a855c7e67c6a6b5776cfa64/alibabacloud_darabonba_array-0.1.0.tar.gz", hash = "sha256:7f9a7c632518ff4f0cebb0d4e825a48c12e7cf0b9016ea25054dd73732e155aa", size = 2306, upload-time = "2022-11-01T06:32:47.928Z" } + +[[package]] +name = "alibabacloud-darabonba-encode-util" +version = "0.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/d8/22543b2ade9aa68fef028a9f0c4154bfdb970926f918f63d7b85bae527a9/alibabacloud_darabonba_encode_util-0.0.2.tar.gz", hash = "sha256:f1c484f276d60450fa49b4b2987194e741fcb2f7faae7f287c0ae65abc85fd4d", size = 3990, upload-time = "2022-12-10T04:43:48.086Z" } + +[[package]] +name = "alibabacloud-darabonba-map" +version = "0.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/bc/f11d56adffffade9a0d33ccca155ce82ca950b97cdce27a75228715c4639/alibabacloud_darabonba_map-0.0.1.tar.gz", hash = "sha256:adb17384658a1a8f72418f1838d4b6a5fd2566bfd392a3ef06d9dbb0a595a23f", size = 2056, upload-time = "2021-12-04T03:41:20.369Z" } + +[[package]] +name = "alibabacloud-darabonba-signature-util" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/09/2118a2df631eaa06a291013ea61f31e449ba7a3cc3d6061477a43420e93a/alibabacloud_darabonba_signature_util-0.0.4.tar.gz", hash = "sha256:71d79b2ae65957bcfbf699ced894fda782b32f9635f1616635533e5a90d5feb0", size = 4170, upload-time = "2022-12-10T04:44:42.979Z" } + +[[package]] +name = "alibabacloud-darabonba-string" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/d4/3d22bd2ff88985f970a10f8cedf2ea326d11d4d95e244f7665dc83d26465/alibabacloud-darabonba-string-0.0.4.tar.gz", hash = "sha256:ec6614c0448dadcbc5e466485838a1f8cfdd911135bea739e20b14511270c6f7", size = 2852, upload-time = "2021-12-13T13:30:06.114Z" } + +[[package]] +name = "alibabacloud-endpoint-util" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/7d/8cc92a95c920e344835b005af6ea45a0db98763ad6ad19299d26892e6c8d/alibabacloud_endpoint_util-0.0.4.tar.gz", hash = "sha256:a593eb8ddd8168d5dc2216cd33111b144f9189fcd6e9ca20e48f358a739bbf90", size = 2813, upload-time = "2025-06-12T07:20:52.572Z" } + +[[package]] +name = "alibabacloud-gateway-pop" +version = "0.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-credentials" }, + { name = "alibabacloud-darabonba-array" }, + { name = "alibabacloud-darabonba-encode-util" }, + { name = "alibabacloud-darabonba-map" }, + { name = "alibabacloud-darabonba-signature-util" }, + { name = "alibabacloud-darabonba-string" }, + { name = "alibabacloud-endpoint-util" }, + { name = "alibabacloud-gateway-spi" }, + { name = "alibabacloud-openapi-util" }, + { name = "alibabacloud-tea-util" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/7d/d521d803ee227499aa5a3044a0ab8bd4ba139a455d10c1a070e745d26b0c/alibabacloud_gateway_pop-0.0.9.tar.gz", hash = "sha256:50aec34abc47b3adc6e43da6fa036bbbd04477a0047435f3728129ede7641628", size = 5981, upload-time = "2025-07-23T07:06:06.717Z" } + +[[package]] +name = "alibabacloud-gateway-spi" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-credentials" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/98/d7111245f17935bf72ee9bea60bbbeff2bc42cdfe24d2544db52bc517e1a/alibabacloud_gateway_spi-0.0.3.tar.gz", hash = "sha256:10d1c53a3fc5f87915fbd6b4985b98338a776e9b44a0263f56643c5048223b8b", size = 4249, upload-time = "2025-02-23T16:29:54.222Z" } + +[[package]] +name = "alibabacloud-kms20160120" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-endpoint-util" }, + { name = "alibabacloud-gateway-pop" }, + { name = "alibabacloud-openapi-util" }, + { name = "alibabacloud-tea-openapi" }, + { name = "alibabacloud-tea-util" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/39/dfb1043f2995523507b03bb23e5db6291508eccbb4f78ea02930ff95f137/alibabacloud_kms20160120-2.2.3.tar.gz", hash = "sha256:fa7991185e92d85f9d224ead0bf82e5673fcfd022714e6c3cd2b1894b59555bf", size = 77350, upload-time = "2024-08-30T10:18:44.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/04/0668cbc62f3d9239e86d3d97b3de40b92e66730a90fc4c58f0ee38a81399/alibabacloud_kms20160120-2.2.3-py3-none-any.whl", hash = "sha256:51d3d04c75ba93c574ff4e368e51097f180fc05922fbd6336d290ea8113da99e", size = 76701, upload-time = "2024-08-30T10:18:42.524Z" }, +] + +[[package]] +name = "alibabacloud-openapi-util" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-tea-util" }, + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/51/be5802851a4ed20ac2c6db50ac8354a6e431e93db6e714ca39b50983626f/alibabacloud_openapi_util-0.2.4.tar.gz", hash = "sha256:87022b9dcb7593a601f7a40ca698227ac3ccb776b58cb7b06b8dc7f510995c34", size = 7981, upload-time = "2026-01-15T08:05:03.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/46/9b217343648b366eb93447f5d93116e09a61956005794aed5ef95a2e9e2e/alibabacloud_openapi_util-0.2.4-py3-none-any.whl", hash = "sha256:a2474f230b5965ae9a8c286e0dc86132a887928d02d20b8182656cf6b1b6c5bd", size = 7661, upload-time = "2026-01-15T08:05:01.374Z" }, +] + +[[package]] +name = "alibabacloud-tea" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/7d/b22cb9a0d4f396ee0f3f9d7f26b76b9ed93d4101add7867a2c87ed2534f5/alibabacloud-tea-0.4.3.tar.gz", hash = "sha256:ec8053d0aa8d43ebe1deb632d5c5404339b39ec9a18a0707d57765838418504a", size = 8785, upload-time = "2025-03-24T07:34:42.958Z" } + +[[package]] +name = "alibabacloud-tea-openapi" +version = "0.3.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-credentials" }, + { name = "alibabacloud-gateway-spi" }, + { name = "alibabacloud-openapi-util" }, + { name = "alibabacloud-tea-util" }, + { name = "alibabacloud-tea-xml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/f5/c7823490a1574d1e3c27c9641aa395710e89d0c15c5a436c96e999e6e2fe/alibabacloud_tea_openapi-0.3.14.tar.gz", hash = "sha256:1e0a67ab3450cf09e26ccc0fb5b0622a6b58fdde25dc3ccb99b45e167c5db717", size = 12993, upload-time = "2025-04-15T12:20:03.363Z" } + +[[package]] +name = "alibabacloud-tea-util" +version = "0.3.14" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-tea" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/ee/ea90be94ad781a5055db29556744681fc71190ef444ae53adba45e1be5f3/alibabacloud_tea_util-0.3.14.tar.gz", hash = "sha256:708e7c9f64641a3c9e0e566365d2f23675f8d7c2a3e2971d9402ceede0408cdb", size = 7515, upload-time = "2025-11-19T06:01:08.504Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/9e/c394b4e2104766fb28a1e44e3ed36e4c7773b4d05c868e482be99d5635c9/alibabacloud_tea_util-0.3.14-py3-none-any.whl", hash = "sha256:10d3e5c340d8f7ec69dd27345eb2fc5a1dab07875742525edf07bbe86db93bfe", size = 6697, upload-time = "2025-11-19T06:01:07.355Z" }, +] + +[[package]] +name = "alibabacloud-tea-xml" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alibabacloud-tea" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/eb/5e82e419c3061823f3feae9b5681588762929dc4da0176667297c2784c1a/alibabacloud_tea_xml-0.0.3.tar.gz", hash = "sha256:979cb51fadf43de77f41c69fc69c12529728919f849723eb0cd24eb7b048a90c", size = 3466, upload-time = "2025-07-01T08:04:55.144Z" } + [[package]] name = "amqp" version = "5.3.1" @@ -1746,6 +1903,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] +[[package]] +name = "nacos-sdk-python" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "aiohttp" }, + { name = "alibabacloud-kms20160120" }, + { name = "alibabacloud-tea-openapi" }, + { name = "grpcio" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "pycryptodome" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/e4/c9506551fe699e1f0bc194a9024cc8fb18c8d4ee4f004dfdd5861db07b2d/nacos-sdk-python-2.0.1.tar.gz", hash = "sha256:29fa1dd14f771824b65ae0edd208bb4d20737655ae8b809685194e2f6358c2a7", size = 68582, upload-time = "2025-01-13T14:37:22.981Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/14/269a08582090ac1d16ff2c491455a22d4a4c4f47337eb0b142957a93ea0a/nacos_sdk_python-2.0.1-py3-none-any.whl", hash = "sha256:623cfc4645adb44f21c8613d6c0e6f1c41a0110318ce0899d57942009b626044", size = 93265, upload-time = "2025-01-13T14:37:17.808Z" }, +] + [[package]] name = "networkx" version = "3.6.1" @@ -2307,6 +2484,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823, upload-time = "2025-05-28T23:51:58.157Z" }, ] +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + [[package]] name = "psycopg2-binary" version = "2.9.11" @@ -3165,6 +3358,7 @@ dependencies = [ { name = "loguru" }, { name = "minio" }, { name = "moviepy" }, + { name = "nacos-sdk-python" }, { name = "np" }, { name = "numpy" }, { name = "ollama" }, @@ -3216,6 +3410,7 @@ requires-dist = [ { name = "loguru", specifier = ">=0.7.3" }, { name = "minio", specifier = ">=7.2.20" }, { name = "moviepy", specifier = "==1.0.3" }, + { name = "nacos-sdk-python", specifier = "==2.0.1" }, { name = "np", specifier = ">=1.0.2" }, { name = "numpy", specifier = "<2" }, { name = "ollama", specifier = ">=0.6.1" },