[build-system] requires = ["setuptools>=68.0"] build-backend = "setuptools.build_meta" [project] name = "polygateway" version = "1.3.3" description = "PolyGateway:实验室统一的大语言模型(LLM/VLM/OCR)调度与中转库——多源、限流、重试、熔断、缓存、遥测" # registry 包页面的正文只认这一项:缺了页面就是一片空白(1.1.2 的教训,twine 会警告 # long_description missing 但不阻塞上传)。README 在打包时被固化进产物,发布后再改无效。 readme = "README.md" requires-python = ">=3.12" dependencies = [ "httpx>=0.27", "pydantic>=2.8", "pydantic-settings>=2.4", # 显式声明(2026-07-20 人类确认): config.py 的多源动态键族直接使用 dotenv_values, # 不能只依赖 pydantic-settings 的传递安装 "python-dotenv>=1.0", "loguru>=0.7", ] [project.optional-dependencies] redis = ["redis>=5.0"] postgres = ["asyncpg>=0.29"] structured = ["json-repair>=0.28"] sdk = ["openai>=1.30"] dev = [ "pytest>=8.0", "pytest-cov>=5.0", "pytest-asyncio>=0.23", "ruff>=0.6", "radon>=6.0", "import-linter>=2.0", ] [project.urls] Homepage = "https://gitea.iomgaa.online/iomgaa/PolyGateway" Changelog = "https://gitea.iomgaa.online/iomgaa/PolyGateway/src/branch/main/CHANGELOG.md" Issues = "https://gitea.iomgaa.online/iomgaa/PolyGateway/issues" [tool.setuptools.packages.find] where = ["src"] [tool.pytest.ini_options] pythonpath = ["src"] testpaths = ["tests"] asyncio_mode = "auto" # slow(真实等待的时间语义变体,单文件 12-15 分钟)默认排除; # 显式 `pytest -m slow` 覆盖(CLI 的 -m 后到优先)。M2 T12 全量跑。 addopts = "-m 'not slow'" markers = [ "requires_redis: 需要可达的 Redis(无则 skip)", "requires_llm: 需要真实 LLM 网关(无则 skip,输出落 tests/outputs/)", "slow: 慢速测试(CI 按需跑)", ] [tool.ruff] target-version = "py312" line-length = 100 [tool.ruff.lint] select = ["E", "F", "W", "I", "N", "UP", "B", "A", "C4", "SIM", "TCH"] ignore = ["E501"] [tool.ruff.lint.isort] known-first-party = ["polygateway"] # 依赖纪律(ARCHITECTURE.md §8):ports/types/errors/streaming 为最内层; # middleware 只依赖端口;transports/backends/telemetry/structured/providers/sources # 只实现端口且互不依赖;client 是唯一组装层。 # 注:M1 模块落地前 lint-imports 由 Makefile 门控跳过。 [tool.importlinter] root_packages = ["polygateway"] [[tool.importlinter.contracts]] name = "洋葱分层:client → config → middleware → 实现层(互不依赖)→ 叶子 → 内核" type = "layers" layers = [ "polygateway.client", "polygateway.config", "polygateway.middleware", "polygateway.transports | polygateway.backends | polygateway.telemetry | polygateway.structured", "polygateway.thinking", "polygateway.providers : polygateway.sources", "polygateway.ports : polygateway.types : polygateway.errors : polygateway.streaming", ]