From 8559f104033c0f93a169a66e0a7e8496be453573 Mon Sep 17 00:00:00 2001 From: iomgaa Date: Wed, 22 Jul 2026 11:18:50 -0400 Subject: [PATCH] chore: bump version to 1.0.0 with changelog --- CHANGELOG.md | 18 ++++++++++++++++++ pyproject.toml | 2 +- tests/integration/test_postgres_telemetry.py | 8 ++++---- 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f78fa6f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog + +## 1.0.0(2026-07-22) + +首个正式版。统一 LLM/VLM/OCR/Embedding 调度与中转库,治理单位为一次模型调用;经 GovDoc-SaaS 与 CHSAnalyzer 两个真实项目全量迁移验收(ARCHITECTURE §11)。 + +- **M1 核心**: types/errors/ports 内核、OpenAI 兼容 httpx transport(SSE + 非流式)、三层活性看门狗、自研重试(错误四分类驱动,换源/退避/Retry-After)、多源多账号 + 选源 + 源冷却、内存限流/熔断、Redis/内存响应缓存(key 含 namespace/salt/多模态摘要)、SQLite 遥测(18 字段必录)、结构化输出阶梯(json_repair/原生 schema + 有界重问)、provider 注册表、`from_env` 装配。 +- **M2 分布式**: Redis 六道闸限流(Lua,契约测试双后端共用)、跨进程熔断(单探针租约 + epoch fencing)、背压 stall 双条件判定、Postgres 遥测、pricing 成本、EmbeddingClient(分批/维度校验)。 +- **M2.5 治理韧性**: 双通道熔断(失败率窗 + 连败 + 健康证据抑制)、健康感知选源(EWMA×在途 P2C 缺省)、AIMD 自适应并发、429 免重试预算、健康门槛降权;故障混编 soak 同场景 58.1%→98.96%。 +- **M3 OCR**: OcrTextPort/OcrLayoutPort 端口族 + MonkeyOCR 双端点 transport(数值防御下沉)、OcrClient 独立治理循环、`check_health()` 逐源预检;OCR soak 1500 调用 99.73%。 +- **M4 迁移验证**: GovDoc 与 CHS 全量迁移(合计约 −6800 行项目治理代码由库继任),原测试全绿 + 真实冒烟 + 50 样本回归;Gitea PyPI 分发。 + +安装(实验室 Gitea PyPI): + +```bash +pip install --index-url https://gitea.iomgaa.online/api/packages/iomgaa/pypi/simple/ \ + --extra-index-url https://pypi.org/simple/ "polygateway[redis,postgres,structured]==1.0.*" +``` diff --git a/pyproject.toml b/pyproject.toml index 3bccfd3..43992dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "polygateway" -version = "0.1.0" +version = "1.0.0" description = "PolyGateway:实验室统一的大语言模型(LLM/VLM/OCR)调度与中转库——多源、限流、重试、熔断、缓存、遥测" requires-python = ">=3.11" dependencies = [ diff --git a/tests/integration/test_postgres_telemetry.py b/tests/integration/test_postgres_telemetry.py index 9371bf4..51e9c92 100644 --- a/tests/integration/test_postgres_telemetry.py +++ b/tests/integration/test_postgres_telemetry.py @@ -73,14 +73,14 @@ async def dsn(): conn = await asyncpg.connect(value, timeout=10) try: if await conn.fetchval("SELECT to_regclass('llm_calls')") is not None: - await conn.execute( - "DELETE FROM llm_calls WHERE call_id LIKE $1", f"{_RUN_PREFIX}-%" - ) + await conn.execute("DELETE FROM llm_calls WHERE call_id LIKE $1", f"{_RUN_PREFIX}-%") finally: await conn.close() -async def _record_minimal(recorder: PostgresRecorder, call_id: str | None = None, **overrides) -> None: +async def _record_minimal( + recorder: PostgresRecorder, call_id: str | None = None, **overrides +) -> None: fields = { "call_id": call_id if call_id is not None else _cid("c1"), "parent_call_id": None,