From 4ca0588acd1d2ad86a4cacfc1daab0acac3de1a1 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Wed, 29 Apr 2026 20:34:31 +0800 Subject: [PATCH 01/66] =?UTF-8?q?fix(proxy):=20=E4=BF=AE=E5=A4=8D=20tool?= =?UTF-8?q?=5Fuse.input=20=E9=9D=9E=E6=B3=95=20JSON=20=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E5=AF=BC=E8=87=B4=E7=9A=84=E7=BA=A7=E8=81=94=E6=95=85?= =?UTF-8?q?=E9=9A=9C=E8=BD=AC=E7=A7=BB=E5=A4=B1=E8=B4=A5;=20(#213)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 防御性 tool_use.input 序列化: 非 dict 类型(None/字符串等)降级为空字典, 避免向 copilot 发送非 JSON 对象的 arguments 字段 - 识别 zhipu 500 'ClaudeContentBlockToolResult' 错误为格式不兼容, 不计入熔断器, 确保干净的故障转移到 copilot - 扩展 _is_likely_request_format_error 覆盖结构化 400 响应中 invalid_tool_call_format 错误码的检测 - 新增对应单元测试: input 类型降级、zhipu 格式错误检测、结构化 400 检测 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- .../proxy/convert/anthropic_to_openai.py | 36 ++-- src/coding/proxy/routing/executor.py | 25 +++ tests/test_copilot_convert_request.py | 129 +++++++++++++ tests/test_router_executor.py | 180 ++++++++++++++++++ 4 files changed, 357 insertions(+), 13 deletions(-) diff --git a/src/coding/proxy/convert/anthropic_to_openai.py b/src/coding/proxy/convert/anthropic_to_openai.py index 82baeba..81bd163 100644 --- a/src/coding/proxy/convert/anthropic_to_openai.py +++ b/src/coding/proxy/convert/anthropic_to_openai.py @@ -284,24 +284,34 @@ def _translate_assistant_message(message: dict[str, Any]) -> list[dict[str, Any] final_text_parts = text_parts if tool_uses: + tool_calls: list[dict[str, Any]] = [] + for block in tool_uses: + raw_input = block.get("input") + if not isinstance(raw_input, dict): + logger.debug( + "copilot: tool_use id=%s name=%s has non-dict input (type=%s), " + "defaulting to empty dict", + block.get("id", ""), + block.get("name", ""), + type(raw_input).__name__, + ) + raw_input = {} + tool_calls.append( + { + "id": block.get("id", ""), + "type": "function", + "function": { + "name": block.get("name", ""), + "arguments": json.dumps(raw_input, ensure_ascii=False), + }, + } + ) return [ { "role": "assistant", "content": "\n\n".join(part for part in final_text_parts if part) or None, - "tool_calls": [ - { - "id": block.get("id", ""), - "type": "function", - "function": { - "name": block.get("name", ""), - "arguments": json.dumps( - block.get("input", {}), ensure_ascii=False - ), - }, - } - for block in tool_uses - ], + "tool_calls": tool_calls, } ] diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 2a27665..972537c 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -135,6 +135,10 @@ def _is_likely_request_format_error( # 非结构化响应体(非 JSON) if not trimmed.startswith("{") and len(trimmed) < 200: return True + # 结构化 JSON 400 但含 tool_call 格式错误码 → 格式不兼容 + # (如 Copilot 返回 {"error":{"code":"invalid_tool_call_format",...}}) + if "invalid_tool_call_format" in trimmed: + return True return False @@ -795,6 +799,27 @@ async def _handle_http_error( tier.name, ) + # 补充检测:zhipu 500 — tool_result 块触发上游 AttributeError + # zhipu 后端在 tool_result 块上错误访问 .id 属性(应为 .tool_use_id), + # 此为已知的上游格式缺陷,应视为 format incompatibility 而非真实服务器故障。 + if ( + not semantic_rejection + and exc.response.status_code == 500 + and request_body is not None + and _has_tool_results(request_body) + ): + err_text = (exc.response.text or "")[:500] + if ( + "'ClaudeContentBlockToolResult'" in err_text + and "has no attribute 'id'" in err_text + ): + semantic_rejection = True + logger.warning( + "Tier %s zhipu tool_result format error (500), " + "treating as format incompatibility without circuit breaker penalty", + tier.name, + ) + if semantic_rejection and not is_last: return True, tier.name, exc diff --git a/tests/test_copilot_convert_request.py b/tests/test_copilot_convert_request.py index 0a4dbce..c4718cc 100644 --- a/tests/test_copilot_convert_request.py +++ b/tests/test_copilot_convert_request.py @@ -472,3 +472,132 @@ def test_image_block_converted_to_image_url(): image_part = [p for p in user_msg["content"] if p.get("type") == "image_url"] assert len(image_part) == 1 assert "data:image/png;base64,abc123" in image_part[0]["image_url"]["url"] + + +# === Defensive tool_use.input serialization === + + +def test_tool_use_input_none_defaults_to_empty_dict(): + """input=None 应被降级为 {} 而非序列化为 'null'.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_001", + "name": "read_file", + "input": None, + } + ], + } + ], + } + result = convert_request(body) + assistant_msgs = [m for m in result["messages"] if m["role"] == "assistant"] + assert len(assistant_msgs) == 1 + assert "tool_calls" in assistant_msgs[0] + tc = assistant_msgs[0]["tool_calls"][0] + assert tc["function"]["arguments"] == "{}" + + +def test_tool_use_input_string_defaults_to_empty_dict(): + """input='some string' 应被降级为 {} 而非序列化为 '"some string"'.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_002", + "name": "run_cmd", + "input": "not a dict", + } + ], + } + ], + } + result = convert_request(body) + assistant_msgs = [m for m in result["messages"] if m["role"] == "assistant"] + tc = assistant_msgs[0]["tool_calls"][0] + assert tc["function"]["arguments"] == "{}" + + +def test_tool_use_input_missing_defaults_to_empty_dict(): + """input key 不存在时,block.get('input') 返回 None,应降级为 {}.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_003", + "name": "search", + } + ], + } + ], + } + result = convert_request(body) + assistant_msgs = [m for m in result["messages"] if m["role"] == "assistant"] + tc = assistant_msgs[0]["tool_calls"][0] + assert tc["function"]["arguments"] == "{}" + + +def test_tool_use_input_int_defaults_to_empty_dict(): + """input=42 应被降级为 {} 而非序列化为 '42'.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_004", + "name": "calc", + "input": 42, + } + ], + } + ], + } + result = convert_request(body) + assistant_msgs = [m for m in result["messages"] if m["role"] == "assistant"] + tc = assistant_msgs[0]["tool_calls"][0] + assert tc["function"]["arguments"] == "{}" + + +def test_tool_use_valid_dict_input_preserved(): + """正常 dict input 应保持原样.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_005", + "name": "read_file", + "input": {"path": "/tmp/test.txt", "offset": 10}, + } + ], + } + ], + } + result = convert_request(body) + assistant_msgs = [m for m in result["messages"] if m["role"] == "assistant"] + tc = assistant_msgs[0]["tool_calls"][0] + import json + + assert json.loads(tc["function"]["arguments"]) == { + "path": "/tmp/test.txt", + "offset": 10, + } diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index bc0201f..7f3193f 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -11,6 +11,7 @@ from unittest.mock import AsyncMock, MagicMock +import httpx import pytest from coding.proxy.compat.canonical import ( @@ -1229,6 +1230,31 @@ def test_returns_false_for_empty_body(self): is False ) + def test_returns_true_for_invalid_tool_call_format(self): + """400 + 结构化 JSON 含 invalid_tool_call_format + tool_result → 格式不兼容.""" + json_body = '{"error":{"message":"Invalid JSON format in tool call arguments","code":"invalid_tool_call_format"}}' + assert ( + _is_likely_request_format_error( + status_code=400, + error_body_text=json_body, + body=self._body_with_tool_results(), + ) + is True + ) + + def test_returns_false_for_invalid_tool_call_format_without_tool_results(self): + """invalid_tool_call_format 但无 tool_result → 不应匹配.""" + json_body = '{"error":{"message":"Invalid JSON format in tool call arguments","code":"invalid_tool_call_format"}}' + body = {"model": "test", "messages": [{"role": "user", "content": "hi"}]} + assert ( + _is_likely_request_format_error( + status_code=400, + error_body_text=json_body, + body=body, + ) + is False + ) + # ── TokenAcquireError 永久性凭证错误测试 ──────────────────── @@ -2101,3 +2127,157 @@ def test_self_cleanup_preserves_srvtoolu_ids(self): b for b in result["messages"][0]["content"] if b.get("type") == "thinking" ) assert thinking_block["signature"] == "zhipu_sig" + + +# ── zhipu 500 tool_result 格式错误检测测试 ────────────────────── + + +class TestZhipu500ToolResultFormatError: + """验证 _handle_http_error 对 zhipu 500 'ClaudeContentBlockToolResult' 错误的处理. + + zhipu 后端在 tool_result 块上错误访问 .id 属性(应为 .tool_use_id), + 此为已知的上游格式缺陷,应视为 format incompatibility(semantic rejection) + 而非真实服务器故障,不应计入熔断器。 + """ + + @pytest.mark.asyncio + async def test_zhipu_500_tool_result_error_triggers_semantic_rejection(self): + """zhipu 500 + 'ClaudeContentBlockToolResult' + tool_result → semantic rejection.""" + from coding.proxy.routing.circuit_breaker import CircuitBreaker + + vendor = _mock_vendor("zhipu") + error_body = ( + b'{"error":{"code":"500","message":"\'ClaudeContentBlockToolResult\' ' + b"object has no attribute 'id'\"}}" + ) + response = httpx.Response( + status_code=500, + content=error_body, + request=httpx.Request("POST", "https://example.com"), + ) + exc = httpx.HTTPStatusError( + "zhipu API error: 500", request=response.request, response=response + ) + + cb = CircuitBreaker(failure_threshold=3) + tier = _make_tier(vendor, circuit_breaker=cb) + exec_inst = _executor([tier, _make_tier(_mock_vendor("copilot"))]) + + body = { + "model": "claude-opus-4-6", + "messages": [ + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "tu_1", + "content": "result", + } + ], + }, + ], + } + + should_continue, failed_name, _ = await exec_inst._handle_http_error( + tier, + exc, + is_last=False, + failed_tier_name=None, + last_exc=None, + is_stream=True, + request_body=body, + ) + + assert should_continue is True + assert failed_name == "zhipu" + # 不应计入熔断器 + assert cb.get_info()["failure_count"] == 0 + + @pytest.mark.asyncio + async def test_zhipu_500_generic_error_records_failure(self): + """zhipu 500 但非 tool_result 格式错误 → 正常记录熔断器.""" + from coding.proxy.routing.circuit_breaker import CircuitBreaker + + vendor = _mock_vendor("zhipu") + error_body = b'{"error":{"code":"500","message":"Internal Server Error"}}' + response = httpx.Response( + status_code=500, + content=error_body, + request=httpx.Request("POST", "https://example.com"), + ) + exc = httpx.HTTPStatusError( + "zhipu API error: 500", request=response.request, response=response + ) + + cb = CircuitBreaker(failure_threshold=3) + tier = _make_tier(vendor, circuit_breaker=cb) + exec_inst = _executor([tier]) + + body = { + "model": "claude-opus-4-6", + "messages": [ + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "tu_1", + "content": "result", + } + ], + }, + ], + } + + should_continue, _, _ = await exec_inst._handle_http_error( + tier, + exc, + is_last=True, + failed_tier_name=None, + last_exc=None, + is_stream=True, + request_body=body, + ) + + # 非 last tier 时 should_continue=False,且应记录熔断器失败 + assert should_continue is False + assert cb.get_info()["failure_count"] == 1 + + @pytest.mark.asyncio + async def test_zhipu_500_tool_result_error_without_tool_results_body(self): + """zhipu 500 tool_result 错误但请求体无 tool_result → 不触发特殊处理.""" + from coding.proxy.routing.circuit_breaker import CircuitBreaker + + vendor = _mock_vendor("zhipu") + error_body = ( + b'{"error":{"code":"500","message":"\'ClaudeContentBlockToolResult\' ' + b"object has no attribute 'id'\"}}" + ) + response = httpx.Response( + status_code=500, + content=error_body, + request=httpx.Request("POST", "https://example.com"), + ) + exc = httpx.HTTPStatusError( + "zhipu API error: 500", request=response.request, response=response + ) + + cb = CircuitBreaker(failure_threshold=3) + tier = _make_tier(vendor, circuit_breaker=cb) + exec_inst = _executor([tier]) + + body = {"model": "test", "messages": [{"role": "user", "content": "hello"}]} + + should_continue, _, _ = await exec_inst._handle_http_error( + tier, + exc, + is_last=True, + failed_tier_name=None, + last_exc=None, + is_stream=True, + request_body=body, + ) + + assert should_continue is False + assert cb.get_info()["failure_count"] == 1 From ea962d3b8a48f7132ecf53e95c7ba82bffbde3b2 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Wed, 29 Apr 2026 20:37:02 +0800 Subject: [PATCH 02/66] =?UTF-8?q?fix(usage-parser):=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=20OpenAI/Gemini=20SSE=20=E6=B5=81=E5=BC=8F=E5=88=86=E6=94=AF?= =?UTF-8?q?=E7=9A=84=20model=5Fserved=20=E6=8F=90=E5=8F=96;=20(#214)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenAI 和 Gemini 的 SSE 流式响应解析中,model_served 仅写入证据记录而未赋值 到主 usage 字典,导致 Native API 流式路径下模型名称回退为 "unknown"。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/routing/usage_parser.py | 6 +++++ tests/test_parse_usage.py | 28 ++++++++++++++++++++++++ tests/test_parse_usage_gemini.py | 16 ++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/coding/proxy/routing/usage_parser.py b/src/coding/proxy/routing/usage_parser.py index e07b187..0d6509c 100644 --- a/src/coding/proxy/routing/usage_parser.py +++ b/src/coding/proxy/routing/usage_parser.py @@ -210,6 +210,9 @@ def parse_usage_from_chunk( request_id=data.get("id"), model_served=data.get("model"), ) + model_name = data.get("model") + if model_name: + usage["model_served"] = model_name # Gemini SSE 格式: data.usageMetadata.{promptTokenCount, candidatesTokenCount, cachedContentTokenCount, thoughtsTokenCount, toolUsePromptTokenCount} # Gemini 的流式响应在最后一帧(或每一帧)携带 usageMetadata;字段命名与 @@ -243,6 +246,9 @@ def parse_usage_from_chunk( request_id=data.get("responseId") or data.get("id"), model_served=data.get("modelVersion") or data.get("model"), ) + model_name = data.get("modelVersion") or data.get("model") + if model_name: + usage["model_served"] = model_name # request_id fallback (OpenAI 格式下 id 在顶层, Gemini 顶层为 responseId) if not usage.get("request_id"): diff --git a/tests/test_parse_usage.py b/tests/test_parse_usage.py index d3502b7..251d165 100644 --- a/tests/test_parse_usage.py +++ b/tests/test_parse_usage.py @@ -117,6 +117,34 @@ def test_openai_zhipu_final_chunk(): assert usage["input_tokens"] == 200 assert usage["output_tokens"] == 80 assert usage["request_id"] == "chatcmpl-1" + assert usage["model_served"] == "glm-5.1" + + +def test_openai_final_chunk_with_model(): + """OpenAI 最终 chunk 有 model 字段时应提取到 model_served.""" + usage: dict = {} + parse_usage_from_chunk( + _sse( + '{"id":"chatcmpl-2","model":"gpt-4o-2024-08-06",' + '"usage":{"prompt_tokens":50,"completion_tokens":20}}' + ), + usage, + ) + assert usage["input_tokens"] == 50 + assert usage["output_tokens"] == 20 + assert usage["model_served"] == "gpt-4o-2024-08-06" + + +def test_openai_final_chunk_without_model(): + """OpenAI 最终 chunk 无 model 字段时不应设置 model_served.""" + usage: dict = {} + parse_usage_from_chunk( + _sse('{"id":"chatcmpl-3","usage":{"prompt_tokens":30,"completion_tokens":10}}'), + usage, + ) + assert usage["input_tokens"] == 30 + assert usage["output_tokens"] == 10 + assert "model_served" not in usage def test_openai_final_chunk_with_cache_tokens(): diff --git a/tests/test_parse_usage_gemini.py b/tests/test_parse_usage_gemini.py index cec2b79..01e7334 100644 --- a/tests/test_parse_usage_gemini.py +++ b/tests/test_parse_usage_gemini.py @@ -35,6 +35,7 @@ def test_gemini_usage_metadata_basic_fields(): assert usage["output_tokens"] == 42 assert usage.get("cache_read_tokens", 0) == 0 assert usage["request_id"] == "resp_abc" + assert usage["model_served"] == "gemini-2.0-flash" def test_gemini_usage_metadata_with_cached_content(): @@ -194,3 +195,18 @@ def test_gemini_partial_fields_ok(): ) assert usage["input_tokens"] == 77 assert "output_tokens" not in usage + + +def test_gemini_model_fallback_to_data_model(): + """当 modelVersion 不存在时,应回退到 data.model.""" + usage: dict = {} + parse_usage_from_chunk( + _sse( + '{"usageMetadata":{"promptTokenCount":80,"candidatesTokenCount":20},' + '"model":"gemini-1.5-flash"}' + ), + usage, + ) + assert usage["input_tokens"] == 80 + assert usage["output_tokens"] == 20 + assert usage["model_served"] == "gemini-1.5-flash" From 96e72637b1fe5c24197cc5e32ed0a9f3ede01760 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 29 Apr 2026 20:41:06 +0800 Subject: [PATCH 03/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a3=20=E2=86=92=200.3.1a4;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4cc7854..ad331e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a3" +version = "0.3.1a4" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 7258f33..537f8a6 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a3" +version = "0.3.1a4" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From f4970774f8543e5af7be08069898a51ea9f14f91 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Wed, 29 Apr 2026 21:13:48 +0800 Subject: [PATCH 04/66] =?UTF-8?q?fix(vendor-channels):=20=E4=B8=BA=20tool?= =?UTF-8?q?=5Fresult=20=E5=9D=97=E6=B3=A8=E5=85=A5=20id=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E4=BF=AE=E5=A4=8D=20zhipu=20GLM-5=20?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=20500=20=E9=94=99=E8=AF=AF;=20(#215)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 _inject_tool_result_id_for_zhipu 辅助函数,在所有 targeting zhipu 的转换通道 (copilot→zhipu、anthropic→zhipu、zhipu self-cleanup)末尾统一注入 tool_result.id, 解决 zhipu 后端错误访问 .id 属性导致的 'ClaudeContentBlockToolResult' object has no attribute 'id' 级联故障转移问题。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- CHANGELOG.md | 1 + docs/issue.md | 38 +++++ src/coding/proxy/convert/vendor_channels.py | 46 ++++++ tests/test_vendor_channels.py | 159 ++++++++++++++++++++ 4 files changed, 244 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b974ed..c6915e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## [Unreleased] +- fix(vendor-channels): 为所有 targeting zhipu 的转换通道(zhipu→zhipu、copilot→zhipu、anthropic→zhipu)新增 `tool_result.id` 字段注入,修复 zhipu GLM-5 后端错误访问 `.id` 属性(`'ClaudeContentBlockToolResult' object has no attribute 'id'`)导致的 500 错误,使 zhipu 可完全承接含 tool_result 的会话; - fix(vendor-channels): 新增 zhipu 同 vendor 自清理通道,修复 GLM-5 自循环 400 + tool_results 偶发降级; - fix(vendor-channels): 修复 `_rewrite_srvtoolu_ids` 块顺序敏感性导致 inline tool_result 漏改名,进而 enforce 阶段 dict key 与 tool_use_ids 错位、anthropic 报 `tool_use ids without tool_result blocks immediately after` 的 cascade failover 问题(改为两遍扫描:先收集 id_map,再统一改写所有 tool_result.tool_use_id 引用); - fix(vendor-channels): `enforce_anthropic_tool_pairing` 增加全局 sanity check pass,主循环边角错位让 dangling tool_use 漏过校验时兜底合成 is_error 占位并打 `pairing_sanity_repaired` 标签,避免 anthropic 二次报错; diff --git a/docs/issue.md b/docs/issue.md index 1fc6428..f73780e 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -141,3 +141,41 @@ adaptations 列表显示 `misplaced_tool_result_relocated` 但**没有** `orphan - 任何对 messages 进行 ID 重写的转换链 (如 `_rewrite_srvtoolu_ids`、`anthropic_to_openai`、`anthropic_to_gemini`) 都应使用两遍扫描或一次性收集后再批量改写, 以保证 block 顺序无关性。 - enforce 类校验函数若依赖 dict key 与 list 元素的**等同性**, 必须先确保两者在同一参考系下 (改名前 vs 改名后); 否则错位会以 "看起来 OK 实际有漏" 的方式静默泄漏到下游。 + +--- + +## zhipu 500 `'ClaudeContentBlockToolResult' object has no attribute 'id'` + +**问题描述** + +zhipu GLM-5 在处理含 `tool_result` 块的会话时持续返回 500 错误,每次请求都触发故障转移至 copilot,zhipu 完全无法承接含工具调用的多轮对话: + +``` +WARNING zhipu stream error: status=500 body='...message":"\'ClaudeContentBlockToolResult\' object has no attribute \'id\'"}' +WARNING Tier zhipu zhipu tool_result format error (500), treating as format incompatibility without circuit breaker penalty +INFO Failover: zhipu → copilot (reason: HTTP 500) +``` + +**表因** + +zhipu 后端在解析 `tool_result` 内容块时错误地访问 `.id` 属性。但 Anthropic API 规范中 `tool_result` 块只有 `tool_use_id` 字段(用于关联对应的 `tool_use`),没有 `id` 字段(`id` 是 `tool_use` 块的属性)。 + +**根因** + +所有 targeting zhipu 的转换通道(`prepare_zhipu_self_cleanup`、`prepare_copilot_to_zhipu`、`prepare_anthropic_to_zhipu`)在完成 `enforce_anthropic_tool_pairing` 后,没有为 `tool_result` 块补上 zhipu 后端期望的 `id` 字段。搬迁或合成的 `tool_result` 块仅有 `tool_use_id`,缺少 `id`。 + +**处理方式** + +- 在 `vendor_channels.py` 新增 `_inject_tool_result_id_for_zhipu` 辅助函数:扫描所有消息中的 `tool_result` 块,将 `tool_use_id` 值复制为 `id` 字段(仅注入尚无 `id` 的块,保持幂等) +- 在三个 targeting zhipu 的转换通道末尾统一调用此辅助函数 +- 保留 executor 中已有的 500 错误检测作为纵深防御 + +**后续防范** + +- 其他 `NativeAnthropicVendor` 子类若出现类似的「后端期望非标准字段」问题,可参考此模式在对应的转换通道中注入兼容字段。 +- 当 zhipu 后端修复此 bug(不再访问 `.id`)后,此 workaround 仍安全保留(多一个 `id` 字段不影响 Anthropic API 语义)。 + +**同类问题影响与处理注意事项** + +- `enforce_anthropic_tool_pairing` 合成的 `is_error=True` 占位块只有 `tool_use_id`,同样需要 `id` 注入——辅助函数在配对后统一处理,无需在合成逻辑中单独添加。 +- `tool_result.id` 的值设为与 `tool_use_id` 相同,语义上可视为「内容块标识符」,对 zhipu 后端足够区分不同 tool_result 块。 diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index 0b1d511..dd3f3c7 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -322,6 +322,36 @@ def _enforce_pairing_sanity_pass(messages_list: list[Any]) -> list[str]: return sanity_synthesized +def _inject_tool_result_id_for_zhipu(body: dict[str, Any]) -> int: + """为 tool_result 块注入 ``id`` 字段以兼容 zhipu GLM-5 后端. + + zhipu 的 Anthropic 兼容端点在解析 ``tool_result`` 块时会访问 ``.id`` 属性, + 但 Anthropic API 规范中 ``tool_result`` 只有 ``tool_use_id`` 字段而没有 ``id``。 + 此函数在所有 ``tool_result`` 块上补设 ``id``(值等于 ``tool_use_id``), + 避免触发 ``'ClaudeContentBlockToolResult' object has no attribute 'id'`` 500 错误。 + + Returns: + 被注入 ``id`` 字段的 tool_result 块数量。 + """ + injected = 0 + for message in body.get("messages", []): + if not isinstance(message, dict): + continue + content = message.get("content") + if not isinstance(content, list): + continue + for block in content: + if ( + isinstance(block, dict) + and block.get("type") == "tool_result" + and "id" not in block + and block.get("tool_use_id") + ): + block["id"] = block["tool_use_id"] + injected += 1 + return injected + + def _strip_cache_control(body: dict[str, Any]) -> int: """从 system/messages/tools 中移除 cache_control 字段(就地). @@ -577,6 +607,11 @@ def prepare_copilot_to_zhipu( if pairing_fixes: adaptations.extend(pairing_fixes) + # Step 5: 为 tool_result 块注入 id 字段(zhipu 后端 bug workaround) + injected = _inject_tool_result_id_for_zhipu(prepared) + if injected: + adaptations.append(f"injected_{injected}_tool_result_id_fields") + return prepared, adaptations @@ -632,6 +667,11 @@ def prepare_anthropic_to_zhipu( if pairing_fixes: adaptations.extend(pairing_fixes) + # Step 6: 为 tool_result 块注入 id 字段(zhipu 后端 bug workaround) + injected = _inject_tool_result_id_for_zhipu(prepared) + if injected: + adaptations.append(f"injected_{injected}_tool_result_id_fields") + return prepared, adaptations @@ -760,6 +800,7 @@ def prepare_zhipu_self_cleanup( 1. 剥离 ``server_tool_use_delta`` 流式残块 2. 强制 tool_use/tool_result 配对(关键: 把 assistant 内联的 tool_result 搬迁到紧随的 user 消息) + 3. 为 ``tool_result`` 块注入 ``id`` 字段(zhipu 后端错误访问 ``.id`` 属性) Returns: (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 @@ -777,6 +818,11 @@ def prepare_zhipu_self_cleanup( if pairing_fixes: adaptations.extend(pairing_fixes) + # Step 3: 为 tool_result 块注入 id 字段(zhipu 后端 bug workaround) + injected = _inject_tool_result_id_for_zhipu(prepared) + if injected: + adaptations.append(f"injected_{injected}_tool_result_id_fields") + return prepared, adaptations diff --git a/tests/test_vendor_channels.py b/tests/test_vendor_channels.py index a105b42..b89db15 100644 --- a/tests/test_vendor_channels.py +++ b/tests/test_vendor_channels.py @@ -392,6 +392,38 @@ def test_idempotency(self): assert prepared2 == prepared1 assert adaptations2 == [] + def test_injects_id_on_tool_result_for_zhipu(self): + """copilot → zhipu 转换后 tool_result 应包含 id 字段.""" + body = { + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_001", + "name": "bash", + "input": {}, + }, + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_001", + "content": "ok", + }, + ], + }, + ], + } + prepared, adaptations = prepare_copilot_to_zhipu(body) + tr = prepared["messages"][1]["content"][0] + assert tr["id"] == "toolu_001" + assert any("injected" in a and "tool_result_id" in a for a in adaptations) + # ── zhipu → anthropic 转换通道测试 ──────────────────────────────── @@ -762,6 +794,101 @@ def test_relocates_misplaced_tool_result(self): ) assert "misplaced_tool_result_relocated" in adaptations + def test_injects_id_on_relocated_tool_result(self): + """搬迁后的 tool_result 块应具有 id 字段(zhipu 后端 bug workaround).""" + body = { + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_001", + "name": "bash", + "input": {}, + }, + { + "type": "tool_result", + "tool_use_id": "toolu_001", + "content": "ok", + }, + ], + }, + {"role": "user", "content": []}, + ], + } + prepared, adaptations = prepare_zhipu_self_cleanup(body) + + user_content = prepared["messages"][1]["content"] + tr = next(b for b in user_content if b.get("type") == "tool_result") + assert tr["id"] == "toolu_001" + assert any("injected" in a and "tool_result_id" in a for a in adaptations) + + def test_injects_id_on_existing_user_tool_result(self): + """user 消息中已有的 tool_result 也应被注入 id 字段.""" + body = { + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_001", + "name": "bash", + "input": {}, + }, + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_001", + "content": "ok", + }, + ], + }, + ], + } + prepared, adaptations = prepare_zhipu_self_cleanup(body) + + tr = prepared["messages"][1]["content"][0] + assert tr["id"] == "toolu_001" + assert any("injected" in a and "tool_result_id" in a for a in adaptations) + + def test_skips_id_injection_when_already_present(self): + """tool_result 已有 id 字段时不应重复注入.""" + body = { + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_001", + "name": "bash", + "input": {}, + }, + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_001", + "id": "toolu_001", + "content": "ok", + }, + ], + }, + ], + } + prepared, adaptations = prepare_zhipu_self_cleanup(body) + # 不应产生注入 adaptation(id 已存在) + assert not any("injected" in a for a in adaptations) + def test_preserves_srvtoolu_ids(self): """zhipu 原生 srvtoolu_* ID 与 server_tool_use 类型必须保留.""" body = { @@ -2751,3 +2878,35 @@ def test_combined_server_tool_use_and_thinking(self): assert "thinking" not in prepared assert any("server_tool_use" in a for a in adaptations) assert any("thinking_blocks" in a for a in adaptations) + + def test_injects_id_on_tool_result_for_zhipu(self): + """anthropic → zhipu 转换后 tool_result 应包含 id 字段.""" + body = { + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_001", + "name": "bash", + "input": {}, + }, + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_001", + "content": "ok", + }, + ], + }, + ], + } + prepared, adaptations = prepare_anthropic_to_zhipu(body) + tr = prepared["messages"][1]["content"][0] + assert tr["id"] == "toolu_001" + assert any("injected" in a and "tool_result_id" in a for a in adaptations) From 152328645552489978cdfaa10ecbc6853d58d390 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 29 Apr 2026 21:14:22 +0800 Subject: [PATCH 05/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a4=20=E2=86=92=200.3.1a5;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ad331e2..931db2c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a4" +version = "0.3.1a5" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 537f8a6..9910412 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a4" +version = "0.3.1a5" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From fdd4a92fe94b4a3e846e3055009f0285db1a5a50 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Wed, 29 Apr 2026 22:17:29 +0800 Subject: [PATCH 06/66] =?UTF-8?q?fix(vendor-channels):=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20zhipu=20=E7=9B=AE=E6=A0=87=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=AD=E6=9C=89=E5=AE=B3=E6=AD=A5=E9=AA=A4=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20500=20=E7=BA=A7=E8=81=94=E6=95=85=E9=9A=9C=E5=8F=8A?= =?UTF-8?q?=E9=81=97=E7=95=99=E6=B5=8B=E8=AF=95;=20(#216)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(vendor-channels): 移除 zhipu 目标转换中的有害步骤,修复 500 级联故障; 从 prepare_copilot_to_zhipu、prepare_anthropic_to_zhipu、prepare_zhipu_self_cleanup 三个通道中移除 enforce_anthropic_tool_pairing(tool_result 搬迁触发 zhipu 500)、 _inject_tool_result_id_for_zhipu(zhipu 类不读取 JSON id,注入无效)、 _strip_cache_control(GLM-5 原生支持 cache_control)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(vendor-channels): 修复 zhipu 移除 id 注入后遗留测试断言错误; 6 处测试的断言仍检查旧行为(id 被注入 / cache_control 被移除 / tool_result 被搬迁), 导致 KeyError 或 AssertionError。统一更新为验证新语义:id 不注入、cache_control 保留、 inline tool_result 保留在 assistant 原位。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- docs/issue.md | 54 +++++-- src/coding/proxy/convert/vendor_channels.py | 84 ++++------- tests/test_router_executor.py | 21 +-- tests/test_vendor_channels.py | 149 +++++++++----------- 4 files changed, 141 insertions(+), 167 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index f73780e..bac2f7e 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -152,30 +152,58 @@ zhipu GLM-5 在处理含 `tool_result` 块的会话时持续返回 500 错误, ``` WARNING zhipu stream error: status=500 body='...message":"\'ClaudeContentBlockToolResult\' object has no attribute \'id\'"}' -WARNING Tier zhipu zhipu tool_result format error (500), treating as format incompatibility without circuit breaker penalty -INFO Failover: zhipu → copilot (reason: HTTP 500) ``` **表因** -zhipu 后端在解析 `tool_result` 内容块时错误地访问 `.id` 属性。但 Anthropic API 规范中 `tool_result` 块只有 `tool_use_id` 字段(用于关联对应的 `tool_use`),没有 `id` 字段(`id` 是 `tool_use` 块的属性)。 +zhipu 后端在解析 `tool_result` 内容块时错误地访问 `.id` 属性。但 Anthropic API 规范中 `tool_result` 块只有 `tool_use_id` 字段(用于关联对应的 `tool_use`),没有 `id` 字段。 -**根因** +**根因**(2026-04-29 复盘更新) -所有 targeting zhipu 的转换通道(`prepare_zhipu_self_cleanup`、`prepare_copilot_to_zhipu`、`prepare_anthropic_to_zhipu`)在完成 `enforce_anthropic_tool_pairing` 后,没有为 `tool_result` 块补上 zhipu 后端期望的 `id` 字段。搬迁或合成的 `tool_result` 块仅有 `tool_use_id`,缺少 `id`。 +**初始诊断**(已推翻):认为 zhipu 后端期望 `tool_result` 有 `id` 字段,通过 `_inject_tool_result_id_for_zhipu` 注入 `id = tool_use_id` 可绕过。 -**处理方式** +**实际根因**:转换通道本身引入的问题。具体因果链: + +1. **转换前**:zhipu 偶发在 assistant 消息中内联输出 `tool_result`(违反 Anthropic 规范),但 zhipu 后端对 assistant 消息中内联的 `tool_result` **不做 `.id` 属性访问**,因此不触发 500。 +2. **转换后**:所有 zhipu 目标通道执行 `enforce_anthropic_tool_pairing`,将 assistant 内联的 `tool_result` 搬迁到紧随的 user 消息。zhipu 后端对 user 消息中的 `tool_result` **执行 `.id` 属性访问**(代码路径不同),触发 `AttributeError` → 500。 +3. **`_inject_tool_result_id_for_zhipu` 无效**:该函数往 JSON dict 注入 `"id": tool_use_id`,但 zhipu 后端的 `ClaudeContentBlockToolResult` Python 类不从 JSON 读取 `id` 字段(类定义中无此属性),注入的值在反序列化时被丢弃。 + +**实证依据**:用户确认「转换通道之前 zhipu 正常,转换通道之后才出现 500 错误」。 + +**处理方式**(2026-04-29 更新) + +从所有 zhipu 目标转换通道中移除以下三个步骤: + +| 移除项 | 原因 | +|--------|------| +| `enforce_anthropic_tool_pairing` | 搬迁 `tool_result` 到 user 消息触发 zhipu 500 | +| `_inject_tool_result_id_for_zhipu` | zhipu 类不读取注入的 `id`,无效且可能干扰 | +| `_strip_cache_control` | zhipu 原生支持 `cache_control`(cache_read 已实证),剥离反损性能 | + +保留的必要步骤: + +| 保留项 | 原因 | +|--------|------| +| `strip_thinking_blocks` | copilot/anthropic 的 thinking 签名 zhipu 无法验证 | +| 移除 `thinking`/`extended_thinking` 顶层参数 | zhipu 不支持 | +| `_remove_vendor_blocks(server_tool_use_delta)` | zhipu 自身流式残块 | +| `_remove_vendor_blocks(server_tool_use)` | Anthropic beta 块,zhipu 不支持 | + +**涉及变更的转换通道**: +- `prepare_copilot_to_zhipu` — 移除 cache_control / tool pairing / id 注入 +- `prepare_anthropic_to_zhipu` — 移除 cache_control / tool pairing / id 注入 +- `prepare_zhipu_self_cleanup` — 移除 tool pairing / id 注入 -- 在 `vendor_channels.py` 新增 `_inject_tool_result_id_for_zhipu` 辅助函数:扫描所有消息中的 `tool_result` 块,将 `tool_use_id` 值复制为 `id` 字段(仅注入尚无 `id` 的块,保持幂等) -- 在三个 targeting zhipu 的转换通道末尾统一调用此辅助函数 -- 保留 executor 中已有的 500 错误检测作为纵深防御 +**注意**: `prepare_zhipu_to_anthropic` 和 `prepare_zhipu_to_copilot` 不受影响(目标是 anthropic/copilot,不是 zhipu),仍保留 `enforce_anthropic_tool_pairing`。 **后续防范** -- 其他 `NativeAnthropicVendor` 子类若出现类似的「后端期望非标准字段」问题,可参考此模式在对应的转换通道中注入兼容字段。 -- 当 zhipu 后端修复此 bug(不再访问 `.id`)后,此 workaround 仍安全保留(多一个 `id` 字段不影响 Anthropic API 语义)。 +- **转换通道的「最小干预」原则**:跨供应商转换应仅清理目标供应商**确认不支持**的特性。未经验证的「预防性清理」(如剥离 cache_control)可能误伤供应商原生支持的功能,甚至引入新的故障。 +- **workaround 须验证有效**:`_inject_tool_result_id_for_zhipu` 虽有注释说明目的,但未经验证其有效性即合入。后续 workaround 须附带验证证据(如 curl 复现、上游确认)。 +- **zhipu 后端 bug 跟踪**:`ClaudeContentBlockToolResult` 类缺少 `id` 属性是 zhipu 上游 bug。若 zhipu 修复此 bug,可考虑恢复 tool pairing 以获得更严格的消息结构校验。 **同类问题影响与处理注意事项** -- `enforce_anthropic_tool_pairing` 合成的 `is_error=True` 占位块只有 `tool_use_id`,同样需要 `id` 注入——辅助函数在配对后统一处理,无需在合成逻辑中单独添加。 -- `tool_result.id` 的值设为与 `tool_use_id` 相同,语义上可视为「内容块标识符」,对 zhipu 后端足够区分不同 tool_result 块。 +- `NativeAnthropicVendor` 子类的自清理通道应**精确剪裁**:仅修复 vendor 自身拒绝的产物,不做跨供应商的全量清理。 +- 当 zhipu 后端出现新的 400 拒绝(如 inline tool_result 再次被拒),应优先调查是 zhipu 后端变更还是请求格式问题,而非立即加回 tool pairing(可能重新触发 500)。 +- `_inject_tool_result_id_for_zhipu` 函数暂时保留在代码中(未删除),标记为 deprecated,待确认不需要后清理。 diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index dd3f3c7..65b669b 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -572,13 +572,18 @@ def infer_source_vendor_from_body(body: dict[str, Any]) -> str | None: def prepare_copilot_to_zhipu( body: dict[str, Any], ) -> tuple[dict[str, Any], list[str]]: - """copilot → zhipu 转换: 清理 copilot 产物以适配 GLM-5. + """copilot → zhipu 转换: 仅清理 copilot 产物中 zhipu 确认不支持的部分. - GLM-5 的 Anthropic 兼容端点对以下特性支持不完整: - - thinking / redacted_thinking 块 (signature 由非 Anthropic 签发) - - cache_control 字段 - - 跨供应商产物 (misplaced tool_result, 非标准 tool_use ID) - - 顶层 thinking / extended_thinking 参数 + GLM-5 的 Anthropic 兼容端点: + - ✗ thinking / redacted_thinking 块 (signature 由非 Anthropic 签发) + - ✓ cache_control 字段 (cache_read 已在生产实证) + - ✓ tool_result 在 assistant 消息中内联 (zhipu 自身偶发产出,可自行消化) + - ✗ 顶层 thinking / extended_thinking 参数 + + 注意: 不再执行 enforce_anthropic_tool_pairing 和 _inject_tool_result_id_for_zhipu。 + 实证表明 tool_result 重定位会触发 zhipu 后端 ``'ClaudeContentBlockToolResult' + object has no attribute 'id'`` 500 错误;id 注入对 zhipu 的 Python 类 + (不读取 JSON 中的 id 字段) 亦无效。详见 docs/issue.md。 Returns: (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 @@ -591,27 +596,12 @@ def prepare_copilot_to_zhipu( if stripped: adaptations.append(f"stripped_{stripped}_thinking_blocks") - # Step 2: 移除 cache_control 字段 - removed_cc = _strip_cache_control(prepared) - if removed_cc: - adaptations.append(f"removed_{removed_cc}_cache_control_fields") - - # Step 3: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) + # Step 2: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) for param in ("thinking", "extended_thinking"): if param in prepared: del prepared[param] adaptations.append(f"removed_{param}_param") - # Step 4: 强制 tool_use/tool_result 配对 - pairing_fixes = enforce_anthropic_tool_pairing(prepared.get("messages", [])) - if pairing_fixes: - adaptations.extend(pairing_fixes) - - # Step 5: 为 tool_result 块注入 id 字段(zhipu 后端 bug workaround) - injected = _inject_tool_result_id_for_zhipu(prepared) - if injected: - adaptations.append(f"injected_{injected}_tool_result_id_fields") - return prepared, adaptations @@ -632,9 +622,11 @@ def prepare_anthropic_to_zhipu( Anthropic API 可能产生的非兼容产物: - ``server_tool_use`` blocks(web search / computer use 等 beta 功能) - ``thinking`` / ``redacted_thinking`` blocks(含 Anthropic 签发的 signature) - - ``cache_control`` 字段 - 顶层 ``thinking`` / ``extended_thinking`` 参数 + 注意: 不再移除 cache_control (GLM-5 支持) ,不再执行 tool pairing 和 + id 注入。原因同 prepare_copilot_to_zhipu 的 docstring。 + Returns: (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 """ @@ -651,27 +643,12 @@ def prepare_anthropic_to_zhipu( if stripped: adaptations.append(f"stripped_{stripped}_thinking_blocks") - # Step 3: 移除 cache_control 字段 - removed_cc = _strip_cache_control(prepared) - if removed_cc: - adaptations.append(f"removed_{removed_cc}_cache_control_fields") - - # Step 4: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) + # Step 3: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) for param in ("thinking", "extended_thinking"): if param in prepared: del prepared[param] adaptations.append(f"removed_{param}_param") - # Step 5: 强制 tool_use/tool_result 配对 - pairing_fixes = enforce_anthropic_tool_pairing(prepared.get("messages", [])) - if pairing_fixes: - adaptations.extend(pairing_fixes) - - # Step 6: 为 tool_result 块注入 id 字段(zhipu 后端 bug workaround) - injected = _inject_tool_result_id_for_zhipu(prepared) - if injected: - adaptations.append(f"injected_{injected}_tool_result_id_fields") - return prepared, adaptations @@ -782,25 +759,22 @@ def prepare_zhipu_to_anthropic( def prepare_zhipu_self_cleanup( body: dict[str, Any], ) -> tuple[dict[str, Any], list[str]]: - """zhipu → zhipu 自清理: 仅修复 zhipu 自身无法消化的产物. + """zhipu → zhipu 自清理: 仅剥离 zhipu 自身的流式残块. - GLM-5 偶发地在 assistant 消息中输出 ``tool_result`` 块(违反 Anthropic 规范), - 或在流式响应中暴露 ``server_tool_use_delta`` 私有块。当 Claude Code 将这些 - 产物原样回送下一轮请求时,zhipu 的 Anthropic 兼容端点会以 400 拒绝 - (表现为 "400 + tool_results" 偶发,进而触发到 copilot 的降级)。 + GLM-5 在流式响应中偶发暴露 ``server_tool_use_delta`` 私有块。当 Claude Code + 将这些产物原样回送下一轮请求时,zhipu 的 Anthropic 兼容端点会拒绝。 - 本通道仅修复 zhipu 自身拒绝的两类产物,**保留** 所有 zhipu 原生支持的特性: + 本通道**保留**所有 zhipu 原生支持的特性: - ✓ ``srvtoolu_*`` ID 与 ``server_tool_use`` 类型(zhipu 原生) - ✓ thinking blocks 的 zhipu 自签 signature - ✓ ``cache_control`` 字段(GLM Anthropic 端点支持,cache_read 已实证) - ✓ 顶层 ``thinking`` / ``extended_thinking`` 参数 + - ✓ tool_result 在 assistant 消息中内联(zhipu 自身偶发产出,可自行消化) - 清理操作(顺序、就地、幂等): - 1. 剥离 ``server_tool_use_delta`` 流式残块 - 2. 强制 tool_use/tool_result 配对(关键: 把 assistant 内联的 tool_result - 搬迁到紧随的 user 消息) - 3. 为 ``tool_result`` 块注入 ``id`` 字段(zhipu 后端错误访问 ``.id`` 属性) + 注意: 不再执行 enforce_anthropic_tool_pairing 和 _inject_tool_result_id_for_zhipu。 + 实证表明 tool_result 重定位会触发 zhipu 后端 500 错误。 + 详见 docs/issue.md。 Returns: (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 @@ -813,16 +787,6 @@ def prepare_zhipu_self_cleanup( if removed_vendor_blocks: adaptations.append(f"removed_{removed_vendor_blocks}_zhipu_vendor_blocks") - # Step 2: 强制 tool_use/tool_result 配对 - pairing_fixes = enforce_anthropic_tool_pairing(prepared.get("messages", [])) - if pairing_fixes: - adaptations.extend(pairing_fixes) - - # Step 3: 为 tool_result 块注入 id 字段(zhipu 后端 bug workaround) - injected = _inject_tool_result_id_for_zhipu(prepared) - if injected: - adaptations.append(f"injected_{injected}_tool_result_id_fields") - return prepared, adaptations diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index 7f3193f..f4344a4 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -2034,7 +2034,12 @@ class TestPrepareBodyForTierSelfTransition: """验证 zhipu → zhipu 自转换通道在 _prepare_body_for_tier 中的应用行为.""" def test_applies_zhipu_self_cleanup(self): - """source=zhipu, target=zhipu → 剥离 server_tool_use_delta + tool pairing.""" + """source=zhipu, target=zhipu → 仅剥离 server_tool_use_delta. + + 不再做 tool pairing(搬迁 tool_result 会触发 zhipu 500), + 也不做 id 注入(zhipu 类不读取 JSON 中的 id)。 + inline tool_result 保留在 assistant 消息中,zhipu 可自行消化。 + """ tier = MagicMock() tier.name = "zhipu" @@ -2067,18 +2072,16 @@ def test_applies_zhipu_self_cleanup(self): assert result is not body assert len(body["messages"][0]["content"]) == 3 - # delta 块被剥离, tool_result 被搬迁出 assistant + # delta 块被剥离 assistant_content = result["messages"][0]["content"] - assert all( - b.get("type") not in ("server_tool_use_delta", "tool_result") - for b in assistant_content - ) - # tool_result 已搬到下一个 user 消息 - assert result["messages"][1]["role"] == "user" + assert all(b.get("type") != "server_tool_use_delta" for b in assistant_content) + # inline tool_result 保留在 assistant 中(不再搬迁) assert any( b.get("type") == "tool_result" and b.get("tool_use_id") == "srvtoolu_a" - for b in result["messages"][1]["content"] + for b in assistant_content ) + # 不应插入额外的 user 消息 + assert len(result["messages"]) == 1 def test_self_cleanup_preserves_srvtoolu_ids(self): """回归保护: 自清理通道不得改写 zhipu 原生 srvtoolu_* ID.""" diff --git a/tests/test_vendor_channels.py b/tests/test_vendor_channels.py index b89db15..631ea98 100644 --- a/tests/test_vendor_channels.py +++ b/tests/test_vendor_channels.py @@ -244,7 +244,8 @@ def test_strips_thinking_blocks(self): # 原始 body 未被修改 assert body["messages"][0]["content"][0]["type"] == "thinking" - def test_removes_cache_control(self): + def test_preserves_cache_control(self): + """copilot → zhipu 不再移除 cache_control(zhipu 原生支持).""" body = { "system": [ {"type": "text", "text": "sys", "cache_control": {"type": "ephemeral"}}, @@ -252,8 +253,8 @@ def test_removes_cache_control(self): "messages": [], } prepared, adaptations = prepare_copilot_to_zhipu(body) - assert any("cache_control" in a for a in adaptations) - assert "cache_control" not in prepared["system"][0] + assert not any("cache_control" in a for a in adaptations) + assert "cache_control" in prepared["system"][0] def test_removes_thinking_params(self): body = { @@ -267,7 +268,8 @@ def test_removes_thinking_params(self): assert "removed_thinking_param" in adaptations assert "removed_extended_thinking_param" in adaptations - def test_enforces_tool_pairing(self): + def test_does_not_relocate_tool_results(self): + """copilot → zhipu 不再执行 tool pairing(避免触发 zhipu 500).""" body = { "messages": [ { @@ -288,14 +290,15 @@ def test_enforces_tool_pairing(self): ], } prepared, adaptations = prepare_copilot_to_zhipu(body) + # user 消息内容不变(无 synthesized tool_result) user_content = prepared["messages"][1]["content"] tool_results = [ b for b in user_content if isinstance(b, dict) and b.get("type") == "tool_result" ] - assert len(tool_results) == 1 - assert tool_results[0]["tool_use_id"] == "toolu_1" + assert len(tool_results) == 0 + assert not any("misplaced" in a for a in adaptations) def test_combined_transformations(self): body = { @@ -327,15 +330,17 @@ def test_combined_transformations(self): b.get("type") not in ("thinking", "redacted_thinking") for b in prepared["messages"][0]["content"] ) - assert "cache_control" not in prepared["system"][0] + # cache_control 保留 + assert "cache_control" in prepared["system"][0] assert "thinking" not in prepared + # tool pairing 不执行(user 消息内容不变) user_content = prepared["messages"][1]["content"] tool_results = [ b for b in user_content if isinstance(b, dict) and b.get("type") == "tool_result" ] - assert len(tool_results) == 1 + assert len(tool_results) == 0 def test_preserves_original_body(self): body = { @@ -392,8 +397,8 @@ def test_idempotency(self): assert prepared2 == prepared1 assert adaptations2 == [] - def test_injects_id_on_tool_result_for_zhipu(self): - """copilot → zhipu 转换后 tool_result 应包含 id 字段.""" + def test_no_id_injection_on_tool_result(self): + """copilot → zhipu 转换不再注入 id 字段(zhipu 类不读取,注入无效).""" body = { "messages": [ { @@ -421,8 +426,8 @@ def test_injects_id_on_tool_result_for_zhipu(self): } prepared, adaptations = prepare_copilot_to_zhipu(body) tr = prepared["messages"][1]["content"][0] - assert tr["id"] == "toolu_001" - assert any("injected" in a and "tool_result_id" in a for a in adaptations) + assert "id" not in tr + assert not any("injected" in a for a in adaptations) # ── zhipu → anthropic 转换通道测试 ──────────────────────────────── @@ -758,8 +763,8 @@ def test_strips_server_tool_use_delta(self): assert all(b.get("type") != "server_tool_use_delta" for b in content) assert any("zhipu_vendor_blocks" in a for a in adaptations) - def test_relocates_misplaced_tool_result(self): - """assistant 内联 tool_result 应被搬迁到下一个 user 消息.""" + def test_preserves_inline_tool_result_in_assistant(self): + """assistant 内联 tool_result 保留原位(不再搬迁,避免触发 zhipu 500).""" body = { "messages": [ { @@ -783,49 +788,19 @@ def test_relocates_misplaced_tool_result(self): } prepared, adaptations = prepare_zhipu_self_cleanup(body) - # assistant 消息中应不再包含 tool_result + # assistant 消息中 tool_result 保留原位 assistant_content = prepared["messages"][0]["content"] - assert all(b.get("type") != "tool_result" for b in assistant_content) - # tool_result 已搬到下一个 user 消息 - user_content = prepared["messages"][1]["content"] assert any( b.get("type") == "tool_result" and b.get("tool_use_id") == "srvtoolu_a" - for b in user_content + for b in assistant_content ) - assert "misplaced_tool_result_relocated" in adaptations - - def test_injects_id_on_relocated_tool_result(self): - """搬迁后的 tool_result 块应具有 id 字段(zhipu 后端 bug workaround).""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_001", - "name": "bash", - "input": {}, - }, - { - "type": "tool_result", - "tool_use_id": "toolu_001", - "content": "ok", - }, - ], - }, - {"role": "user", "content": []}, - ], - } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - - user_content = prepared["messages"][1]["content"] - tr = next(b for b in user_content if b.get("type") == "tool_result") - assert tr["id"] == "toolu_001" - assert any("injected" in a and "tool_result_id" in a for a in adaptations) + # 不应有 tool pairing 相关的 adaptations + assert not any("misplaced" in a for a in adaptations) + assert not any("orphaned" in a for a in adaptations) + assert not any("injected" in a for a in adaptations) - def test_injects_id_on_existing_user_tool_result(self): - """user 消息中已有的 tool_result 也应被注入 id 字段.""" + def test_no_id_injection(self): + """自清理通道不再注入 id 字段(zhipu 类不读取,注入无效).""" body = { "messages": [ { @@ -854,11 +829,11 @@ def test_injects_id_on_existing_user_tool_result(self): prepared, adaptations = prepare_zhipu_self_cleanup(body) tr = prepared["messages"][1]["content"][0] - assert tr["id"] == "toolu_001" - assert any("injected" in a and "tool_result_id" in a for a in adaptations) + assert "id" not in tr + assert not any("injected" in a for a in adaptations) - def test_skips_id_injection_when_already_present(self): - """tool_result 已有 id 字段时不应重复注入.""" + def test_preserves_existing_id(self): + """tool_result 已有 id 字段时应原样保留,不被修改.""" body = { "messages": [ { @@ -878,7 +853,7 @@ def test_skips_id_injection_when_already_present(self): { "type": "tool_result", "tool_use_id": "toolu_001", - "id": "toolu_001", + "id": "original_id", "content": "ok", }, ], @@ -886,7 +861,8 @@ def test_skips_id_injection_when_already_present(self): ], } prepared, adaptations = prepare_zhipu_self_cleanup(body) - # 不应产生注入 adaptation(id 已存在) + tr = prepared["messages"][1]["content"][0] + assert tr["id"] == "original_id" assert not any("injected" in a for a in adaptations) def test_preserves_srvtoolu_ids(self): @@ -1060,11 +1036,11 @@ def test_does_not_mutate_input(self): assert body == original def test_combined_artifacts(self): - """端到端: server_tool_use_delta 被剥, server_tool_use 保留, 错位 tool_result 搬迁. + """端到端: server_tool_use_delta 被剥, 其余保留原位. - 典型场景: Claude Code 的客户端工具 (Bash/Read 等) 以 ``tool_use`` 形式 - emit, 其错位的 ``tool_result`` 应被重定位; zhipu 原生 ``server_tool_use`` - 块不需要客户端 tool_result, 仅需保留原状. + 典型场景: zhipu 偶发在 assistant 消息中产出多种块。 + server_tool_use_delta 被剥离,其余块(含 inline tool_result)保留原位, + 不再做 tool pairing 和 id 注入。 """ body = { "messages": [ @@ -1098,8 +1074,11 @@ def test_combined_artifacts(self): assistant_content = prepared["messages"][0]["content"] # delta 被剥离 assert all(b.get("type") != "server_tool_use_delta" for b in assistant_content) - # 错位 tool_result 被搬出 assistant - assert all(b.get("type") != "tool_result" for b in assistant_content) + # inline tool_result 保留在 assistant 中(不再搬迁) + assert any( + b.get("type") == "tool_result" and b.get("tool_use_id") == "toolu_bash_001" + for b in assistant_content + ) # server_tool_use 与其 srvtoolu_* ID 完整保留 srv_block = next( b for b in assistant_content if b.get("type") == "server_tool_use" @@ -1110,15 +1089,13 @@ def test_combined_artifacts(self): b for b in assistant_content if b.get("type") == "tool_use" ) assert tool_use_block["id"] == "toolu_bash_001" - # 后续 user 消息已被插入并包含 tool_result - assert prepared["messages"][1]["role"] == "user" - assert any( - b.get("type") == "tool_result" and b.get("tool_use_id") == "toolu_bash_001" - for b in prepared["messages"][1]["content"] - ) - # 关键 adaptation 标签均出现 + # 不插入额外 user 消息 + assert len(prepared["messages"]) == 1 + # 关键 adaptation 标签 assert any("zhipu_vendor_blocks" in a for a in adaptations) - assert "misplaced_tool_result_relocated" in adaptations + # 不应有 tool pairing / id 注入 相关 adaptation + assert not any("misplaced" in a for a in adaptations) + assert not any("injected" in a for a in adaptations) # ── 转换注册表测试 ──────────────────────────────────────────── @@ -2689,7 +2666,8 @@ def test_strips_thinking_blocks(self): {"type": "text", "text": "response"}, ] - def test_removes_cache_control(self): + def test_preserves_cache_control(self): + """anthropic → zhipu 不再移除 cache_control(zhipu 原生支持).""" body = { "system": [ {"type": "text", "text": "sys", "cache_control": {"type": "ephemeral"}}, @@ -2697,8 +2675,8 @@ def test_removes_cache_control(self): "messages": [], } prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert any("cache_control" in a for a in adaptations) - assert "cache_control" not in prepared["system"][0] + assert not any("cache_control" in a for a in adaptations) + assert "cache_control" in prepared["system"][0] def test_removes_thinking_params(self): body = { @@ -2712,7 +2690,8 @@ def test_removes_thinking_params(self): assert "removed_thinking_param" in adaptations assert "removed_extended_thinking_param" in adaptations - def test_enforces_tool_pairing(self): + def test_does_not_relocate_tool_results(self): + """anthropic → zhipu 不再执行 tool pairing(避免触发 zhipu 500).""" body = { "messages": [ { @@ -2730,14 +2709,13 @@ def test_enforces_tool_pairing(self): ], } prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert "orphaned_tool_use_repaired" in adaptations + assert not any("orphaned" in a for a in adaptations) user_results = [ b for b in prepared["messages"][1]["content"] if isinstance(b, dict) and b.get("type") == "tool_result" ] - assert len(user_results) == 1 - assert user_results[0]["tool_use_id"] == "toolu_1" + assert len(user_results) == 0 def test_preserves_original_body(self): body = { @@ -2847,7 +2825,7 @@ def test_inserts_placeholder_when_all_blocks_stripped(self): ] def test_combined_server_tool_use_and_thinking(self): - """server_tool_use + thinking + cache_control 的组合清洗.""" + """server_tool_use + thinking 的组合清洗, cache_control 保留.""" body = { "system": [ {"type": "text", "text": "sys", "cache_control": {"type": "ephemeral"}}, @@ -2874,13 +2852,14 @@ def test_combined_server_tool_use_and_thinking(self): b.get("type") not in ("thinking", "redacted_thinking", "server_tool_use") for b in prepared["messages"][0]["content"] ) - assert "cache_control" not in prepared["system"][0] + # cache_control 保留(zhipu 原生支持) + assert "cache_control" in prepared["system"][0] assert "thinking" not in prepared assert any("server_tool_use" in a for a in adaptations) assert any("thinking_blocks" in a for a in adaptations) - def test_injects_id_on_tool_result_for_zhipu(self): - """anthropic → zhipu 转换后 tool_result 应包含 id 字段.""" + def test_no_id_injection_on_tool_result(self): + """anthropic → zhipu 转换不再注入 id 字段(zhipu 类不读取,注入无效).""" body = { "messages": [ { @@ -2908,5 +2887,5 @@ def test_injects_id_on_tool_result_for_zhipu(self): } prepared, adaptations = prepare_anthropic_to_zhipu(body) tr = prepared["messages"][1]["content"][0] - assert tr["id"] == "toolu_001" - assert any("injected" in a and "tool_result_id" in a for a in adaptations) + assert "id" not in tr + assert not any("injected" in a for a in adaptations) From ed71c02d2961166bfbea0767c4d4bafa57b38c5f Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 29 Apr 2026 22:18:36 +0800 Subject: [PATCH 07/66] =?UTF-8?q?docs(agents):=20=E6=96=B0=E5=A2=9E"In-dep?= =?UTF-8?q?th=20and=20close=20to=20the=20facts"=E5=8D=8F=E4=BD=9C=E5=87=86?= =?UTF-8?q?=E5=88=99;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index 20c1143..30d9d7a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,6 +52,7 @@ 1. **Python**: 严禁使用 pip/poetry,**必须**统一使用 `uv` 进行包管理与脚本执行(如 `uv run`); 2. **JavaScript/TypeScript**: 严禁使用 npm/yarn,**必须**统一使用 `pnpm` 进行包管理与脚本执行。 - **Database Management**: 谨慎操作,数据迁移、测试等操作严禁将现有数据删除,谨慎操作数据迁移的回滚,防止数据被清理。 +- **In-depth and close to the facts**:系统且全面地进行问题的分析,深入贴近事实,如有疑问,需先发问,不要乱做决定。 ## Documentation Standards (文档规范) From d622333e5d10545c8103c8d43879539596acea91 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 29 Apr 2026 22:18:40 +0800 Subject: [PATCH 08/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a5=20=E2=86=92=200.3.1a6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 931db2c..defd147 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a5" +version = "0.3.1a6" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 9910412..6872550 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a5" +version = "0.3.1a6" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From cff2dc9984beb5b3251f0e567461b09638867ead Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Thu, 30 Apr 2026 09:20:23 +0800 Subject: [PATCH 09/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a6=20=E2=86=92=200.3.1a7;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index defd147..9e62114 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a6" +version = "0.3.1a7" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 6872550..3558c1f 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a6" +version = "0.3.1a7" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 43488a194b0c99303b9b23387aa2d2120d6258d4 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 10:55:16 +0800 Subject: [PATCH 10/66] =?UTF-8?q?fix(vendor-channels):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20zhipu=20tool=5Fresult=20500=20=E7=BA=A7=E8=81=94?= =?UTF-8?q?=E6=95=85=E9=9A=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(vendor-channels): 移除 zhipu 目标转换中的有害步骤,修复 500 级联故障; 从 prepare_copilot_to_zhipu、prepare_anthropic_to_zhipu、prepare_zhipu_self_cleanup 三个通道中移除 enforce_anthropic_tool_pairing(tool_result 搬迁触发 zhipu 500)、 _inject_tool_result_id_for_zhipu(zhipu 类不读取 JSON id,注入无效)、 _strip_cache_control(GLM-5 原生支持 cache_control)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(vendor-channels): 修复 zhipu 移除 id 注入后遗留测试断言错误; 6 处测试的断言仍检查旧行为(id 被注入 / cache_control 被移除 / tool_result 被搬迁), 导致 KeyError 或 AssertionError。统一更新为验证新语义:id 不注入、cache_control 保留、 inline tool_result 保留在 assistant 原位。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(vendor-channels): 在 tier 门控层主动跳过含 tool_result 的 zhipu 请求; 修正前两次诊断:zhipu 500 发生于所有含 tool_result 块的请求(非仅 tool pairing 后)。 根因是 zhipu 后端 ClaudeContentBlockToolResult 类缺少 id 属性且 JSON 注入无效。 通过 RequestCapabilities.has_tool_results 门控,在发送请求前跳过 zhipu tier, 消除「尝试 → 500 → failover」的无效延迟。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(vendor-channels): 将 tool_use/tool_result 展平为 text 块,彻底修复 zhipu 500 错误 zhipu 后端的 ClaudeContentBlockToolResult 类缺少 id 属性, 无法通过 JSON 注入修复。改用在转换通道中将所有 tool_use 和 tool_result 块转为 text 块的策略,让 zhipu 仅看到纯文本对话。 - 新增 _flatten_tool_blocks 辅助函数 - 三个 zhipu 目标通道均调用展平逻辑 - 移除 ZhipuVendor.supports_request 中的 tool_result 门控 - 更新全部相关测试用例 Co-Authored-By: Claude Opus 4.7 --------- Co-authored-by: Claude Opus 4.7 --- docs/issue.md | 34 +++--- src/coding/proxy/convert/vendor_channels.py | 101 ++++++++++++++++ src/coding/proxy/model/vendor.py | 2 + src/coding/proxy/routing/error_classifier.py | 18 ++- tests/test_error_classifier.py | 72 ++++++++++++ tests/test_model_vendor.py | 15 ++- tests/test_router_executor.py | 16 +-- tests/test_types.py | 1 + tests/test_vendor_channels.py | 114 +++++++++---------- tests/test_vendors.py | 38 ++++++- 10 files changed, 315 insertions(+), 96 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index bac2f7e..e8d6edf 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -158,29 +158,35 @@ WARNING zhipu stream error: status=500 body='...message":"\'ClaudeContentBlockTo zhipu 后端在解析 `tool_result` 内容块时错误地访问 `.id` 属性。但 Anthropic API 规范中 `tool_result` 块只有 `tool_use_id` 字段(用于关联对应的 `tool_use`),没有 `id` 字段。 -**根因**(2026-04-29 复盘更新) +**根因**(2026-04-29 第二次复盘更新) -**初始诊断**(已推翻):认为 zhipu 后端期望 `tool_result` 有 `id` 字段,通过 `_inject_tool_result_id_for_zhipu` 注入 `id = tool_use_id` 可绕过。 +**第一次诊断**(已推翻):认为 `_inject_tool_result_id_for_zhipu` 注入 `id` 可绕过。实证:注入 114 个块后 500 依旧。 -**实际根因**:转换通道本身引入的问题。具体因果链: +**第二次诊断**(已推翻):认为 `enforce_anthropic_tool_pairing` 搬迁 tool_result 到 user 消息是触发条件。实证:移除 tool pairing 后 500 依旧(日志显示 `copilot → zhipu: stripped_19_thinking_blocks, removed_thinking_param`,无 `misplaced_tool_result_relocated`)。 -1. **转换前**:zhipu 偶发在 assistant 消息中内联输出 `tool_result`(违反 Anthropic 规范),但 zhipu 后端对 assistant 消息中内联的 `tool_result` **不做 `.id` 属性访问**,因此不触发 500。 -2. **转换后**:所有 zhipu 目标通道执行 `enforce_anthropic_tool_pairing`,将 assistant 内联的 `tool_result` 搬迁到紧随的 user 消息。zhipu 后端对 user 消息中的 `tool_result` **执行 `.id` 属性访问**(代码路径不同),触发 `AttributeError` → 500。 -3. **`_inject_tool_result_id_for_zhipu` 无效**:该函数往 JSON dict 注入 `"id": tool_use_id`,但 zhipu 后端的 `ClaudeContentBlockToolResult` Python 类不从 JSON 读取 `id` 字段(类定义中无此属性),注入的值在反序列化时被丢弃。 +**实际根因**:zhipu 后端的 `ClaudeContentBlockToolResult` Python 类**没有 `id` 属性**,但 zhipu 代码在处理**所有** `tool_result` 块时都访问 `obj.id`,无论块位于 assistant 还是 user 消息。三层因果链: -**实证依据**:用户确认「转换通道之前 zhipu 正常,转换通道之后才出现 500 错误」。 +1. **zhipu 后端 Bug**(不可修复 — 上游代码):`ClaudeContentBlockToolResult` 类缺少 `id` 属性,zhipu 代码访问时触发 `AttributeError` → 500。 +2. **JSON 注入无效**(已实证):`_inject_tool_result_id_for_zhipu` 往 JSON dict 注入 `id = tool_use_id`,但 zhipu 反序列化框架不读取此字段,Python 对象仍无 `id` 属性。 +3. **无预防机制**(proxy 层可修复):tier 门控系统不检查请求是否含 `tool_result` 块 → 每次请求先发 zhipu → 必然 500 → failover → 额外 ~2 秒延迟。 -**处理方式**(2026-04-29 更新) +**实证依据**: +- 有注入(114 个块)→ 500;无注入 → 500。结论:注入无效。 +- 有 tool pairing → 500;无 tool pairing → 500。结论:tool pairing 不是触发条件。 +- 首次请求(无 tool_result 块)→ zhipu 正常。结论:500 由 tool_result 块本身触发。 -从所有 zhipu 目标转换通道中移除以下三个步骤: +**处理方式**(2026-04-29 第二次更新) -| 移除项 | 原因 | +从所有 zhipu 目标转换通道中移除有害/无效步骤(`enforce_anthropic_tool_pairing`、`_inject_tool_result_id_for_zhipu`、`_strip_cache_control`),并在 `ZhipuVendor.supports_request` 中增加 `has_tool_results` 门控:当请求包含 `tool_result` 块时主动拒绝 zhipu tier,避免「尝试 → 500 → failover」的无效延迟。 + +| 变更项 | 说明 | |--------|------| -| `enforce_anthropic_tool_pairing` | 搬迁 `tool_result` 到 user 消息触发 zhipu 500 | -| `_inject_tool_result_id_for_zhipu` | zhipu 类不读取注入的 `id`,无效且可能干扰 | -| `_strip_cache_control` | zhipu 原生支持 `cache_control`(cache_read 已实证),剥离反损性能 | +| `RequestCapabilities.has_tool_results` | 新增字段,检测请求中是否含 `tool_result` 块 | +| `CapabilityLossReason.TOOL_RESULTS` | 新增枚举值,标记 tool_result 兼容性问题 | +| `ZhipuVendor.supports_request` | 覆写方法,`has_tool_results=True` 时拒绝请求 | +| `build_request_capabilities` | 扩展 tool_result 块检测逻辑 | -保留的必要步骤: +保留的 zhipu 目标转换通道精简步骤: | 保留项 | 原因 | |--------|------| diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index 65b669b..93eb328 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -352,6 +352,92 @@ def _inject_tool_result_id_for_zhipu(body: dict[str, Any]) -> int: return injected +def _extract_text_from_content(content: Any) -> str: + """从 tool_result 的 content 字段提取可读文本.""" + if isinstance(content, str): + return content + if isinstance(content, list): + parts: list[str] = [] + for item in content: + if isinstance(item, str): + parts.append(item) + elif isinstance(item, dict) and item.get("type") == "text": + parts.append(item.get("text", "")) + return " ".join(parts) + return "" + + +def _flatten_tool_blocks(body: dict[str, Any]) -> int: + """将 messages 中的 tool_use 和 tool_result 块转为 text 块. + + zhipu GLM-5 后端的 ``ClaudeContentBlockToolResult`` 类缺少 ``id`` 属性, + 导致处理 tool_result 块时触发 ``AttributeError`` → HTTP 500。 + 此函数将所有 tool_use / tool_result 块转为纯文本表示, + 让 zhipu 以普通文本对话处理,彻底规避反序列化缺陷。 + + Returns: + 被转换的 tool_use + tool_result 块总数。 + """ + import json as _json + + converted = 0 + for message in body.get("messages", []): + if not isinstance(message, dict): + continue + content = message.get("content") + if not isinstance(content, list): + continue + + new_blocks: list[dict[str, Any]] = [] + for block in content: + if not isinstance(block, dict): + new_blocks.append(block) + continue + + block_type = block.get("type") + + if block_type == "tool_use": + name = block.get("name", "unknown") + input_data = block.get("input", {}) + try: + args_text = _json.dumps(input_data, ensure_ascii=False) + except (TypeError, ValueError): + args_text = str(input_data) + # 截断过长参数 + if len(args_text) > 2000: + args_text = args_text[:1997] + "..." + new_blocks.append( + {"type": "text", "text": f"[Tool Call: {name}({args_text})]"} + ) + converted += 1 + + elif block_type == "tool_result": + tool_use_id = block.get("tool_use_id", "?") + is_error = block.get("is_error", False) + result_text = _extract_text_from_content(block.get("content")) + if len(result_text) > 2000: + result_text = result_text[:1997] + "..." + prefix = "[ERROR] " if is_error else "" + new_blocks.append( + { + "type": "text", + "text": f"{prefix}[Tool Result for {tool_use_id}: {result_text}]", + } + ) + converted += 1 + + else: + new_blocks.append(block) + + # 如果 content 为空则插入占位 + if not new_blocks: + new_blocks = [{"type": "text", "text": "..."}] + + message["content"] = new_blocks + + return converted + + def _strip_cache_control(body: dict[str, Any]) -> int: """从 system/messages/tools 中移除 cache_control 字段(就地). @@ -602,6 +688,11 @@ def prepare_copilot_to_zhipu( del prepared[param] adaptations.append(f"removed_{param}_param") + # Step 3: 展平 tool_use/tool_result 为 text 块 + flattened = _flatten_tool_blocks(prepared) + if flattened: + adaptations.append(f"flattened_{flattened}_tool_blocks") + return prepared, adaptations @@ -649,6 +740,11 @@ def prepare_anthropic_to_zhipu( del prepared[param] adaptations.append(f"removed_{param}_param") + # Step 4: 展平 tool_use/tool_result 为 text 块 + flattened = _flatten_tool_blocks(prepared) + if flattened: + adaptations.append(f"flattened_{flattened}_tool_blocks") + return prepared, adaptations @@ -787,6 +883,11 @@ def prepare_zhipu_self_cleanup( if removed_vendor_blocks: adaptations.append(f"removed_{removed_vendor_blocks}_zhipu_vendor_blocks") + # Step 2: 展平 tool_use/tool_result 为 text 块 + flattened = _flatten_tool_blocks(prepared) + if flattened: + adaptations.append(f"flattened_{flattened}_tool_blocks") + return prepared, adaptations diff --git a/src/coding/proxy/model/vendor.py b/src/coding/proxy/model/vendor.py index dd5ef4f..e28c64d 100644 --- a/src/coding/proxy/model/vendor.py +++ b/src/coding/proxy/model/vendor.py @@ -99,6 +99,7 @@ class CapabilityLossReason(Enum): IMAGES = "images" VENDOR_TOOLS = "vendor_tools" METADATA = "metadata" + TOOL_RESULTS = "tool_results" @dataclass(frozen=True) @@ -109,6 +110,7 @@ class RequestCapabilities: has_thinking: bool = False has_images: bool = False has_metadata: bool = False + has_tool_results: bool = False @dataclass(frozen=True) diff --git a/src/coding/proxy/routing/error_classifier.py b/src/coding/proxy/routing/error_classifier.py index 74bbb32..fae2eb0 100644 --- a/src/coding/proxy/routing/error_classifier.py +++ b/src/coding/proxy/routing/error_classifier.py @@ -111,15 +111,22 @@ def is_semantic_rejection( def build_request_capabilities(body: dict[str, Any]) -> RequestCapabilities: """从请求体提取能力画像.""" has_images = False + has_tool_results = False for msg in body.get("messages", []): content = msg.get("content") if not isinstance(content, list): continue - if any( - isinstance(block, dict) and block.get("type") == "image" - for block in content - ): - has_images = True + for block in content: + if not isinstance(block, dict): + continue + block_type = block.get("type") + if block_type == "image" and not has_images: + has_images = True + elif block_type == "tool_result" and not has_tool_results: + has_tool_results = True + if has_images and has_tool_results: + break + if has_images and has_tool_results: break return RequestCapabilities( @@ -127,4 +134,5 @@ def build_request_capabilities(body: dict[str, Any]) -> RequestCapabilities: has_thinking=bool(body.get("thinking") or body.get("extended_thinking")), has_images=has_images, has_metadata=bool(body.get("metadata")), + has_tool_results=has_tool_results, ) diff --git a/tests/test_error_classifier.py b/tests/test_error_classifier.py index 90cb36e..8a37e65 100644 --- a/tests/test_error_classifier.py +++ b/tests/test_error_classifier.py @@ -362,3 +362,75 @@ def test_string_content_not_image(): def test_empty_messages(): caps = build_request_capabilities({"model": "m", "messages": []}) assert caps.has_images is False + assert caps.has_tool_results is False + + +def test_tool_results_in_user_message(): + caps = build_request_capabilities( + { + "model": "m", + "messages": [ + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_1", + "content": "ok", + } + ], + } + ], + } + ) + assert caps.has_tool_results is True + + +def test_tool_results_in_assistant_message(): + caps = build_request_capabilities( + { + "model": "m", + "messages": [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_1", + "name": "bash", + "input": {}, + }, + { + "type": "tool_result", + "tool_use_id": "toolu_1", + "content": "ok", + }, + ], + } + ], + } + ) + assert caps.has_tool_results is True + + +def test_no_tool_results(): + caps = build_request_capabilities( + { + "model": "m", + "messages": [ + {"role": "user", "content": "hello"}, + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_1", + "name": "bash", + "input": {}, + } + ], + }, + ], + } + ) + assert caps.has_tool_results is False diff --git a/tests/test_model_vendor.py b/tests/test_model_vendor.py index 14895e2..8d468a3 100644 --- a/tests/test_model_vendor.py +++ b/tests/test_model_vendor.py @@ -115,13 +115,20 @@ def test_all_member_values(self): assert CapabilityLossReason.METADATA.value == "metadata" def test_member_count(self): - """枚举成员数量固定为 5.""" - assert len(CapabilityLossReason) == 5 + """枚举成员数量.""" + assert len(CapabilityLossReason) == 6 def test_can_iterate(self): """可遍历所有成员.""" names = {m.name for m in CapabilityLossReason} - assert names == {"TOOLS", "THINKING", "IMAGES", "VENDOR_TOOLS", "METADATA"} + assert names == { + "TOOLS", + "THINKING", + "IMAGES", + "VENDOR_TOOLS", + "METADATA", + "TOOL_RESULTS", + } def test_lookup_by_value(self): """可通过 value 反查成员.""" @@ -144,6 +151,7 @@ def test_defaults_all_false(self): assert caps.has_thinking is False assert caps.has_images is False assert caps.has_metadata is False + assert caps.has_tool_results is False def test_custom_true_values(self): """自定义构造: 指定 True 的字段正确赋值.""" @@ -152,6 +160,7 @@ def test_custom_true_values(self): assert caps.has_images is True assert caps.has_thinking is False assert caps.has_metadata is False + assert caps.has_tool_results is False def test_frozen_immutable(self): """frozen dataclass: 赋值操作抛 AttributeError.""" diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index f4344a4..b06794f 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -2034,12 +2034,7 @@ class TestPrepareBodyForTierSelfTransition: """验证 zhipu → zhipu 自转换通道在 _prepare_body_for_tier 中的应用行为.""" def test_applies_zhipu_self_cleanup(self): - """source=zhipu, target=zhipu → 仅剥离 server_tool_use_delta. - - 不再做 tool pairing(搬迁 tool_result 会触发 zhipu 500), - 也不做 id 注入(zhipu 类不读取 JSON 中的 id)。 - inline tool_result 保留在 assistant 消息中,zhipu 可自行消化。 - """ + """source=zhipu, target=zhipu → 剥离 server_tool_use_delta 并展平 tool 块.""" tier = MagicMock() tier.name = "zhipu" @@ -2075,13 +2070,10 @@ def test_applies_zhipu_self_cleanup(self): # delta 块被剥离 assistant_content = result["messages"][0]["content"] assert all(b.get("type") != "server_tool_use_delta" for b in assistant_content) - # inline tool_result 保留在 assistant 中(不再搬迁) - assert any( - b.get("type") == "tool_result" and b.get("tool_use_id") == "srvtoolu_a" - for b in assistant_content + # tool_use 和 tool_result 被展平为 text + assert all( + b.get("type") not in ("tool_use", "tool_result") for b in assistant_content ) - # 不应插入额外的 user 消息 - assert len(result["messages"]) == 1 def test_self_cleanup_preserves_srvtoolu_ids(self): """回归保护: 自清理通道不得改写 zhipu 原生 srvtoolu_* ID.""" diff --git a/tests/test_types.py b/tests/test_types.py index eebecb7..2b783ad 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -67,6 +67,7 @@ def test_request_capabilities_defaults(): assert caps.has_thinking is False assert caps.has_images is False assert caps.has_metadata is False + assert caps.has_tool_results is False def test_request_capabilities_immutable(): diff --git a/tests/test_vendor_channels.py b/tests/test_vendor_channels.py index 631ea98..535e30f 100644 --- a/tests/test_vendor_channels.py +++ b/tests/test_vendor_channels.py @@ -268,8 +268,8 @@ def test_removes_thinking_params(self): assert "removed_thinking_param" in adaptations assert "removed_extended_thinking_param" in adaptations - def test_does_not_relocate_tool_results(self): - """copilot → zhipu 不再执行 tool pairing(避免触发 zhipu 500).""" + def test_flattens_tool_use_blocks(self): + """copilot → zhipu 将 tool_use 展平为 text 块.""" body = { "messages": [ { @@ -279,7 +279,7 @@ def test_does_not_relocate_tool_results(self): "type": "tool_use", "id": "toolu_1", "name": "bash", - "input": {}, + "input": {"command": "ls"}, }, ], }, @@ -290,15 +290,15 @@ def test_does_not_relocate_tool_results(self): ], } prepared, adaptations = prepare_copilot_to_zhipu(body) - # user 消息内容不变(无 synthesized tool_result) - user_content = prepared["messages"][1]["content"] - tool_results = [ - b - for b in user_content - if isinstance(b, dict) and b.get("type") == "tool_result" - ] - assert len(tool_results) == 0 - assert not any("misplaced" in a for a in adaptations) + assert any("flattened" in a for a in adaptations) + # tool_use 被转为 text + assistant_content = prepared["messages"][0]["content"] + assert all(b.get("type") != "tool_use" for b in assistant_content) + assert any( + "Tool Call: bash" in b.get("text", "") + for b in assistant_content + if b.get("type") == "text" + ) def test_combined_transformations(self): body = { @@ -333,14 +333,9 @@ def test_combined_transformations(self): # cache_control 保留 assert "cache_control" in prepared["system"][0] assert "thinking" not in prepared - # tool pairing 不执行(user 消息内容不变) - user_content = prepared["messages"][1]["content"] - tool_results = [ - b - for b in user_content - if isinstance(b, dict) and b.get("type") == "tool_result" - ] - assert len(tool_results) == 0 + # tool_use 被展平为 text + assistant_content = prepared["messages"][0]["content"] + assert all(b.get("type") != "tool_use" for b in assistant_content) def test_preserves_original_body(self): body = { @@ -397,8 +392,8 @@ def test_idempotency(self): assert prepared2 == prepared1 assert adaptations2 == [] - def test_no_id_injection_on_tool_result(self): - """copilot → zhipu 转换不再注入 id 字段(zhipu 类不读取,注入无效).""" + def test_flattens_tool_result_in_user_message(self): + """copilot → zhipu 将 user 消息中的 tool_result 展平为 text.""" body = { "messages": [ { @@ -425,9 +420,10 @@ def test_no_id_injection_on_tool_result(self): ], } prepared, adaptations = prepare_copilot_to_zhipu(body) - tr = prepared["messages"][1]["content"][0] - assert "id" not in tr - assert not any("injected" in a for a in adaptations) + # tool_result 被展平为 text + user_content = prepared["messages"][1]["content"] + assert all(b.get("type") != "tool_result" for b in user_content) + assert any("flattened" in a for a in adaptations) # ── zhipu → anthropic 转换通道测试 ──────────────────────────────── @@ -764,7 +760,7 @@ def test_strips_server_tool_use_delta(self): assert any("zhipu_vendor_blocks" in a for a in adaptations) def test_preserves_inline_tool_result_in_assistant(self): - """assistant 内联 tool_result 保留原位(不再搬迁,避免触发 zhipu 500).""" + """assistant 内联 tool_result 和 tool_use 被展平为 text 块.""" body = { "messages": [ { @@ -788,19 +784,15 @@ def test_preserves_inline_tool_result_in_assistant(self): } prepared, adaptations = prepare_zhipu_self_cleanup(body) - # assistant 消息中 tool_result 保留原位 + # tool_use 和 tool_result 均被展平为 text assistant_content = prepared["messages"][0]["content"] - assert any( - b.get("type") == "tool_result" and b.get("tool_use_id") == "srvtoolu_a" - for b in assistant_content + assert all( + b.get("type") not in ("tool_use", "tool_result") for b in assistant_content ) - # 不应有 tool pairing 相关的 adaptations - assert not any("misplaced" in a for a in adaptations) - assert not any("orphaned" in a for a in adaptations) - assert not any("injected" in a for a in adaptations) + assert any("flattened" in a for a in adaptations) - def test_no_id_injection(self): - """自清理通道不再注入 id 字段(zhipu 类不读取,注入无效).""" + def test_tool_result_flattened_to_text(self): + """自清理通道将 tool_result 展平为 text 块.""" body = { "messages": [ { @@ -827,13 +819,13 @@ def test_no_id_injection(self): ], } prepared, adaptations = prepare_zhipu_self_cleanup(body) + # tool_result 被展平为 text + user_content = prepared["messages"][1]["content"] + assert all(b.get("type") != "tool_result" for b in user_content) + assert any("flattened" in a for a in adaptations) - tr = prepared["messages"][1]["content"][0] - assert "id" not in tr - assert not any("injected" in a for a in adaptations) - - def test_preserves_existing_id(self): - """tool_result 已有 id 字段时应原样保留,不被修改.""" + def test_flattens_tool_result_with_existing_id(self): + """自清理通道将含 id 的 tool_result 也展平为 text.""" body = { "messages": [ { @@ -861,9 +853,10 @@ def test_preserves_existing_id(self): ], } prepared, adaptations = prepare_zhipu_self_cleanup(body) - tr = prepared["messages"][1]["content"][0] - assert tr["id"] == "original_id" - assert not any("injected" in a for a in adaptations) + # tool_result 被展平为 text,不再保留原结构 + user_content = prepared["messages"][1]["content"] + assert all(b.get("type") != "tool_result" for b in user_content) + assert any("flattened" in a for a in adaptations) def test_preserves_srvtoolu_ids(self): """zhipu 原生 srvtoolu_* ID 与 server_tool_use 类型必须保留.""" @@ -1074,25 +1067,25 @@ def test_combined_artifacts(self): assistant_content = prepared["messages"][0]["content"] # delta 被剥离 assert all(b.get("type") != "server_tool_use_delta" for b in assistant_content) - # inline tool_result 保留在 assistant 中(不再搬迁) - assert any( - b.get("type") == "tool_result" and b.get("tool_use_id") == "toolu_bash_001" - for b in assistant_content - ) + # tool_use / tool_result 被 flatten 为 text 块 + assert not any(b.get("type") == "tool_use" for b in assistant_content) + assert not any(b.get("type") == "tool_result" for b in assistant_content) # server_tool_use 与其 srvtoolu_* ID 完整保留 srv_block = next( b for b in assistant_content if b.get("type") == "server_tool_use" ) assert srv_block["id"] == "srvtoolu_native" - # tool_use ID 同样保留 - tool_use_block = next( - b for b in assistant_content if b.get("type") == "tool_use" - ) - assert tool_use_block["id"] == "toolu_bash_001" + # flatten 后应包含 tool_use 和 tool_result 对应的 text 块 + text_contents = [ + b.get("text", "") for b in assistant_content if b.get("type") == "text" + ] + assert any("Tool Call: bash" in t for t in text_contents) + assert any("Tool Result for toolu_bash_001" in t for t in text_contents) # 不插入额外 user 消息 assert len(prepared["messages"]) == 1 # 关键 adaptation 标签 assert any("zhipu_vendor_blocks" in a for a in adaptations) + assert any("flattened" in a and "tool_blocks" in a for a in adaptations) # 不应有 tool pairing / id 注入 相关 adaptation assert not any("misplaced" in a for a in adaptations) assert not any("injected" in a for a in adaptations) @@ -2858,8 +2851,8 @@ def test_combined_server_tool_use_and_thinking(self): assert any("server_tool_use" in a for a in adaptations) assert any("thinking_blocks" in a for a in adaptations) - def test_no_id_injection_on_tool_result(self): - """anthropic → zhipu 转换不再注入 id 字段(zhipu 类不读取,注入无效).""" + def test_flattens_tool_result_in_user_message(self): + """anthropic → zhipu 将 tool_result 展平为 text 块.""" body = { "messages": [ { @@ -2886,6 +2879,7 @@ def test_no_id_injection_on_tool_result(self): ], } prepared, adaptations = prepare_anthropic_to_zhipu(body) - tr = prepared["messages"][1]["content"][0] - assert "id" not in tr - assert not any("injected" in a for a in adaptations) + # tool_result 被展平为 text + user_content = prepared["messages"][1]["content"] + assert all(b.get("type") != "tool_result" for b in user_content) + assert any("flattened" in a for a in adaptations) diff --git a/tests/test_vendors.py b/tests/test_vendors.py index 578b0b0..2d86aca 100644 --- a/tests/test_vendors.py +++ b/tests/test_vendors.py @@ -340,7 +340,6 @@ def test_zhipu_never_triggers_failover(): def test_zhipu_supports_tools_and_thinking(): """ZhipuVendor 应声明全部能力为 NATIVE(原生 Anthropic 兼容端点).""" - from coding.proxy.compat.canonical import CompatibilityStatus from coding.proxy.vendors.base import RequestCapabilities mapper = ModelMapper([]) @@ -361,7 +360,42 @@ def test_zhipu_supports_tools_and_thinking(): ) assert supported is True assert reasons == [] - # 兼容性画像应全部为 NATIVE + + +def test_zhipu_accepts_tool_results(): + """ZhipuVendor 应接受含 tool_result 的请求(由转换通道展平处理).""" + from coding.proxy.vendors.base import RequestCapabilities + + mapper = ModelMapper([]) + zhipu_vendor = ZhipuVendor(ZhipuConfig(), mapper) + + supported, reasons = zhipu_vendor.supports_request( + RequestCapabilities(has_tool_results=True) + ) + assert supported is True + assert reasons == [] + + +def test_zhipu_accepts_without_tool_results(): + """ZhipuVendor 应接受不含 tool_result 的请求.""" + from coding.proxy.vendors.base import RequestCapabilities + + mapper = ModelMapper([]) + zhipu_vendor = ZhipuVendor(ZhipuConfig(), mapper) + + supported, reasons = zhipu_vendor.supports_request( + RequestCapabilities(has_tools=True, has_tool_results=False) + ) + assert supported is True + assert reasons == [] + + +# 兼容性画像应全部为 NATIVE +def test_zhipu_compatibility_profile_native(): + from coding.proxy.compat.canonical import CompatibilityStatus + + mapper = ModelMapper([]) + zhipu_vendor = ZhipuVendor(ZhipuConfig(), mapper) profile = zhipu_vendor.get_compatibility_profile() assert profile.thinking is CompatibilityStatus.NATIVE assert profile.tool_calling is CompatibilityStatus.NATIVE From 2bac9a7b20ca339c39c9614264b48fc4acfa545a Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 14:30:00 +0800 Subject: [PATCH 11/66] =?UTF-8?q?revert(vendor-channels):=20=E8=BF=98?= =?UTF-8?q?=E5=8E=9F=E8=87=B3=20v0.3.0=20=E5=9F=BA=E7=BA=BF=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20failover=20=E7=BA=A7=E8=81=94=20server=5Ft?= =?UTF-8?q?ool=5Fuse.id=20400=20=E9=94=99=E8=AF=AF=20(#218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * revert(vendor-channels): 还原至 v0.3.0 基线,修复 failover 级联 server_tool_use.id 400 错误; - 还原 vendor_channels.py 至 v0.3.0(移除 _flatten_tool_blocks、_inject_tool_result_id_for_zhipu、 _enforce_pairing_sanity_pass、zhipu 自清理通道、anthropic→zhipu 通道等 v0.3.0 后引入的特殊处理) - 修复 _determine_source_vendor Priority 1 逻辑:仅当 failed_tier 有已注册转换通道时才返回, 否则降级到 session history / body inference,确保 copilot→anthropic failover 时能通过 session 找到 zhipu 源并正确清理 server_tool_use 块 - 还原 model/vendor.py(移除 TOOL_RESULTS capability) - 部分还原 error_classifier.py(保留 CN 语义拒绝标记,移除 has_tool_results) - 还原 executor.py(移除 zhipu 500 特殊检测,保留 invalid_tool_call_format 检测) - 同步更新测试用例,全部 1399 测试通过 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * docs(issue): 恢复与 vendor-channels 回退无关的 Issue #1 文档; 回退 vendor-channels 至 v0.3.0 基线时误删了 docs/issue.md 全部内容, 其中 Issue #1(streaming usage parse failed)描述的 null 防护修复 仍保留在 usage_parser.py 中,属于无关文档,不应被连带删除。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- docs/issue.md | 168 -- src/coding/proxy/convert/vendor_channels.py | 458 +---- src/coding/proxy/model/vendor.py | 2 - src/coding/proxy/routing/error_classifier.py | 18 +- src/coding/proxy/routing/executor.py | 51 +- tests/test_error_classifier.py | 72 - tests/test_model_vendor.py | 5 +- tests/test_router_executor.py | 374 +--- tests/test_types.py | 1 - tests/test_vendor_channels.py | 1944 ++++-------------- tests/test_vendors.py | 28 - 11 files changed, 493 insertions(+), 2628 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index e8d6edf..c8f9765 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -45,171 +45,3 @@ if "usage" in data: # 仅判断 key 存在 - 本仓库内 `parse_usage_from_chunk` 的 Gemini `usageMetadata` 分支 (line ~219) 已经使用 `isinstance(um, dict)` 防御, 不受影响, 可作为参考实现。 - 检查其他解析器 (如 routing / vendor adapter 层) 是否还有 `if "key" in data: v = data["key"]; v.get(...)` 这种模式, 必要时同步加固。 - ---- - -## zhipu 自循环 400 + tool_results 偶发降级 - -**问题描述** - -生产日志反复出现下述链路: 请求一开始命中 zhipu 主 tier, 但在含 `tool_results` 的多轮工具调用场景下偶发返回 400, 触发到 copilot 二级 tier。具体日志特征: - -``` -WARNING Tier zhipu likely format incompatibility (400 + tool_results), trying next tier without recording failure -WARNING Tier zhipu semantic rejection (400), trying next tier without recording failure -DEBUG Applied transition channel zhipu → copilot: rewritten_38_srvtoolu_ids, stripped_16_thinking_blocks, removed_3_cache_control_fields, misplaced_tool_result_relocated -``` - -zhipu → copilot 通道的 adaptations 列表暴露了上一轮 zhipu 响应中存在的非标准产物 (`srvtoolu_*` ID、自签 thinking、错位的 `tool_result`)。 - -**表因** - -zhipu 自身偶发返回 400, 但错误体非 JSON 结构, 由 `_is_likely_request_format_error()` 判定为「格式不兼容」并跳过当前 tier。 - -**根因** - -1. zhipu 是 `NativeAnthropicVendor` 薄透传供应商, **不做任何请求体预处理**。 -2. `executor._determine_source_vendor` 三条优先级路径均以 `source != target_name` 过滤掉了同 vendor 自转换。 -3. `VENDOR_TRANSITIONS` 注册表中无 `("zhipu", "zhipu")` 条目。 - -后果: GLM-5 偶发产出非标准产物 (assistant 内联 `tool_result`、`server_tool_use_delta` 流式残块) 后, Claude Code 把这些产物原样回送下一轮请求时, **没有任何清洗发生**, 直接被转发到 zhipu 自身, 命中 zhipu 端的输入校验返回 400。 - -**处理方式** - -- 在 `vendor_channels.py` 新增 `prepare_zhipu_self_cleanup` 函数, 仅修复 zhipu 自身拒绝的两类产物: - 1. 剥离 `server_tool_use_delta` 流式残块 - 2. `enforce_anthropic_tool_pairing` 把 assistant 内联 `tool_result` 重定位到紧随 user 消息 -- 显式 **保留** zhipu 原生支持的特性: `srvtoolu_*` ID、`server_tool_use` 类型、自签 thinking signature、`cache_control` (cache_read 已在生产实证)、顶层 `thinking` 参数。 -- 在 `VENDOR_TRANSITIONS` 注册 `("zhipu", "zhipu") = prepare_zhipu_self_cleanup`。 -- 在 `executor._determine_source_vendor` 三条优先级路径中, 把「`source != target`」过滤替换为「通道已注册」门控 (`get_transition_channel(...) is not None`), 让自转换通道在显式注册时启用, 未注册时退化为原行为。 - -**后续防范** - -- 新增 `NativeAnthropicVendor` 子类 (minimax / kimi / doubao / xiaomi / alibaba 等) 时, 若上游 vendor 偶发产出违反 Anthropic 规范的产物, 可按需注册同名自清理通道, executor 无需任何额外改动。 -- 同 vendor 自转换通道应**精确剪裁**: 仅修复 vendor 自身拒绝的产物, 不要套用跨 vendor 通道的全量清理 (会误伤 vendor 原生支持的特性, 如 cache_control 损失带来 cache_read miss)。 - -**同类问题影响与处理注意事项** - -- `enforce_anthropic_tool_pairing` 仅识别 `tool_use` 类型 (不含 `server_tool_use`), 因为 `server_tool_use` 由 vendor 自身执行, 不需要客户端 `tool_result`。构造测试或类似清洗逻辑时需注意此差别。 -- `_is_likely_request_format_error()` 把「400 + tool_results + 非结构化错误体」一律标记为格式不兼容并跳过 tier 不计熔断器, 这层兜底虽能维持可用性但会**掩盖** vendor 自身的间歇性问题, 让根因更难发现。处理类似 400 偶发时, 应优先看 `Applied transition channel` 日志中的 adaptations 列表, 它能精确暴露上游响应中的非标准产物。 - ---- - -## anthropic 报 messages.X tool_use 缺 tool_result (zhipu→anthropic 故障转移失败) - -**问题描述** - -zhipu 完成响应后, executor 故障转移至 anthropic 时反复失败 (HTTP 400): - -``` -DEBUG Applied transition channel zhipu → anthropic: rewritten_86_srvtoolu_ids, misplaced_tool_result_relocated, stripped_18_thinking_blocks -WARNING anthropic stream error: status=400 ... messages.3: `tool_use` ids were found without `tool_result` blocks immediately after: toolu_normalized_3. -INFO Failover: anthropic → zhipu (reason: HTTP 400) -``` - -adaptations 列表显示 `misplaced_tool_result_relocated` 但**没有** `orphaned_tool_use_repaired`, 即 enforce 单遍扫描视角下认为所有 tool_use 都已配对; 但 anthropic 仍报 messages.X 缺 tool_result, 导致请求级 cascade failover 反复回到 zhipu。 - -**表因** - -`prepare_zhipu_to_anthropic` 链路输出的请求体中, 某个 assistant 的 `tool_use` 在紧邻的 user 消息中没有匹配的 `tool_result` 块。 - -**根因** - -`_rewrite_srvtoolu_ids` 采用单遍正向扫描: 在同一次循环中一边收集 srvtoolu_* → toolu_normalized_* 的 id_map, 一边改写遇到的 `tool_result.tool_use_id`。GLM-5 流式偶发将 inline tool_result 输出在本消息 `server_tool_use` 之前 (block 顺序异常), 导致: - -1. 处理 inline tool_result 时, id_map 尚未填入对应 srvtoolu_* → 漏改名, inline 仍保留 `srvtoolu_X` -2. 处理本消息 server_tool_use 时, 填入 id_map 并把 tool_use 改名为 `toolu_normalized_X` -3. 进入 `enforce_anthropic_tool_pairing` 时: - - A 步 extracted dict key = `srvtoolu_X` (inline 保留的旧 ID) - - B 步 tool_use_ids = `[toolu_normalized_X]` (已改名) - - F 步 `uid in extracted` 检查失败 (key 错位), 但若 next user 已含其他 stale tool_result 让 existing_result_ids "巧合" 命中, F 步会跳过 synth → 不触发 orphan 标签 - - 最终 anthropic 看到 messages.X 真的缺 toolu_normalized_X 的 tool_result → 400 - -**处理方式** - -- `_rewrite_srvtoolu_ids` 改为**两遍扫描**: Pass 1 仅遍历 assistant 消息, 收集 id_map 并改写 tool_use 自身的 id 与 type; Pass 2 全量遍历所有消息 (含 user / 异常 assistant 内联), 统一改写所有 `tool_result.tool_use_id` 引用。彻底消除 block 顺序敏感性。 -- `enforce_anthropic_tool_pairing` 主循环结束后追加**全局 sanity check pass**: 重新遍历每条 assistant, 验证其 tool_use_ids 全部在 next user 的 tool_result 中存在; 发现遗漏直接合成 is_error 占位并打 `pairing_sanity_repaired` 标签。作为防御深度抵御未来其他主循环边角错位。 -- A 步对 `tool_use_id` 缺失的破损 inline tool_result 也计入 relocated_count (避免 silent drop 影响 adaptations 标签可观测性)。 - -**后续防范** - -- 任何"按出现顺序填充字典 + 同遍引用查询"的两阶段操作都应警惕**顺序耦合**问题。两遍扫描 (collect → apply) 是消除此类 bug 的标准 pattern。 -- 关键校验函数应有**主循环 + 全局 sanity check** 的双层结构, 单层校验在边角场景下容易被绕过。 -- 处理 anthropic `tool_use ids without tool_result blocks immediately after` 类 cascade failover 时, **adaptations 标签能否复现日志**是定位 root cause 的强信号: 若 enforce 视角与 anthropic 视角不一致 (有 misplaced 但无 orphan, anthropic 仍报错), 必有上游 _rewrite / id 改写阶段的隐藏漏洞。 - -**同类问题影响与处理注意事项** - -- 任何对 messages 进行 ID 重写的转换链 (如 `_rewrite_srvtoolu_ids`、`anthropic_to_openai`、`anthropic_to_gemini`) 都应使用两遍扫描或一次性收集后再批量改写, 以保证 block 顺序无关性。 -- enforce 类校验函数若依赖 dict key 与 list 元素的**等同性**, 必须先确保两者在同一参考系下 (改名前 vs 改名后); 否则错位会以 "看起来 OK 实际有漏" 的方式静默泄漏到下游。 - ---- - -## zhipu 500 `'ClaudeContentBlockToolResult' object has no attribute 'id'` - -**问题描述** - -zhipu GLM-5 在处理含 `tool_result` 块的会话时持续返回 500 错误,每次请求都触发故障转移至 copilot,zhipu 完全无法承接含工具调用的多轮对话: - -``` -WARNING zhipu stream error: status=500 body='...message":"\'ClaudeContentBlockToolResult\' object has no attribute \'id\'"}' -``` - -**表因** - -zhipu 后端在解析 `tool_result` 内容块时错误地访问 `.id` 属性。但 Anthropic API 规范中 `tool_result` 块只有 `tool_use_id` 字段(用于关联对应的 `tool_use`),没有 `id` 字段。 - -**根因**(2026-04-29 第二次复盘更新) - -**第一次诊断**(已推翻):认为 `_inject_tool_result_id_for_zhipu` 注入 `id` 可绕过。实证:注入 114 个块后 500 依旧。 - -**第二次诊断**(已推翻):认为 `enforce_anthropic_tool_pairing` 搬迁 tool_result 到 user 消息是触发条件。实证:移除 tool pairing 后 500 依旧(日志显示 `copilot → zhipu: stripped_19_thinking_blocks, removed_thinking_param`,无 `misplaced_tool_result_relocated`)。 - -**实际根因**:zhipu 后端的 `ClaudeContentBlockToolResult` Python 类**没有 `id` 属性**,但 zhipu 代码在处理**所有** `tool_result` 块时都访问 `obj.id`,无论块位于 assistant 还是 user 消息。三层因果链: - -1. **zhipu 后端 Bug**(不可修复 — 上游代码):`ClaudeContentBlockToolResult` 类缺少 `id` 属性,zhipu 代码访问时触发 `AttributeError` → 500。 -2. **JSON 注入无效**(已实证):`_inject_tool_result_id_for_zhipu` 往 JSON dict 注入 `id = tool_use_id`,但 zhipu 反序列化框架不读取此字段,Python 对象仍无 `id` 属性。 -3. **无预防机制**(proxy 层可修复):tier 门控系统不检查请求是否含 `tool_result` 块 → 每次请求先发 zhipu → 必然 500 → failover → 额外 ~2 秒延迟。 - -**实证依据**: -- 有注入(114 个块)→ 500;无注入 → 500。结论:注入无效。 -- 有 tool pairing → 500;无 tool pairing → 500。结论:tool pairing 不是触发条件。 -- 首次请求(无 tool_result 块)→ zhipu 正常。结论:500 由 tool_result 块本身触发。 - -**处理方式**(2026-04-29 第二次更新) - -从所有 zhipu 目标转换通道中移除有害/无效步骤(`enforce_anthropic_tool_pairing`、`_inject_tool_result_id_for_zhipu`、`_strip_cache_control`),并在 `ZhipuVendor.supports_request` 中增加 `has_tool_results` 门控:当请求包含 `tool_result` 块时主动拒绝 zhipu tier,避免「尝试 → 500 → failover」的无效延迟。 - -| 变更项 | 说明 | -|--------|------| -| `RequestCapabilities.has_tool_results` | 新增字段,检测请求中是否含 `tool_result` 块 | -| `CapabilityLossReason.TOOL_RESULTS` | 新增枚举值,标记 tool_result 兼容性问题 | -| `ZhipuVendor.supports_request` | 覆写方法,`has_tool_results=True` 时拒绝请求 | -| `build_request_capabilities` | 扩展 tool_result 块检测逻辑 | - -保留的 zhipu 目标转换通道精简步骤: - -| 保留项 | 原因 | -|--------|------| -| `strip_thinking_blocks` | copilot/anthropic 的 thinking 签名 zhipu 无法验证 | -| 移除 `thinking`/`extended_thinking` 顶层参数 | zhipu 不支持 | -| `_remove_vendor_blocks(server_tool_use_delta)` | zhipu 自身流式残块 | -| `_remove_vendor_blocks(server_tool_use)` | Anthropic beta 块,zhipu 不支持 | - -**涉及变更的转换通道**: -- `prepare_copilot_to_zhipu` — 移除 cache_control / tool pairing / id 注入 -- `prepare_anthropic_to_zhipu` — 移除 cache_control / tool pairing / id 注入 -- `prepare_zhipu_self_cleanup` — 移除 tool pairing / id 注入 - -**注意**: `prepare_zhipu_to_anthropic` 和 `prepare_zhipu_to_copilot` 不受影响(目标是 anthropic/copilot,不是 zhipu),仍保留 `enforce_anthropic_tool_pairing`。 - -**后续防范** - -- **转换通道的「最小干预」原则**:跨供应商转换应仅清理目标供应商**确认不支持**的特性。未经验证的「预防性清理」(如剥离 cache_control)可能误伤供应商原生支持的功能,甚至引入新的故障。 -- **workaround 须验证有效**:`_inject_tool_result_id_for_zhipu` 虽有注释说明目的,但未经验证其有效性即合入。后续 workaround 须附带验证证据(如 curl 复现、上游确认)。 -- **zhipu 后端 bug 跟踪**:`ClaudeContentBlockToolResult` 类缺少 `id` 属性是 zhipu 上游 bug。若 zhipu 修复此 bug,可考虑恢复 tool pairing 以获得更严格的消息结构校验。 - -**同类问题影响与处理注意事项** - -- `NativeAnthropicVendor` 子类的自清理通道应**精确剪裁**:仅修复 vendor 自身拒绝的产物,不做跨供应商的全量清理。 -- 当 zhipu 后端出现新的 400 拒绝(如 inline tool_result 再次被拒),应优先调查是 zhipu 后端变更还是请求格式问题,而非立即加回 tool pairing(可能重新触发 500)。 -- `_inject_tool_result_id_for_zhipu` 函数暂时保留在代码中(未删除),标记为 deprecated,待确认不需要后清理。 diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index 93eb328..bec46f7 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -10,8 +10,6 @@ zhipu → anthropic : prepare_zhipu_to_anthropic (剥离 thinking + tool pairing) zhipu → copilot : prepare_zhipu_to_copilot (剥离 thinking + cache_control + tool pairing) copilot → zhipu : prepare_copilot_to_zhipu (剥离 thinking + cache_control + 移除 thinking 参数 + tool pairing) - zhipu → zhipu : prepare_zhipu_self_cleanup (剥离 server_tool_use_delta + tool pairing) - anthropic → zhipu : prepare_anthropic_to_zhipu (剥离 server_tool_use + thinking + cache_control + 移除 thinking 参数 + tool pairing) """ from __future__ import annotations @@ -110,10 +108,6 @@ def enforce_anthropic_tool_pairing( 此函数是一个**自包含的单遍处理**,不依赖 Phase 1 收集的 misplaced 信息。 - 最终在主循环之后执行一次幂等的全局 sanity check pass, 防御主循环的边角 - 错位 (如 inline tool_result 引用未在本消息出现的 tool_use_id, 导致 extracted - 字典 key 与 tool_use_ids 集合错位) 让 dangling tool_use 漏过校验。 - Args: messages_list: 消息列表(就地修改)。 @@ -145,13 +139,10 @@ def enforce_anthropic_tool_pairing( if tid: extracted_tool_results[tid] = block relocated_count += 1 - else: - # 缺 tool_use_id 的破损 tool_result 也视作错位剥离 - relocated_count += 1 else: retained_content.append(block) - if extracted_tool_results or len(retained_content) != len(content): + if extracted_tool_results: msg["content"] = retained_content # B. 收集所有 tool_use ID @@ -216,17 +207,10 @@ def enforce_anthropic_tool_pairing( i += 1 - # G. 最终全局 sanity check pass (抽出为独立函数便于单测验证正向兜底路径). - sanity_synthesized = _enforce_pairing_sanity_pass(messages_list) - if relocated_count: adaptations.append("misplaced_tool_result_relocated") - if synthesized_ids or sanity_synthesized: - adaptations.append("orphaned_tool_use_repaired") - - # 主循环 F 段与 sanity G 段分别打日志, 避免 main=0/sanity=N 时把 sanity - # 兜底误归因为主循环工作 (运维在线日志聚合时易混淆 cross-pass id-map drift). if synthesized_ids: + adaptations.append("orphaned_tool_use_repaired") logger.warning( "Vendor degradation adaptation: synthesized %d tool_result block(s) " "for orphaned tool_use to satisfy Anthropic pairing constraint. " @@ -234,210 +218,10 @@ def enforce_anthropic_tool_pairing( len(synthesized_ids), ", ".join(synthesized_ids), ) - if sanity_synthesized: - adaptations.append("pairing_sanity_repaired") - logger.warning( - "Pairing sanity check repaired %d dangling tool_use(s) missed by " - "main pass (likely cross-pass id-map drift). Affected tool_use_ids: %s", - len(sanity_synthesized), - ", ".join(sanity_synthesized), - ) return adaptations -def _enforce_pairing_sanity_pass(messages_list: list[Any]) -> list[str]: - """全局 sanity check pass: 防御主循环边角错位让 dangling tool_use 漏过. - - 例如: extracted dict key 与 _rewrite 后的 tool_use_ids 错位、user_msg - 中已有 stale tool_result 让 F 步误判 existing 命中等场景。 - - 扫描所有 assistant 消息, 验证每个 ``tool_use`` block ID 在紧随的 user 消息 - 中均存在对应 ``tool_result``; 漏掉的合成 ``is_error`` 占位。 - - 抽取为独立函数的目的: 主循环 F 步在当前实现下能覆盖所有 dangling tool_use, - 导致 sanity 实际兜底分支在公开 API 测试中无法被触发; 独立函数便于直接 - 构造「绕过主循环」的输入, 对兜底合成路径建立正向回归保护。 - - Args: - messages_list: 消息列表 (就地修改, 必要时插入空 user 消息). - - Returns: - sanity 兜底合成的 tool_use_id 列表 (空表示主循环已完成所有配对). - """ - sanity_synthesized: list[str] = [] - j = 0 - while j < len(messages_list): - msg_j = messages_list[j] - if not isinstance(msg_j, dict) or msg_j.get("role") != "assistant": - j += 1 - continue - content_j = msg_j.get("content") - if not isinstance(content_j, list): - j += 1 - continue - tu_ids = [ - b["id"] - for b in content_j - if isinstance(b, dict) and b.get("type") == "tool_use" and b.get("id") - ] - if not tu_ids: - j += 1 - continue - next_j = j + 1 - if ( - next_j < len(messages_list) - and isinstance(messages_list[next_j], dict) - and messages_list[next_j].get("role") == "user" - ): - next_user = messages_list[next_j] - else: - next_user = {"role": "user", "content": []} - messages_list.insert(next_j, next_user) - nu_content = next_user.get("content") - if isinstance(nu_content, str): - next_user["content"] = [{"type": "text", "text": nu_content}] - elif not isinstance(nu_content, list): - next_user["content"] = [] - nu_result_ids = { - b["tool_use_id"] - for b in next_user["content"] - if isinstance(b, dict) - and b.get("type") == "tool_result" - and b.get("tool_use_id") - } - for uid in tu_ids: - if uid in nu_result_ids: - continue - next_user["content"].append( - { - "type": "tool_result", - "tool_use_id": uid, - "content": "", - "is_error": True, - } - ) - sanity_synthesized.append(uid) - j += 1 - return sanity_synthesized - - -def _inject_tool_result_id_for_zhipu(body: dict[str, Any]) -> int: - """为 tool_result 块注入 ``id`` 字段以兼容 zhipu GLM-5 后端. - - zhipu 的 Anthropic 兼容端点在解析 ``tool_result`` 块时会访问 ``.id`` 属性, - 但 Anthropic API 规范中 ``tool_result`` 只有 ``tool_use_id`` 字段而没有 ``id``。 - 此函数在所有 ``tool_result`` 块上补设 ``id``(值等于 ``tool_use_id``), - 避免触发 ``'ClaudeContentBlockToolResult' object has no attribute 'id'`` 500 错误。 - - Returns: - 被注入 ``id`` 字段的 tool_result 块数量。 - """ - injected = 0 - for message in body.get("messages", []): - if not isinstance(message, dict): - continue - content = message.get("content") - if not isinstance(content, list): - continue - for block in content: - if ( - isinstance(block, dict) - and block.get("type") == "tool_result" - and "id" not in block - and block.get("tool_use_id") - ): - block["id"] = block["tool_use_id"] - injected += 1 - return injected - - -def _extract_text_from_content(content: Any) -> str: - """从 tool_result 的 content 字段提取可读文本.""" - if isinstance(content, str): - return content - if isinstance(content, list): - parts: list[str] = [] - for item in content: - if isinstance(item, str): - parts.append(item) - elif isinstance(item, dict) and item.get("type") == "text": - parts.append(item.get("text", "")) - return " ".join(parts) - return "" - - -def _flatten_tool_blocks(body: dict[str, Any]) -> int: - """将 messages 中的 tool_use 和 tool_result 块转为 text 块. - - zhipu GLM-5 后端的 ``ClaudeContentBlockToolResult`` 类缺少 ``id`` 属性, - 导致处理 tool_result 块时触发 ``AttributeError`` → HTTP 500。 - 此函数将所有 tool_use / tool_result 块转为纯文本表示, - 让 zhipu 以普通文本对话处理,彻底规避反序列化缺陷。 - - Returns: - 被转换的 tool_use + tool_result 块总数。 - """ - import json as _json - - converted = 0 - for message in body.get("messages", []): - if not isinstance(message, dict): - continue - content = message.get("content") - if not isinstance(content, list): - continue - - new_blocks: list[dict[str, Any]] = [] - for block in content: - if not isinstance(block, dict): - new_blocks.append(block) - continue - - block_type = block.get("type") - - if block_type == "tool_use": - name = block.get("name", "unknown") - input_data = block.get("input", {}) - try: - args_text = _json.dumps(input_data, ensure_ascii=False) - except (TypeError, ValueError): - args_text = str(input_data) - # 截断过长参数 - if len(args_text) > 2000: - args_text = args_text[:1997] + "..." - new_blocks.append( - {"type": "text", "text": f"[Tool Call: {name}({args_text})]"} - ) - converted += 1 - - elif block_type == "tool_result": - tool_use_id = block.get("tool_use_id", "?") - is_error = block.get("is_error", False) - result_text = _extract_text_from_content(block.get("content")) - if len(result_text) > 2000: - result_text = result_text[:1997] + "..." - prefix = "[ERROR] " if is_error else "" - new_blocks.append( - { - "type": "text", - "text": f"{prefix}[Tool Result for {tool_use_id}: {result_text}]", - } - ) - converted += 1 - - else: - new_blocks.append(block) - - # 如果 content 为空则插入占位 - if not new_blocks: - new_blocks = [{"type": "text", "text": "..."}] - - message["content"] = new_blocks - - return converted - - def _strip_cache_control(body: dict[str, Any]) -> int: """从 system/messages/tools 中移除 cache_control 字段(就地). @@ -500,13 +284,7 @@ def _remove_vendor_blocks(body: dict[str, Any], block_types: set[str]) -> int: removed += 1 continue new_content.append(block) - if content != new_content: - if not new_content: - new_content = [{"type": "text", "text": "[vendor_block_removed]"}] - logger.info( - "Inserted placeholder text block after stripping " - "vendor blocks to avoid empty message content", - ) + if removed: message["content"] = new_content return removed @@ -516,12 +294,8 @@ def _rewrite_srvtoolu_ids(body: dict[str, Any]) -> tuple[int, dict[str, str]]: Anthropic API 要求 tool_use 类型与 ``toolu_*`` 格式的 ID。Zhipu 的 ``server_tool_use`` + ``srvtoolu_*`` 在上游 Anthropic 兼容端点可用,但无法 - 透传至其他供应商;同时还需重写所有 ``tool_result.tool_use_id`` 引用, - 保持配对关系。 - - 采用**两遍扫描**避免块顺序敏感性: GLM-5 偶发将 inline tool_result 输出在 - 本消息 tool_use 之前, 单遍扫描会因 id_map 尚未填入而漏改 inline tool_result - 的 tool_use_id, 导致后续 enforce 步骤无法将其与 tool_use 配对。 + 透传至其他供应商;同时还需重写紧随其后 user 消息中 ``tool_result.tool_use_id`` + 引用,保持配对关系。 Returns: (rewritten_count, id_map) — 重写次数与 {原 ID: 新 ID} 映射。 @@ -534,59 +308,45 @@ def next_id() -> str: counter += 1 return f"toolu_normalized_{counter}" - # Pass 1: 收集所有 assistant tool_use / server_tool_use 的 ID 映射 - # 不修改 tool_result, 仅建立 id_map; 同时改写 tool_use 自身的 id 与 type for message in body.get("messages", []): if not isinstance(message, dict): continue content = message.get("content") if not isinstance(content, list): continue - if message.get("role") != "assistant": - continue + role = message.get("role") for block in content: if not isinstance(block, dict): continue block_type = block.get("type") block_id = block.get("id") - if block_type not in {"tool_use", "server_tool_use"}: - continue - if isinstance(block_id, str) and _ANTHROPIC_SERVER_TOOL_USE_ID_RE.match( - block_id - ): - new_id = next_id() - id_map[block_id] = new_id - block["id"] = new_id - block["type"] = "tool_use" - elif ( - isinstance(block_id, str) - and block_id - and not _ANTHROPIC_TOOL_USE_ID_RE.match(block_id) - and block.get("name") - ): - # 非标准 ID(非 toolu_ / srvtoolu_),且具备 name 可改写 - new_id = next_id() - id_map[block_id] = new_id - block["id"] = new_id - block["type"] = "tool_use" - elif block_type == "server_tool_use" and isinstance(block_id, str): - # 兜底: 类型是 server_tool_use 但 ID 已是标准 toolu_ 形式,仅纠正类型 - block["type"] = "tool_use" - - # Pass 2: 全量同步所有 tool_result.tool_use_id 引用 (含 user/assistant 内联) - if id_map: - for message in body.get("messages", []): - if not isinstance(message, dict): - continue - content = message.get("content") - if not isinstance(content, list): - continue - for block in content: - if not isinstance(block, dict): - continue - if block.get("type") != "tool_result": - continue + # Case A: assistant 消息里的 server_tool_use / srvtoolu_* → 改写 + if role == "assistant" and block_type in {"tool_use", "server_tool_use"}: + if isinstance(block_id, str) and _ANTHROPIC_SERVER_TOOL_USE_ID_RE.match( + block_id + ): + new_id = next_id() + id_map[block_id] = new_id + block["id"] = new_id + block["type"] = "tool_use" + elif ( + isinstance(block_id, str) + and block_id + and not _ANTHROPIC_TOOL_USE_ID_RE.match(block_id) + and block.get("name") + ): + # 非标准 ID(非 toolu_ / srvtoolu_),且具备 name 可改写 + new_id = next_id() + id_map[block_id] = new_id + block["id"] = new_id + block["type"] = "tool_use" + elif block_type == "server_tool_use" and isinstance(block_id, str): + # 兜底: 类型是 server_tool_use 但 ID 已是标准 toolu_ 形式,仅纠正类型 + block["type"] = "tool_use" + + # Case B: user 消息里的 tool_result.tool_use_id 同步重写 + if block_type == "tool_result": tool_use_id = block.get("tool_use_id") if isinstance(tool_use_id, str) and tool_use_id in id_map: block["tool_use_id"] = id_map[tool_use_id] @@ -598,9 +358,8 @@ def infer_source_vendor_from_body(body: dict[str, Any]) -> str | None: """从请求 body 内容推断源供应商(仅在无会话上下文时作为兜底). 启发式(按置信度排序): - - 出现 ``srvtoolu_*`` 格式的 ID → zhipu - - 出现 ``server_tool_use_delta`` 类型的 content block → zhipu - - 出现 ``server_tool_use`` 块 + ``toolu_*`` ID → anthropic(beta 功能产物) + - 出现 ``srvtoolu_*`` 格式的 ``tool_use.id`` → zhipu + - 出现 ``server_tool_use`` / ``server_tool_use_delta`` 类型的 content block → zhipu 原则: 只读扫描不修改 body;无匹配返回 None(视作纯净无需跨供应商清洗)。 @@ -608,7 +367,7 @@ def infer_source_vendor_from_body(body: dict[str, Any]) -> str | None: body: Anthropic Messages 请求体。 Returns: - 推断的源供应商名称(``"zhipu"`` 或 ``"anthropic"``),无法推断返回 None。 + 推断的源供应商名称(当前仅支持 ``"zhipu"``),无法推断返回 None。 """ for message in body.get("messages", []): if not isinstance(message, dict): @@ -620,35 +379,18 @@ def infer_source_vendor_from_body(body: dict[str, Any]) -> str | None: if not isinstance(block, dict): continue block_type = block.get("type") - block_id = block.get("id") - tool_use_id = block.get("tool_use_id") - - # Zhipu: server_tool_use_delta 是 zhipu 私有流式块(无歧义) - if block_type == "server_tool_use_delta": + if block_type in _ZHIPU_SERVER_TOOL_USE_TYPES: return "zhipu" - - # srvtoolu_* ID(无论 block type)→ zhipu + block_id = block.get("id") if isinstance(block_id, str) and _ANTHROPIC_SERVER_TOOL_USE_ID_RE.match( block_id ): return "zhipu" + tool_use_id = block.get("tool_use_id") if isinstance(tool_use_id, str) and _ANTHROPIC_SERVER_TOOL_USE_ID_RE.match( tool_use_id ): return "zhipu" - - # server_tool_use 块 + toolu_* ID → Anthropic beta 功能 - if ( - block_type == "server_tool_use" - and isinstance(block_id, str) - and _ANTHROPIC_TOOL_USE_ID_RE.match(block_id) - ): - return "anthropic" - - # server_tool_use 块 + 非 toolu_/srvtoolu_ ID → 按类型兜底归 zhipu - if block_type == "server_tool_use": - return "zhipu" - return None @@ -658,18 +400,13 @@ def infer_source_vendor_from_body(body: dict[str, Any]) -> str | None: def prepare_copilot_to_zhipu( body: dict[str, Any], ) -> tuple[dict[str, Any], list[str]]: - """copilot → zhipu 转换: 仅清理 copilot 产物中 zhipu 确认不支持的部分. + """copilot → zhipu 转换: 清理 copilot 产物以适配 GLM-5. - GLM-5 的 Anthropic 兼容端点: - - ✗ thinking / redacted_thinking 块 (signature 由非 Anthropic 签发) - - ✓ cache_control 字段 (cache_read 已在生产实证) - - ✓ tool_result 在 assistant 消息中内联 (zhipu 自身偶发产出,可自行消化) - - ✗ 顶层 thinking / extended_thinking 参数 - - 注意: 不再执行 enforce_anthropic_tool_pairing 和 _inject_tool_result_id_for_zhipu。 - 实证表明 tool_result 重定位会触发 zhipu 后端 ``'ClaudeContentBlockToolResult' - object has no attribute 'id'`` 500 错误;id 注入对 zhipu 的 Python 类 - (不读取 JSON 中的 id 字段) 亦无效。详见 docs/issue.md。 + GLM-5 的 Anthropic 兼容端点对以下特性支持不完整: + - thinking / redacted_thinking 块 (signature 由非 Anthropic 签发) + - cache_control 字段 + - 跨供应商产物 (misplaced tool_result, 非标准 tool_use ID) + - 顶层 thinking / extended_thinking 参数 Returns: (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 @@ -682,57 +419,10 @@ def prepare_copilot_to_zhipu( if stripped: adaptations.append(f"stripped_{stripped}_thinking_blocks") - # Step 2: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) - for param in ("thinking", "extended_thinking"): - if param in prepared: - del prepared[param] - adaptations.append(f"removed_{param}_param") - - # Step 3: 展平 tool_use/tool_result 为 text 块 - flattened = _flatten_tool_blocks(prepared) - if flattened: - adaptations.append(f"flattened_{flattened}_tool_blocks") - - return prepared, adaptations - - -# ── anthropic → zhipu 转换通道 ──────────────────────────────────── - -# Anthropic beta 特有的 server_tool_use 块类型(web search, computer use 等). -# 这些块在 Anthropic API 中有效,但 zhipu GLM-5 的兼容端点不支持。 -# 注意: 这与 zhipu 自己的 server_tool_use(使用 srvtoolu_* ID)是不同的概念, -# 但它们共用同一个 type 名称 "server_tool_use"。 -_ANTHROPIC_BETA_BLOCK_TYPES = {"server_tool_use"} - - -def prepare_anthropic_to_zhipu( - body: dict[str, Any], -) -> tuple[dict[str, Any], list[str]]: - """anthropic → zhipu 转换: 清理 anthropic 产物以适配 GLM-5. - - Anthropic API 可能产生的非兼容产物: - - ``server_tool_use`` blocks(web search / computer use 等 beta 功能) - - ``thinking`` / ``redacted_thinking`` blocks(含 Anthropic 签发的 signature) - - 顶层 ``thinking`` / ``extended_thinking`` 参数 - - 注意: 不再移除 cache_control (GLM-5 支持) ,不再执行 tool pairing 和 - id 注入。原因同 prepare_copilot_to_zhipu 的 docstring。 - - Returns: - (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 - """ - prepared = copy.deepcopy(body) - adaptations: list[str] = [] - - # Step 1: 剥离 anthropic 的 server_tool_use blocks(web search, computer use 等) - removed_stu = _remove_vendor_blocks(prepared, _ANTHROPIC_BETA_BLOCK_TYPES) - if removed_stu: - adaptations.append(f"removed_{removed_stu}_server_tool_use_blocks") - - # Step 2: 剥离 thinking/redacted_thinking blocks - stripped = strip_thinking_blocks(prepared) - if stripped: - adaptations.append(f"stripped_{stripped}_thinking_blocks") + # Step 2: 移除 cache_control 字段 + removed_cc = _strip_cache_control(prepared) + if removed_cc: + adaptations.append(f"removed_{removed_cc}_cache_control_fields") # Step 3: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) for param in ("thinking", "extended_thinking"): @@ -740,10 +430,10 @@ def prepare_anthropic_to_zhipu( del prepared[param] adaptations.append(f"removed_{param}_param") - # Step 4: 展平 tool_use/tool_result 为 text 块 - flattened = _flatten_tool_blocks(prepared) - if flattened: - adaptations.append(f"flattened_{flattened}_tool_blocks") + # Step 4: 强制 tool_use/tool_result 配对 + pairing_fixes = enforce_anthropic_tool_pairing(prepared.get("messages", [])) + if pairing_fixes: + adaptations.extend(pairing_fixes) return prepared, adaptations @@ -849,52 +539,8 @@ def prepare_zhipu_to_anthropic( return prepared, adaptations -# ── zhipu → zhipu 自清理通道 ────────────────────────────────────── - - -def prepare_zhipu_self_cleanup( - body: dict[str, Any], -) -> tuple[dict[str, Any], list[str]]: - """zhipu → zhipu 自清理: 仅剥离 zhipu 自身的流式残块. - - GLM-5 在流式响应中偶发暴露 ``server_tool_use_delta`` 私有块。当 Claude Code - 将这些产物原样回送下一轮请求时,zhipu 的 Anthropic 兼容端点会拒绝。 - - 本通道**保留**所有 zhipu 原生支持的特性: - - - ✓ ``srvtoolu_*`` ID 与 ``server_tool_use`` 类型(zhipu 原生) - - ✓ thinking blocks 的 zhipu 自签 signature - - ✓ ``cache_control`` 字段(GLM Anthropic 端点支持,cache_read 已实证) - - ✓ 顶层 ``thinking`` / ``extended_thinking`` 参数 - - ✓ tool_result 在 assistant 消息中内联(zhipu 自身偶发产出,可自行消化) - - 注意: 不再执行 enforce_anthropic_tool_pairing 和 _inject_tool_result_id_for_zhipu。 - 实证表明 tool_result 重定位会触发 zhipu 后端 500 错误。 - 详见 docs/issue.md。 - - Returns: - (prepared_body, adaptations) — adaptations 为应用的变换描述列表。 - """ - prepared = copy.deepcopy(body) - adaptations: list[str] = [] - - # Step 1: 剥离 zhipu 私有流式块类型(input 中不应出现) - removed_vendor_blocks = _remove_vendor_blocks(prepared, _ZHIPU_VENDOR_BLOCK_TYPES) - if removed_vendor_blocks: - adaptations.append(f"removed_{removed_vendor_blocks}_zhipu_vendor_blocks") - - # Step 2: 展平 tool_use/tool_result 为 text 块 - flattened = _flatten_tool_blocks(prepared) - if flattened: - adaptations.append(f"flattened_{flattened}_tool_blocks") - - return prepared, adaptations - - # ── 注册所有转换通道 ────────────────────────────────────────────── VENDOR_TRANSITIONS[("zhipu", "anthropic")] = prepare_zhipu_to_anthropic VENDOR_TRANSITIONS[("zhipu", "copilot")] = prepare_zhipu_to_copilot VENDOR_TRANSITIONS[("copilot", "zhipu")] = prepare_copilot_to_zhipu -VENDOR_TRANSITIONS[("zhipu", "zhipu")] = prepare_zhipu_self_cleanup -VENDOR_TRANSITIONS[("anthropic", "zhipu")] = prepare_anthropic_to_zhipu diff --git a/src/coding/proxy/model/vendor.py b/src/coding/proxy/model/vendor.py index e28c64d..dd5ef4f 100644 --- a/src/coding/proxy/model/vendor.py +++ b/src/coding/proxy/model/vendor.py @@ -99,7 +99,6 @@ class CapabilityLossReason(Enum): IMAGES = "images" VENDOR_TOOLS = "vendor_tools" METADATA = "metadata" - TOOL_RESULTS = "tool_results" @dataclass(frozen=True) @@ -110,7 +109,6 @@ class RequestCapabilities: has_thinking: bool = False has_images: bool = False has_metadata: bool = False - has_tool_results: bool = False @dataclass(frozen=True) diff --git a/src/coding/proxy/routing/error_classifier.py b/src/coding/proxy/routing/error_classifier.py index fae2eb0..74bbb32 100644 --- a/src/coding/proxy/routing/error_classifier.py +++ b/src/coding/proxy/routing/error_classifier.py @@ -111,22 +111,15 @@ def is_semantic_rejection( def build_request_capabilities(body: dict[str, Any]) -> RequestCapabilities: """从请求体提取能力画像.""" has_images = False - has_tool_results = False for msg in body.get("messages", []): content = msg.get("content") if not isinstance(content, list): continue - for block in content: - if not isinstance(block, dict): - continue - block_type = block.get("type") - if block_type == "image" and not has_images: - has_images = True - elif block_type == "tool_result" and not has_tool_results: - has_tool_results = True - if has_images and has_tool_results: - break - if has_images and has_tool_results: + if any( + isinstance(block, dict) and block.get("type") == "image" + for block in content + ): + has_images = True break return RequestCapabilities( @@ -134,5 +127,4 @@ def build_request_capabilities(body: dict[str, Any]) -> RequestCapabilities: has_thinking=bool(body.get("thinking") or body.get("extended_thinking")), has_images=has_images, has_metadata=bool(body.get("metadata")), - has_tool_results=has_tool_results, ) diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 972537c..d64b296 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -268,34 +268,38 @@ def _determine_source_vendor( Priority 1: failed_tier_name(请求内故障转移,最可靠)。 Priority 2: session_record.provider_state 中有已注册转换的 vendor(跨请求)。 Priority 3: 从 body 内容推断(兜底首次请求无会话状态场景)。 - - 同 vendor 自转换(source == target)仅在 ``VENDOR_TRANSITIONS`` 显式注册 - 了对应通道时启用(如 ``("zhipu","zhipu")`` 修复 zhipu 自身不接受的产物), - 否则退化到无源行为。 """ from ..convert.vendor_channels import ( get_transition_channel, infer_source_vendor_from_body, ) - # 请求内:刚失败的 tier 就是源 - # 同 vendor 自转换仅在显式注册通道时生效 - if failed_tier_name and ( - failed_tier_name != target_name - or get_transition_channel(failed_tier_name, target_name) is not None + # 请求内:刚失败的 tier 就是源(仅当存在已注册的转换通道时) + # 修复:原逻辑仅检查 failed_tier != target 就无条件返回, + # 导致无注册通道的 failed_tier(如 copilot→anthropic)阻断降级到 + # Priority 2/3,原始 body 中的 server_tool_use 等非标准块未被清理。 + if ( + failed_tier_name + and get_transition_channel(failed_tier_name, target_name) is not None ): return failed_tier_name - # 跨请求:从会话历史找有注册转换的源(含已注册自转换) + # 跨请求:从会话历史找有注册转换的源 if session_record is not None and session_record.provider_state: for source in session_record.provider_state: - if get_transition_channel(source, target_name): + if source != target_name and get_transition_channel( + source, target_name + ): return source - # 首次请求兜底:从 body 内容推断(识别 zhipu 产物等,含已注册自转换) + # 首次请求兜底:从 body 内容推断(识别 zhipu 产物等) if body is not None: inferred = infer_source_vendor_from_body(body) - if inferred and get_transition_channel(inferred, target_name): + if ( + inferred + and inferred != target_name + and get_transition_channel(inferred, target_name) + ): return inferred return None @@ -799,27 +803,6 @@ async def _handle_http_error( tier.name, ) - # 补充检测:zhipu 500 — tool_result 块触发上游 AttributeError - # zhipu 后端在 tool_result 块上错误访问 .id 属性(应为 .tool_use_id), - # 此为已知的上游格式缺陷,应视为 format incompatibility 而非真实服务器故障。 - if ( - not semantic_rejection - and exc.response.status_code == 500 - and request_body is not None - and _has_tool_results(request_body) - ): - err_text = (exc.response.text or "")[:500] - if ( - "'ClaudeContentBlockToolResult'" in err_text - and "has no attribute 'id'" in err_text - ): - semantic_rejection = True - logger.warning( - "Tier %s zhipu tool_result format error (500), " - "treating as format incompatibility without circuit breaker penalty", - tier.name, - ) - if semantic_rejection and not is_last: return True, tier.name, exc diff --git a/tests/test_error_classifier.py b/tests/test_error_classifier.py index 8a37e65..90cb36e 100644 --- a/tests/test_error_classifier.py +++ b/tests/test_error_classifier.py @@ -362,75 +362,3 @@ def test_string_content_not_image(): def test_empty_messages(): caps = build_request_capabilities({"model": "m", "messages": []}) assert caps.has_images is False - assert caps.has_tool_results is False - - -def test_tool_results_in_user_message(): - caps = build_request_capabilities( - { - "model": "m", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "toolu_1", - "content": "ok", - } - ], - } - ], - } - ) - assert caps.has_tool_results is True - - -def test_tool_results_in_assistant_message(): - caps = build_request_capabilities( - { - "model": "m", - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_1", - "name": "bash", - "input": {}, - }, - { - "type": "tool_result", - "tool_use_id": "toolu_1", - "content": "ok", - }, - ], - } - ], - } - ) - assert caps.has_tool_results is True - - -def test_no_tool_results(): - caps = build_request_capabilities( - { - "model": "m", - "messages": [ - {"role": "user", "content": "hello"}, - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_1", - "name": "bash", - "input": {}, - } - ], - }, - ], - } - ) - assert caps.has_tool_results is False diff --git a/tests/test_model_vendor.py b/tests/test_model_vendor.py index 8d468a3..bdc1a87 100644 --- a/tests/test_model_vendor.py +++ b/tests/test_model_vendor.py @@ -116,7 +116,7 @@ def test_all_member_values(self): def test_member_count(self): """枚举成员数量.""" - assert len(CapabilityLossReason) == 6 + assert len(CapabilityLossReason) == 5 def test_can_iterate(self): """可遍历所有成员.""" @@ -127,7 +127,6 @@ def test_can_iterate(self): "IMAGES", "VENDOR_TOOLS", "METADATA", - "TOOL_RESULTS", } def test_lookup_by_value(self): @@ -151,7 +150,6 @@ def test_defaults_all_false(self): assert caps.has_thinking is False assert caps.has_images is False assert caps.has_metadata is False - assert caps.has_tool_results is False def test_custom_true_values(self): """自定义构造: 指定 True 的字段正确赋值.""" @@ -160,7 +158,6 @@ def test_custom_true_values(self): assert caps.has_images is True assert caps.has_thinking is False assert caps.has_metadata is False - assert caps.has_tool_results is False def test_frozen_immutable(self): """frozen dataclass: 赋值操作抛 AttributeError.""" diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index b06794f..1e40ea6 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -348,7 +348,6 @@ async def test_raises_no_compatible_vendor(self): @pytest.mark.asyncio async def test_last_tier_propagates_http_error(self): """最后一层的 HTTP 错误直接抛出.""" - import httpx vendor = _mock_vendor() vendor.send_message.side_effect = httpx.ConnectError("unreachable") @@ -370,7 +369,6 @@ async def test_last_tier_propagates_token_error(self): @pytest.mark.asyncio async def test_non_last_tier_continues_on_connect_error(self): """非最后一层连接失败时继续尝试下一层.""" - import httpx bad = _mock_vendor("bad") bad.send_message.side_effect = httpx.ConnectError("down") @@ -461,7 +459,6 @@ async def _raise_token(*a, **kw): @pytest.mark.asyncio async def test_stream_http_error_raises_on_last_tier(self): """最后一层流式 HTTP 错误直接抛出.""" - import httpx vendor = _mock_vendor() @@ -1636,13 +1633,13 @@ def test_returns_none_for_no_source(self): ) def test_returns_session_vendor_with_registered_transition_anthropic_to_zhipu(self): - """anthropic → zhipu 已注册转换,应返回 anthropic 作为源 vendor.""" + """anthropic → zhipu 未注册转换,应回退到无源行为.""" session_record = MagicMock() session_record.provider_state = {"anthropic": {}} assert ( _RouteExecutor._determine_source_vendor("zhipu", None, session_record) - == "anthropic" + is None ) def test_returns_none_when_session_is_none(self): @@ -1786,8 +1783,8 @@ def test_priority3_skips_when_no_registered_transition(self): ) def test_priority1_overrides_priority3(self): - """Priority 1 (failed_tier) 优先于 Priority 3 (body inference).""" - # body 内有 zhipu 产物,但 failed_tier 显式指定 copilot + """Priority 1 (failed_tier) 优先于 Priority 3 (body inference) — 仅当通道已注册.""" + # body 内有 zhipu 产物,failed_tier=zhipu, target=copilot → zhipu→copilot 已注册 body = { "messages": [ { @@ -1803,10 +1800,26 @@ def test_priority1_overrides_priority3(self): }, ], } - # failed_tier=copilot → 应返回 copilot,不看 body + # failed_tier=zhipu, target=copilot → (zhipu,copilot) 已注册 → 返回 zhipu assert ( - _RouteExecutor._determine_source_vendor("zhipu", "copilot", None, body) - == "copilot" + _RouteExecutor._determine_source_vendor("copilot", "zhipu", None, body) + == "zhipu" + ) + + def test_priority1_falls_through_when_no_registered_transition(self): + """Priority 1: failed_tier 无已注册转换通道 → 降级到 Priority 2. + + 核心修复场景: copilot 失败后降级到 anthropic 时, (copilot,anthropic) + 未注册 → 通过 session history 找到 zhipu → 应用 zhipu→anthropic 转换. + """ + session_record = MagicMock() + session_record.provider_state = {"zhipu": {}} + # copilot → anthropic 未注册, 但 session 中有 zhipu → zhipu→anthropic 已注册 + assert ( + _RouteExecutor._determine_source_vendor( + "anthropic", "copilot", session_record + ) + == "zhipu" ) def test_priority2_overrides_priority3(self): @@ -1844,79 +1857,6 @@ def test_body_parameter_is_optional(self): ) -# ── _determine_source_vendor 自转换通道测试 ───────────────────────── - - -class TestDetermineSourceVendorSelfTransition: - """验证已注册的同 vendor 自转换 (如 zhipu → zhipu) 在三条优先级中均能命中. - - 自转换通道用于修复 vendor 自身无法消化的产物 (如 zhipu 不接受输入中的 - server_tool_use_delta 与 assistant 内联 tool_result). - """ - - def test_priority1_self_transition_when_registered(self): - """Priority 1: failed_tier == target 且通道已注册 → 返回 target 作为源.""" - # zhipu 自转换通道已在 vendor_channels 注册 - assert ( - _RouteExecutor._determine_source_vendor("zhipu", "zhipu", None) == "zhipu" - ) - - def test_priority1_self_transition_blocked_when_unregistered(self): - """Priority 1: failed_tier == target 但通道未注册 → 返回 None. - - anthropic 未注册自转换通道, 保持原有「同 vendor 无源」行为. - """ - assert ( - _RouteExecutor._determine_source_vendor("anthropic", "anthropic", None) - is None - ) - - def test_priority2_self_transition_via_session(self): - """Priority 2: 会话历史中只有目标 vendor, 但其自转换通道已注册 → 命中.""" - session_record = MagicMock() - session_record.provider_state = {"zhipu": {}} - assert ( - _RouteExecutor._determine_source_vendor("zhipu", None, session_record) - == "zhipu" - ) - - def test_priority2_session_unregistered_self_returns_none(self): - """Priority 2: 会话只有未注册自转换的 vendor → None.""" - session_record = MagicMock() - session_record.provider_state = {"anthropic": {}} - assert ( - _RouteExecutor._determine_source_vendor("anthropic", None, session_record) - is None - ) - - def test_priority3_self_transition_when_registered(self): - """Priority 3: 首次请求 body 含 zhipu 产物且目标也是 zhipu → 命中自清理. - - 这是修复 「zhipu 400 + tool_results 偶发」 的核心兜底场景: - Claude Code 把上一轮 zhipu 响应原样回送, 命中 zhipu 主 tier 时 - 可识别并应用自清理通道。 - """ - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_x", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - assert ( - _RouteExecutor._determine_source_vendor("zhipu", None, None, body) - == "zhipu" - ) - - # ── _prepare_body_for_tier 转换通道应用测试 ──────────────────────── @@ -1998,23 +1938,6 @@ def test_returns_body_when_no_source_vendor(self): assert result is body assert len(result["messages"][0]["content"]) == 2 - def test_applies_anthropic_to_zhipu_transition(self): - """anthropic → zhipu 已注册转换,应清理 thinking blocks.""" - tier = MagicMock() - tier.name = "zhipu" - - exec_inst = _executor([]) - body = self._body_with_thinking() - result = exec_inst._prepare_body_for_tier(body, tier, source_vendor="anthropic") - - # thinking blocks 应被剥离 - assert result is not body - assert all( - b.get("type") not in ("thinking", "redacted_thinking") - for b in result["messages"][0]["content"] - ) - assert len(result["messages"][0]["content"]) >= 1 - def test_returns_body_for_unknown_tier(self): """未知 tier(无注册转换)→ 原样返回.""" tier = MagicMock() @@ -2025,254 +1948,3 @@ def test_returns_body_for_unknown_tier(self): result = exec_inst._prepare_body_for_tier(body, tier, source_vendor="zhipu") assert result is body - - -# ── _prepare_body_for_tier 自转换通道测试 ─────────────────────────── - - -class TestPrepareBodyForTierSelfTransition: - """验证 zhipu → zhipu 自转换通道在 _prepare_body_for_tier 中的应用行为.""" - - def test_applies_zhipu_self_cleanup(self): - """source=zhipu, target=zhipu → 剥离 server_tool_use_delta 并展平 tool 块.""" - tier = MagicMock() - tier.name = "zhipu" - - body = { - "model": "claude-opus-4-6", - "messages": [ - { - "role": "assistant", - "content": [ - {"type": "server_tool_use_delta", "partial_json": "{}"}, - { - "type": "tool_use", - "id": "srvtoolu_a", - "name": "bash", - "input": {}, - }, - { - "type": "tool_result", - "tool_use_id": "srvtoolu_a", - "content": "ok", - }, - ], - }, - ], - } - exec_inst = _executor([]) - result = exec_inst._prepare_body_for_tier(body, tier, source_vendor="zhipu") - - # 深拷贝(不修改原始 body) - assert result is not body - assert len(body["messages"][0]["content"]) == 3 - - # delta 块被剥离 - assistant_content = result["messages"][0]["content"] - assert all(b.get("type") != "server_tool_use_delta" for b in assistant_content) - # tool_use 和 tool_result 被展平为 text - assert all( - b.get("type") not in ("tool_use", "tool_result") for b in assistant_content - ) - - def test_self_cleanup_preserves_srvtoolu_ids(self): - """回归保护: 自清理通道不得改写 zhipu 原生 srvtoolu_* ID.""" - tier = MagicMock() - tier.name = "zhipu" - - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_keep_me", - "name": "bash", - "input": {}, - }, - { - "type": "thinking", - "thinking": "...", - "signature": "zhipu_sig", - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "srvtoolu_keep_me", - "content": "ok", - }, - ], - }, - ], - } - exec_inst = _executor([]) - result = exec_inst._prepare_body_for_tier(body, tier, source_vendor="zhipu") - - # ID 与 server_tool_use 类型必须保留 - first_block = result["messages"][0]["content"][0] - assert first_block["id"] == "srvtoolu_keep_me" - assert first_block["type"] == "server_tool_use" - # thinking signature 也必须保留 - thinking_block = next( - b for b in result["messages"][0]["content"] if b.get("type") == "thinking" - ) - assert thinking_block["signature"] == "zhipu_sig" - - -# ── zhipu 500 tool_result 格式错误检测测试 ────────────────────── - - -class TestZhipu500ToolResultFormatError: - """验证 _handle_http_error 对 zhipu 500 'ClaudeContentBlockToolResult' 错误的处理. - - zhipu 后端在 tool_result 块上错误访问 .id 属性(应为 .tool_use_id), - 此为已知的上游格式缺陷,应视为 format incompatibility(semantic rejection) - 而非真实服务器故障,不应计入熔断器。 - """ - - @pytest.mark.asyncio - async def test_zhipu_500_tool_result_error_triggers_semantic_rejection(self): - """zhipu 500 + 'ClaudeContentBlockToolResult' + tool_result → semantic rejection.""" - from coding.proxy.routing.circuit_breaker import CircuitBreaker - - vendor = _mock_vendor("zhipu") - error_body = ( - b'{"error":{"code":"500","message":"\'ClaudeContentBlockToolResult\' ' - b"object has no attribute 'id'\"}}" - ) - response = httpx.Response( - status_code=500, - content=error_body, - request=httpx.Request("POST", "https://example.com"), - ) - exc = httpx.HTTPStatusError( - "zhipu API error: 500", request=response.request, response=response - ) - - cb = CircuitBreaker(failure_threshold=3) - tier = _make_tier(vendor, circuit_breaker=cb) - exec_inst = _executor([tier, _make_tier(_mock_vendor("copilot"))]) - - body = { - "model": "claude-opus-4-6", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "tu_1", - "content": "result", - } - ], - }, - ], - } - - should_continue, failed_name, _ = await exec_inst._handle_http_error( - tier, - exc, - is_last=False, - failed_tier_name=None, - last_exc=None, - is_stream=True, - request_body=body, - ) - - assert should_continue is True - assert failed_name == "zhipu" - # 不应计入熔断器 - assert cb.get_info()["failure_count"] == 0 - - @pytest.mark.asyncio - async def test_zhipu_500_generic_error_records_failure(self): - """zhipu 500 但非 tool_result 格式错误 → 正常记录熔断器.""" - from coding.proxy.routing.circuit_breaker import CircuitBreaker - - vendor = _mock_vendor("zhipu") - error_body = b'{"error":{"code":"500","message":"Internal Server Error"}}' - response = httpx.Response( - status_code=500, - content=error_body, - request=httpx.Request("POST", "https://example.com"), - ) - exc = httpx.HTTPStatusError( - "zhipu API error: 500", request=response.request, response=response - ) - - cb = CircuitBreaker(failure_threshold=3) - tier = _make_tier(vendor, circuit_breaker=cb) - exec_inst = _executor([tier]) - - body = { - "model": "claude-opus-4-6", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "tu_1", - "content": "result", - } - ], - }, - ], - } - - should_continue, _, _ = await exec_inst._handle_http_error( - tier, - exc, - is_last=True, - failed_tier_name=None, - last_exc=None, - is_stream=True, - request_body=body, - ) - - # 非 last tier 时 should_continue=False,且应记录熔断器失败 - assert should_continue is False - assert cb.get_info()["failure_count"] == 1 - - @pytest.mark.asyncio - async def test_zhipu_500_tool_result_error_without_tool_results_body(self): - """zhipu 500 tool_result 错误但请求体无 tool_result → 不触发特殊处理.""" - from coding.proxy.routing.circuit_breaker import CircuitBreaker - - vendor = _mock_vendor("zhipu") - error_body = ( - b'{"error":{"code":"500","message":"\'ClaudeContentBlockToolResult\' ' - b"object has no attribute 'id'\"}}" - ) - response = httpx.Response( - status_code=500, - content=error_body, - request=httpx.Request("POST", "https://example.com"), - ) - exc = httpx.HTTPStatusError( - "zhipu API error: 500", request=response.request, response=response - ) - - cb = CircuitBreaker(failure_threshold=3) - tier = _make_tier(vendor, circuit_breaker=cb) - exec_inst = _executor([tier]) - - body = {"model": "test", "messages": [{"role": "user", "content": "hello"}]} - - should_continue, _, _ = await exec_inst._handle_http_error( - tier, - exc, - is_last=True, - failed_tier_name=None, - last_exc=None, - is_stream=True, - request_body=body, - ) - - assert should_continue is False - assert cb.get_info()["failure_count"] == 1 diff --git a/tests/test_types.py b/tests/test_types.py index 2b783ad..eebecb7 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -67,7 +67,6 @@ def test_request_capabilities_defaults(): assert caps.has_thinking is False assert caps.has_images is False assert caps.has_metadata is False - assert caps.has_tool_results is False def test_request_capabilities_immutable(): diff --git a/tests/test_vendor_channels.py b/tests/test_vendor_channels.py index 535e30f..774b85a 100644 --- a/tests/test_vendor_channels.py +++ b/tests/test_vendor_channels.py @@ -4,8 +4,6 @@ - zhipu → anthropic 转换 (prepare_zhipu_to_anthropic) - zhipu → copilot 转换 (prepare_zhipu_to_copilot) - copilot → zhipu 转换 (prepare_copilot_to_zhipu) -- zhipu → zhipu 自清理 (prepare_zhipu_self_cleanup) -- anthropic → zhipu 转换 (prepare_anthropic_to_zhipu) - 共享辅助函数 (strip_thinking_blocks, _strip_cache_control, _remove_vendor_blocks, _rewrite_srvtoolu_ids, enforce_anthropic_tool_pairing, infer_source_vendor_from_body) - 转换注册表 (VENDOR_TRANSITIONS, get_transition_channel) @@ -17,16 +15,13 @@ from coding.proxy.convert.vendor_channels import ( VENDOR_TRANSITIONS, - _enforce_pairing_sanity_pass, _remove_vendor_blocks, _rewrite_srvtoolu_ids, _strip_cache_control, enforce_anthropic_tool_pairing, get_transition_channel, infer_source_vendor_from_body, - prepare_anthropic_to_zhipu, prepare_copilot_to_zhipu, - prepare_zhipu_self_cleanup, prepare_zhipu_to_anthropic, prepare_zhipu_to_copilot, strip_thinking_blocks, @@ -244,8 +239,7 @@ def test_strips_thinking_blocks(self): # 原始 body 未被修改 assert body["messages"][0]["content"][0]["type"] == "thinking" - def test_preserves_cache_control(self): - """copilot → zhipu 不再移除 cache_control(zhipu 原生支持).""" + def test_removes_cache_control(self): body = { "system": [ {"type": "text", "text": "sys", "cache_control": {"type": "ephemeral"}}, @@ -253,8 +247,8 @@ def test_preserves_cache_control(self): "messages": [], } prepared, adaptations = prepare_copilot_to_zhipu(body) - assert not any("cache_control" in a for a in adaptations) - assert "cache_control" in prepared["system"][0] + assert any("cache_control" in a for a in adaptations) + assert "cache_control" not in prepared["system"][0] def test_removes_thinking_params(self): body = { @@ -268,8 +262,7 @@ def test_removes_thinking_params(self): assert "removed_thinking_param" in adaptations assert "removed_extended_thinking_param" in adaptations - def test_flattens_tool_use_blocks(self): - """copilot → zhipu 将 tool_use 展平为 text 块.""" + def test_enforces_tool_pairing(self): body = { "messages": [ { @@ -279,7 +272,7 @@ def test_flattens_tool_use_blocks(self): "type": "tool_use", "id": "toolu_1", "name": "bash", - "input": {"command": "ls"}, + "input": {}, }, ], }, @@ -290,15 +283,14 @@ def test_flattens_tool_use_blocks(self): ], } prepared, adaptations = prepare_copilot_to_zhipu(body) - assert any("flattened" in a for a in adaptations) - # tool_use 被转为 text - assistant_content = prepared["messages"][0]["content"] - assert all(b.get("type") != "tool_use" for b in assistant_content) - assert any( - "Tool Call: bash" in b.get("text", "") - for b in assistant_content - if b.get("type") == "text" - ) + user_content = prepared["messages"][1]["content"] + tool_results = [ + b + for b in user_content + if isinstance(b, dict) and b.get("type") == "tool_result" + ] + assert len(tool_results) == 1 + assert tool_results[0]["tool_use_id"] == "toolu_1" def test_combined_transformations(self): body = { @@ -330,12 +322,15 @@ def test_combined_transformations(self): b.get("type") not in ("thinking", "redacted_thinking") for b in prepared["messages"][0]["content"] ) - # cache_control 保留 - assert "cache_control" in prepared["system"][0] + assert "cache_control" not in prepared["system"][0] assert "thinking" not in prepared - # tool_use 被展平为 text - assistant_content = prepared["messages"][0]["content"] - assert all(b.get("type") != "tool_use" for b in assistant_content) + user_content = prepared["messages"][1]["content"] + tool_results = [ + b + for b in user_content + if isinstance(b, dict) and b.get("type") == "tool_result" + ] + assert len(tool_results) == 1 def test_preserves_original_body(self): body = { @@ -392,39 +387,6 @@ def test_idempotency(self): assert prepared2 == prepared1 assert adaptations2 == [] - def test_flattens_tool_result_in_user_message(self): - """copilot → zhipu 将 user 消息中的 tool_result 展平为 text.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_001", - "name": "bash", - "input": {}, - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "toolu_001", - "content": "ok", - }, - ], - }, - ], - } - prepared, adaptations = prepare_copilot_to_zhipu(body) - # tool_result 被展平为 text - user_content = prepared["messages"][1]["content"] - assert all(b.get("type") != "tool_result" for b in user_content) - assert any("flattened" in a for a in adaptations) - # ── zhipu → anthropic 转换通道测试 ──────────────────────────────── @@ -731,111 +693,158 @@ def test_strips_redacted_thinking(self): ] -# ── zhipu → zhipu 自清理通道测试 ───────────────────────────────── +# ── 转换注册表测试 ──────────────────────────────────────────── -class TestZhipuSelfCleanupChannel: - """prepare_zhipu_self_cleanup 单元测试. +class TestTransitionRegistry: + """VENDOR_TRANSITIONS / get_transition_channel 单元测试.""" - 自清理通道的核心契约: **仅** 修复 zhipu 自身拒绝的产物 - (server_tool_use_delta, 错位 tool_result), 保留所有 zhipu 原生支持 - 的特性 (srvtoolu_* ID, thinking signature, cache_control, 顶层 thinking). - """ + def test_all_transitions_registered(self): + assert ("zhipu", "anthropic") in VENDOR_TRANSITIONS + assert ("zhipu", "copilot") in VENDOR_TRANSITIONS + assert ("copilot", "zhipu") in VENDOR_TRANSITIONS + assert len(VENDOR_TRANSITIONS) == 3 + + def test_get_transition_channel_returns_function(self): + assert ( + get_transition_channel("zhipu", "anthropic") is prepare_zhipu_to_anthropic + ) + assert get_transition_channel("zhipu", "copilot") is prepare_zhipu_to_copilot + assert get_transition_channel("copilot", "zhipu") is prepare_copilot_to_zhipu - def test_strips_server_tool_use_delta(self): + def test_get_transition_channel_returns_none_for_unregistered(self): + assert get_transition_channel("anthropic", "zhipu") is None + assert get_transition_channel("copilot", "anthropic") is None + assert get_transition_channel("unknown", "target") is None + assert get_transition_channel("antigravity", "copilot") is None + + def test_transition_functions_share_signature(self): + body = {"messages": []} + for key, fn in VENDOR_TRANSITIONS.items(): + result = fn(body) + assert isinstance(result, tuple) and len(result) == 2 + assert isinstance(result[0], dict) + assert isinstance(result[1], list) + + +# ── 转换通道差异测试 ────────────────────────────────────────── + + +class TestTransitionDifferences: + """验证不同转换通道的关键行为差异.""" + + def test_copilot_to_zhipu_removes_thinking_param_zhipu_to_copilot_preserves(self): + body = { + "messages": [], + "thinking": {"type": "enabled", "budget_tokens": 5000}, + } + copilot_to_zhipu_result, copilot_to_zhipu_adapt = prepare_copilot_to_zhipu(body) + zhipu_to_copilot_result, zhipu_to_copilot_adapt = prepare_zhipu_to_copilot(body) + + assert "thinking" not in copilot_to_zhipu_result + assert "removed_thinking_param" in copilot_to_zhipu_adapt + + assert "thinking" in zhipu_to_copilot_result + assert "removed_thinking_param" not in zhipu_to_copilot_adapt + + def test_all_transitions_strip_thinking_blocks(self): body = { "messages": [ { "role": "assistant", "content": [ - {"type": "text", "text": "thinking..."}, - {"type": "server_tool_use_delta", "partial_json": "{}"}, + {"type": "thinking", "thinking": "t"}, + {"type": "text", "text": "hi"}, ], }, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - content = prepared["messages"][0]["content"] - assert all(b.get("type") != "server_tool_use_delta" for b in content) - assert any("zhipu_vendor_blocks" in a for a in adaptations) + for key, fn in VENDOR_TRANSITIONS.items(): + result, adaptations = fn(body) + assert result["messages"][0]["content"] == [ + {"type": "text", "text": "hi"} + ], f"Transition {key} failed to strip thinking blocks" + + +# ── _remove_vendor_blocks 单元测试 ──────────────────────────────── + + +class TestRemoveVendorBlocks: + """_remove_vendor_blocks 就地剥离指定 type 内容块.""" - def test_preserves_inline_tool_result_in_assistant(self): - """assistant 内联 tool_result 和 tool_use 被展平为 text 块.""" + def test_removes_single_type(self): body = { "messages": [ { "role": "assistant", "content": [ + {"type": "text", "text": "before"}, { - "type": "tool_use", - "id": "srvtoolu_a", - "name": "bash", - "input": {}, - }, - { - "type": "tool_result", - "tool_use_id": "srvtoolu_a", - "content": "ok", + "type": "server_tool_use_delta", + "partial_json": '{"cmd":"pwd"}', }, + {"type": "text", "text": "after"}, ], }, - {"role": "user", "content": []}, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - - # tool_use 和 tool_result 均被展平为 text - assistant_content = prepared["messages"][0]["content"] - assert all( - b.get("type") not in ("tool_use", "tool_result") for b in assistant_content - ) - assert any("flattened" in a for a in adaptations) + removed = _remove_vendor_blocks(body, {"server_tool_use_delta"}) + assert removed == 1 + assert [b["type"] for b in body["messages"][0]["content"]] == ["text", "text"] - def test_tool_result_flattened_to_text(self): - """自清理通道将 tool_result 展平为 text 块.""" + def test_removes_multiple_types(self): body = { "messages": [ { "role": "assistant", "content": [ - { - "type": "tool_use", - "id": "toolu_001", - "name": "bash", - "input": {}, - }, + {"type": "text", "text": "keep"}, + {"type": "foo", "data": "drop"}, + {"type": "bar", "data": "drop"}, ], }, + ], + } + removed = _remove_vendor_blocks(body, {"foo", "bar"}) + assert removed == 2 + assert body["messages"][0]["content"] == [{"type": "text", "text": "keep"}] + + def test_noop_when_no_match(self): + body = { + "messages": [ { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "toolu_001", - "content": "ok", - }, - ], + "role": "assistant", + "content": [{"type": "text", "text": "clean"}], }, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - # tool_result 被展平为 text - user_content = prepared["messages"][1]["content"] - assert all(b.get("type") != "tool_result" for b in user_content) - assert any("flattened" in a for a in adaptations) + removed = _remove_vendor_blocks(body, {"server_tool_use_delta"}) + assert removed == 0 + assert body["messages"][0]["content"] == [{"type": "text", "text": "clean"}] + + def test_handles_string_content(self): + body = {"messages": [{"role": "user", "content": "hi"}]} + removed = _remove_vendor_blocks(body, {"whatever"}) + assert removed == 0 + + +# ── _rewrite_srvtoolu_ids 单元测试 ───────────────────────────────── + + +class TestRewriteSrvtooluIds: + """_rewrite_srvtoolu_ids 将 srvtoolu_* ID 与 server_tool_use 类型标准化.""" - def test_flattens_tool_result_with_existing_id(self): - """自清理通道将含 id 的 tool_result 也展平为 text.""" + def test_rewrites_server_tool_use_and_result_pair(self): body = { "messages": [ { "role": "assistant", "content": [ { - "type": "tool_use", - "id": "toolu_001", + "type": "server_tool_use", + "id": "srvtoolu_xyz", "name": "bash", - "input": {}, + "input": {"cmd": "ls"}, }, ], }, @@ -844,30 +853,32 @@ def test_flattens_tool_result_with_existing_id(self): "content": [ { "type": "tool_result", - "tool_use_id": "toolu_001", - "id": "original_id", + "tool_use_id": "srvtoolu_xyz", "content": "ok", }, ], }, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - # tool_result 被展平为 text,不再保留原结构 - user_content = prepared["messages"][1]["content"] - assert all(b.get("type") != "tool_result" for b in user_content) - assert any("flattened" in a for a in adaptations) + count, id_map = _rewrite_srvtoolu_ids(body) + assert count == 1 + assistant_block = body["messages"][0]["content"][0] + user_block = body["messages"][1]["content"][0] + assert assistant_block["type"] == "tool_use" + assert assistant_block["id"].startswith("toolu_normalized_") + assert user_block["tool_use_id"] == assistant_block["id"] + assert id_map == {"srvtoolu_xyz": assistant_block["id"]} - def test_preserves_srvtoolu_ids(self): - """zhipu 原生 srvtoolu_* ID 与 server_tool_use 类型必须保留.""" + def test_rewrites_non_standard_tool_use_id_with_name(self): + """非标准 ID(非 toolu_ / srvtoolu_)且具备 name → 改写为 toolu_normalized_*.""" body = { "messages": [ { "role": "assistant", "content": [ { - "type": "server_tool_use", - "id": "srvtoolu_xyz", + "type": "tool_use", + "id": "custom_bad_id", "name": "bash", "input": {}, }, @@ -878,425 +889,214 @@ def test_preserves_srvtoolu_ids(self): "content": [ { "type": "tool_result", - "tool_use_id": "srvtoolu_xyz", + "tool_use_id": "custom_bad_id", "content": "ok", }, ], }, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - - block = prepared["messages"][0]["content"][0] - assert block["id"] == "srvtoolu_xyz" - assert block["type"] == "server_tool_use" - # 无任何 srvtoolu 改写或 server_tool_use 类型纠正 - assert not any("srvtoolu_ids" in a for a in adaptations) + count, id_map = _rewrite_srvtoolu_ids(body) + assert count == 1 + new_id = body["messages"][0]["content"][0]["id"] + assert new_id.startswith("toolu_normalized_") + assert body["messages"][1]["content"][0]["tool_use_id"] == new_id - def test_preserves_thinking_blocks(self): - """zhipu 自签 thinking signature 必须保留.""" + def test_preserves_standard_tool_use_id(self): body = { "messages": [ { "role": "assistant", "content": [ { - "type": "thinking", - "thinking": "let me think", - "signature": "zhipu_sig_abc", + "type": "tool_use", + "id": "toolu_abc", + "name": "bash", + "input": {}, }, - {"type": "text", "text": "answer"}, ], }, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - content = prepared["messages"][0]["content"] - assert any(b.get("type") == "thinking" for b in content) - assert not any("thinking_blocks" in a for a in adaptations) + count, id_map = _rewrite_srvtoolu_ids(body) + assert count == 0 + assert body["messages"][0]["content"][0]["id"] == "toolu_abc" - def test_preserves_cache_control(self): - """cache_control 字段必须保留 (GLM 原生支持, 已实证 cache_read).""" + def test_corrects_server_tool_use_type_with_standard_id(self): + """type 为 server_tool_use 但 ID 已是 toolu_* 时仅纠正 type.""" body = { - "system": [ - { - "type": "text", - "text": "system prompt", - "cache_control": {"type": "ephemeral"}, - }, - ], "messages": [ { - "role": "user", + "role": "assistant", "content": [ { - "type": "text", - "text": "hi", - "cache_control": {"type": "ephemeral"}, + "type": "server_tool_use", + "id": "toolu_okay", + "name": "bash", + "input": {}, }, ], }, ], - "tools": [ - { - "name": "bash", - "description": "", - "input_schema": {"type": "object"}, - "cache_control": {"type": "ephemeral"}, - }, - ], - } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - assert prepared["system"][0].get("cache_control") == {"type": "ephemeral"} - assert prepared["messages"][0]["content"][0].get("cache_control") == { - "type": "ephemeral" } - assert prepared["tools"][0].get("cache_control") == {"type": "ephemeral"} - assert not any("cache_control" in a for a in adaptations) - - def test_preserves_thinking_param(self): - """顶层 thinking / extended_thinking 参数必须保留.""" - body = { - "messages": [], - "thinking": {"type": "enabled", "budget_tokens": 5000}, - "extended_thinking": {"foo": "bar"}, - } - prepared, _ = prepare_zhipu_self_cleanup(body) - assert prepared["thinking"] == { - "type": "enabled", - "budget_tokens": 5000, - } - assert prepared["extended_thinking"] == {"foo": "bar"} + count, _ = _rewrite_srvtoolu_ids(body) + # 既不是 srvtoolu_*,ID 也合法 → 不计入 count,但 type 应被校正 + assert count == 0 + assert body["messages"][0]["content"][0]["type"] == "tool_use" - def test_idempotency(self): - """二次调用幂等: 已清洗的 body 不再产生新 adaptations.""" + def test_rewrites_multiple_pairs_with_unique_ids(self): body = { "messages": [ { "role": "assistant", "content": [ { - "type": "tool_use", + "type": "server_tool_use", "id": "srvtoolu_a", "name": "bash", "input": {}, }, { - "type": "tool_result", - "tool_use_id": "srvtoolu_a", - "content": "ok", + "type": "server_tool_use", + "id": "srvtoolu_b", + "name": "read", + "input": {}, }, - {"type": "server_tool_use_delta", "partial_json": "{}"}, - ], - }, - ], - } - first_pass, first_adapt = prepare_zhipu_self_cleanup(body) - assert first_adapt # 首次调用应产生变换 - _, second_adapt = prepare_zhipu_self_cleanup(first_pass) - assert second_adapt == [] - - def test_noop_when_clean(self): - """纯净 body (无 zhipu 产物) 应不产生任何 adaptations.""" - body = { - "messages": [ - {"role": "user", "content": "hello"}, - { - "role": "assistant", - "content": [{"type": "text", "text": "hi"}], - }, - ], - } - original = copy.deepcopy(body) - prepared, adaptations = prepare_zhipu_self_cleanup(body) - assert adaptations == [] - assert prepared == original - - def test_does_not_mutate_input(self): - """通道返回深拷贝, 输入 body 必须保持原状.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - {"type": "server_tool_use_delta", "partial_json": "{}"}, ], }, - ], - } - original = copy.deepcopy(body) - prepare_zhipu_self_cleanup(body) - assert body == original - - def test_combined_artifacts(self): - """端到端: server_tool_use_delta 被剥, 其余保留原位. - - 典型场景: zhipu 偶发在 assistant 消息中产出多种块。 - server_tool_use_delta 被剥离,其余块(含 inline tool_result)保留原位, - 不再做 tool pairing 和 id 注入。 - """ - body = { - "messages": [ { - "role": "assistant", + "role": "user", "content": [ - {"type": "server_tool_use_delta", "partial_json": "{}"}, - { - "type": "server_tool_use", - "id": "srvtoolu_native", - "name": "web_search", - "input": {}, - }, { - "type": "tool_use", - "id": "toolu_bash_001", - "name": "bash", - "input": {"command": "ls"}, + "type": "tool_result", + "tool_use_id": "srvtoolu_a", + "content": "a", }, { "type": "tool_result", - "tool_use_id": "toolu_bash_001", - "content": "ok", + "tool_use_id": "srvtoolu_b", + "content": "b", }, ], }, ], } - prepared, adaptations = prepare_zhipu_self_cleanup(body) - - assistant_content = prepared["messages"][0]["content"] - # delta 被剥离 - assert all(b.get("type") != "server_tool_use_delta" for b in assistant_content) - # tool_use / tool_result 被 flatten 为 text 块 - assert not any(b.get("type") == "tool_use" for b in assistant_content) - assert not any(b.get("type") == "tool_result" for b in assistant_content) - # server_tool_use 与其 srvtoolu_* ID 完整保留 - srv_block = next( - b for b in assistant_content if b.get("type") == "server_tool_use" - ) - assert srv_block["id"] == "srvtoolu_native" - # flatten 后应包含 tool_use 和 tool_result 对应的 text 块 - text_contents = [ - b.get("text", "") for b in assistant_content if b.get("type") == "text" - ] - assert any("Tool Call: bash" in t for t in text_contents) - assert any("Tool Result for toolu_bash_001" in t for t in text_contents) - # 不插入额外 user 消息 - assert len(prepared["messages"]) == 1 - # 关键 adaptation 标签 - assert any("zhipu_vendor_blocks" in a for a in adaptations) - assert any("flattened" in a and "tool_blocks" in a for a in adaptations) - # 不应有 tool pairing / id 注入 相关 adaptation - assert not any("misplaced" in a for a in adaptations) - assert not any("injected" in a for a in adaptations) - - -# ── 转换注册表测试 ──────────────────────────────────────────── - - -class TestTransitionRegistry: - """VENDOR_TRANSITIONS / get_transition_channel 单元测试.""" - - def test_all_transitions_registered(self): - assert ("zhipu", "anthropic") in VENDOR_TRANSITIONS - assert ("zhipu", "copilot") in VENDOR_TRANSITIONS - assert ("copilot", "zhipu") in VENDOR_TRANSITIONS - assert ("zhipu", "zhipu") in VENDOR_TRANSITIONS - assert ("anthropic", "zhipu") in VENDOR_TRANSITIONS - assert len(VENDOR_TRANSITIONS) == 5 - - def test_get_transition_channel_returns_function(self): - assert ( - get_transition_channel("zhipu", "anthropic") is prepare_zhipu_to_anthropic - ) - assert get_transition_channel("zhipu", "copilot") is prepare_zhipu_to_copilot - assert get_transition_channel("copilot", "zhipu") is prepare_copilot_to_zhipu - assert get_transition_channel("zhipu", "zhipu") is prepare_zhipu_self_cleanup - assert ( - get_transition_channel("anthropic", "zhipu") is prepare_anthropic_to_zhipu - ) - - def test_get_transition_channel_returns_none_for_unregistered(self): - assert get_transition_channel("copilot", "anthropic") is None - assert get_transition_channel("unknown", "target") is None - assert get_transition_channel("antigravity", "copilot") is None - # 未注册的同 vendor 自转换仍返回 None - assert get_transition_channel("anthropic", "anthropic") is None - assert get_transition_channel("copilot", "copilot") is None - - def test_transition_functions_share_signature(self): - body = {"messages": []} - for key, fn in VENDOR_TRANSITIONS.items(): - result = fn(body) - assert isinstance(result, tuple) and len(result) == 2 - assert isinstance(result[0], dict) - assert isinstance(result[1], list) - - -# ── 转换通道差异测试 ────────────────────────────────────────── - - -class TestTransitionDifferences: - """验证不同转换通道的关键行为差异.""" - - def test_copilot_to_zhipu_removes_thinking_param_zhipu_to_copilot_preserves(self): - body = { - "messages": [], - "thinking": {"type": "enabled", "budget_tokens": 5000}, - } - copilot_to_zhipu_result, copilot_to_zhipu_adapt = prepare_copilot_to_zhipu(body) - zhipu_to_copilot_result, zhipu_to_copilot_adapt = prepare_zhipu_to_copilot(body) - - assert "thinking" not in copilot_to_zhipu_result - assert "removed_thinking_param" in copilot_to_zhipu_adapt - - assert "thinking" in zhipu_to_copilot_result - assert "removed_thinking_param" not in zhipu_to_copilot_adapt + count, id_map = _rewrite_srvtoolu_ids(body) + assert count == 2 + assert len(set(id_map.values())) == 2 + assistant_ids = [b["id"] for b in body["messages"][0]["content"]] + result_ids = [b["tool_use_id"] for b in body["messages"][1]["content"]] + assert assistant_ids == result_ids - def test_cross_vendor_transitions_strip_thinking_blocks(self): - """跨 vendor 通道一律剥离 thinking blocks(自清理通道刻意保留,故排除).""" + def test_skips_non_matching_user_tool_result(self): + """tool_result.tool_use_id 不在 id_map 时保留原样.""" body = { "messages": [ { - "role": "assistant", + "role": "user", "content": [ - {"type": "thinking", "thinking": "t"}, - {"type": "text", "text": "hi"}, + { + "type": "tool_result", + "tool_use_id": "toolu_other", + "content": "unrelated", + }, ], }, ], } - for key, fn in VENDOR_TRANSITIONS.items(): - if key[0] == key[1]: - # 自转换通道(如 zhipu→zhipu)保留 thinking signature,跳过 - continue - result, adaptations = fn(body) - assert result["messages"][0]["content"] == [ - {"type": "text", "text": "hi"} - ], f"Transition {key} failed to strip thinking blocks" + count, _ = _rewrite_srvtoolu_ids(body) + assert count == 0 + assert body["messages"][0]["content"][0]["tool_use_id"] == "toolu_other" -# ── _remove_vendor_blocks 单元测试 ──────────────────────────────── +# ── infer_source_vendor_from_body 单元测试 ───────────────────────── -class TestRemoveVendorBlocks: - """_remove_vendor_blocks 就地剥离指定 type 内容块.""" +class TestInferSourceVendorFromBody: + """infer_source_vendor_from_body 内容感知启发式推断.""" - def test_removes_single_type(self): + def test_detects_zhipu_by_srvtoolu_id(self): body = { "messages": [ { "role": "assistant", "content": [ - {"type": "text", "text": "before"}, { - "type": "server_tool_use_delta", - "partial_json": '{"cmd":"pwd"}', + "type": "tool_use", + "id": "srvtoolu_abc", + "name": "bash", + "input": {}, }, - {"type": "text", "text": "after"}, ], }, ], } - removed = _remove_vendor_blocks(body, {"server_tool_use_delta"}) - assert removed == 1 - assert [b["type"] for b in body["messages"][0]["content"]] == ["text", "text"] + assert infer_source_vendor_from_body(body) == "zhipu" - def test_removes_multiple_types(self): + def test_detects_zhipu_by_server_tool_use_type(self): body = { "messages": [ { "role": "assistant", "content": [ - {"type": "text", "text": "keep"}, - {"type": "foo", "data": "drop"}, - {"type": "bar", "data": "drop"}, + { + "type": "server_tool_use", + "id": "toolu_any", + "name": "bash", + "input": {}, + }, ], }, ], } - removed = _remove_vendor_blocks(body, {"foo", "bar"}) - assert removed == 2 - assert body["messages"][0]["content"] == [{"type": "text", "text": "keep"}] - - def test_noop_when_no_match(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [{"type": "text", "text": "clean"}], - }, - ], - } - removed = _remove_vendor_blocks(body, {"server_tool_use_delta"}) - assert removed == 0 - assert body["messages"][0]["content"] == [{"type": "text", "text": "clean"}] - - def test_handles_string_content(self): - body = {"messages": [{"role": "user", "content": "hi"}]} - removed = _remove_vendor_blocks(body, {"whatever"}) - assert removed == 0 + assert infer_source_vendor_from_body(body) == "zhipu" - def test_inserts_placeholder_when_all_blocks_stripped(self): - """assistant 消息仅含 vendor 块时插入占位 text block.""" + def test_detects_zhipu_by_server_tool_use_delta(self): body = { "messages": [ { "role": "assistant", "content": [ { - "type": "server_tool_use", - "id": "toolu_1", - "name": "ws", - "input": {}, + "type": "server_tool_use_delta", + "partial_json": "{}", }, ], }, ], } - removed = _remove_vendor_blocks(body, {"server_tool_use"}) - assert removed == 1 - assert body["messages"][0]["content"] == [ - {"type": "text", "text": "[vendor_block_removed]"}, - ] + assert infer_source_vendor_from_body(body) == "zhipu" - def test_does_not_mutate_unrelated_messages(self): - """仅含 vendor 块的消息被修改,其他消息不受影响.""" + def test_detects_zhipu_by_tool_result_tool_use_id(self): + """tool_result 块中 tool_use_id 为 srvtoolu_* 也可识别.""" body = { "messages": [ - {"role": "user", "content": [{"type": "text", "text": "hi"}]}, { - "role": "assistant", + "role": "user", "content": [ - {"type": "server_tool_use_delta", "partial_json": "{}"}, + { + "type": "tool_result", + "tool_use_id": "srvtoolu_x", + "content": "", + }, ], }, ], } - _remove_vendor_blocks(body, {"server_tool_use_delta"}) - assert body["messages"][0]["content"] == [{"type": "text", "text": "hi"}] - assert body["messages"][1]["content"] == [ - {"type": "text", "text": "[vendor_block_removed]"}, - ] - - -# ── _rewrite_srvtoolu_ids 单元测试 ───────────────────────────────── - - -class TestRewriteSrvtooluIds: - """_rewrite_srvtoolu_ids 将 srvtoolu_* ID 与 server_tool_use 类型标准化.""" + assert infer_source_vendor_from_body(body) == "zhipu" - def test_rewrites_server_tool_use_and_result_pair(self): + def test_returns_none_for_pristine_anthropic_body(self): body = { "messages": [ + {"role": "user", "content": "hi"}, { "role": "assistant", "content": [ { - "type": "server_tool_use", - "id": "srvtoolu_xyz", + "type": "tool_use", + "id": "toolu_standard", "name": "bash", - "input": {"cmd": "ls"}, + "input": {}, }, ], }, @@ -1305,359 +1105,28 @@ def test_rewrites_server_tool_use_and_result_pair(self): "content": [ { "type": "tool_result", - "tool_use_id": "srvtoolu_xyz", + "tool_use_id": "toolu_standard", "content": "ok", }, ], }, ], } - count, id_map = _rewrite_srvtoolu_ids(body) - assert count == 1 - assistant_block = body["messages"][0]["content"][0] - user_block = body["messages"][1]["content"][0] - assert assistant_block["type"] == "tool_use" - assert assistant_block["id"].startswith("toolu_normalized_") - assert user_block["tool_use_id"] == assistant_block["id"] - assert id_map == {"srvtoolu_xyz": assistant_block["id"]} + assert infer_source_vendor_from_body(body) is None - def test_rewrites_non_standard_tool_use_id_with_name(self): - """非标准 ID(非 toolu_ / srvtoolu_)且具备 name → 改写为 toolu_normalized_*.""" + def test_returns_none_for_empty_body(self): + assert infer_source_vendor_from_body({}) is None + assert infer_source_vendor_from_body({"messages": []}) is None + + def test_readonly_does_not_mutate_body(self): body = { "messages": [ { "role": "assistant", "content": [ { - "type": "tool_use", - "id": "custom_bad_id", - "name": "bash", - "input": {}, - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "custom_bad_id", - "content": "ok", - }, - ], - }, - ], - } - count, id_map = _rewrite_srvtoolu_ids(body) - assert count == 1 - new_id = body["messages"][0]["content"][0]["id"] - assert new_id.startswith("toolu_normalized_") - assert body["messages"][1]["content"][0]["tool_use_id"] == new_id - - def test_preserves_standard_tool_use_id(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_abc", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - count, id_map = _rewrite_srvtoolu_ids(body) - assert count == 0 - assert body["messages"][0]["content"][0]["id"] == "toolu_abc" - - def test_corrects_server_tool_use_type_with_standard_id(self): - """type 为 server_tool_use 但 ID 已是 toolu_* 时仅纠正 type.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "toolu_okay", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - count, _ = _rewrite_srvtoolu_ids(body) - # 既不是 srvtoolu_*,ID 也合法 → 不计入 count,但 type 应被校正 - assert count == 0 - assert body["messages"][0]["content"][0]["type"] == "tool_use" - - def test_rewrites_multiple_pairs_with_unique_ids(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_a", - "name": "bash", - "input": {}, - }, - { - "type": "server_tool_use", - "id": "srvtoolu_b", - "name": "read", - "input": {}, - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "srvtoolu_a", - "content": "a", - }, - { - "type": "tool_result", - "tool_use_id": "srvtoolu_b", - "content": "b", - }, - ], - }, - ], - } - count, id_map = _rewrite_srvtoolu_ids(body) - assert count == 2 - assert len(set(id_map.values())) == 2 - assistant_ids = [b["id"] for b in body["messages"][0]["content"]] - result_ids = [b["tool_use_id"] for b in body["messages"][1]["content"]] - assert assistant_ids == result_ids - - def test_skips_non_matching_user_tool_result(self): - """tool_result.tool_use_id 不在 id_map 时保留原样.""" - body = { - "messages": [ - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "toolu_other", - "content": "unrelated", - }, - ], - }, - ], - } - count, _ = _rewrite_srvtoolu_ids(body) - assert count == 0 - assert body["messages"][0]["content"][0]["tool_use_id"] == "toolu_other" - - def test_rewrites_inline_tool_result_before_tool_use(self): - """块顺序鲁棒性回归保护: inline tool_result 在 tool_use 之前时仍正确改名. - - GLM-5 偶发将 inline tool_result 输出在本消息 tool_use 之前 (流式断片). - 若 _rewrite 用单遍扫描, 处理 inline tool_result 时 id_map 尚未填入对应 - srvtoolu_* → 漏改名 → enforce 阶段 extracted dict key 与 tool_use_ids - 错位 → dangling tool_use 漏报 → anthropic 报 'tool_use ids without - tool_result blocks immediately after'. - - 修复后采用两遍扫描: 先全量收集 id_map (仅处理 tool_use), 再统一改写 - 所有 tool_result.tool_use_id 引用。 - """ - body = { - "messages": [ - { - "role": "assistant", - "content": [ - # inline tool_result 在 server_tool_use 之前! - { - "type": "tool_result", - "tool_use_id": "srvtoolu_X", - "content": "inline-X", - }, - { - "type": "server_tool_use", - "id": "srvtoolu_X", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - count, id_map = _rewrite_srvtoolu_ids(body) - assert count == 1 - new_id = id_map["srvtoolu_X"] - assert new_id.startswith("toolu_normalized_") - # 关键断言: inline tool_result 也被改名 (即使在 tool_use 之前) - inline_result = body["messages"][0]["content"][0] - assert inline_result["type"] == "tool_result" - assert inline_result["tool_use_id"] == new_id - # tool_use 也被改名 - tool_use_block = body["messages"][0]["content"][1] - assert tool_use_block["type"] == "tool_use" - assert tool_use_block["id"] == new_id - - def test_rewrites_tool_result_in_assistant_role(self): - """assistant role 内的 tool_result 也应被改名 (Pass 2 全量扫描所有消息).""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_M", - "name": "bash", - "input": {}, - }, - ], - }, - { - "role": "assistant", # 异常: 连续 assistant - "content": [ - { - "type": "tool_result", - "tool_use_id": "srvtoolu_M", - "content": "M-result", - }, - ], - }, - ], - } - count, id_map = _rewrite_srvtoolu_ids(body) - new_id = id_map["srvtoolu_M"] - # 后续 assistant 内的 tool_result 也被改名 - assert body["messages"][1]["content"][0]["tool_use_id"] == new_id - - -# ── infer_source_vendor_from_body 单元测试 ───────────────────────── - - -class TestInferSourceVendorFromBody: - """infer_source_vendor_from_body 内容感知启发式推断.""" - - def test_detects_zhipu_by_srvtoolu_id(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "srvtoolu_abc", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) == "zhipu" - - def test_detects_zhipu_by_server_tool_use_with_non_standard_id(self): - """server_tool_use + 非 toolu_/srvtoolu_ ID → 兜底归 zhipu.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "custom_non_standard", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) == "zhipu" - - def test_detects_zhipu_by_server_tool_use_delta(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use_delta", - "partial_json": "{}", - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) == "zhipu" - - def test_detects_zhipu_by_tool_result_tool_use_id(self): - """tool_result 块中 tool_use_id 为 srvtoolu_* 也可识别.""" - body = { - "messages": [ - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "srvtoolu_x", - "content": "", - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) == "zhipu" - - def test_returns_none_for_pristine_anthropic_body(self): - body = { - "messages": [ - {"role": "user", "content": "hi"}, - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_standard", - "name": "bash", - "input": {}, - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "toolu_standard", - "content": "ok", - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) is None - - def test_returns_none_for_empty_body(self): - assert infer_source_vendor_from_body({}) is None - assert infer_source_vendor_from_body({"messages": []}) is None - - def test_readonly_does_not_mutate_body(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_abc", + "type": "server_tool_use", + "id": "srvtoolu_abc", "name": "bash", "input": {}, }, @@ -1677,44 +1146,6 @@ def test_handles_string_content(self): } assert infer_source_vendor_from_body(body) is None - def test_detects_anthropic_by_server_tool_use_with_toolu_id(self): - """server_tool_use + toolu_* ID(Anthropic beta 功能产物)→ anthropic.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "toolu_web_search_1", - "name": "web_search", - "input": {"query": "test"}, - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) == "anthropic" - - def test_zhipu_srvtoolu_takes_priority_over_anthropic_detection(self): - """srvtoolu_* ID 优先识别为 zhipu(即使 block type 为 server_tool_use).""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_x", - "name": "bash", - "input": {}, - }, - ], - }, - ], - } - assert infer_source_vendor_from_body(body) == "zhipu" - # ── enforce_anthropic_tool_pairing 单元测试(从 test_request_normalizer.py 迁入) ─ @@ -2040,541 +1471,139 @@ def test_complex_multi_turn_conversation(self): { "role": "assistant", "content": [ - { - "type": "tool_use", - "id": "toolu_normalized_1", - "name": "Bash", - "input": {}, - }, - { - "type": "tool_use", - "id": "toolu_normalized_2", - "name": "Read", - "input": {}, - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "toolu_normalized_1", - "content": "ok1", - }, - { - "type": "tool_result", - "tool_use_id": "toolu_normalized_2", - "content": "ok2", - }, - ], - }, - { - "role": "assistant", - "content": [ - {"type": "text", "text": "Now running more tools..."}, - { - "type": "tool_use", - "id": "toolu_normalized_5", - "name": "Bash", - "input": {}, - }, - { - "type": "tool_use", - "id": "toolu_normalized_6", - "name": "Read", - "input": {}, - }, - { - "type": "tool_use", - "id": "toolu_normalized_7", - "name": "Write", - "input": {}, - }, - { - "type": "tool_result", - "tool_use_id": "toolu_normalized_5", - "content": "zhipu inline result", - }, - ], - }, - {"role": "user", "content": "continue"}, - ] - _, fixes = _enforce_pairing(messages) - assert len(messages[1]["content"]) == 2 - assert messages[2]["content"][0]["tool_use_id"] == "toolu_normalized_1" - assert "misplaced_tool_result_relocated" in fixes - assert "orphaned_tool_use_repaired" in fixes - assistant_content = messages[3]["content"] - assert all(b["type"] != "tool_result" for b in assistant_content) - assert assistant_content[0] == { - "type": "text", - "text": "Now running more tools...", - } - user_content = messages[4]["content"] - result_ids = { - b["tool_use_id"] - for b in user_content - if isinstance(b, dict) and b.get("type") == "tool_result" - } - assert result_ids == { - "toolu_normalized_5", - "toolu_normalized_6", - "toolu_normalized_7", - } - - def test_next_message_is_assistant_inserts_user(self): - """下一条消息不是 user 而是 assistant 时,插入合成 user 消息.""" - messages = [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_gap", - "name": "Bash", - "input": {}, - }, - ], - }, - { - "role": "assistant", - "content": [{"type": "text", "text": "follow up"}], - }, - ] - _, fixes = _enforce_pairing(messages) - assert "orphaned_tool_use_repaired" in fixes - assert len(messages) == 3 - assert messages[0]["content"][0]["type"] == "tool_use" - assert messages[1]["role"] == "user" - assert messages[1]["content"][0]["type"] == "tool_result" - assert messages[2]["role"] == "assistant" - - def test_sanity_check_does_not_false_fire_on_correctly_paired_messages(self): - """正常配对消息走完主循环后, sanity G 段不应误触发. - - 主循环 F 步已正确合成/搬迁所有 tool_result 时, sanity 视角下 next_user - 的 nu_result_ids 已覆盖全部 tool_use_ids, 走 ``if uid in nu_result_ids: - continue`` 分支, 不会重复合成占位、也不应打 ``pairing_sanity_repaired`` - 标签 → 验证 sanity 的幂等性 / 不重复合成保证。 - """ - messages = [ - {"role": "user", "content": "task"}, - { - "role": "assistant", - "content": [ - {"type": "tool_use", "id": "toolu_a", "name": "bash", "input": {}}, - ], - }, - { - "role": "user", - "content": [ - {"type": "tool_result", "tool_use_id": "toolu_a", "content": "ok"}, - ], - }, - ] - _, fixes = _enforce_pairing(messages) - # 一切正常, sanity 不应介入 - assert "pairing_sanity_repaired" not in fixes - assert "orphaned_tool_use_repaired" not in fixes - assert "misplaced_tool_result_relocated" not in fixes - - -class TestEnforcePairingSanityPass: - """_enforce_pairing_sanity_pass 正向兜底路径单元测试. - - 主循环 F 步在当前实现下能覆盖所有 dangling tool_use, 因此 sanity 在公开 - ``enforce_anthropic_tool_pairing`` API 调用中不会被实际触发. 抽出为独立 - helper 后可绕过主循环, 直接对兜底合成路径建立正向回归保护, 防止 G 段 - 被未来重构「优化掉」时静默失效。 - """ - - def test_synthesizes_is_error_for_dangling_tool_use(self): - """next_user 缺对应 tool_result 时, sanity 直接合成 is_error 占位.""" - messages = [ - { - "role": "assistant", - "content": [ - { - "type": "tool_use", - "id": "toolu_dangling", - "name": "bash", - "input": {}, - }, - ], - }, - {"role": "user", "content": []}, - ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == ["toolu_dangling"] - # next_user 已被注入 is_error 占位 - user_content = messages[1]["content"] - assert len(user_content) == 1 - placeholder = user_content[0] - assert placeholder["type"] == "tool_result" - assert placeholder["tool_use_id"] == "toolu_dangling" - assert placeholder["is_error"] is True - assert placeholder["content"] == "" - - def test_inserts_user_message_when_next_is_not_user(self): - """assistant 后无 user 消息时, sanity 应当插入空 user 再合成占位.""" - messages = [ - { - "role": "assistant", - "content": [ - {"type": "tool_use", "id": "toolu_x", "name": "bash", "input": {}}, - ], - }, - # 没有后续消息 → sanity 应插入空 user 并合成占位 - ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == ["toolu_x"] - assert len(messages) == 2 - assert messages[1]["role"] == "user" - results = messages[1]["content"] - assert len(results) == 1 - assert results[0]["tool_use_id"] == "toolu_x" - assert results[0]["is_error"] is True - - def test_inserts_user_message_when_next_is_assistant(self): - """assistant 后紧跟另一个 assistant (非 user) 时, sanity 应插入空 user.""" - messages = [ - { - "role": "assistant", - "content": [ - {"type": "tool_use", "id": "toolu_a", "name": "bash", "input": {}}, - ], - }, - { - "role": "assistant", - "content": [{"type": "text", "text": "stray"}], - }, - ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == ["toolu_a"] - assert messages[1]["role"] == "user" # 新插入的空 user - assert messages[2]["role"] == "assistant" # 原 stray 后移 - assert messages[1]["content"][0]["tool_use_id"] == "toolu_a" - - def test_skips_when_tool_result_already_present(self): - """next_user 已含对应 tool_result 时不应重复合成.""" - messages = [ - { - "role": "assistant", - "content": [ - {"type": "tool_use", "id": "toolu_a", "name": "bash", "input": {}}, + { + "type": "tool_use", + "id": "toolu_normalized_1", + "name": "Bash", + "input": {}, + }, + { + "type": "tool_use", + "id": "toolu_normalized_2", + "name": "Read", + "input": {}, + }, ], }, { "role": "user", "content": [ - {"type": "tool_result", "tool_use_id": "toolu_a", "content": "ok"}, + { + "type": "tool_result", + "tool_use_id": "toolu_normalized_1", + "content": "ok1", + }, + { + "type": "tool_result", + "tool_use_id": "toolu_normalized_2", + "content": "ok2", + }, ], }, - ] - original_user_content = list(messages[1]["content"]) - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == [] - assert messages[1]["content"] == original_user_content # 未被改动 - - def test_handles_string_content_in_next_user(self): - """next_user.content 是字符串时, sanity 先转为 text 块再合成占位.""" - messages = [ { "role": "assistant", "content": [ - {"type": "tool_use", "id": "toolu_a", "name": "bash", "input": {}}, + {"type": "text", "text": "Now running more tools..."}, + { + "type": "tool_use", + "id": "toolu_normalized_5", + "name": "Bash", + "input": {}, + }, + { + "type": "tool_use", + "id": "toolu_normalized_6", + "name": "Read", + "input": {}, + }, + { + "type": "tool_use", + "id": "toolu_normalized_7", + "name": "Write", + "input": {}, + }, + { + "type": "tool_result", + "tool_use_id": "toolu_normalized_5", + "content": "zhipu inline result", + }, ], }, - {"role": "user", "content": "free text"}, + {"role": "user", "content": "continue"}, ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == ["toolu_a"] - user_content = messages[1]["content"] - assert isinstance(user_content, list) - # 原字符串保留为 text 块, 占位追加在末尾 - assert user_content[0] == {"type": "text", "text": "free text"} - assert user_content[-1]["type"] == "tool_result" - assert user_content[-1]["tool_use_id"] == "toolu_a" + _, fixes = _enforce_pairing(messages) + assert len(messages[1]["content"]) == 2 + assert messages[2]["content"][0]["tool_use_id"] == "toolu_normalized_1" + assert "misplaced_tool_result_relocated" in fixes + assert "orphaned_tool_use_repaired" in fixes + assistant_content = messages[3]["content"] + assert all(b["type"] != "tool_result" for b in assistant_content) + assert assistant_content[0] == { + "type": "text", + "text": "Now running more tools...", + } + user_content = messages[4]["content"] + result_ids = { + b["tool_use_id"] + for b in user_content + if isinstance(b, dict) and b.get("type") == "tool_result" + } + assert result_ids == { + "toolu_normalized_5", + "toolu_normalized_6", + "toolu_normalized_7", + } - def test_partial_repair_only_synthesizes_missing_uids(self): - """next_user 已含部分 tool_result 时, sanity 仅为缺失的 uid 合成占位.""" + def test_next_message_is_assistant_inserts_user(self): + """下一条消息不是 user 而是 assistant 时,插入合成 user 消息.""" messages = [ { "role": "assistant", "content": [ - {"type": "tool_use", "id": "toolu_a", "name": "bash", "input": {}}, - {"type": "tool_use", "id": "toolu_b", "name": "bash", "input": {}}, - ], - }, - { - "role": "user", - "content": [ - {"type": "tool_result", "tool_use_id": "toolu_a", "content": "ok"}, - # toolu_b 缺失 + { + "type": "tool_use", + "id": "toolu_gap", + "name": "Bash", + "input": {}, + }, ], }, - ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == ["toolu_b"] - results = messages[1]["content"] - assert len(results) == 2 - # 原 toolu_a 不变 - assert results[0]["tool_use_id"] == "toolu_a" - assert results[0].get("is_error") is not True - # 新合成 toolu_b is_error 占位 - assert results[1]["tool_use_id"] == "toolu_b" - assert results[1]["is_error"] is True - - def test_skips_assistant_without_tool_use(self): - """assistant 不含 tool_use 时 sanity 应当短路, 不插入空 user.""" - messages = [ { "role": "assistant", - "content": [{"type": "text", "text": "just talking"}], + "content": [{"type": "text", "text": "follow up"}], }, ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - - assert sanity_synthesized == [] - # 不应插入空 user - assert len(messages) == 1 - - def test_skips_non_assistant_messages(self): - """非 assistant 消息 (user/system) 不参与 sanity 检查.""" - messages = [ - {"role": "user", "content": "hi"}, - {"role": "system", "content": "rules"}, - ] - sanity_synthesized = _enforce_pairing_sanity_pass(messages) - assert sanity_synthesized == [] - assert len(messages) == 2 # 不被改动 - - -# ── 通道层端到端集成(zhipu 产物全量清洗) ─────────────────────────── - - -class TestZhipuToAnthropicChannelFullCleanup: - """验证 prepare_zhipu_to_anthropic 对完整 zhipu 产物集合的清洗.""" - - def test_rewrites_srvtoolu_and_strips_vendor_delta(self): - body = { - "messages": [ - {"role": "user", "content": "run tools"}, - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_alpha", - "name": "bash", - "input": {"cmd": "ls"}, - }, - { - "type": "server_tool_use_delta", - "partial_json": '{"cmd":"ls"}', - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "srvtoolu_alpha", - "content": "output", - }, - ], - }, - ], - } - prepared, adaptations = prepare_zhipu_to_anthropic(body) - # server_tool_use_delta 已被剥离 - assert any( - b.get("type") == "tool_use" for b in prepared["messages"][1]["content"] - ) - assert not any( - b.get("type") == "server_tool_use_delta" - for b in prepared["messages"][1]["content"] - ) - # srvtoolu_* ID 已重写 - new_id = prepared["messages"][1]["content"][0]["id"] - assert new_id.startswith("toolu_normalized_") - assert prepared["messages"][1]["content"][0]["type"] == "tool_use" - # tool_result 引用同步更新 - assert prepared["messages"][2]["content"][0]["tool_use_id"] == new_id - # adaptations 覆盖完整清洗项 - assert any("zhipu_vendor_blocks" in a for a in adaptations) - assert any("srvtoolu_ids" in a for a in adaptations) - - def test_full_zhipu_artifacts_combined(self): - """srvtoolu_* + server_tool_use_delta + misplaced tool_result + thinking.""" - body = { - "messages": [ - {"role": "user", "content": "start"}, - { - "role": "assistant", - "content": [ - { - "type": "thinking", - "thinking": "...", - "signature": "zhipu_sig", - }, - { - "type": "server_tool_use", - "id": "srvtoolu_x", - "name": "bash", - "input": {}, - }, - { - "type": "server_tool_use_delta", - "partial_json": "{}", - }, - { - "type": "tool_result", - "tool_use_id": "srvtoolu_x", - "content": "inline", - }, - ], - }, - {"role": "user", "content": "ok"}, - ], - } - prepared, adaptations = prepare_zhipu_to_anthropic(body) - assistant_content = prepared["messages"][1]["content"] - # thinking/server_tool_use_delta/tool_result 均被剥离 - types = {b.get("type") for b in assistant_content} - assert types == {"tool_use"} - assert len(assistant_content) == 1 - new_id = assistant_content[0]["id"] - assert new_id.startswith("toolu_normalized_") - # tool_result 被重定位到 user 消息(索引 2) - user_content = prepared["messages"][2]["content"] - assert isinstance(user_content, list) - relocated = [b for b in user_content if b.get("type") == "tool_result"] - assert len(relocated) == 1 - assert relocated[0]["tool_use_id"] == new_id - assert any("misplaced_tool_result_relocated" in a for a in adaptations) - - def test_inline_tool_result_before_tool_use_pairs_correctly(self): - """日志现象回归保护: GLM-5 输出 [inline tool_result, tool_use] 块顺序时, - 修复前 _rewrite 单遍扫描漏改 inline.tool_use_id, enforce 阶段 dict key - 与 tool_use_ids 错位, 导致最终 anthropic 报 'tool_use ids without - tool_result blocks immediately after'. - - 修复后两遍扫描确保 inline tool_result 与 tool_use 同步改名, enforce 能 - 正确将 inline 搬迁到 next user, 不需合成 is_error 占位 (无 orphan 标签). - """ - body = { - "messages": [ - {"role": "user", "content": "task"}, - # 上一轮完成 - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "srvtoolu_A", - "name": "bash", - "input": {}, - }, - ], - }, - { - "role": "user", - "content": [ - { - "type": "tool_result", - "tool_use_id": "srvtoolu_A", - "content": "A-ok", - }, - ], - }, - # 当前轮: inline tool_result 在 server_tool_use 之前 (流式断片) - { - "role": "assistant", - "content": [ - { - "type": "thinking", - "thinking": "...", - "signature": "zhipu_sig", - }, - # inline tool_result 在 tool_use 之前! - { - "type": "tool_result", - "tool_use_id": "srvtoolu_B", - "content": "B-inline", - }, - { - "type": "server_tool_use", - "id": "srvtoolu_B", - "name": "bash", - "input": {}, - }, - ], - }, - # 客户端没回 B 的 tool_result (因为已被 inline) - {"role": "user", "content": []}, - ], - } - prepared, adaptations = prepare_zhipu_to_anthropic(body) - - # 关键断言: 仅有 misplaced_tool_result_relocated, 无 orphaned_tool_use_repaired - # (因 inline 真实内容被正确搬迁, 无需合成 is_error 占位) - assert "misplaced_tool_result_relocated" in adaptations - assert "orphaned_tool_use_repaired" not in adaptations - assert "pairing_sanity_repaired" not in adaptations - - # 验证 messages[3] 的 tool_use 在 messages[4] 有匹配 tool_result - m3 = prepared["messages"][3] - m4 = prepared["messages"][4] - m3_tool_uses = [ - b["id"] - for b in m3["content"] - if isinstance(b, dict) and b.get("type") == "tool_use" - ] - m4_results = { - b.get("tool_use_id") - for b in m4["content"] - if isinstance(b, dict) and b.get("type") == "tool_result" - } - assert len(m3_tool_uses) == 1 - assert m3_tool_uses[0] in m4_results + _, fixes = _enforce_pairing(messages) + assert "orphaned_tool_use_repaired" in fixes + assert len(messages) == 3 + assert messages[0]["content"][0]["type"] == "tool_use" + assert messages[1]["role"] == "user" + assert messages[1]["content"][0]["type"] == "tool_result" + assert messages[2]["role"] == "assistant" - # 搬迁的 tool_result 应保留原始内容 ("B-inline"), 而非合成的空 is_error - relocated = next( - b - for b in m4["content"] - if isinstance(b, dict) and b.get("type") == "tool_result" - ) - assert relocated["content"] == "B-inline" - assert relocated.get("is_error") is not True +# ── 通道层端到端集成(zhipu 产物全量清洗) ─────────────────────────── -class TestZhipuToCopilotChannelFullCleanup: - """验证 prepare_zhipu_to_copilot 对 zhipu 产物的完整清洗.""" + +class TestZhipuToAnthropicChannelFullCleanup: + """验证 prepare_zhipu_to_anthropic 对完整 zhipu 产物集合的清洗.""" def test_rewrites_srvtoolu_and_strips_vendor_delta(self): body = { "messages": [ + {"role": "user", "content": "run tools"}, { "role": "assistant", "content": [ { "type": "server_tool_use", - "id": "srvtoolu_beta", - "name": "read", - "input": {}, + "id": "srvtoolu_alpha", + "name": "bash", + "input": {"cmd": "ls"}, }, { "type": "server_tool_use_delta", - "partial_json": "{}", + "partial_json": '{"cmd":"ls"}', }, ], }, @@ -2583,286 +1612,100 @@ def test_rewrites_srvtoolu_and_strips_vendor_delta(self): "content": [ { "type": "tool_result", - "tool_use_id": "srvtoolu_beta", - "content": "ok", + "tool_use_id": "srvtoolu_alpha", + "content": "output", }, ], }, ], } - prepared, adaptations = prepare_zhipu_to_copilot(body) - assistant_content = prepared["messages"][0]["content"] - assert {b.get("type") for b in assistant_content} == {"tool_use"} - new_id = assistant_content[0]["id"] + prepared, adaptations = prepare_zhipu_to_anthropic(body) + # server_tool_use_delta 已被剥离 + assert any( + b.get("type") == "tool_use" for b in prepared["messages"][1]["content"] + ) + assert not any( + b.get("type") == "server_tool_use_delta" + for b in prepared["messages"][1]["content"] + ) + # srvtoolu_* ID 已重写 + new_id = prepared["messages"][1]["content"][0]["id"] assert new_id.startswith("toolu_normalized_") - assert prepared["messages"][1]["content"][0]["tool_use_id"] == new_id + assert prepared["messages"][1]["content"][0]["type"] == "tool_use" + # tool_result 引用同步更新 + assert prepared["messages"][2]["content"][0]["tool_use_id"] == new_id + # adaptations 覆盖完整清洗项 assert any("zhipu_vendor_blocks" in a for a in adaptations) assert any("srvtoolu_ids" in a for a in adaptations) - -# ── anthropic → zhipu 转换通道测试 ────────────────────────────── - - -class TestAnthropicToZhipuChannel: - """prepare_anthropic_to_zhipu 转换通道单元测试.""" - - def test_strips_server_tool_use_blocks(self): - """Anthropic 的 server_tool_use(web search, computer use)应被剥离.""" + def test_full_zhipu_artifacts_combined(self): + """srvtoolu_* + server_tool_use_delta + misplaced tool_result + thinking.""" body = { "messages": [ + {"role": "user", "content": "start"}, { "role": "assistant", - "content": [ - {"type": "text", "text": "Let me search..."}, - { - "type": "server_tool_use", - "id": "toolu_web_search_123", - "name": "web_search", - "input": {"query": "python async"}, - }, - ], - }, - { - "role": "user", "content": [ { - "type": "tool_result", - "tool_use_id": "toolu_web_search_123", - "content": "search results", + "type": "thinking", + "thinking": "...", + "signature": "zhipu_sig", }, - ], - }, - ], - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert any("server_tool_use" in a for a in adaptations) - assistant_content = prepared["messages"][0]["content"] - assert all(b.get("type") != "server_tool_use" for b in assistant_content) - assert assistant_content == [{"type": "text", "text": "Let me search..."}] - - def test_strips_thinking_blocks(self): - """Anthropic 签发的 thinking blocks 应被剥离(zhipu 可能无法验证 signature).""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - {"type": "thinking", "thinking": "thought", "signature": "sig"}, - {"type": "text", "text": "response"}, - ], - }, - ], - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert any("thinking_blocks" in a for a in adaptations) - assert prepared["messages"][0]["content"] == [ - {"type": "text", "text": "response"}, - ] - - def test_preserves_cache_control(self): - """anthropic → zhipu 不再移除 cache_control(zhipu 原生支持).""" - body = { - "system": [ - {"type": "text", "text": "sys", "cache_control": {"type": "ephemeral"}}, - ], - "messages": [], - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert not any("cache_control" in a for a in adaptations) - assert "cache_control" in prepared["system"][0] - - def test_removes_thinking_params(self): - body = { - "messages": [], - "thinking": {"type": "enabled", "budget_tokens": 10000}, - "extended_thinking": {"type": "enabled"}, - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert "thinking" not in prepared - assert "extended_thinking" not in prepared - assert "removed_thinking_param" in adaptations - assert "removed_extended_thinking_param" in adaptations - - def test_does_not_relocate_tool_results(self): - """anthropic → zhipu 不再执行 tool pairing(避免触发 zhipu 500).""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ { - "type": "tool_use", - "id": "toolu_1", + "type": "server_tool_use", + "id": "srvtoolu_x", "name": "bash", "input": {}, }, - ], - }, - {"role": "user", "content": "next"}, - ], - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert not any("orphaned" in a for a in adaptations) - user_results = [ - b - for b in prepared["messages"][1]["content"] - if isinstance(b, dict) and b.get("type") == "tool_result" - ] - assert len(user_results) == 0 - - def test_preserves_original_body(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ { - "type": "server_tool_use", - "id": "toolu_1", - "name": "web_search", - "input": {}, + "type": "server_tool_use_delta", + "partial_json": "{}", }, - {"type": "text", "text": "hi"}, - ], - }, - ], - } - original = copy.deepcopy(body) - prepare_anthropic_to_zhipu(body) - assert body == original - - def test_noop_when_clean(self): - body = { - "messages": [ - {"role": "user", "content": "hello"}, - {"role": "assistant", "content": [{"type": "text", "text": "hi"}]}, - ], - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert adaptations == [] - assert prepared == body - - def test_idempotency(self): - body = { - "messages": [ - { - "role": "assistant", - "content": [ - {"type": "thinking", "thinking": "t"}, { - "type": "server_tool_use", - "id": "toolu_1", - "name": "web_search", - "input": {}, + "type": "tool_result", + "tool_use_id": "srvtoolu_x", + "content": "inline", }, ], }, + {"role": "user", "content": "ok"}, ], - "thinking": {"type": "enabled"}, } - prepared1, adaptations1 = prepare_anthropic_to_zhipu(body) - prepared2, adaptations2 = prepare_anthropic_to_zhipu(prepared1) - assert prepared2 == prepared1 - assert adaptations2 == [] + prepared, adaptations = prepare_zhipu_to_anthropic(body) + assistant_content = prepared["messages"][1]["content"] + # thinking/server_tool_use_delta/tool_result 均被剥离 + types = {b.get("type") for b in assistant_content} + assert types == {"tool_use"} + assert len(assistant_content) == 1 + new_id = assistant_content[0]["id"] + assert new_id.startswith("toolu_normalized_") + # tool_result 被重定位到 user 消息(索引 2) + user_content = prepared["messages"][2]["content"] + assert isinstance(user_content, list) + relocated = [b for b in user_content if b.get("type") == "tool_result"] + assert len(relocated) == 1 + assert relocated[0]["tool_use_id"] == new_id + assert any("misplaced_tool_result_relocated" in a for a in adaptations) - def test_strips_multiple_server_tool_use_blocks(self): - """多个 server_tool_use 块(web search + computer use)全部剥离.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "toolu_ws_1", - "name": "web_search", - "input": {"query": "test"}, - }, - { - "type": "server_tool_use", - "id": "toolu_cu_1", - "name": "computer", - "input": {"action": "click"}, - }, - ], - }, - ], - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert not any( - b.get("type") == "server_tool_use" - for b in prepared["messages"][0]["content"] - ) - assert "removed_2_server_tool_use" in adaptations[0] - def test_inserts_placeholder_when_all_blocks_stripped(self): - """assistant 消息仅含 server_tool_use 时插入占位 text block.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ - { - "type": "server_tool_use", - "id": "toolu_1", - "name": "web_search", - "input": {}, - }, - ], - }, - ], - } - prepared, _ = prepare_anthropic_to_zhipu(body) - assert prepared["messages"][0]["content"] == [ - {"type": "text", "text": "[vendor_block_removed]"}, - ] +class TestZhipuToCopilotChannelFullCleanup: + """验证 prepare_zhipu_to_copilot 对 zhipu 产物的完整清洗.""" - def test_combined_server_tool_use_and_thinking(self): - """server_tool_use + thinking 的组合清洗, cache_control 保留.""" + def test_rewrites_srvtoolu_and_strips_vendor_delta(self): body = { - "system": [ - {"type": "text", "text": "sys", "cache_control": {"type": "ephemeral"}}, - ], "messages": [ { "role": "assistant", "content": [ - {"type": "thinking", "thinking": "t", "signature": "s"}, { "type": "server_tool_use", - "id": "toolu_cu_1", - "name": "computer", + "id": "srvtoolu_beta", + "name": "read", "input": {}, }, - {"type": "text", "text": "done"}, - ], - }, - ], - "thinking": {"type": "enabled"}, - } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - assert all( - b.get("type") not in ("thinking", "redacted_thinking", "server_tool_use") - for b in prepared["messages"][0]["content"] - ) - # cache_control 保留(zhipu 原生支持) - assert "cache_control" in prepared["system"][0] - assert "thinking" not in prepared - assert any("server_tool_use" in a for a in adaptations) - assert any("thinking_blocks" in a for a in adaptations) - - def test_flattens_tool_result_in_user_message(self): - """anthropic → zhipu 将 tool_result 展平为 text 块.""" - body = { - "messages": [ - { - "role": "assistant", - "content": [ { - "type": "tool_use", - "id": "toolu_001", - "name": "bash", - "input": {}, + "type": "server_tool_use_delta", + "partial_json": "{}", }, ], }, @@ -2871,15 +1714,18 @@ def test_flattens_tool_result_in_user_message(self): "content": [ { "type": "tool_result", - "tool_use_id": "toolu_001", + "tool_use_id": "srvtoolu_beta", "content": "ok", }, ], }, ], } - prepared, adaptations = prepare_anthropic_to_zhipu(body) - # tool_result 被展平为 text - user_content = prepared["messages"][1]["content"] - assert all(b.get("type") != "tool_result" for b in user_content) - assert any("flattened" in a for a in adaptations) + prepared, adaptations = prepare_zhipu_to_copilot(body) + assistant_content = prepared["messages"][0]["content"] + assert {b.get("type") for b in assistant_content} == {"tool_use"} + new_id = assistant_content[0]["id"] + assert new_id.startswith("toolu_normalized_") + assert prepared["messages"][1]["content"][0]["tool_use_id"] == new_id + assert any("zhipu_vendor_blocks" in a for a in adaptations) + assert any("srvtoolu_ids" in a for a in adaptations) diff --git a/tests/test_vendors.py b/tests/test_vendors.py index 2d86aca..f771e9b 100644 --- a/tests/test_vendors.py +++ b/tests/test_vendors.py @@ -362,34 +362,6 @@ def test_zhipu_supports_tools_and_thinking(): assert reasons == [] -def test_zhipu_accepts_tool_results(): - """ZhipuVendor 应接受含 tool_result 的请求(由转换通道展平处理).""" - from coding.proxy.vendors.base import RequestCapabilities - - mapper = ModelMapper([]) - zhipu_vendor = ZhipuVendor(ZhipuConfig(), mapper) - - supported, reasons = zhipu_vendor.supports_request( - RequestCapabilities(has_tool_results=True) - ) - assert supported is True - assert reasons == [] - - -def test_zhipu_accepts_without_tool_results(): - """ZhipuVendor 应接受不含 tool_result 的请求.""" - from coding.proxy.vendors.base import RequestCapabilities - - mapper = ModelMapper([]) - zhipu_vendor = ZhipuVendor(ZhipuConfig(), mapper) - - supported, reasons = zhipu_vendor.supports_request( - RequestCapabilities(has_tools=True, has_tool_results=False) - ) - assert supported is True - assert reasons == [] - - # 兼容性画像应全部为 NATIVE def test_zhipu_compatibility_profile_native(): from coding.proxy.compat.canonical import CompatibilityStatus From d4eec1b203a93eae6691fb6002a2ff42f065561d Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 14:49:26 +0800 Subject: [PATCH 12/66] =?UTF-8?q?feat(session-policy):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Session=20=E7=BA=A7=E5=88=AB=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E4=B8=8E=E4=BC=9A=E8=AF=9D=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=20(#219)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(session-policy): 新增 Session 级别路由策略与会话活动面板; - 新增 SessionPolicy 配置模型(Pydantic),支持按 session_key / client_category 匹配并覆盖 vendor 优先级 - 新增 SessionPolicyResolver 解析引擎,启动时构建索引实现 O(1) 查找 - 为 usage_log 表新增 session_key 列及索引,含幂等迁移逻辑 - 新增 query_recent_sessions / query_session_profile 聚合查询方法 - executor 路由流式/非流式请求时按 Session Policy 动态重排 tier 顺序 - Dashboard 新增 Recent Active Sessions 面板,展示近期会话聚合数据 - 新增 /api/dashboard/sessions API 端点 - 新增完整测试覆盖(schema、迁移、策略解析、tier 重排、聚合查询) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(session-policy): 修复 Dashboard XSS 风险并标注 client_category 为预留字段; - 新增 escapeHtml() 工具函数,对所有用户可控数据(session_key、models、vendors、categories)插入 innerHTML 前进行 HTML 实体转义 - title 属性中的 session_key 同样使用转义后的值 - 在 SessionPolicyMatch.client_category 字段描述和 config.default.yaml 中明确标注该条件为预留功能,当前版本暂未生效 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/config/config.default.yaml | 28 ++ src/coding/proxy/config/schema.py | 19 +- src/coding/proxy/config/session_policy.py | 59 +++ src/coding/proxy/logging/db.py | 80 +++- src/coding/proxy/routing/executor.py | 40 +- src/coding/proxy/routing/router.py | 3 + src/coding/proxy/routing/session_policy.py | 56 +++ src/coding/proxy/routing/usage_recorder.py | 2 + src/coding/proxy/server/app.py | 7 +- src/coding/proxy/server/dashboard.py | 160 +++++++ tests/test_session_aware.py | 451 ++++++++++++++++++++ 11 files changed, 896 insertions(+), 9 deletions(-) create mode 100644 src/coding/proxy/config/session_policy.py create mode 100644 src/coding/proxy/routing/session_policy.py create mode 100644 tests/test_session_aware.py diff --git a/src/coding/proxy/config/config.default.yaml b/src/coding/proxy/config/config.default.yaml index f511e8b..40808fd 100644 --- a/src/coding/proxy/config/config.default.yaml +++ b/src/coding/proxy/config/config.default.yaml @@ -644,3 +644,31 @@ native_api: base_url: "https://api.anthropic.com" timeout_ms: 300000 connect_timeout_ms: 15000 + +# === Session 级别路由策略(可选)=== +# +# 为特定 Session 或客户端类别定制 vendor 优先级顺序。 +# 匹配策略按定义顺序求值,首次匹配生效。 +# +# 支持的匹配条件(OR 语义,满足任一即匹配): +# session_keys: 精确匹配的 session key 列表 +# client_category: 按客户端类别匹配(⚠️ 预留字段,当前版本暂未生效,后续版本支持) +# +# tiers: 覆盖全局 tier 顺序的供应商优先级列表(未提及的 vendor 保持在末尾) +# +# 示例 1:为特定 session 绑定专属 vendor 组合 +# session_policies: +# - name: "vip-session" +# match: +# session_keys: ["my-specific-session-id"] +# tiers: ["anthropic", "copilot", "zhipu"] +# +# 示例 2:Claude Code 请求优先走 Copilot +# session_policies: +# - name: "claude-code-preferred" +# match: +# client_category: "cc" +# tiers: ["copilot", "anthropic", "zhipu"] +# +# 未配置时(默认),所有 Session 使用全局 tiers 顺序。 +session_policies: [] diff --git a/src/coding/proxy/config/schema.py b/src/coding/proxy/config/schema.py index 5441979..ee21ee7 100644 --- a/src/coding/proxy/config/schema.py +++ b/src/coding/proxy/config/schema.py @@ -44,6 +44,7 @@ # ── 子模块 re-export ──────────────────────────────────────────── from .server import DatabaseConfig, LoggingConfig, ServerConfig # noqa: F401 +from .session_policy import SessionPoliciesConfig # noqa: F401 from .vendors import ( # noqa: F401 AlibabaConfig, AnthropicConfig, @@ -152,11 +153,19 @@ class ProxyConfig(BaseModel): "三个 provider 默认 enabled=False,显式启用才暴露 /api/{provider}/* 端点。" ), ) + # Session 级别路由策略 + session_policies: SessionPoliciesConfig = Field( + default_factory=SessionPoliciesConfig, + description=( + "Session 级别的路由策略配置。" + "可为特定 Session 或客户端类别定制 vendor 优先级顺序。" + ), + ) @model_validator(mode="before") @classmethod def _migrate_legacy_fields(cls, data: Any) -> Any: - """向后兼容迁移(legacy flat 格式 → vendors 列表格式). + """向后兼容迁移(legacy flat 格式 → vendors 列表格式)+ session_policies 规范化. 迁移规则: 1. ``anthropic`` / ``zhipu`` 字段名自动映射为 ``primary`` / ``fallback`` @@ -165,6 +174,12 @@ def _migrate_legacy_fields(cls, data: Any) -> Any: if not isinstance(data, dict): return data + # session_policies 规范化:YAML 中 session_policies: [] 解析为 list, + # 需转为 dict 包装以匹配 SessionPoliciesConfig 模型 + sp = data.get("session_policies") + if isinstance(sp, list): + data["session_policies"] = {"policies": sp} + # 1. 字段别名迁移 if "anthropic" in data and "primary" not in data: data["primary"] = data.pop("anthropic") @@ -331,4 +346,6 @@ def compat_state_path(self) -> Path: "AlibabaConfig", # native api passthrough "NativeApiConfig", + # session policy + "SessionPoliciesConfig", ] diff --git a/src/coding/proxy/config/session_policy.py b/src/coding/proxy/config/session_policy.py new file mode 100644 index 0000000..cb2c512 --- /dev/null +++ b/src/coding/proxy/config/session_policy.py @@ -0,0 +1,59 @@ +"""Session Policy 配置模型 — 为特定 Session 定制路由行为.""" + +from __future__ import annotations + +from pydantic import BaseModel, Field + + +class SessionPolicyMatch(BaseModel): + """策略匹配条件 — 满足任一条件即匹配(OR 语义).""" + + session_keys: list[str] = Field( + default_factory=list, + description="精确匹配的 session key 列表", + ) + client_category: str | None = Field( + default=None, + description=( + "按客户端类别匹配('cc' 或 'api')。" + "⚠️ 预留字段,当前路由执行链路未传入 client_category," + "配置此条件不会生效。后续版本将支持。" + ), + ) + + +class SessionQuotaConfig(BaseModel): + """Per-session 资源配额(架构预留).""" + + token_budget: int = Field( + default=0, + description="时间窗口内的 token 预算上限", + ) + window_hours: float = Field( + default=24.0, + description="滚动时间窗口(小时)", + ) + + +class SessionPolicy(BaseModel): + """单条 Session 路由策略.""" + + name: str = Field(description="策略名称(用于日志与排障)") + match: SessionPolicyMatch = Field(description="匹配条件") + tiers: list[str] = Field( + default_factory=list, + description="覆盖全局 tier 顺序的供应商优先级列表", + ) + quota: SessionQuotaConfig | None = Field( + default=None, + description="Per-session 资源配额(预留)", + ) + + +class SessionPoliciesConfig(BaseModel): + """顶层 Session 策略配置容器.""" + + policies: list[SessionPolicy] = Field( + default_factory=list, + description="Session 路由策略列表,按定义顺序求值,首次匹配生效", + ) diff --git a/src/coding/proxy/logging/db.py b/src/coding/proxy/logging/db.py index 3c52e66..ffe9b2c 100644 --- a/src/coding/proxy/logging/db.py +++ b/src/coding/proxy/logging/db.py @@ -170,7 +170,8 @@ def _local_month_udf(ts_str: str) -> str: client_category TEXT NOT NULL DEFAULT 'cc', operation TEXT NOT NULL DEFAULT '', endpoint TEXT NOT NULL DEFAULT '', - extra_usage_json TEXT NOT NULL DEFAULT '{}' + extra_usage_json TEXT NOT NULL DEFAULT '{}', + session_key TEXT NOT NULL DEFAULT '' ); CREATE TABLE IF NOT EXISTS usage_evidence ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -194,6 +195,7 @@ def _local_month_udf(ts_str: str) -> str: CREATE INDEX IF NOT EXISTS idx_usage_vendor ON usage_log(vendor); CREATE INDEX IF NOT EXISTS idx_usage_client_category ON usage_log(client_category); CREATE INDEX IF NOT EXISTS idx_usage_operation ON usage_log(operation); +CREATE INDEX IF NOT EXISTS idx_usage_session_key ON usage_log(session_key); CREATE INDEX IF NOT EXISTS idx_usage_evidence_request_id ON usage_evidence(request_id); CREATE INDEX IF NOT EXISTS idx_usage_evidence_vendor ON usage_evidence(vendor); """ @@ -247,6 +249,7 @@ async def init(self) -> None: await self._migrate_rename_backend_to_vendor() await self._migrate_add_failover_from() await self._migrate_add_native_columns() + await self._migrate_add_session_key() await self._db.executescript(_CREATE_INDEXES) # 注册时区感知的日期函数:将 UTC 时间戳转为本地时间维度 await self._db.create_function("local_date", 1, _local_date_udf) @@ -286,6 +289,18 @@ async def _migrate_add_native_columns(self) -> None: await self._db.execute(f"ALTER TABLE usage_log ADD COLUMN {name} {ddl}") logger.info("Migration: added %s column to usage_log", name) + async def _migrate_add_session_key(self) -> None: + """幂等迁移:为已有数据库添加 session_key 列.""" + if not self._db: + return + cursor = await self._db.execute("PRAGMA table_info(usage_log)") + columns = {row["name"] for row in await cursor.fetchall()} + if "session_key" not in columns: + await self._db.execute( + "ALTER TABLE usage_log ADD COLUMN session_key TEXT NOT NULL DEFAULT ''" + ) + logger.info("Migration: added session_key column to usage_log") + async def _migrate_rename_backend_to_vendor(self) -> None: """幂等迁移:重命名 backend 列为 vendor.""" if not self._db: @@ -319,6 +334,7 @@ async def log( operation: str = "", endpoint: str = "", extra_usage_json: str = "{}", + session_key: str = "", ) -> None: if not self._db: return @@ -328,8 +344,8 @@ async def log( input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens, duration_ms, success, failover, failover_from, request_id, - client_category, operation, endpoint, extra_usage_json) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", + client_category, operation, endpoint, extra_usage_json, session_key) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", ( vendor, model_requested, @@ -347,6 +363,7 @@ async def log( operation, endpoint, extra_usage_json, + session_key, ), ) await self._db.commit() @@ -573,6 +590,63 @@ async def query_window_total( row = await cursor.fetchone() return row["total"] if row else 0 + async def query_recent_sessions( + self, + limit: int = 20, + hours: float = 24.0, + ) -> list[dict]: + """按 session_key 聚合近期活跃会话统计.""" + if not self._db: + return [] + cutoff_iso = _hours_ago_utc_iso(hours) + cursor = await self._db.execute( + """SELECT session_key, + MIN(ts) AS first_seen_ts, + MAX(ts) AS last_active_ts, + COUNT(*) AS total_requests, + SUM(input_tokens + output_tokens) AS total_tokens, + SUM(input_tokens) AS total_input, + SUM(output_tokens) AS total_output, + GROUP_CONCAT(DISTINCT model_served) AS models, + GROUP_CONCAT(DISTINCT vendor) AS vendors, + AVG(duration_ms) AS avg_duration_ms, + SUM(CASE WHEN success THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS success_rate, + GROUP_CONCAT(DISTINCT client_category) AS client_categories + FROM usage_log + WHERE session_key != '' AND ts >= ? + GROUP BY session_key + ORDER BY last_active_ts DESC + LIMIT ?""", + (cutoff_iso, limit), + ) + rows = await cursor.fetchall() + return [dict(row) for row in rows] + + async def query_session_profile(self, session_key: str) -> dict | None: + """查询单个会话的完整聚合数据.""" + if not self._db: + return None + cursor = await self._db.execute( + """SELECT session_key, + MIN(ts) AS first_seen_ts, + MAX(ts) AS last_active_ts, + COUNT(*) AS total_requests, + SUM(input_tokens + output_tokens) AS total_tokens, + SUM(input_tokens) AS total_input, + SUM(output_tokens) AS total_output, + GROUP_CONCAT(DISTINCT model_served) AS models, + GROUP_CONCAT(DISTINCT vendor) AS vendors, + AVG(duration_ms) AS avg_duration_ms, + SUM(CASE WHEN success THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS success_rate, + GROUP_CONCAT(DISTINCT client_category) AS client_categories + FROM usage_log + WHERE session_key = ? + GROUP BY session_key""", + (session_key,), + ) + row = await cursor.fetchone() + return dict(row) if row else None + async def close(self) -> None: if self._db: await self._db.close() diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index d64b296..9d33ca9 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -31,6 +31,7 @@ parse_rate_limit_headers, ) from .session_manager import RouteSessionManager +from .session_policy import SessionPolicyResolver from .tier import VendorTier from .usage_parser import ( build_usage_evidence_records, @@ -211,12 +212,14 @@ def __init__( usage_recorder: UsageRecorder, session_manager: RouteSessionManager, reauth_coordinator: Any | None = None, + session_policy_resolver: SessionPolicyResolver | None = None, ) -> None: self._router = router self._tiers = tiers self._recorder = usage_recorder self._session_mgr = session_manager self._reauth_coordinator = reauth_coordinator + self._policy_resolver = session_policy_resolver or SessionPolicyResolver() # Tier 名称 → OAuth provider 名称的映射 self._tier_provider_map: dict[str, str] = { @@ -226,6 +229,30 @@ def __init__( # ── 公开执行入口 ────────────────────────────────────── + def _resolve_effective_tiers(self, session_key: str) -> list[VendorTier]: + """根据 Session Policy 解析生效的 tier 顺序. + + 策略指定的 vendor 按其顺序排列在头部,未提及的保持在末尾。 + 无策略时返回全局默认顺序。 + """ + policy = self._policy_resolver.resolve(session_key) + if not policy or not policy.tiers: + return self._tiers + + name_to_tier = {t.name: t for t in self._tiers} + ordered: list[VendorTier] = [] + seen: set[str] = set() + for name in policy.tiers: + tier = name_to_tier.get(name) + if tier and name not in seen: + ordered.append(tier) + seen.add(name) + for tier in self._tiers: + if tier.name not in seen: + ordered.append(tier) + seen.add(tier.name) + return ordered + def _prepare_body_for_tier( self, body: dict[str, Any], @@ -310,7 +337,6 @@ async def execute_stream( headers: dict[str, str], ) -> AsyncIterator[tuple[bytes, str]]: """路由流式请求,按优先级尝试各层级.""" - last_idx = len(self._tiers) - 1 last_exc: Exception | None = None failed_tier_name: str | None = None request_caps = build_request_capabilities(body) @@ -320,8 +346,10 @@ async def execute_stream( canonical_request.trace_id, ) incompatible_reasons: list[str] = [] + effective_tiers = self._resolve_effective_tiers(canonical_request.session_key) + last_idx = len(effective_tiers) - 1 - for i, tier in enumerate(self._tiers): + for i, tier in enumerate(effective_tiers): is_last = i == last_idx gate = await self._try_gate_tier( @@ -404,6 +432,7 @@ async def execute_stream( model_served=model_served, request_id=info.request_id, ), + session_key=canonical_request.session_key, ) self._router._active_vendor_name = tier.name # 更新活跃供应商 return @@ -479,7 +508,6 @@ async def execute_message( headers: dict[str, str], ) -> VendorResponse: """路由非流式请求,按优先级尝试各层级.""" - last_idx = len(self._tiers) - 1 start = time.monotonic() failed_tier_name: str | None = None request_caps = build_request_capabilities(body) @@ -489,8 +517,10 @@ async def execute_message( canonical_request.trace_id, ) incompatible_reasons: list[str] = [] + effective_tiers = self._resolve_effective_tiers(canonical_request.session_key) + last_idx = len(effective_tiers) - 1 - for i, tier in enumerate(self._tiers): + for i, tier in enumerate(effective_tiers): is_last = i == last_idx gate = await self._try_gate_tier( @@ -545,6 +575,7 @@ async def execute_message( model_served=model_served, usage=resp.usage, ), + session_key=canonical_request.session_key, ) self._router._active_vendor_name = tier.name # 更新活跃供应商 return resp @@ -628,6 +659,7 @@ async def execute_message( evidence_records=self._recorder.build_nonstream_evidence_records( vendor=tier.name, model_served=model_served, usage=resp.usage ), + session_key=canonical_request.session_key, ) return resp diff --git a/src/coding/proxy/routing/router.py b/src/coding/proxy/routing/router.py index 3a65cd6..32757a8 100644 --- a/src/coding/proxy/routing/router.py +++ b/src/coding/proxy/routing/router.py @@ -18,6 +18,7 @@ from .executor import _RouteExecutor from .session_manager import RouteSessionManager +from .session_policy import SessionPolicyResolver from .tier import VendorTier # 向后兼容别名 @@ -36,6 +37,7 @@ def __init__( token_logger: TokenLogger | None = None, reauth_coordinator: Any | None = None, compat_session_store: CompatSessionStore | None = None, + session_policy_resolver: SessionPolicyResolver | None = None, ) -> None: if not tiers: raise ValueError("至少需要一个供应商层级") @@ -53,6 +55,7 @@ def __init__( usage_recorder=self._recorder, session_manager=self._session_mgr, reauth_coordinator=reauth_coordinator, + session_policy_resolver=session_policy_resolver, ) def set_pricing_table(self, table: PricingTable) -> None: diff --git a/src/coding/proxy/routing/session_policy.py b/src/coding/proxy/routing/session_policy.py new file mode 100644 index 0000000..1ffcdaf --- /dev/null +++ b/src/coding/proxy/routing/session_policy.py @@ -0,0 +1,56 @@ +"""Session Policy 解析引擎 — 根据 session_key + client_category 解析适用的路由策略.""" + +from __future__ import annotations + +import logging + +from ..config.session_policy import SessionPolicy + +logger = logging.getLogger(__name__) + + +class SessionPolicyResolver: + """根据 session_key + client_category 解析适用的 SessionPolicy. + + 设计要点: + - 启动时构建索引,运行时 O(1) 查找 + - 精确匹配优先:session_key > client_category > 无策略 + - 无侵入性:不匹配时返回 None,路由行为与现有一致 + """ + + def __init__(self, policies: list[SessionPolicy] | None = None) -> None: + self._policies = policies or [] + self._key_index: dict[str, SessionPolicy] = {} + self._category_index: dict[str, SessionPolicy] = {} + self._build_index() + + def _build_index(self) -> None: + """构建 session_key / client_category → SessionPolicy 的查找索引. + + 按定义顺序遍历,首次出现的 key/category 获得最高优先级。 + """ + for policy in self._policies: + for key in policy.match.session_keys: + if key not in self._key_index: + self._key_index[key] = policy + if ( + policy.match.client_category + and policy.match.client_category not in self._category_index + ): + self._category_index[policy.match.client_category] = policy + + if self._key_index or self._category_index: + logger.info( + "SessionPolicyResolver initialized: %d key rules, %d category rules", + len(self._key_index), + len(self._category_index), + ) + + def resolve( + self, session_key: str, client_category: str = "cc" + ) -> SessionPolicy | None: + """返回匹配的策略,优先精确 session_key 匹配,其次 category 匹配.""" + policy = self._key_index.get(session_key) + if policy: + return policy + return self._category_index.get(client_category) diff --git a/src/coding/proxy/routing/usage_recorder.py b/src/coding/proxy/routing/usage_recorder.py index da66978..525a6c1 100644 --- a/src/coding/proxy/routing/usage_recorder.py +++ b/src/coding/proxy/routing/usage_recorder.py @@ -97,6 +97,7 @@ async def record( operation: str = "", endpoint: str = "", extra_usage: dict[str, Any] | None = None, + session_key: str = "", ) -> None: """记录用量到 TokenLogger. @@ -141,6 +142,7 @@ async def record( operation=operation, endpoint=endpoint, extra_usage_json=extra_usage_json, + session_key=session_key, ) if not evidence_records: return diff --git a/src/coding/proxy/server/app.py b/src/coding/proxy/server/app.py index ec1f1e4..5ce8011 100644 --- a/src/coding/proxy/server/app.py +++ b/src/coding/proxy/server/app.py @@ -23,6 +23,7 @@ from ..logging.db import TokenLogger from ..native_api import NativeProxyHandler from ..routing.router import RequestRouter +from ..routing.session_policy import SessionPolicyResolver from ..routing.tier import VendorTier from ..routing.usage_recorder import UsageRecorder from ..vendors.antigravity import AntigravityVendor @@ -155,7 +156,11 @@ def create_app(config: ProxyConfig | None = None) -> FastAPI: ) router = RequestRouter( - tiers, token_logger, reauth_coordinator, compat_session_store + tiers, + token_logger, + reauth_coordinator, + compat_session_store, + session_policy_resolver=SessionPolicyResolver(config.session_policies.policies), ) app = FastAPI(title="coding-proxy", version=__version__, lifespan=lifespan) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index d0afcd4..dbd46a5 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -395,6 +395,28 @@ def _build_favicon() -> bytes: color: var(--text-tertiary); font-size: 14px; } .empty-icon { font-size: 32px; margin-bottom: 8px; opacity: .5; } + /* ── Sessions Panel ── */ + .sessions-card { grid-column: 1 / -1; animation-delay: .1s; } + .session-table-wrap { overflow-x: auto; max-height: 480px; overflow-y: auto; } + .session-table { width: 100%; border-collapse: collapse; font-size: 13px; } + .session-table th { + position: sticky; top: 0; z-index: 1; + background: var(--bg-card); padding: 10px 12px; + text-align: left; font-weight: 600; font-size: 12px; + color: var(--text-secondary); text-transform: uppercase; letter-spacing: .5px; + border-bottom: 1px solid var(--border); + } + .session-table td { padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); white-space: nowrap; } + .session-table tr:hover td { background: var(--bg-card-hover); } + .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; } + .session-tag { + display: inline-block; font-size: 11px; padding: 2px 7px; + border-radius: 8px; margin: 1px 2px; + background: rgba(88,166,255,.08); border: 1px solid rgba(88,166,255,.15); + color: var(--text-secondary); + } + .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); display: inline-block; vertical-align: middle; margin-left: 6px; } + .success-bar-fill { height: 100%; border-radius: 2px; } /* ── 加载态 ── */ .loading { opacity: .4; pointer-events: none; } /* ── 图表标签截断 ── */ @@ -541,6 +563,34 @@ def _build_favicon() -> bytes: + +
+
+ Recent Active Sessions + Last 24h +
+
+ + + + + + + + + + + + + + + + + +
SessionLast ActiveRequestsTokensModelsVendorsAvg LatencySuccessClient
Loading...
+
+
+
@@ -1263,6 +1313,83 @@ def _build_favicon() -> bytes: if (mt) mt.textContent = label + ' Token 用量(按 Vendor / 模型)'; } +// ── Sessions Panel ────────────────────────────────────────────── +function relativeTime(tsStr) { + if (!tsStr) return '–'; + var d = new Date(tsStr.replace('Z', '+00:00')); + var diff = (Date.now() - d.getTime()) / 1000; + if (diff < 60) return 'just now'; + if (diff < 3600) return Math.floor(diff / 60) + 'm ago'; + if (diff < 86400) return Math.floor(diff / 3600) + 'h ago'; + return Math.floor(diff / 86400) + 'd ago'; +} +function escapeHtml(s) { + if (!s) return ''; + return s.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,'''); +} +function truncateKey(key, maxLen) { + if (!key || key.length <= maxLen) return escapeHtml(key) || '–'; + return escapeHtml(key.slice(0, maxLen - 3)) + '…'; +} +function successBarHtml(pct) { + if (pct == null) return '–'; + var p = Math.round(pct); + var color = p >= 95 ? 'var(--accent-green)' : (p >= 80 ? 'var(--accent-yellow)' : 'var(--accent-red)'); + return '' + p + '%' + + ''; +} +function formatSessionTags(str, max) { + if (!str) return '–'; + var list = str.split(','); + var html = list.slice(0, max).map(function(c) { + return '' + escapeHtml(c.trim()) + ''; + }).join(''); + if (list.length > max) html += '+' + (list.length - max) + ''; + return html; +} +function formatCategories(cats) { + if (!cats) return '–'; + return cats.split(',').map(function(c) { + var t = c.trim(); + var label = t === 'cc' ? 'Claude Code' : (t === 'api' ? 'API' : escapeHtml(t)); + return '' + label + ''; + }).join(''); +} +function formatVendorTags(vendors) { + if (!vendors) return '–'; + return vendors.split(',').map(function(v) { + return '' + formatVendorLabel(v.trim()) + ''; + }).join(''); +} +async function updateSessions() { + try { + var data = await fetchJSON('/api/dashboard/sessions?hours=24&limit=20'); + var sessions = data.sessions || []; + var tbody = document.getElementById('sessions-tbody'); + var subtitle = document.getElementById('sessions-subtitle'); + if (subtitle) subtitle.textContent = 'Last ' + data.hours + 'h'; + if (!sessions.length) { + tbody.innerHTML = '
📭
No session data'; + return; + } + tbody.innerHTML = sessions.map(function(s) { + return '' + + '' + truncateKey(s.session_key, 22) + '' + + '' + relativeTime(s.last_active_ts) + '' + + '' + fmtNum(s.total_requests) + '' + + '' + fmtTokens(s.total_tokens) + '' + + '' + formatSessionTags(s.models, 2) + '' + + '' + formatVendorTags(s.vendors) + '' + + '' + (s.avg_duration_ms ? Math.round(s.avg_duration_ms) + 'ms' : '–') + '' + + '' + successBarHtml(s.success_rate) + '' + + '' + formatCategories(s.client_categories) + '' + + ''; + }).join(''); + } catch (e) { + console.error('Sessions refresh error:', e); + } +} + // ── 主刷新逻辑 ──────────────────────────────────────────── let refreshing = false; async function refresh() { @@ -1291,6 +1418,7 @@ def _build_favicon() -> bytes: buildVendorDist(rows, tierOrder); buildTokenTimeline(rows, tierOrder); buildModelTokenTimeline(rows); + updateSessions(); document.getElementById('refresh-time').textContent = '上次刷新: ' + now(); } catch (e) { @@ -1473,3 +1601,35 @@ async def dashboard_timeline(request: Request, days: int = 7) -> Response: status_code=200, media_type="application/json", ) + + @app.get("/api/dashboard/sessions") + async def dashboard_sessions( + request: Request, hours: float = 24.0, limit: int = 20 + ) -> Response: + """返回近期活跃会话聚合数据.""" + token_logger = getattr(request.app.state, "token_logger", None) + if token_logger is None: + return Response( + content=b'{"error":"token_logger not available"}', + status_code=503, + media_type="application/json", + ) + hours = max(1.0, min(hours, 168.0)) + limit = max(1, min(limit, 100)) + try: + sessions = await token_logger.query_recent_sessions( + limit=limit, hours=hours + ) + except Exception as exc: + logger.error("dashboard_sessions query error: %s", exc, exc_info=True) + return Response( + content=b'{"error":"query failed"}', + status_code=500, + media_type="application/json", + ) + result = {"sessions": sessions, "hours": hours} + return Response( + content=json.dumps(result, ensure_ascii=False).encode(), + status_code=200, + media_type="application/json", + ) diff --git a/tests/test_session_aware.py b/tests/test_session_aware.py new file mode 100644 index 0000000..bdd69e8 --- /dev/null +++ b/tests/test_session_aware.py @@ -0,0 +1,451 @@ +"""Session-Aware Architecture 测试. + +覆盖矩阵: +1. 新装库 schema 包含 session_key 列与索引; +2. 旧库增量迁移幂等 (重复 init 不抛错); +3. log() 写入 session_key 可回读; +4. query_recent_sessions() 聚合/排序/过滤正确性; +5. query_session_profile() 单会话查询; +6. SessionPolicyResolver 精确匹配/通配匹配/无匹配; +7. _resolve_effective_tiers 策略 tier 重排逻辑. +""" + +from __future__ import annotations + +import aiosqlite +import pytest +import pytest_asyncio + +from coding.proxy.config.session_policy import ( + SessionPoliciesConfig, + SessionPolicy, + SessionPolicyMatch, +) +from coding.proxy.logging.db import TokenLogger +from coding.proxy.routing.session_policy import SessionPolicyResolver + +# ── Fixture ────────────────────────────────────────────────── + + +@pytest_asyncio.fixture +async def logger(tmp_path): + tl = TokenLogger(tmp_path / "test.db") + await tl.init() + yield tl + await tl.close() + + +# ── 1. 新装库 schema ───────────────────────────────────────── + + +@pytest.mark.asyncio +async def test_fresh_schema_contains_session_key(logger): + cursor = await logger._db.execute("PRAGMA table_info(usage_log)") + rows = await cursor.fetchall() + columns = {row["name"] for row in rows} + assert "session_key" in columns + + +@pytest.mark.asyncio +async def test_fresh_schema_contains_session_key_index(logger): + cursor = await logger._db.execute( + "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='usage_log'" + ) + rows = await cursor.fetchall() + names = {row["name"] for row in rows} + assert "idx_usage_session_key" in names + + +# ── 2. 旧库迁移幂等 ───────────────────────────────────────── + + +@pytest.mark.asyncio +async def test_migration_from_legacy_db_adds_session_key(tmp_path): + db_path = tmp_path / "legacy.db" + async with aiosqlite.connect(str(db_path)) as db: + await db.executescript( + """ + CREATE TABLE usage_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + ts TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')), + vendor TEXT NOT NULL, + model_requested TEXT NOT NULL, + model_served TEXT NOT NULL, + input_tokens INTEGER DEFAULT 0, + output_tokens INTEGER DEFAULT 0, + cache_creation_tokens INTEGER DEFAULT 0, + cache_read_tokens INTEGER DEFAULT 0, + duration_ms INTEGER DEFAULT 0, + success BOOLEAN NOT NULL DEFAULT 1, + failover BOOLEAN NOT NULL DEFAULT 0, + failover_from TEXT DEFAULT NULL, + request_id TEXT DEFAULT '', + client_category TEXT NOT NULL DEFAULT 'cc', + operation TEXT NOT NULL DEFAULT '', + endpoint TEXT NOT NULL DEFAULT '', + extra_usage_json TEXT NOT NULL DEFAULT '{}' + ); + """ + ) + await db.execute( + "INSERT INTO usage_log (vendor, model_requested, model_served) " + "VALUES ('anthropic','claude-sonnet','claude-sonnet')" + ) + await db.commit() + + tl = TokenLogger(db_path) + await tl.init() + try: + cursor = await tl._db.execute("PRAGMA table_info(usage_log)") + rows = await cursor.fetchall() + columns = {row["name"] for row in rows} + assert "session_key" in columns + + cursor = await tl._db.execute( + "SELECT session_key FROM usage_log WHERE vendor='anthropic'" + ) + row = await cursor.fetchone() + assert row["session_key"] == "" + finally: + await tl.close() + + tl2 = TokenLogger(db_path) + await tl2.init() + await tl2.close() + + +# ── 3. log() 写入 session_key ─────────────────────────────── + + +@pytest.mark.asyncio +async def test_log_persists_session_key(logger): + await logger.log( + vendor="anthropic", + model_requested="claude-sonnet", + model_served="claude-sonnet", + input_tokens=100, + output_tokens=50, + session_key="test-session-123", + ) + cursor = await logger._db.execute( + "SELECT session_key FROM usage_log WHERE vendor='anthropic'" + ) + row = await cursor.fetchone() + assert row["session_key"] == "test-session-123" + + +@pytest.mark.asyncio +async def test_log_default_session_key_empty(logger): + await logger.log( + vendor="anthropic", + model_requested="claude-sonnet", + model_served="claude-sonnet", + input_tokens=50, + output_tokens=10, + ) + cursor = await logger._db.execute("SELECT session_key FROM usage_log") + row = await cursor.fetchone() + assert row["session_key"] == "" + + +# ── 4. query_recent_sessions ──────────────────────────────── + + +@pytest.mark.asyncio +async def test_query_recent_sessions_basic(logger): + for i in range(3): + await logger.log( + vendor="anthropic", + model_requested="claude-sonnet", + model_served="claude-sonnet", + input_tokens=100 * (i + 1), + output_tokens=50 * (i + 1), + session_key="session-alpha", + duration_ms=100 + i * 50, + ) + await logger.log( + vendor="copilot", + model_requested="claude-sonnet", + model_served="gpt-4o", + input_tokens=200, + output_tokens=80, + session_key="session-beta", + duration_ms=150, + ) + await logger.log( + vendor="zhipu", + model_requested="claude-sonnet", + model_served="glm-5v-turbo", + input_tokens=50, + output_tokens=20, + session_key="", # 空 key,应被排除 + ) + + sessions = await logger.query_recent_sessions(limit=10, hours=1) + assert len(sessions) == 2 + + alpha = next(s for s in sessions if s["session_key"] == "session-alpha") + assert alpha["total_requests"] == 3 + assert alpha["total_tokens"] == (100 + 200 + 300) + (50 + 100 + 150) + assert alpha["total_input"] == 100 + 200 + 300 + assert alpha["total_output"] == 50 + 100 + 150 + assert "claude-sonnet" in alpha["models"] + assert "anthropic" in alpha["vendors"] + assert alpha["success_rate"] == 100.0 + assert "cc" in alpha["client_categories"] + + +@pytest.mark.asyncio +async def test_query_recent_sessions_excludes_empty_key(logger): + await logger.log( + vendor="anthropic", + model_requested="claude-sonnet", + model_served="claude-sonnet", + input_tokens=100, + session_key="", + ) + await logger.log( + vendor="anthropic", + model_requested="claude-sonnet", + model_served="claude-sonnet", + input_tokens=100, + session_key="valid-session", + ) + sessions = await logger.query_recent_sessions(limit=10, hours=1) + assert len(sessions) == 1 + assert sessions[0]["session_key"] == "valid-session" + + +@pytest.mark.asyncio +async def test_query_recent_sessions_limit(logger): + for i in range(5): + await logger.log( + vendor="anthropic", + model_requested="claude-sonnet", + model_served="claude-sonnet", + input_tokens=100, + session_key=f"session-{i}", + ) + sessions = await logger.query_recent_sessions(limit=3, hours=1) + assert len(sessions) == 3 + + +@pytest.mark.asyncio +async def test_query_recent_sessions_success_rate(logger): + await logger.log( + vendor="anthropic", + model_requested="m", + model_served="m", + session_key="s1", + success=True, + ) + await logger.log( + vendor="anthropic", + model_requested="m", + model_served="m", + session_key="s1", + success=False, + ) + await logger.log( + vendor="anthropic", + model_requested="m", + model_served="m", + session_key="s1", + success=True, + ) + sessions = await logger.query_recent_sessions(limit=10, hours=1) + assert len(sessions) == 1 + assert abs(sessions[0]["success_rate"] - (2 / 3 * 100)) < 0.01 + + +# ── 5. query_session_profile ──────────────────────────────── + + +@pytest.mark.asyncio +async def test_query_session_profile_found(logger): + await logger.log( + vendor="anthropic", + model_requested="m", + model_served="m", + input_tokens=100, + output_tokens=50, + session_key="profile-test", + ) + profile = await logger.query_session_profile("profile-test") + assert profile is not None + assert profile["session_key"] == "profile-test" + assert profile["total_requests"] == 1 + + +@pytest.mark.asyncio +async def test_query_session_profile_not_found(logger): + profile = await logger.query_session_profile("nonexistent") + assert profile is None + + +# ── 6. SessionPolicyResolver ──────────────────────────────── + + +def _make_policy(name, keys=None, category=None, tiers=None): + return SessionPolicy( + name=name, + match=SessionPolicyMatch(session_keys=keys or [], client_category=category), + tiers=tiers or [], + ) + + +def test_resolve_by_session_key(): + p1 = _make_policy("vip", keys=["key-1", "key-2"], tiers=["anthropic"]) + p2 = _make_policy("cc-default", category="cc", tiers=["copilot"]) + resolver = SessionPolicyResolver([p1, p2]) + + assert resolver.resolve("key-1") is p1 + assert resolver.resolve("key-2") is p1 + assert resolver.resolve("unknown-key", "cc") is p2 + assert resolver.resolve("unknown-key", "api") is None + + +def test_resolve_key_priority_over_category(): + p1 = _make_policy("cc-default", category="cc", tiers=["copilot"]) + p2 = _make_policy("vip", keys=["vip-key"], tiers=["anthropic"]) + resolver = SessionPolicyResolver([p1, p2]) + + result = resolver.resolve("vip-key", "cc") + assert result is p2 # 精确 key 匹配优先 + + +def test_resolve_no_match(): + resolver = SessionPolicyResolver([]) + assert resolver.resolve("any-key") is None + + +def test_resolve_first_match_wins(): + p1 = _make_policy("first", keys=["dup-key"], tiers=["anthropic"]) + p2 = _make_policy("second", keys=["dup-key"], tiers=["zhipu"]) + resolver = SessionPolicyResolver([p1, p2]) + + assert resolver.resolve("dup-key") is p1 + + +def test_empty_resolver(): + resolver = SessionPolicyResolver() + assert resolver.resolve("any") is None + + +# ── 7. _resolve_effective_tiers (via executor) ────────────── + + +def test_resolve_effective_tiers_with_policy(): + from coding.proxy.routing.executor import _RouteExecutor + from coding.proxy.routing.tier import VendorTier + from coding.proxy.vendors.base import BaseVendor + + class FakeVendor(BaseVendor): + def __init__(self, name): + self._name = name + + def get_name(self): + return self._name + + async def _prepare_request(self, body, headers): + return body, headers + + async def send_message_stream(self, body, headers): + yield b"", "" + + async def send_message(self, body, headers): + return None + + def supports_request(self, caps): + return True, [] + + def map_model(self, model): + return model + + tiers = [ + VendorTier(vendor=FakeVendor("zhipu")), + VendorTier(vendor=FakeVendor("anthropic")), + VendorTier(vendor=FakeVendor("copilot")), + ] + + policy = _make_policy("vip", keys=["vip-key"], tiers=["anthropic", "copilot"]) + resolver = SessionPolicyResolver([policy]) + + executor = _RouteExecutor( + router=None, + tiers=tiers, + usage_recorder=None, + session_manager=None, + session_policy_resolver=resolver, + ) + + effective = executor._resolve_effective_tiers("vip-key") + names = [t.name for t in effective] + assert names == ["anthropic", "copilot", "zhipu"] + + +def test_resolve_effective_tiers_no_policy(): + from coding.proxy.routing.executor import _RouteExecutor + from coding.proxy.routing.tier import VendorTier + from coding.proxy.vendors.base import BaseVendor + + class FakeVendor(BaseVendor): + def __init__(self, name): + self._name = name + + def get_name(self): + return self._name + + async def _prepare_request(self, body, headers): + return body, headers + + async def send_message_stream(self, body, headers): + yield b"", "" + + async def send_message(self, body, headers): + return None + + def supports_request(self, caps): + return True, [] + + def map_model(self, model): + return model + + tiers = [ + VendorTier(vendor=FakeVendor("zhipu")), + VendorTier(vendor=FakeVendor("anthropic")), + ] + + executor = _RouteExecutor( + router=None, + tiers=tiers, + usage_recorder=None, + session_manager=None, + ) + + effective = executor._resolve_effective_tiers("unknown-key") + assert effective is tiers # 返回同一列表引用 + + +# ── 8. SessionPoliciesConfig 集成 ─────────────────────────── + + +def test_config_default_empty(): + config = SessionPoliciesConfig() + assert config.policies == [] + + +def test_config_parse(): + config = SessionPoliciesConfig( + policies=[ + { + "name": "vip", + "match": {"session_keys": ["key-1"]}, + "tiers": ["anthropic", "copilot"], + } + ] + ) + assert len(config.policies) == 1 + assert config.policies[0].name == "vip" + assert config.policies[0].match.session_keys == ["key-1"] + assert config.policies[0].tiers == ["anthropic", "copilot"] From 9960a45bc95ea667a018296f6713af8ce4368351 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Thu, 30 Apr 2026 14:52:44 +0800 Subject: [PATCH 13/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a7=20=E2=86=92=200.3.1a8;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9e62114..eb63fd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a7" +version = "0.3.1a8" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 3558c1f..8c9e847 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a7" +version = "0.3.1a8" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 02d3aa5e240594b1662302c1a86b7659b929f3bb Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 17:04:51 +0800 Subject: [PATCH 14/66] =?UTF-8?q?feat(dashboard):=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E4=B8=BA=20Overview=20/=20Recent=20Active=20?= =?UTF-8?q?Sessions=20=E5=8F=8C=E9=A1=B5=E7=AD=BE;=20(#220)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 顶部新增 Tab 导航(Overview / Recent Active Sessions),用 `?tab=` 同步 URL 状态,F5 与书签可保留页签; - 将 refresh() 拆为 refreshOverview() + refreshSessions() + 分发器,⟳ 按钮与 10 分钟 setInterval 均仅刷新当前页签; - 页签切换采用懒加载(首次切到才请求,再切回不重复请求),降低无关 API 调用; - refresh() 加入循环补刷快照机制,防止 await 期间用户切页签导致 tabLoaded 标记错位; - 沿用既有 CSS 变量与暗色主题,新增 .tabs / .tab-btn / .tab-pane 样式。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 171 ++++++++++++++++++++++----- 1 file changed, 141 insertions(+), 30 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index dbd46a5..7581986 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -457,6 +457,34 @@ def _build_favicon() -> bytes: margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--border-subtle); font-weight: 500; font-size: 12px; color: var(--text-secondary); } + /* ── Tabs ─────────────────────────────────────────────────── */ + .tabs { + display: flex; + gap: 4px; + margin-bottom: 16px; + border-bottom: 1px solid var(--border); + padding: 0 2px; + } + .tab-btn { + appearance: none; + background: transparent; + border: none; + border-bottom: 2px solid transparent; + color: var(--text-secondary); + cursor: pointer; + font-family: inherit; + font-size: 14px; + font-weight: 500; + padding: 10px 16px; + margin-bottom: -1px; + transition: color .15s ease, border-color .15s ease, background .15s ease; + border-radius: 6px 6px 0 0; + } + .tab-btn:hover { color: var(--text-primary); background: var(--bg-card-hover); } + .tab-btn.active { color: var(--text-primary); border-bottom-color: var(--accent-blue); } + .tab-btn:focus-visible { outline: 2px solid var(--accent-blue); outline-offset: 2px; } + .tab-pane { display: none; } + .tab-pane.active { display: block; } @@ -473,6 +501,14 @@ def _build_favicon() -> bytes:
+ + + + +
时间区间 @@ -562,7 +598,10 @@ def _build_favicon() -> bytes:
+
+ +
@@ -590,6 +629,7 @@ def _build_favicon() -> bytes:
+
@@ -1390,48 +1430,119 @@ def _build_favicon() -> bytes: } } -// ── 主刷新逻辑 ──────────────────────────────────────────── +// ── 主刷新逻辑(按 Tab 分发) ────────────────────────────── let refreshing = false; +let currentTab = 'overview'; +const tabLoaded = { overview: false, sessions: false }; +const TAB_LABELS = { overview: 'Overview', sessions: 'Recent Active Sessions' }; + +async function refreshOverview() { + const days = currentDays > 0 ? currentDays : 7; + const [summary, timeline, status] = await Promise.all([ + fetchJSON('/api/dashboard/summary?days=' + days), + fetchJSON('/api/dashboard/timeline?days=' + days), + fetchJSON('/api/status'), + ]); + + if (summary.version) { + document.getElementById('version-badge').textContent = 'v' + summary.version; + } + + updateKPI(summary); + updateVendorStatus(status); + updateChartTitles(days); + + const rows = timeline.rows || []; + const tierOrder = (status.tiers || []).map(t => t.name); + buildTimeline(rows, tierOrder); + buildVendorDist(rows, tierOrder); + buildTokenTimeline(rows, tierOrder); + buildModelTokenTimeline(rows); +} + +async function refreshSessions() { + await updateSessions(); +} + async function refresh() { if (refreshing) return; refreshing = true; - document.getElementById('refresh-time').textContent = '刷新中…'; try { - const days = currentDays > 0 ? currentDays : 7; - const [summary, timeline, status] = await Promise.all([ - fetchJSON('/api/dashboard/summary?days=' + days), - fetchJSON('/api/dashboard/timeline?days=' + days), - fetchJSON('/api/status'), - ]); - - if (summary.version) { - document.getElementById('version-badge').textContent = 'v' + summary.version; + // 循环:若 await 期间用户切到了尚未加载的另一页签,补一次刷新,避免 tabLoaded 错位。 + while (true) { + const tab = currentTab; + document.getElementById('refresh-time').textContent = '刷新中…'; + try { + if (tab === 'sessions') { + await refreshSessions(); + } else { + await refreshOverview(); + } + tabLoaded[tab] = true; + if (tab === currentTab) { + document.getElementById('refresh-time').textContent = + '上次刷新: ' + now() + '(' + TAB_LABELS[tab] + ')'; + } + } catch (e) { + console.error('Dashboard refresh error:', e); + document.getElementById('refresh-time').textContent = '刷新失败 ' + now(); + } + if (currentTab !== tab && !tabLoaded[currentTab]) continue; + break; } + } finally { + refreshing = false; + } +} - updateKPI(summary); - updateVendorStatus(status); - updateChartTitles(days); +// ── 页签切换(懒加载 + URL 同步) ───────────────────────── +function syncTabUrl(name) { + try { + const url = new URL(window.location.href); + if (url.searchParams.get('tab') === name) return; + url.searchParams.set('tab', name); + window.history.replaceState({}, '', url); + } catch (e) { /* no-op */ } +} - const rows = timeline.rows || []; - const tierOrder = (status.tiers || []).map(t => t.name); - buildTimeline(rows, tierOrder); - buildVendorDist(rows, tierOrder); - buildTokenTimeline(rows, tierOrder); - buildModelTokenTimeline(rows); - updateSessions(); +function applyTabState(name) { + document.querySelectorAll('.tab-btn').forEach(function (b) { + const active = b.getAttribute('data-tab') === name; + b.classList.toggle('active', active); + b.setAttribute('aria-selected', active ? 'true' : 'false'); + }); + document.querySelectorAll('.tab-pane').forEach(function (p) { + p.classList.toggle('active', p.getAttribute('data-tab') === name); + }); +} - document.getElementById('refresh-time').textContent = '上次刷新: ' + now(); - } catch (e) { - console.error('Dashboard refresh error:', e); - document.getElementById('refresh-time').textContent = '刷新失败 ' + now(); - } finally { - refreshing = false; +function switchTab(name) { + if (name !== 'overview' && name !== 'sessions') name = 'overview'; + if (name === currentTab) { + syncTabUrl(name); + return; + } + currentTab = name; + applyTabState(name); + syncTabUrl(name); + if (!tabLoaded[name]) { + refresh(); } } -// 页面加载 + 每 30 秒自动刷新 -refresh(); -setInterval(refresh, 600000); +// ── 初始化 ──────────────────────────────────────────────── +(function bootstrap() { + let initial = 'overview'; + try { + const t = new URL(window.location.href).searchParams.get('tab'); + if (t === 'sessions') initial = 'sessions'; + } catch (e) { /* no-op */ } + currentTab = initial; + applyTabState(initial); + syncTabUrl(initial); + refresh(); // 仅加载初始页签的数据 + setInterval(refresh, 600000); // 每 10 分钟刷新当前页签 +})(); From 131a0a42fcdea0fda10ac3dc7a68d9fb31a0a8d5 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 17:31:53 +0800 Subject: [PATCH 15/66] =?UTF-8?q?feat(session-vendor):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20Session=20=E7=BA=A7=E5=88=AB=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=20vendor=20=E7=BB=91=E5=AE=9A=E8=83=BD=E5=8A=9B=20(#2?= =?UTF-8?q?21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(session-vendor): 新增 Session 级别运行时 vendor 绑定能力 - SessionPolicyResolver 支持运行时 upsert/remove/list 操作,无需重启服务 - 新增 PUT/DELETE/GET /api/session-vendor API 端点 - Dashboard Sessions 表新增 "Vendor Bind" 下拉选择器,即时绑定 vendor - CLI 新增 session 子命令组(bind/unbind/list) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(session-vendor): 修复 CLI unbind URL 编码与 list_runtime_bindings 类型标注; - session_unbind 中 key 参数使用 urllib.parse.quote 进行 URL 编码,防止特殊字符导致路由匹配失败 - 修正 list_runtime_bindings 返回类型为 dict[str, str | list[str]],准确反映 session_key 为 str、vendors 为 list[str] 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(session-vendor): 修复 Dashboard bind 变更响应检查与 XSS 防护; - handleBindChange 增加 resp.ok 检查,失败时 revert select 并输出错误日志 - buildBindSelect 改用 data-session-key 属性 + 事件委托替代 inline onchange,消除字符串拼接注入风险 - resolve() docstring 补充 SessionPolicy 不可变约束说明 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(session-vendor): 修复运行时绑定覆盖配置策略与 Dashboard 容错; - upsert 时备份被覆盖的配置策略,remove 时自动恢复,避免配置策略永久丢失 - Dashboard updateSessions 改用 Promise.allSettled,bind/status 请求失败时降级而不阻塞表格渲染 - 新增 test_runtime_remove_restores_config_policy 测试用例覆盖恢复路径 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(session-vendor): 修复 API JSON 解析异常处理与 Dashboard 多绑定显示; - routes: request.json() 添加 try/except,malformed JSON 返回 400 而非 500 - routes: 区分 "非 JSON" 与 "非 JSON Object" 两种错误消息 - dashboard: buildBindSelect 多 vendor 绑定时显示 (+N) 后缀提示 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/cli/__init__.py | 95 ++++++++++++++ src/coding/proxy/routing/session_policy.py | 66 +++++++++- src/coding/proxy/server/dashboard.py | 87 ++++++++++++- src/coding/proxy/server/routes.py | 91 +++++++++++++ tests/test_session_aware.py | 141 +++++++++++++++++++++ 5 files changed, 474 insertions(+), 6 deletions(-) diff --git a/src/coding/proxy/cli/__init__.py b/src/coding/proxy/cli/__init__.py index 21cbe91..3b479fb 100644 --- a/src/coding/proxy/cli/__init__.py +++ b/src/coding/proxy/cli/__init__.py @@ -30,6 +30,10 @@ # 注册 Auth 子应用 app.add_typer(auth_app, name="auth") +# 注册 Session 子应用 +session_app = typer.Typer(name="session", help="管理 Session-Vendor 运行时绑定") +app.add_typer(session_app, name="session") + def _build_token_store(cfg_path: Path | None = None): """按配置解析 Token Store 路径并完成加载.""" @@ -264,6 +268,97 @@ def reset( console.print("[red]代理服务未运行[/red]") +# ── Session 子命令 ─────────────────────────────────────────────── + + +@session_app.command("bind") +def session_bind( + key: str = typer.Option(..., "--key", "-k", help="Session key"), + vendor: str = typer.Option( + ..., "--vendor", "-v", help="绑定 vendor(逗号分隔多个)" + ), + port: int = typer.Option(3392, "--port", "-p", help="代理服务端口"), +) -> None: + """为指定 Session 绑定 vendor 优先级.""" + import httpx as _httpx + + vendors = [v.strip() for v in vendor.split(",") if v.strip()] + try: + resp = _httpx.put( + f"http://127.0.0.1:{port}/api/session-vendor", + json={"session_key": key, "vendors": vendors}, + timeout=5, + ) + if resp.status_code == 200: + data = resp.json() + console.print( + f"[green]绑定成功:[/] session [cyan]{key[:16]}…[/cyan] → " + + " → ".join(data.get("vendors", vendors)) + ) + else: + try: + err = resp.json() + msg = err.get("error", {}).get("message", resp.text) + except Exception: + msg = resp.text + console.print(f"[red]绑定失败: {msg}[/red]") + except _httpx.ConnectError: + console.print("[red]代理服务未运行[/red]") + + +@session_app.command("unbind") +def session_unbind( + key: str = typer.Option(..., "--key", "-k", help="Session key"), + port: int = typer.Option(3392, "--port", "-p", help="代理服务端口"), +) -> None: + """解除指定 Session 的 vendor 绑定.""" + from urllib.parse import quote + + import httpx as _httpx + + try: + resp = _httpx.delete( + f"http://127.0.0.1:{port}/api/session-vendor/{quote(key, safe='')}", + timeout=5, + ) + if resp.status_code == 200: + console.print(f"[green]已解除绑定:[/] session [cyan]{key[:16]}…[/cyan]") + elif resp.status_code == 404: + console.print(f"[yellow]未找到绑定:[/] session [cyan]{key[:16]}…[/cyan]") + else: + console.print(f"[red]解除失败: {resp.status_code} {resp.text}[/red]") + except _httpx.ConnectError: + console.print("[red]代理服务未运行[/red]") + + +@session_app.command("list") +def session_list( + port: int = typer.Option(3392, "--port", "-p", help="代理服务端口"), +) -> None: + """列出所有运行时 Session-Vendor 绑定.""" + import httpx as _httpx + + try: + resp = _httpx.get( + f"http://127.0.0.1:{port}/api/session-vendor", + timeout=5, + ) + if resp.status_code == 200: + data = resp.json() + bindings = data.get("bindings", []) + if not bindings: + console.print("[dim]当前无运行时绑定[/dim]") + return + for b in bindings: + key = b.get("session_key", "?") + vendors = b.get("vendors", []) + console.print(f" [cyan]{key[:24]}…[/cyan] → " + " → ".join(vendors)) + else: + console.print(f"[red]查询失败: {resp.status_code} {resp.text}[/red]") + except _httpx.ConnectError: + console.print("[red]代理服务未运行[/red]") + + def _resolve_config_path(config: str | Path | None = None) -> Path | None: """标准化配置路径输入.""" if config is None: diff --git a/src/coding/proxy/routing/session_policy.py b/src/coding/proxy/routing/session_policy.py index 1ffcdaf..9102e41 100644 --- a/src/coding/proxy/routing/session_policy.py +++ b/src/coding/proxy/routing/session_policy.py @@ -3,8 +3,9 @@ from __future__ import annotations import logging +import threading -from ..config.session_policy import SessionPolicy +from ..config.session_policy import SessionPolicy, SessionPolicyMatch logger = logging.getLogger(__name__) @@ -16,12 +17,15 @@ class SessionPolicyResolver: - 启动时构建索引,运行时 O(1) 查找 - 精确匹配优先:session_key > client_category > 无策略 - 无侵入性:不匹配时返回 None,路由行为与现有一致 + - 运行时可变:支持 API 动态 upsert/remove session → vendor 绑定 """ def __init__(self, policies: list[SessionPolicy] | None = None) -> None: self._policies = policies or [] self._key_index: dict[str, SessionPolicy] = {} self._category_index: dict[str, SessionPolicy] = {} + self._config_key_backup: dict[str, SessionPolicy] = {} + self._lock = threading.Lock() self._build_index() def _build_index(self) -> None: @@ -49,8 +53,64 @@ def _build_index(self) -> None: def resolve( self, session_key: str, client_category: str = "cc" ) -> SessionPolicy | None: - """返回匹配的策略,优先精确 session_key 匹配,其次 category 匹配.""" - policy = self._key_index.get(session_key) + """返回匹配的策略,优先精确 session_key 匹配,其次 category 匹配. + + 返回的 SessionPolicy 对象应为不可变引用;调用方不应修改其内部属性, + 否则在并发 upsert/remove 场景下可能产生竞态。 + """ + with self._lock: + policy = self._key_index.get(session_key) if policy: return policy return self._category_index.get(client_category) + + # ── 运行时 session → vendor 绑定 ────────────────────────────── + + def upsert(self, session_key: str, tier_names: list[str]) -> SessionPolicy: + """为指定 session key 创建或替换运行时 vendor 绑定. + + 运行时策略使用 ``runtime:`` 名称前缀,与配置文件驱动的策略区分。 + """ + policy = SessionPolicy( + name=f"runtime:{session_key}", + match=SessionPolicyMatch(session_keys=[session_key]), + tiers=tier_names, + ) + with self._lock: + existing = self._key_index.get(session_key) + if existing and not existing.name.startswith("runtime:"): + self._config_key_backup[session_key] = existing + self._key_index[session_key] = policy + logger.info( + "Session vendor binding upserted: session_key=%s → %s", + session_key, + tier_names, + ) + return policy + + def remove(self, session_key: str) -> bool: + """删除指定 session key 的运行时 vendor 绑定. + + Returns: + True 如果找到并删除了绑定,False 如果不存在。 + """ + with self._lock: + policy = self._key_index.get(session_key) + if policy is None or not policy.name.startswith("runtime:"): + return False + del self._key_index[session_key] + # 恢复被运行时绑定覆盖的配置策略 + backup = self._config_key_backup.pop(session_key, None) + if backup is not None: + self._key_index[session_key] = backup + logger.info("Session vendor binding removed: session_key=%s", session_key) + return True + + def list_runtime_bindings(self) -> list[dict[str, str | list[str]]]: + """返回所有运行时注入的绑定快照(仅 API 创建的,不含配置文件驱动的).""" + with self._lock: + return [ + {"session_key": key, "vendors": policy.tiers} + for key, policy in self._key_index.items() + if policy.name.startswith("runtime:") + ] diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 7581986..707494e 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -417,6 +417,19 @@ def _build_favicon() -> bytes: } .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); display: inline-block; vertical-align: middle; margin-left: 6px; } .success-bar-fill { height: 100%; border-radius: 2px; } + /* ── Vendor Bind 选择器 ── */ + .bind-select { + padding: 3px 6px; border-radius: 6px; + background: rgba(48,54,61,.6); border: 1px solid rgba(255,255,255,.1); + color: var(--text-secondary); font-size: 12px; + font-family: 'JetBrains Mono', monospace; + cursor: pointer; outline: none; + transition: all .2s ease; + max-width: 120px; + } + .bind-select:hover { border-color: rgba(88,166,255,.4); color: var(--text-primary); } + .bind-select:focus { border-color: rgba(88,166,255,.6); box-shadow: 0 0 0 2px rgba(88,166,255,.1); } + .bind-select option { background: var(--bg-card); color: var(--text-primary); } /* ── 加载态 ── */ .loading { opacity: .4; pointer-events: none; } /* ── 图表标签截断 ── */ @@ -620,11 +633,12 @@ def _build_favicon() -> bytes: Vendors Avg Latency Success + Vendor Bind Client - Loading... + Loading... @@ -1403,16 +1417,31 @@ def _build_favicon() -> bytes: } async function updateSessions() { try { - var data = await fetchJSON('/api/dashboard/sessions?hours=24&limit=20'); + var results = await Promise.allSettled([ + fetchJSON('/api/dashboard/sessions?hours=24&limit=20'), + fetchJSON('/api/session-vendor'), + fetchJSON('/api/status'), + ]); + if (results[0].status === 'rejected') throw results[0].reason; + var data = results[0].value; + var bindData = results[1].status === 'fulfilled' ? results[1].value : {bindings: []}; + var statusData = results[2].status === 'fulfilled' ? results[2].value : {tiers: []}; var sessions = data.sessions || []; + var bindings = bindData.bindings || []; + var availableVendors = (statusData.tiers || []).map(function(t) { return t.name; }); var tbody = document.getElementById('sessions-tbody'); var subtitle = document.getElementById('sessions-subtitle'); if (subtitle) subtitle.textContent = 'Last ' + data.hours + 'h'; if (!sessions.length) { - tbody.innerHTML = '
📭
No session data'; + tbody.innerHTML = '
📭
No session data'; return; } + // Build binding lookup: session_key → vendors list + var bindMap = {}; + bindings.forEach(function(b) { bindMap[b.session_key] = b.vendors; }); tbody.innerHTML = sessions.map(function(s) { + var boundVendors = bindMap[s.session_key]; + var selectHtml = buildBindSelect(s.session_key, boundVendors, availableVendors); return '' + '' + truncateKey(s.session_key, 22) + '' + '' + relativeTime(s.last_active_ts) + '' + @@ -1422,6 +1451,7 @@ def _build_favicon() -> bytes: '' + formatVendorTags(s.vendors) + '' + '' + (s.avg_duration_ms ? Math.round(s.avg_duration_ms) + 'ms' : '–') + '' + '' + successBarHtml(s.success_rate) + '' + + '' + selectHtml + '' + '' + formatCategories(s.client_categories) + '' + ''; }).join(''); @@ -1430,6 +1460,57 @@ def _build_favicon() -> bytes: } } +function buildBindSelect(sessionKey, boundVendors, availableVendors) { + var isBound = boundVendors && boundVendors.length > 0; + var multiBound = isBound && boundVendors.length > 1; + var selected = isBound ? boundVendors[0] : ''; + var html = ''; + return html; +} + +async function handleBindChange(sel) { + var sessionKey = sel.getAttribute('data-session-key'); + var vendor = sel.value; + var previousValue = sel.getAttribute('data-previous') || ''; + try { + var resp; + if (vendor) { + resp = await fetch('/api/session-vendor', { + method: 'PUT', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({session_key: sessionKey, vendors: [vendor]}), + }); + } else { + resp = await fetch('/api/session-vendor/' + encodeURIComponent(sessionKey), {method: 'DELETE'}); + } + if (!resp.ok) { + sel.value = previousValue; + console.error('Bind change rejected:', resp.status, await resp.text()); + } + } catch (e) { + sel.value = previousValue; + console.error('Bind change failed:', e); + } +} + +var sessionsTbody = document.getElementById('sessions-tbody'); +sessionsTbody.addEventListener('focus', function(e) { + if (e.target.classList.contains('bind-select')) { + e.target.setAttribute('data-previous', e.target.value); + } +}, true); +sessionsTbody.addEventListener('change', function(e) { + if (e.target.classList.contains('bind-select')) { + handleBindChange(e.target); + } +}); + // ── 主刷新逻辑(按 Tab 分发) ────────────────────────────── let refreshing = false; let currentTab = 'overview'; diff --git a/src/coding/proxy/server/routes.py b/src/coding/proxy/server/routes.py index 3ee7588..7f157f0 100644 --- a/src/coding/proxy/server/routes.py +++ b/src/coding/proxy/server/routes.py @@ -327,6 +327,96 @@ async def reset_circuit(request: Request) -> Response: ) +def register_session_vendor_routes(app: Any, router: Any) -> None: + """注册 Session-Vendor 运行时绑定路由.""" + + @app.put("/api/session-vendor") + async def bind_session_vendor(request: Request) -> Response: + """为指定 session key 绑定 vendor 优先级列表.""" + try: + body = await request.json() + except Exception: + return json_error_response( + 400, error_type="invalid_request_error", message="body must be JSON" + ) + if not isinstance(body, dict): + return json_error_response( + 400, + error_type="invalid_request_error", + message="body must be a JSON object", + ) + session_key = body.get("session_key", "").strip() + vendors = body.get("vendors", []) + if not session_key: + return json_error_response( + 400, + error_type="invalid_request_error", + message="session_key is required", + ) + if not isinstance(vendors, list) or not vendors: + return json_error_response( + 400, + error_type="invalid_request_error", + message="vendors must be a non-empty list", + ) + vendors = [str(v).strip() for v in vendors] + available = set(router.get_vendor_names()) + unknown = [v for v in vendors if v not in available] + if unknown: + return json_error_response( + 400, + error_type="invalid_request_error", + message=( + f"unknown vendor(s): {', '.join(unknown)}; " + f"available: {', '.join(sorted(available))}" + ), + ) + resolver = router._executor._policy_resolver # noqa: SLF001 + resolver.upsert(session_key, vendors) + return Response( + content=json.dumps( + {"status": "ok", "session_key": session_key, "vendors": vendors}, + ensure_ascii=False, + ).encode(), + status_code=200, + media_type="application/json", + ) + + @app.delete("/api/session-vendor/{session_key}") + async def unbind_session_vendor(session_key: str) -> Response: + """解除指定 session key 的 vendor 绑定.""" + resolver = router._executor._policy_resolver # noqa: SLF001 + removed = resolver.remove(session_key) + if not removed: + return Response( + content=json.dumps( + {"status": "not_found", "session_key": session_key}, + ensure_ascii=False, + ).encode(), + status_code=404, + media_type="application/json", + ) + return Response( + content=json.dumps( + {"status": "removed", "session_key": session_key}, + ensure_ascii=False, + ).encode(), + status_code=200, + media_type="application/json", + ) + + @app.get("/api/session-vendor") + async def list_session_vendors() -> Response: + """列出所有运行时 session-vendor 绑定.""" + resolver = router._executor._policy_resolver # noqa: SLF001 + bindings = resolver.list_runtime_bindings() + return Response( + content=json.dumps({"bindings": bindings}, ensure_ascii=False).encode(), + status_code=200, + media_type="application/json", + ) + + def register_reauth_routes(app: Any, reauth_coordinator: Any) -> None: """注册重认证路由.""" @@ -368,6 +458,7 @@ def register_all_routes( register_status_route(app, router) register_copilot_routes(app, router) register_admin_routes(app, router) + register_session_vendor_routes(app, router) if reauth_coordinator: register_reauth_routes(app, reauth_coordinator) diff --git a/tests/test_session_aware.py b/tests/test_session_aware.py index bdd69e8..0c08449 100644 --- a/tests/test_session_aware.py +++ b/tests/test_session_aware.py @@ -449,3 +449,144 @@ def test_config_parse(): assert config.policies[0].name == "vip" assert config.policies[0].match.session_keys == ["key-1"] assert config.policies[0].tiers == ["anthropic", "copilot"] + + +# ── 9. SessionPolicyResolver 运行时可变性 ──────────────────────── + + +def test_runtime_upsert_and_resolve(): + resolver = SessionPolicyResolver() + assert resolver.resolve("my-session") is None + + resolver.upsert("my-session", ["anthropic", "copilot"]) + policy = resolver.resolve("my-session") + assert policy is not None + assert policy.tiers == ["anthropic", "copilot"] + assert policy.name.startswith("runtime:") + + +def test_runtime_upsert_overwrites(): + resolver = SessionPolicyResolver() + resolver.upsert("my-session", ["anthropic"]) + resolver.upsert("my-session", ["copilot", "zhipu"]) + policy = resolver.resolve("my-session") + assert policy.tiers == ["copilot", "zhipu"] + + +def test_runtime_remove(): + resolver = SessionPolicyResolver() + resolver.upsert("my-session", ["anthropic"]) + assert resolver.remove("my-session") is True + assert resolver.resolve("my-session") is None + assert resolver.remove("my-session") is False + + +def test_runtime_remove_does_not_affect_config_policy(): + p = _make_policy("config-policy", keys=["config-key"], tiers=["anthropic"]) + resolver = SessionPolicyResolver([p]) + # Cannot remove config-driven policy via runtime API + assert resolver.remove("config-key") is False + assert resolver.resolve("config-key") is p + + +def test_runtime_upsert_overrides_config_policy(): + p = _make_policy("config-policy", keys=["shared-key"], tiers=["anthropic"]) + resolver = SessionPolicyResolver([p]) + resolver.upsert("shared-key", ["copilot"]) + # Runtime binding takes precedence (replaces in key_index) + policy = resolver.resolve("shared-key") + assert policy.tiers == ["copilot"] + assert policy.name.startswith("runtime:") + + +def test_runtime_remove_restores_config_policy(): + p = _make_policy("config-policy", keys=["shared-key"], tiers=["anthropic"]) + resolver = SessionPolicyResolver([p]) + resolver.upsert("shared-key", ["copilot"]) + assert resolver.resolve("shared-key").tiers == ["copilot"] + # 移除运行时绑定后应恢复原配置策略 + assert resolver.remove("shared-key") is True + restored = resolver.resolve("shared-key") + assert restored is p + assert restored.tiers == ["anthropic"] + + +def test_list_runtime_bindings(): + resolver = SessionPolicyResolver() + p = _make_policy("config-policy", keys=["config-key"], tiers=["anthropic"]) + resolver = SessionPolicyResolver([p]) + resolver.upsert("runtime-1", ["copilot"]) + resolver.upsert("runtime-2", ["zhipu", "anthropic"]) + + bindings = resolver.list_runtime_bindings() + assert len(bindings) == 2 + keys = {b["session_key"] for b in bindings} + assert keys == {"runtime-1", "runtime-2"} + # Config-driven policy should not appear + assert "config-key" not in keys + + +def test_runtime_upsert_integrates_with_executor(): + from coding.proxy.routing.executor import _RouteExecutor + from coding.proxy.routing.tier import VendorTier + from coding.proxy.vendors.base import BaseVendor + + class FakeVendor(BaseVendor): + def __init__(self, name): + self._name = name + + def get_name(self): + return self._name + + async def _prepare_request(self, body, headers): + return body, headers + + async def send_message_stream(self, body, headers): + yield b"", "" + + async def send_message(self, body, headers): + return None + + def supports_request(self, caps): + return True, [] + + def map_model(self, model): + return model + + tiers = [ + VendorTier(vendor=FakeVendor("zhipu")), + VendorTier(vendor=FakeVendor("anthropic")), + VendorTier(vendor=FakeVendor("copilot")), + ] + + resolver = SessionPolicyResolver() + executor = _RouteExecutor( + router=None, + tiers=tiers, + usage_recorder=None, + session_manager=None, + session_policy_resolver=resolver, + ) + + # Before binding: default order + assert [t.name for t in executor._resolve_effective_tiers("test")] == [ + "zhipu", + "anthropic", + "copilot", + ] + + # After binding: anthropic first, copilot second, zhipu last + resolver.upsert("test", ["anthropic", "copilot"]) + assert [t.name for t in executor._resolve_effective_tiers("test")] == [ + "anthropic", + "copilot", + "zhipu", + ] + + # After unbind: back to default + resolver.remove("test") + assert [t.name for t in executor._resolve_effective_tiers("test")] == [ + "zhipu", + "anthropic", + "copilot", + ] From e9fc4b9b7144e993cb34cd7e5bb905e4b7849509 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Thu, 30 Apr 2026 17:40:09 +0800 Subject: [PATCH 16/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a8=20=E2=86=92=200.3.1a9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index eb63fd8..c8fce18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a8" +version = "0.3.1a9" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 8c9e847..ee5c573 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a8" +version = "0.3.1a9" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From b04dc3cc0af657cbbf30e6af9097441426f6591d Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 21:45:42 +0800 Subject: [PATCH 17/66] =?UTF-8?q?fix(dashboard):=20=E4=BC=98=E5=8C=96=20Re?= =?UTF-8?q?cent=20Active=20Sessions=20=E8=A1=A8=E6=A0=BC=20UI=EF=BC=8C?= =?UTF-8?q?=E6=B6=88=E9=99=A4=E6=BB=9A=E5=8A=A8=E6=9D=A1=E5=B9=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=88=86=E9=A1=B5=20(#222)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(dashboard): 优化 Recent Active Sessions 表格 UI,消除滚动条并新增分页; - 解析 session_key JSON,分别展示 session_id(首列完整显示)、device_id 与 account_uuid(紧凑副文本) - 采用 table-layout: fixed + colgroup 固定列宽比例,消除底部水平滚动条 - 新增客户端分页(默认 30 行/页,显示总行数与页码),消除右侧垂直滚动条 - 后端 API limit 上限从 100 调整到 200,支持前端拉取更多数据 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): 提升 session-key 样式选择器优先级,确保覆盖通用 td 规则; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/server/dashboard.py | 123 +++++++++++++++++++++------ 1 file changed, 99 insertions(+), 24 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 707494e..d4647bb 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -397,8 +397,8 @@ def _build_favicon() -> bytes: .empty-icon { font-size: 32px; margin-bottom: 8px; opacity: .5; } /* ── Sessions Panel ── */ .sessions-card { grid-column: 1 / -1; animation-delay: .1s; } - .session-table-wrap { overflow-x: auto; max-height: 480px; overflow-y: auto; } - .session-table { width: 100%; border-collapse: collapse; font-size: 13px; } + .session-table-wrap { overflow: hidden; } + .session-table { width: 100%; border-collapse: collapse; font-size: 13px; table-layout: fixed; } .session-table th { position: sticky; top: 0; z-index: 1; background: var(--bg-card); padding: 10px 12px; @@ -406,9 +406,11 @@ def _build_favicon() -> bytes: color: var(--text-secondary); text-transform: uppercase; letter-spacing: .5px; border-bottom: 1px solid var(--border); } - .session-table td { padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); white-space: nowrap; } + .session-table td { padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .session-table tr:hover td { background: var(--bg-card-hover); } - .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; } + .session-table .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; white-space: normal; overflow: visible; } + .session-id { line-height: 1.4; word-break: break-all; } + .session-meta { font-size: 10px; color: var(--text-tertiary); line-height: 1.2; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .session-tag { display: inline-block; font-size: 11px; padding: 2px 7px; border-radius: 8px; margin: 1px 2px; @@ -430,6 +432,21 @@ def _build_favicon() -> bytes: .bind-select:hover { border-color: rgba(88,166,255,.4); color: var(--text-primary); } .bind-select:focus { border-color: rgba(88,166,255,.6); box-shadow: 0 0 0 2px rgba(88,166,255,.1); } .bind-select option { background: var(--bg-card); color: var(--text-primary); } + /* ── 分页 ── */ + .session-pagination { + display: flex; align-items: center; justify-content: space-between; + padding: 10px 12px; border-top: 1px solid var(--border-subtle); + font-size: 12px; color: var(--text-secondary); + } + .page-btn { + padding: 4px 10px; border-radius: 6px; + background: rgba(48,54,61,.4); border: 1px solid rgba(255,255,255,.08); + color: var(--text-secondary); font-size: 12px; cursor: pointer; + transition: all .15s ease; + } + .page-btn:hover:not(:disabled) { background: var(--bg-card-hover); color: var(--text-primary); border-color: rgba(88,166,255,.3); } + .page-btn:disabled { opacity: .35; cursor: default; } + .page-info { font-family: 'JetBrains Mono', monospace; font-size: 12px; } /* ── 加载态 ── */ .loading { opacity: .4; pointer-events: none; } /* ── 图表标签截断 ── */ @@ -623,9 +640,21 @@ def _build_favicon() -> bytes:
+ + + + + + + + + + + + - + @@ -641,6 +670,14 @@ def _build_favicon() -> bytes:
SessionSession ID Last Active Requests Tokens
Loading...
+
+ +
+ + + +
+
@@ -1385,6 +1422,11 @@ def _build_favicon() -> bytes: if (!key || key.length <= maxLen) return escapeHtml(key) || '–'; return escapeHtml(key.slice(0, maxLen - 3)) + '…'; } +function parseSessionKey(raw) { + try { var o = JSON.parse(raw); return { device_id: o.device_id||'', account_uuid: o.account_uuid||'', session_id: o.session_id||'' }; } + catch(e) { return { device_id:'', account_uuid:'', session_id: raw || '' }; } +} +function shortId(s, n) { return s ? (s.length <= n ? s : s.slice(0, n) + '…') : ''; } function successBarHtml(pct) { if (pct == null) return '–'; var p = Math.round(pct); @@ -1415,10 +1457,17 @@ def _build_favicon() -> bytes: return '' + formatVendorLabel(v.trim()) + ''; }).join(''); } +// ── Sessions Pagination State ── +var allSessions = []; +var sessionPage = 0; +var sessionPageSize = 30; +var sessionBindMap = {}; +var sessionAvailableVendors = []; + async function updateSessions() { try { var results = await Promise.allSettled([ - fetchJSON('/api/dashboard/sessions?hours=24&limit=20'), + fetchJSON('/api/dashboard/sessions?hours=24&limit=200'), fetchJSON('/api/session-vendor'), fetchJSON('/api/status'), ]); @@ -1426,24 +1475,41 @@ def _build_favicon() -> bytes: var data = results[0].value; var bindData = results[1].status === 'fulfilled' ? results[1].value : {bindings: []}; var statusData = results[2].status === 'fulfilled' ? results[2].value : {tiers: []}; - var sessions = data.sessions || []; - var bindings = bindData.bindings || []; - var availableVendors = (statusData.tiers || []).map(function(t) { return t.name; }); - var tbody = document.getElementById('sessions-tbody'); + allSessions = data.sessions || []; + sessionBindMap = {}; + (bindData.bindings || []).forEach(function(b) { sessionBindMap[b.session_key] = b.vendors; }); + sessionAvailableVendors = (statusData.tiers || []).map(function(t) { return t.name; }); var subtitle = document.getElementById('sessions-subtitle'); if (subtitle) subtitle.textContent = 'Last ' + data.hours + 'h'; - if (!sessions.length) { - tbody.innerHTML = '
📭
No session data'; - return; - } - // Build binding lookup: session_key → vendors list - var bindMap = {}; - bindings.forEach(function(b) { bindMap[b.session_key] = b.vendors; }); - tbody.innerHTML = sessions.map(function(s) { - var boundVendors = bindMap[s.session_key]; - var selectHtml = buildBindSelect(s.session_key, boundVendors, availableVendors); + sessionPage = 0; + renderSessionPage(); + } catch (e) { + console.error('Sessions refresh error:', e); + } +} + +function renderSessionPage() { + var total = allSessions.length; + var totalPages = Math.max(1, Math.ceil(total / sessionPageSize)); + if (sessionPage >= totalPages) sessionPage = totalPages - 1; + var start = sessionPage * sessionPageSize; + var page = allSessions.slice(start, start + sessionPageSize); + var tbody = document.getElementById('sessions-tbody'); + + if (!total) { + tbody.innerHTML = '
📭
No session data'; + } else { + tbody.innerHTML = page.map(function(s) { + var parsed = parseSessionKey(s.session_key); + var boundVendors = sessionBindMap[s.session_key]; + var selectHtml = buildBindSelect(s.session_key, boundVendors, sessionAvailableVendors); return '' + - '' + truncateKey(s.session_key, 22) + '' + + '' + + '
' + escapeHtml(parsed.session_id || s.session_key) + '
' + + '
' + + 'dev:' + escapeHtml(shortId(parsed.device_id, 8)) + ' · acct:' + escapeHtml(shortId(parsed.account_uuid, 8)) + + '
' + + '' + '' + relativeTime(s.last_active_ts) + '' + '' + fmtNum(s.total_requests) + '' + '' + fmtTokens(s.total_tokens) + '' + @@ -1455,9 +1521,18 @@ def _build_favicon() -> bytes: '' + formatCategories(s.client_categories) + '' + ''; }).join(''); - } catch (e) { - console.error('Sessions refresh error:', e); } + + document.getElementById('page-info').textContent = total + ' sessions'; + document.getElementById('page-num').textContent = (sessionPage + 1) + ' / ' + totalPages; + document.getElementById('btn-prev').disabled = (sessionPage === 0); + document.getElementById('btn-next').disabled = (sessionPage >= totalPages - 1); +} + +function changePage(delta) { + var totalPages = Math.max(1, Math.ceil(allSessions.length / sessionPageSize)); + sessionPage = Math.max(0, Math.min(totalPages - 1, sessionPage + delta)); + renderSessionPage(); } function buildBindSelect(sessionKey, boundVendors, availableVendors) { @@ -1807,7 +1882,7 @@ async def dashboard_sessions( media_type="application/json", ) hours = max(1.0, min(hours, 168.0)) - limit = max(1, min(limit, 100)) + limit = max(1, min(limit, 200)) try: sessions = await token_logger.query_recent_sessions( limit=limit, hours=hours From 6347bece06694c6822c9fc8d565292974f0c5200 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Thu, 30 Apr 2026 22:10:06 +0800 Subject: [PATCH 18/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=200.3.1a9=20=E2=86=92=200.3.1a10;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c8fce18..61346e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a9" +version = "0.3.1a10" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index ee5c573..9622ea3 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a9" +version = "0.3.1a10" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 24e43189c8b6ca84c6e383aa0a203490c0b099b1 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 22:49:23 +0800 Subject: [PATCH 19/66] =?UTF-8?q?fix(dashboard):=20=E4=BC=98=E5=8C=96=20Re?= =?UTF-8?q?cent=20Active=20Sessions=20=E8=A1=A8=E6=A0=BC=E5=88=97=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=EF=BC=8C=E6=B6=88=E9=99=A4=E5=86=85=E5=AE=B9=E6=88=AA?= =?UTF-8?q?=E6=96=AD=20(#223)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重分配列宽:Session ID 22%→16%,Client 6%→10%,Vendor Bind 8%→10%, Models 14%→16%,Vendors 12%→14%,解决 Client/Vendor Bind 每行溢出问题 - 供应商标签去文本前缀,改用颜色区分 API(蓝)/CC(绿) 类型,节省约 40% 列宽 - Models/Vendors 列允许标签换行,解除全局 nowrap 约束 - Models 显示上限 2→3,"+N" 标签添加 title tooltip 显示完整列表 - Vendors 增加上限 4,超出部分 "+N" + tooltip 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 53 +++++++++++++++++++--------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index d4647bb..9a3703b 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -407,6 +407,7 @@ def _build_favicon() -> bytes: border-bottom: 1px solid var(--border); } .session-table td { padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + .session-table td.cell-tags { white-space: normal; overflow: visible; text-overflow: clip; line-height: 1.8; vertical-align: middle; } .session-table tr:hover td { background: var(--bg-card-hover); } .session-table .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; white-space: normal; overflow: visible; } .session-id { line-height: 1.4; word-break: break-all; } @@ -417,6 +418,9 @@ def _build_favicon() -> bytes: background: rgba(88,166,255,.08); border: 1px solid rgba(88,166,255,.15); color: var(--text-secondary); } + .session-tag-cc { + background: rgba(63,185,80,.08); border-color: rgba(63,185,80,.15); + } .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); display: inline-block; vertical-align: middle; margin-left: 6px; } .success-bar-fill { height: 100%; border-radius: 2px; } /* ── Vendor Bind 选择器 ── */ @@ -641,16 +645,16 @@ def _build_favicon() -> bytes:
- - - + + + + - - - + - + + @@ -731,12 +735,15 @@ def _build_favicon() -> bytes: // _API_VENDORS 需与后端 native_api/handler.py::_VENDOR_LABEL 对齐, // 新增无 -native 后缀的 native vendor 时同步更新本集合。 const _API_VENDORS = new Set(['anthropic-native', 'openai', 'gemini']); +function isApiVendor(v) { return _API_VENDORS.has(v); } +function vendorShortName(v) { + if (!isValidLabel(v)) return v; + if (isApiVendor(v)) return v.endsWith('-native') ? v.slice(0, -'-native'.length) : v; + return v; +} function formatVendorLabel(v) { if (!isValidLabel(v)) return v; - if (_API_VENDORS.has(v)) { - const name = v.endsWith('-native') ? v.slice(0, -'-native'.length) : v; - return 'api | ' + name; - } + if (isApiVendor(v)) return 'api | ' + vendorShortName(v); return 'cc | ' + v; } @@ -1440,7 +1447,10 @@ def _build_favicon() -> bytes: var html = list.slice(0, max).map(function(c) { return '' + escapeHtml(c.trim()) + ''; }).join(''); - if (list.length > max) html += '+' + (list.length - max) + ''; + if (list.length > max) { + var fullList = list.map(function(c) { return c.trim(); }).join(', '); + html += '+' + (list.length - max) + ''; + } return html; } function formatCategories(cats) { @@ -1453,9 +1463,20 @@ def _build_favicon() -> bytes: } function formatVendorTags(vendors) { if (!vendors) return '–'; - return vendors.split(',').map(function(v) { - return '' + formatVendorLabel(v.trim()) + ''; + var list = vendors.split(','); + var max = 4; + var html = list.slice(0, max).map(function(v) { + var vt = v.trim(); + var name = vendorShortName(vt); + var fullLabel = formatVendorLabel(vt); + var cls = isApiVendor(vt) ? 'session-tag' : 'session-tag session-tag-cc'; + return '' + escapeHtml(name) + ''; }).join(''); + if (list.length > max) { + var fullList = list.map(function(v) { return formatVendorLabel(v.trim()); }).join(', '); + html += '+' + (list.length - max) + ''; + } + return html; } // ── Sessions Pagination State ── var allSessions = []; @@ -1513,8 +1534,8 @@ def _build_favicon() -> bytes: '' + '' + '' + - '' + - '' + + '' + + '' + '' + '' + '' + From fcad99e23b32ef762727dde3741b07c0f9202581 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Thu, 30 Apr 2026 23:20:13 +0800 Subject: [PATCH 20/66] =?UTF-8?q?fix(dashboard):=20=E4=BC=98=E5=8C=96=20Re?= =?UTF-8?q?cent=20Active=20Sessions=20=E8=A1=A8=E6=A0=BC=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=8E=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C=20(#224)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(dashboard): 优化 Recent Active Sessions 表格列显示,消除内容截断 - 重分配列宽:Session ID 22%→16%,Client 6%→10%,Vendor Bind 8%→10%, Models 14%→16%,Vendors 12%→14%,解决 Client/Vendor Bind 每行溢出问题 - 供应商标签去文本前缀,改用颜色区分 API(蓝)/CC(绿) 类型,节省约 40% 列宽 - Models/Vendors 列允许标签换行,解除全局 nowrap 约束 - Models 显示上限 2→3,"+N" 标签添加 title tooltip 显示完整列表 - Vendors 增加上限 4,超出部分 "+N" + tooltip 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): 优化 Session 表格显示 — 禁止换行、添加 Tooltip 与 Copy 按钮 - 移除 cell-tags 换行样式,所有单元格统一 nowrap + ellipsis,行高统一 48px - Session ID 列缩窄至 12%,添加 ⧉ Copy 按钮一键拷贝 Session Key - Models/Vendors 单元格添加 title tooltip,鼠标悬停显示完整标签列表 - 修复 Success 列 "..." 问题:添加 cell-success 类禁用 ellipsis(进度条复合内容) - 进一步优化列宽:Vendors 14%→12%、Client/Vendor Bind 10%→12%、Models 16%→17% 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): Avg Latency 列使用可读时长单位(ms/s/min)自动换算 - <1s 显示毫秒(如 234ms) - 1s~60s 显示秒(如 2.3s、15s) - >=60s 显示分钟+秒(如 2min 30s、5min) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * feat(dashboard): 支持点击行展开详情卡片,显示完整字段内容 - 点击任意数据行展开/收起 detail-card(手风琴模式,仅展开一行) - 卡片以 grid 布局展示全部字段完整值:Session ID、Device、Account、 Models(全量标签)、Vendors(全量标签)、Avg Latency、Success Rate、Client - Session ID 列和 Vendor Bind 列点击事件隔离(stopPropagation), 避免误触展开 - 新增 toggleRow 函数,切换 .row-detail.open 类控制显隐 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * chore(gitignore): 添加 .playwright-mcp/ 到忽略规则 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- .gitignore | 3 + src/coding/proxy/server/dashboard.py | 97 +++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 75fec81..475b250 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,8 @@ config.yaml .claude/.prompts.md .python-version +# Playwright MCP +.playwright-mcp/ + # Log files (dual-write logging) coding-proxy.log* diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 9a3703b..ae815a4 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -409,8 +409,12 @@ def _build_favicon() -> bytes: .session-table td { padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .session-table td.cell-tags { white-space: normal; overflow: visible; text-overflow: clip; line-height: 1.8; vertical-align: middle; } .session-table tr:hover td { background: var(--bg-card-hover); } - .session-table .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; white-space: normal; overflow: visible; } - .session-id { line-height: 1.4; word-break: break-all; } + .session-table .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + .session-id { display: flex; align-items: center; gap: 4px; } + .session-id-text { overflow: hidden; text-overflow: ellipsis; } + .copy-btn { background: none; border: none; color: var(--text-tertiary); cursor: pointer; padding: 2px; border-radius: 4px; font-size: 12px; line-height: 1; opacity: .5; flex-shrink: 0; } + .copy-btn:hover { opacity: 1; color: var(--accent-blue); background: rgba(88,166,255,.1); } + .copy-btn.copied { color: var(--accent-green); opacity: 1; } .session-meta { font-size: 10px; color: var(--text-tertiary); line-height: 1.2; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .session-tag { display: inline-block; font-size: 11px; padding: 2px 7px; @@ -421,6 +425,22 @@ def _build_favicon() -> bytes: .session-tag-cc { background: rgba(63,185,80,.08); border-color: rgba(63,185,80,.15); } + .session-table td.cell-success { overflow: visible; text-overflow: clip; } + /* ── 展开行 ── */ + .session-table tr.row-detail { display: none; } + .session-table tr.row-detail.open { display: table-row; } + .session-table tr.row-detail td { padding: 0; } + .detail-card { + padding: 14px 20px; margin: 4px 0; + background: rgba(18,22,30,.9); border: 1px solid var(--border); + border-radius: 10px; display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 10px 24px; font-size: 13px; + } + .detail-card .detail-item { display: flex; flex-direction: column; gap: 2px; } + .detail-card .detail-label { font-size: 11px; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: .3px; } + .detail-card .detail-value { color: var(--text-primary); line-height: 1.4; word-break: break-all; } + .session-table tbody tr[data-row]:not(.row-detail) { cursor: pointer; } .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); display: inline-block; vertical-align: middle; margin-left: 6px; } .success-bar-fill { height: 100%; border-radius: 2px; } /* ── Vendor Bind 选择器 ── */ @@ -645,16 +665,16 @@ def _build_favicon() -> bytes:
' + relativeTime(s.last_active_ts) + '' + fmtNum(s.total_requests) + '' + fmtTokens(s.total_tokens) + '' + formatSessionTags(s.models, 2) + '' + formatVendorTags(s.vendors) + '' + formatSessionTags(s.models, 3) + '' + formatVendorTags(s.vendors) + '' + (s.avg_duration_ms ? Math.round(s.avg_duration_ms) + 'ms' : '–') + '' + successBarHtml(s.success_rate) + '' + selectHtml + '
- + - - + + - - - + + + @@ -725,7 +745,31 @@ def _build_favicon() -> bytes: return String(n); } function fmtNum(n) { return n == null ? '–' : n.toLocaleString(); } +function copyText(btn, text) { + navigator.clipboard.writeText(text).then(function() { + btn.classList.add('copied'); + btn.textContent = '✓'; + setTimeout(function() { btn.classList.remove('copied'); btn.textContent = '⧉'; }, 1500); + }); +} +function toggleRow(tr) { + var detail = tr.nextElementSibling; + if (!detail || !detail.classList.contains('row-detail')) return; + var wasOpen = detail.classList.contains('open'); + // close all open rows first + document.querySelectorAll('.session-table tr.row-detail.open').forEach(function(r) { r.classList.remove('open'); }); + if (!wasOpen) detail.classList.add('open'); +} function isValidLabel(s) { return typeof s === 'string' && s !== 'undefined' && s !== 'null' && s.trim() !== ''; } +function fmtDuration(ms) { + if (ms == null) return '–'; + var s = ms / 1000; + if (s < 1) return Math.round(ms) + 'ms'; + if (s < 60) return s.toFixed(1).replace(/\\.0$/, '') + 's'; + var m = Math.floor(s / 60); + var sec = Math.round(s % 60); + return sec > 0 ? m + 'min ' + sec + 's' : m + 'min'; +} function now() { return new Date().toLocaleTimeString('zh-CN', {hour:'2-digit',minute:'2-digit',second:'2-digit'}); } @@ -1524,9 +1568,15 @@ def _build_favicon() -> bytes: var parsed = parseSessionKey(s.session_key); var boundVendors = sessionBindMap[s.session_key]; var selectHtml = buildBindSelect(s.session_key, boundVendors, sessionAvailableVendors); - return '' + - '' + + '' + '' + '' + - '' + - '' + - '' + - '' + - '' + + '' + + '' + + '' + + '' + + '' + '' + - ''; + '' + + ''; }).join(''); } From 70f200e37a348a226b70f6b45cc5f2c615cb19be Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 00:44:02 +0800 Subject: [PATCH 21/66] =?UTF-8?q?fix(dashboard):=20=E4=BC=98=E5=8C=96=20Se?= =?UTF-8?q?ssion=20=E8=A1=A8=E6=A0=BC=E6=98=BE=E7=A4=BA=E4=B8=8E=E4=BA=A4?= =?UTF-8?q?=E4=BA=92=E4=BD=93=E9=AA=8C=20(#225)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(dashboard): 优化 Recent Active Sessions 表格列显示,消除内容截断 - 重分配列宽:Session ID 22%→16%,Client 6%→10%,Vendor Bind 8%→10%, Models 14%→16%,Vendors 12%→14%,解决 Client/Vendor Bind 每行溢出问题 - 供应商标签去文本前缀,改用颜色区分 API(蓝)/CC(绿) 类型,节省约 40% 列宽 - Models/Vendors 列允许标签换行,解除全局 nowrap 约束 - Models 显示上限 2→3,"+N" 标签添加 title tooltip 显示完整列表 - Vendors 增加上限 4,超出部分 "+N" + tooltip 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): 优化 Session 表格显示 — 禁止换行、添加 Tooltip 与 Copy 按钮 - 移除 cell-tags 换行样式,所有单元格统一 nowrap + ellipsis,行高统一 48px - Session ID 列缩窄至 12%,添加 ⧉ Copy 按钮一键拷贝 Session Key - Models/Vendors 单元格添加 title tooltip,鼠标悬停显示完整标签列表 - 修复 Success 列 "..." 问题:添加 cell-success 类禁用 ellipsis(进度条复合内容) - 进一步优化列宽:Vendors 14%→12%、Client/Vendor Bind 10%→12%、Models 16%→17% 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): Avg Latency 列使用可读时长单位(ms/s/min)自动换算 - <1s 显示毫秒(如 234ms) - 1s~60s 显示秒(如 2.3s、15s) - >=60s 显示分钟+秒(如 2min 30s、5min) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * feat(dashboard): 支持点击行展开详情卡片,显示完整字段内容 - 点击任意数据行展开/收起 detail-card(手风琴模式,仅展开一行) - 卡片以 grid 布局展示全部字段完整值:Session ID、Device、Account、 Models(全量标签)、Vendors(全量标签)、Avg Latency、Success Rate、Client - Session ID 列和 Vendor Bind 列点击事件隔离(stopPropagation), 避免误触展开 - 新增 toggleRow 函数,切换 .row-detail.open 类控制显隐 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * chore(gitignore): 添加 .playwright-mcp/ 到忽略规则 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): 修复 Copy 按钮导致 JS 报错、展开卡片样式不可读及版本号显示异常 - 将 copyText 内联值改为 copyFromParent 从 data-key 属性读取,避免 JSON 双引号在 onclick 中导致 JS 解析失败 - 优化展开卡片样式:渐变背景、蓝色边框、阴影、增大间距与圆角 - 页面初始化时立即加载版本号,修复直接进入 Sessions tab 时版本显示为 v-.-.- 的问题 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * style(dashboard): 重命名页签「Recent Active Sessions」为「Sessions」 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * style(dashboard): 增强 Success 列进度条底色对比度 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/server/dashboard.py | 34 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index ae815a4..e3394f4 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -431,17 +431,18 @@ def _build_favicon() -> bytes: .session-table tr.row-detail.open { display: table-row; } .session-table tr.row-detail td { padding: 0; } .detail-card { - padding: 14px 20px; margin: 4px 0; - background: rgba(18,22,30,.9); border: 1px solid var(--border); - border-radius: 10px; display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - gap: 10px 24px; font-size: 13px; + padding: 16px 24px; margin: 6px 0; + background: linear-gradient(135deg, rgba(30,37,54,.95), rgba(22,28,40,.95)); + border: 1px solid rgba(88,166,255,.15); border-radius: 12px; + display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + gap: 14px 28px; font-size: 13px; + box-shadow: 0 4px 16px rgba(0,0,0,.3); } .detail-card .detail-item { display: flex; flex-direction: column; gap: 2px; } .detail-card .detail-label { font-size: 11px; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: .3px; } .detail-card .detail-value { color: var(--text-primary); line-height: 1.4; word-break: break-all; } .session-table tbody tr[data-row]:not(.row-detail) { cursor: pointer; } - .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); display: inline-block; vertical-align: middle; margin-left: 6px; } + .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.12); display: inline-block; vertical-align: middle; margin-left: 6px; } .success-bar-fill { height: 100%; border-radius: 2px; } /* ── Vendor Bind 选择器 ── */ .bind-select { @@ -558,7 +559,7 @@ def _build_favicon() -> bytes: @@ -654,12 +655,12 @@ def _build_favicon() -> bytes: - +
- +
- Recent Active Sessions + Sessions Last 24h
@@ -745,7 +746,8 @@ def _build_favicon() -> bytes: return String(n); } function fmtNum(n) { return n == null ? '–' : n.toLocaleString(); } -function copyText(btn, text) { +function copyFromParent(btn) { + var text = btn.parentElement.getAttribute('data-key') || btn.parentElement.getAttribute('title') || ''; navigator.clipboard.writeText(text).then(function() { btn.classList.add('copied'); btn.textContent = '✓'; @@ -1573,9 +1575,9 @@ def _build_favicon() -> bytes: var sr = s.success_rate != null ? Math.round(s.success_rate) : null; return '
' + '' + '' + ''; }).join(''); } From b490c65c1fa143e2acab71a0161821d936a17727 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 08:21:42 +0800 Subject: [PATCH 24/66] =?UTF-8?q?style(dashboard):=20=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?Session=20=E8=AF=A6=E6=83=85=E5=8D=A1=E7=89=87=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E4=B8=8E=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA;=20(#228?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整 identity-row flex 比例,首项 2 其余 3,改善空间分配 - 将 Success Rate 与 Client 合并为 inline-pair 横向排列,减少纵向高度 - 移除 Sessions 卡片冗余标题(Tab 已提供上下文) - 修复 success-bar-fill display 属性确保正确渲染 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 7c88456..62f7b47 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -446,16 +446,19 @@ def _build_favicon() -> bytes: padding-bottom: 10px; margin-bottom: 10px; border-bottom: 1px solid var(--border); } - .detail-identity-row .detail-item { flex: 1 1 0; } + .detail-identity-row .detail-item { flex: 3 1 0; } + .detail-identity-row .detail-item:first-child { flex: 2 1 0; } .detail-identity-row .detail-value { font-family: 'JetBrains Mono', monospace; font-size: 12px; } .detail-metrics-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px 20px; } + .detail-inline-pair { display: flex; gap: 16px; } + .detail-inline-pair > div { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; } .session-table tbody tr[data-row]:not(.row-detail) { cursor: pointer; } .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.12); display: inline-block; vertical-align: middle; margin-left: 6px; } - .success-bar-fill { height: 100%; border-radius: 2px; } + .success-bar-fill { height: 100%; border-radius: 2px; display: block; } /* ── Vendor Bind 选择器 ── */ .bind-select { padding: 3px 6px; border-radius: 6px; @@ -669,10 +672,6 @@ def _build_favicon() -> bytes:
-
- Sessions - Last 24h -
' + - '
' + escapeHtml(parsed.session_id || s.session_key) + '
' + + var modelsFull = (s.models || '').split(',').map(function(c){return c.trim();}); + var vendorsFull = (s.vendors || '').split(',').map(function(v){return formatVendorLabel(v.trim());}); + var sr = s.success_rate != null ? Math.round(s.success_rate) : null; + return '
' + + '
' + + '' + escapeHtml(parsed.session_id || s.session_key) + '' + + '' + + '
' + '
' + 'dev:' + escapeHtml(shortId(parsed.device_id, 8)) + ' · acct:' + escapeHtml(shortId(parsed.account_uuid, 8)) + '
' + @@ -1534,13 +1584,26 @@ def _build_favicon() -> bytes: '
' + relativeTime(s.last_active_ts) + '' + fmtNum(s.total_requests) + '' + fmtTokens(s.total_tokens) + '' + formatSessionTags(s.models, 3) + '' + formatVendorTags(s.vendors) + '' + (s.avg_duration_ms ? Math.round(s.avg_duration_ms) + 'ms' : '–') + '' + successBarHtml(s.success_rate) + '' + selectHtml + '' + formatSessionTags(s.models, 3) + '' + formatVendorTags(s.vendors) + '' + fmtDuration(s.avg_duration_ms) + '' + successBarHtml(s.success_rate) + '' + selectHtml + '' + formatCategories(s.client_categories) + '
' + + '
Session ID
' + escapeHtml(s.session_key) + '
' + + '
Device
' + escapeHtml(parsed.device_id || '–') + '
' + + '
Account
' + escapeHtml(parsed.account_uuid || '–') + '
' + + '
Last Active
' + relativeTime(s.last_active_ts) + '
' + + '
Requests
' + fmtNum(s.total_requests) + '
' + + '
Tokens
' + fmtTokens(s.total_tokens) + '
' + + '
Models
' + (modelsFull.length ? modelsFull.map(function(m){return '' + escapeHtml(m) + '';}).join(' ') : '–') + '
' + + '
Vendors
' + (vendorsFull.length ? vendorsFull.map(function(v){return '' + escapeHtml(v) + '';}).join(' ') : '–') + '
' + + '
Avg Latency
' + fmtDuration(s.avg_duration_ms) + '
' + + '
Success Rate
' + (sr != null ? sr + '%' : '–') + '
' + + '
Client
' + escapeHtml(s.client_categories || '–') + '
' + + '
' + - '
' + + '
' + '' + escapeHtml(parsed.session_id || s.session_key) + '' + - '' + + '' + '
' + '
' + 'dev:' + escapeHtml(shortId(parsed.device_id, 8)) + ' · acct:' + escapeHtml(shortId(parsed.account_uuid, 8)) + @@ -1674,7 +1676,7 @@ def _build_favicon() -> bytes: let refreshing = false; let currentTab = 'overview'; const tabLoaded = { overview: false, sessions: false }; -const TAB_LABELS = { overview: 'Overview', sessions: 'Recent Active Sessions' }; +const TAB_LABELS = { overview: 'Overview', sessions: 'Sessions' }; async function refreshOverview() { const days = currentDays > 0 ? currentDays : 7; @@ -1780,6 +1782,10 @@ def _build_favicon() -> bytes: currentTab = initial; applyTabState(initial); syncTabUrl(initial); + // Load version immediately regardless of active tab + fetchJSON('/api/dashboard/summary?days=7').then(function(s) { + if (s && s.version) document.getElementById('version-badge').textContent = 'v' + s.version; + }).catch(function(){}); refresh(); // 仅加载初始页签的数据 setInterval(refresh, 600000); // 每 10 分钟刷新当前页签 })(); From 98b5cdbd0211cb702ebc46b715f668bb1991f766 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 00:57:03 +0800 Subject: [PATCH 22/66] =?UTF-8?q?style(dashboard):=20=E5=B0=86=E9=A1=B5?= =?UTF-8?q?=E7=AD=BE=E5=AF=BC=E8=88=AA=E7=A7=BB=E8=87=B3=E5=A4=B4=E9=83=A8?= =?UTF-8?q?=E6=A0=8F=EF=BC=8C=E4=BC=98=E5=8C=96=E4=B8=BA=E8=83=B6=E5=9B=8A?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F;=20(#226)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 34 +++++++++++++--------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index e3394f4..dac36a3 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -515,28 +515,28 @@ def _build_favicon() -> bytes: /* ── Tabs ─────────────────────────────────────────────────── */ .tabs { display: flex; - gap: 4px; - margin-bottom: 16px; - border-bottom: 1px solid var(--border); - padding: 0 2px; + gap: 2px; + padding: 0; } .tab-btn { appearance: none; background: transparent; - border: none; - border-bottom: 2px solid transparent; + border: 1px solid transparent; color: var(--text-secondary); cursor: pointer; font-family: inherit; - font-size: 14px; + font-size: 13px; font-weight: 500; - padding: 10px 16px; - margin-bottom: -1px; - transition: color .15s ease, border-color .15s ease, background .15s ease; - border-radius: 6px 6px 0 0; + padding: 4px 12px; + transition: color .15s ease, background .15s ease, border-color .15s ease; + border-radius: var(--radius-sm); } .tab-btn:hover { color: var(--text-primary); background: var(--bg-card-hover); } - .tab-btn.active { color: var(--text-primary); border-bottom-color: var(--accent-blue); } + .tab-btn.active { + color: var(--text-primary); + background: rgba(88,166,255,.1); + border-color: rgba(88,166,255,.2); + } .tab-btn:focus-visible { outline: 2px solid var(--accent-blue); outline-offset: 2px; } .tab-pane { display: none; } .tab-pane.active { display: block; } @@ -550,18 +550,16 @@ def _build_favicon() -> bytes: v-.-.-
+ 正在加载…
- - -
From 5eaaba8dc2fef9d67e99e75d32e8ff0236d68858 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 01:01:02 +0800 Subject: [PATCH 23/66] =?UTF-8?q?fix(dashboard):=20=E9=87=8D=E6=9E=84=20Se?= =?UTF-8?q?ssion=20=E8=AF=A6=E6=83=85=E5=8D=A1=E7=89=87=E5=B8=83=E5=B1=80?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=86=85=E5=AE=B9=E9=87=8D=E5=8F=A0?= =?UTF-8?q?=E9=97=AE=E9=A2=98;=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Session 详情卡片的扁平网格布局重构为身份信息行 + 指标网格两层结构, 分离 Session ID/Device/Account 等身份字段与指标字段的展示区域, 新增 title 属性提供完整值悬浮提示,消除窄屏下的内容重叠与截断。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 46 +++++++++++++++++++--------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index dac36a3..7c88456 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -434,13 +434,25 @@ def _build_favicon() -> bytes: padding: 16px 24px; margin: 6px 0; background: linear-gradient(135deg, rgba(30,37,54,.95), rgba(22,28,40,.95)); border: 1px solid rgba(88,166,255,.15); border-radius: 12px; - display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); - gap: 14px 28px; font-size: 13px; + font-size: 13px; + white-space: normal; overflow: hidden; box-shadow: 0 4px 16px rgba(0,0,0,.3); } - .detail-card .detail-item { display: flex; flex-direction: column; gap: 2px; } + .detail-card .detail-item { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .detail-card .detail-label { font-size: 11px; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: .3px; } - .detail-card .detail-value { color: var(--text-primary); line-height: 1.4; word-break: break-all; } + .detail-card .detail-value { color: var(--text-primary); line-height: 1.4; word-break: break-all; overflow-wrap: break-word; } + .detail-identity-row { + display: flex; gap: 16px; + padding-bottom: 10px; margin-bottom: 10px; + border-bottom: 1px solid var(--border); + } + .detail-identity-row .detail-item { flex: 1 1 0; } + .detail-identity-row .detail-value { font-family: 'JetBrains Mono', monospace; font-size: 12px; } + .detail-metrics-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 10px 20px; + } .session-table tbody tr[data-row]:not(.row-detail) { cursor: pointer; } .success-bar { width: 56px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.12); display: inline-block; vertical-align: middle; margin-left: 6px; } .success-bar-fill { height: 100%; border-radius: 2px; } @@ -1592,17 +1604,21 @@ def _build_favicon() -> bytes: '
' + formatCategories(s.client_categories) + '
' + - '
Session ID
' + escapeHtml(s.session_key) + '
' + - '
Device
' + escapeHtml(parsed.device_id || '–') + '
' + - '
Account
' + escapeHtml(parsed.account_uuid || '–') + '
' + - '
Last Active
' + relativeTime(s.last_active_ts) + '
' + - '
Requests
' + fmtNum(s.total_requests) + '
' + - '
Tokens
' + fmtTokens(s.total_tokens) + '
' + - '
Models
' + (modelsFull.length ? modelsFull.map(function(m){return '' + escapeHtml(m) + '';}).join(' ') : '–') + '
' + - '
Vendors
' + (vendorsFull.length ? vendorsFull.map(function(v){return '' + escapeHtml(v) + '';}).join(' ') : '–') + '
' + - '
Avg Latency
' + fmtDuration(s.avg_duration_ms) + '
' + - '
Success Rate
' + (sr != null ? sr + '%' : '–') + '
' + - '
Client
' + escapeHtml(s.client_categories || '–') + '
' + + '
' + + '
Session ID
' + escapeHtml(parsed.session_id || s.session_key) + '
' + + '
Device
' + (parsed.device_id ? escapeHtml(parsed.device_id) : '–') + '
' + + '
Account
' + (parsed.account_uuid ? escapeHtml(parsed.account_uuid) : '–') + '
' + + '
' + + '
' + + '
Last Active
' + relativeTime(s.last_active_ts) + '
' + + '
Requests
' + fmtNum(s.total_requests) + '
' + + '
Tokens
' + fmtTokens(s.total_tokens) + '
' + + '
Models
' + (modelsFull.length ? modelsFull.map(function(m){return '' + escapeHtml(m) + '';}).join(' ') : '–') + '
' + + '
Vendors
' + (vendorsFull.length ? vendorsFull.map(function(v){return '' + escapeHtml(v) + '';}).join(' ') : '–') + '
' + + '
Avg Latency
' + fmtDuration(s.avg_duration_ms) + '
' + + '
Success Rate
' + (sr != null ? sr + '%' : '–') + '
' + + '
Client
' + escapeHtml(s.client_categories || '–') + '
' + + '
' + '
@@ -1556,8 +1555,6 @@ def _build_favicon() -> bytes: sessionBindMap = {}; (bindData.bindings || []).forEach(function(b) { sessionBindMap[b.session_key] = b.vendors; }); sessionAvailableVendors = (statusData.tiers || []).map(function(t) { return t.name; }); - var subtitle = document.getElementById('sessions-subtitle'); - if (subtitle) subtitle.textContent = 'Last ' + data.hours + 'h'; sessionPage = 0; renderSessionPage(); } catch (e) { @@ -1616,8 +1613,10 @@ def _build_favicon() -> bytes: '
Models
' + (modelsFull.length ? modelsFull.map(function(m){return '' + escapeHtml(m) + '';}).join(' ') : '–') + '
' + '
Vendors
' + (vendorsFull.length ? vendorsFull.map(function(v){return '' + escapeHtml(v) + '';}).join(' ') : '–') + '
' + '
Avg Latency
' + fmtDuration(s.avg_duration_ms) + '
' + - '
Success Rate
' + (sr != null ? sr + '%' : '–') + '
' + - '
Client
' + escapeHtml(s.client_categories || '–') + '
' + + '
' + + '
Success Rate
' + (sr != null ? sr + '%' : '–') + '
' + + '
Client
' + escapeHtml(s.client_categories || '–') + '
' + + '
' + '' + ''; }).join(''); From 43a35d10a71b0e67cdb2859f5e07557ba5df338f Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 08:34:08 +0800 Subject: [PATCH 25/66] =?UTF-8?q?fix(dashboard):=20=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E9=A1=B5=E7=AD=BE=E6=97=B6=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E9=A1=B5=E6=95=B0=E6=8D=AE;=20(#229)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除 switchTab() 中的 tabLoaded 条件守卫,使每次在 Overview 与 Sessions 页签间切换时都触发 refresh(),而非仅首次访问时加载数据。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 62f7b47..67c2ef3 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -1780,9 +1780,7 @@ def _build_favicon() -> bytes: currentTab = name; applyTabState(name); syncTabUrl(name); - if (!tabLoaded[name]) { - refresh(); - } + refresh(); } // ── 初始化 ──────────────────────────────────────────────── From 1f18797841e606a3c512a9e58cbb20d979c4b169 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 08:36:38 +0800 Subject: [PATCH 26/66] =?UTF-8?q?fix(dashboard):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BE=9B=E5=BA=94=E5=95=86=E7=8A=B6=E6=80=81=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E6=9D=A1=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=20quota-group=20=E5=8C=85=E8=A3=B9?= =?UTF-8?q?=E9=85=8D=E9=A2=9D=E5=85=83=E7=B4=A0=E7=A1=AE=E4=BF=9D=E6=8A=98?= =?UTF-8?q?=E8=A1=8C=E4=B8=80=E8=87=B4=E6=80=A7;=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 67c2ef3..28fcf71 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -310,6 +310,7 @@ def _build_favicon() -> bytes: } .vendor-name { font-weight: 600; font-size: 14px; } .vendor-badges { display: flex; gap: 5px; flex-wrap: wrap; align-items: center; } + .quota-group { display: flex; align-items: center; gap: 6px; } .status-badge { font-size: 11px; padding: 2px 7px; border-radius: 10px; @@ -319,7 +320,7 @@ def _build_favicon() -> bytes: .sb-warn { background: rgba(210,153,34,.12); color: var(--accent-yellow); border: 1px solid rgba(210,153,34,.2); } .sb-err { background: rgba(248,81,73,.12); color: var(--accent-red); border: 1px solid rgba(248,81,73,.2); } .sb-info { background: rgba(88,166,255,.12); color: var(--accent-blue); border: 1px solid rgba(88,166,255,.2); } - .quota-bar-wrap { flex: 1; margin: 0 10px; max-width: 100px; } + .quota-bar-wrap { flex: 1; min-width: 40px; max-width: 100px; } .quota-bar-bg { height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); @@ -1089,10 +1090,11 @@ def _build_favicon() -> bytes: if (!qg || qg.usage_percent == null) return ''; const pct = Math.round(qg.usage_percent); const label = quotaWindowLabel(qg.window_hours); - return `${label} ${pct}%` + + return `
` + + `${label} ${pct}%` + `
` + `
` + - `
`; + `
`; } function updateVendorStatus(status) { From 18dbe161360529728eb2c54942cada04d7bc8475 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 08:57:33 +0800 Subject: [PATCH 27/66] =?UTF-8?q?style(dashboard):=20=E6=94=B6=E7=AA=84=20?= =?UTF-8?q?KPI=20=E5=8D=A1=E7=89=87=E9=97=B4=E9=9A=99=E8=87=B3=E5=8E=9F?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=201/3;=20(#231)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 28fcf71..5d66768 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -159,7 +159,7 @@ def _build_favicon() -> bytes: .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 16px; + gap: 5px; margin-bottom: 24px; } .kpi-card { From 41c2927fdd1e098c3e0f7569365350f9183fcc20 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 09:03:54 +0800 Subject: [PATCH 28/66] =?UTF-8?q?fix(dashboard):=20=E4=BF=AE=E5=A4=8D=20Se?= =?UTF-8?q?ssion=20=E8=AF=A6=E6=83=85=E5=8D=A1=E7=89=87=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=8A=98=E8=A1=8C=E9=97=AE=E9=A2=98=EF=BC=8C=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=8D=95=E8=A1=8C=E6=98=BE=E7=A4=BA;=20(#232)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 身份行(Session ID/Device/Account)长值不再折行,超长部分以省略号截断 - 指标网格改为固定 8 列布局,确保所有指标在一行中均匀排列 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 5d66768..07bd6a3 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -449,11 +449,11 @@ def _build_favicon() -> bytes: } .detail-identity-row .detail-item { flex: 3 1 0; } .detail-identity-row .detail-item:first-child { flex: 2 1 0; } - .detail-identity-row .detail-value { font-family: 'JetBrains Mono', monospace; font-size: 12px; } + .detail-identity-row .detail-value { font-family: 'JetBrains Mono', monospace; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; word-break: normal; } .detail-metrics-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); - gap: 10px 20px; + grid-template-columns: repeat(8, 1fr); + gap: 10px 16px; } .detail-inline-pair { display: flex; gap: 16px; } .detail-inline-pair > div { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; } From 9188736c0dc9b3ed721947c9aebc10125c8ef624 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Fri, 1 May 2026 09:10:46 +0800 Subject: [PATCH 29/66] =?UTF-8?q?chore(release):=20=E5=8F=91=E5=B8=83=20v0?= =?UTF-8?q?.4.0=20=E7=89=88=E6=9C=AC;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- CHANGELOG.md | 27 +++++++++++++++++++-------- assets/session-v0.4.0.png | Bin 0 -> 386239 bytes pyproject.toml | 2 +- uv.lock | 2 +- 4 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 assets/session-v0.4.0.png diff --git a/CHANGELOG.md b/CHANGELOG.md index c6915e6..0fb0f1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,16 +4,27 @@ ## [Unreleased] -- fix(vendor-channels): 为所有 targeting zhipu 的转换通道(zhipu→zhipu、copilot→zhipu、anthropic→zhipu)新增 `tool_result.id` 字段注入,修复 zhipu GLM-5 后端错误访问 `.id` 属性(`'ClaudeContentBlockToolResult' object has no attribute 'id'`)导致的 500 错误,使 zhipu 可完全承接含 tool_result 的会话; -- fix(vendor-channels): 新增 zhipu 同 vendor 自清理通道,修复 GLM-5 自循环 400 + tool_results 偶发降级; -- fix(vendor-channels): 修复 `_rewrite_srvtoolu_ids` 块顺序敏感性导致 inline tool_result 漏改名,进而 enforce 阶段 dict key 与 tool_use_ids 错位、anthropic 报 `tool_use ids without tool_result blocks immediately after` 的 cascade failover 问题(改为两遍扫描:先收集 id_map,再统一改写所有 tool_result.tool_use_id 引用); -- fix(vendor-channels): `enforce_anthropic_tool_pairing` 增加全局 sanity check pass,主循环边角错位让 dangling tool_use 漏过校验时兜底合成 is_error 占位并打 `pairing_sanity_repaired` 标签,避免 anthropic 二次报错; +## [v0.4.0](https://github.com/ThreeFish-AI/coding-proxy/releases/tag/v0.4.0) — 2026-05-01 -### Bug Fixes +> [!IMPORTANT] +> +> **🚀 Session 级专属路由策略!** +> +> 给每个 Session 指定专属的 vendor,动态调节不同 vendors 间的 LLM 流量。 + +![session](assets/session-v0.4.0.png) + +### ✨ 核心亮点 + +- feat(session-policy): 新增 Session 级专属路由策略 (#219) +- feat(dashboard): 新增会话活动面板 (#222) + +### 🔧 更多特性 -- fix(vendor-channels): 新增 `anthropic → zhipu` 跨供应商转换通道,修复 Anthropic beta 功能(web search, computer use)产生的 `server_tool_use` 块导致 zhipu 400 错误的问题; -- fix(error-classifier): 增强语义拒绝检测,识别 zhipu 等供应商返回的中文错误消息(如「API 调用参数有误」code=1210),确保正确触发故障转移; -- fix(vendor-channels): `_remove_vendor_blocks` 增加空内容占位保护,防止内容块全部剥离后消息结构不合法。 +- refactor(logging): 移除已被 ModelCall 汇总行覆盖的冗余 DEBUG 日志 (#203) +- style(dashboard): 加宽图表 tooltip 令模型名称与用量值单行显示 (#211) +- fix(usage-parser): 补充 OpenAI/Gemini SSE 流式分支的 model_served 提取 (#214) +- fix(usage-parser): 兼容 SSE chunk 中 usage 字段为 null 的极端格式 (#212) ## [v0.3.0](https://github.com/ThreeFish-AI/coding-proxy/releases/tag/v0.3.0) — 2026-04-20 diff --git a/assets/session-v0.4.0.png b/assets/session-v0.4.0.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6ff3641733b593dc9da04661227f49ca27b2cd GIT binary patch literal 386239 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�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

n?yu0s8>=^mxlBJau`nEAm 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

~x##I0)a2NHd}=yETV%d=FGjPj63?h+ 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�GU&WBTz3=E= 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 z%0D!2Z+6>5ed8W|53AYRpuqUC_~;7V3T)R=<+!jPRtGcXpp6h=XK~e+b%AjxNU6<0 z?jA*sqh10Jg}Zb35V0QO6BCnga#mlV=<7|vJ#rD-&y7);R^6^k)6nr6(mTKJGPB6d zQ)R$&Y0T+G`t&l%?pXSgEt3YyMH2Y z6oERyk>C?fRP!d=q%itUg0i=T5DSXuqfzV+gvf%@m#^mH9c@B`)%Vz8Ic3dQroGDllpp3`CR zxZ_YR?}u9_LPA35ubwVCnaGFTQxnG_--~=qk%>V&ne+71Ghd2mQsMoMHn?n=91-{Z z{*y1gre{Z4^@6bmHRe@m^*2$Y?SFR;>i?F9w6*!i#Gr>^kS;Zv75zdrGQPyBM$EjT z8xJC%&~{|7bxY*Av^fe5*`If6@l!DJC4?v=eb)RR3%%cn3MzT!^r;GjlF6VDmen)HxNdBg(I)Awe#VawJ1Z+Q zE4K?FHXk3Kj*b&3Q5{saelt{7IvUO4mMrWV&3;f}R|_J4dV0FP_GoOpb2n7ZzQrmo zDRFjnt*-kup?I@vzF>R?gN=mHADg>N8QA$=wM4T@=SP}?D6pU) z!J&ejUYUG*TJy?b*rQIye_~-_u1vEuR3@9kSd;1PS8MGV9OY^dDGHEc2=ep4gp_lH zzFK9uUGxqAmjr}|%WKeGMT&hAD^cIt-hu0|t8Cxip@6`UmENm2Yhz<$b2UC-3Z+b| zxuNOy9&8STDt+M^7#<#8SlG^TUyUXc?%TzYNt7MTp7QlX`}Zw|IzjI0kURzl7x!^O z(e-)d($marlT7yEmMi zZzd*chUbjGT)fG)`L2&|jg0Nq^zDe{z8TC8nAi&!whpGx2gTlZnxBU_M7)Tfnf>9A znDaJBBwbviSxdAFWMgZsQhJENSRf8_VPs@PMnQ4%;Mw#3ySLZ*o&)4*NVyWiu(1E~ zscC?nINK=Vg2Suh;gK1}u;D5_md&<$TF4aWlI=Vd)7RI}{=J|FHMndoq?9e|SC7w4 z_3WUsu<`@bE=7(a%=aO-Ix0zwk}_urNmN;~A3-2{WX%b1NAOS(AgsRBP!lZ!MQ}it z9l2|3M@E#3lye!`DdT&_DJ68!59~sgJGNWpjK$I*K;hn%@p(3M?Gyf>mC2D+kx5F&TyMWxY^tD(!4L?yx%leCSgOKvi<=v^gT%2-KERUBKN;i}+TE5}^l0I;Y!t6eiBj&Z zxtiZ({AkM5*3ej-n)>l5OP2%(f!wF6N^N4zJ`_tqi8OG-sWz)}-S4fm1veB;^jg!m zfR%w^ta~Hjl>jm-x-Q3aO!}_B&lb2cM4>5ZBvpbSqnSZML5qlqRZ(ou%1Kx_NLgH1 z;LH#h%wl0}AjK$ZYg3-COO>PCgbOT-iZyJ^ep|0?0LJb@y}Z3}s-4o<4SAM)@77;I zPVUa!S12=P1_p)%ECvv?Gy3ScJ(Z!n0rnl)zqFqY-lH?pB=SDq5kfjTdKe1COU>of z-e@LOLt2%0O%27nVJ89Uw@a>QoYeros+7rRvm5{QO@`b3P=;ZNRO(e8zk(c>Q1ZxB zcA*SpXvm{7^nknmg0$8?unOf89(IBAF5Q6+#x!ZTN(`x%i`Oodm@;$tAB zLvxFZDp>*+V|h}IOAT);!b8txRR(y7kTBb&_2r|Mnw?$Q@0pp< zfvKvbH9Z%8(mD_1%BEDW%9D|hQV=e|1dit?+Vsiv$wU+JICt?4-*XwcqeCDqDAM+D zc9uaZE%WZ_CpIb{=g@|mmH8$?`1uKV0FVFk08|Nbqq%~Z(BsB>^ou#cIbR=d7%^w( z@opRSb+E`$TvjgVvm3rraV=BVngDDx3Mwi9lQt_}<@|&GUc58bA)bSlTD+4u43W6% z1eO;2v&>9jAYR9n-Ew9hG_?}VNvolB5wp;&u!QKG9^M?EqMQC>d2-x83(>gL(S;7k z7|3+L%98EMql?r^9NX^tvK-s630GH7v8X>8*vMC{v7u|Cyz&=oc{Tfsw;~T$iW>R# z`r+oGki~v-m{VVW@J7E%WN+dpINZKCP&&XN#eezQ{Z9cD(0(twDXglm-|W7K(JdPM z@o6<6&T+YpM%38ef8*qY_rn|(wR2o(M+XEtC`(H%{eOV0G$;d&Y@C5&rq%Ela@=Kh zJ_aXEh4WptfjB3Nj>j(s__4CGH`R5v&%OQTZ-AIO3Is+Fq>!U}i3PYAIXM2R)g}dR zs+m~Xi85JG$7#FYAD*=p=PDF}=D9BCX{;IpE}arWU{H|3Tcx+Gn9#>ZSgz4uq;=Bm z)->%p@^U$RrCzqP@H|=e4QVEpFQD@Ba+FDoZed?7gErH~mr0BS5nAO2^W|{Pq|Xm0 z?Gg5#yfi0Lv~j_inF12r-?SZUY>*+a7nhlMpGgdgLQ}aa2#_MGB2+x?=kxKo8#6om zi-^|=T!zy2`aUd}moS2Z{5hZfwd$&?HMFNV-}w%z?L<(@2_Tl_**fO_u}Y{Q@1#Wi z6d~Lsu6K+GrarhXR^<-jnxvAX#C*lu7kD9?+~NLFLde!j=tyg7>XbulMWk)vNCpXL zXkT1lzJINoryrmXS%3eBUUZS6L?MXDo)~=-|+W?c(ZMq+XIK z$CG7t@HZTbi{7Zx@6s~_az1*kYq+Bp8U0&R`pQ4lP zmgd6E%US&X5d-&s(2Y)QydEF)D8Eud*b*{_gAZ(Tt3hf$9Dk40Go1 zF9Q4N)ISz9%T~K8OG?~5JR;-l0)$Pfbin+pGwJ!_$0)EwLqbfPot?d2`yJ;;!;(pN z=x%mvO^p&$3I-9@$>vl=#rv%4)sGujg^DYdRnbNNtqNvRY6$%=XXygH3G|mdJ$*Bl zXNkR{AD=&8voVGII-IoVxn6rjq)_(NyJZC(WK$oyX-ms!(C;AX3%DOB%Bpwx|7!Zm zsJ6bR>)=v~ThU;}i$ihu;%=e1mE!JDym)ah4#f(=odSj6?ykj(J3P0)_y686$;w(; z$vt!K%$b?JXV*3~+#LsWR=(V&9?n%k(G6&NdfzIiKQ0%_^R$tm81)`s?2V!!!SjY+ z%q&(Ht7N{Lb%wKGCk7}?uRyr9x5MdmeqPCOY17lK3ZcOgMIG<=LfJ&7-oP?%m!+7Q z?LbXunu^>xP5^>->U8B*+}Es&$t>Yk4?EX!kXU!kjff{D2w*S*U03cM=TOt>vds?2K&}7mo(=@V%A;e%S$Pou_-ELXtfI_=Hz1*CckyM~uyTHc8$@^Bn zNS%Nv)pdm~^viZ6N`Bl zz$S_ru3@O|d8hBQv!Hi?V*-GM`n`SbceX7!M$+J(yDfH#p8X3gBeo-fD4Y)#9h(~q zSiCG7h$Ek)Sg@+o1BwgCfy-HB8sRrbdK?y-L+gdKpj(S4w&djgi-uo)H^wcljG!L| zH^-HkjrATjh=)8pLInefLcS-f&DreiR1E<~Wl1IVFf%hVxb>54!HmSO!z}5Ve>M(m ztgI@IQ4UTI?FM&d|JpLun->6w8mr-~=8e58saQD-6Hs1lqgwel@~XqnC5&-cxqE^t zZUy0K8`~L86hWF`Sfb`JtHaQiXyV1;Jk!1nzGM4S*woVEQj0#p6}A7gb}SVL-4?GN zjF@MdR@>9lgAgJKm)BII>XRSfrj;C*+nL%p*52x&FAWdE5F?e)fUt#w|7!X051?xi!06m*8@jyvAJlw;^2F?kbJxcbC`$L%~(3^Lwb3z1ZX=yd7 z%NI;Y^!7}itRR69b)__E!-6zf%Bm}V!eAFy za}Y+Rcg5QxyL6%G}nf-#a^vZS>NM zLW{z~1(R&tH+n2aA|1)rI$zeK*+wb20kPOl2YH)xC^WeweBdc7YdsHqT-S)Ik4YxP zY5%8CkEFMT^L@Tg>f>Ci^Emy(*4gHN zoT1BtiH`1l^W^a$Jpk&u&z(E8@Ly>3SQ~(e)YdgVoIFrs0wQIAl24HY1v%csUMj8Hl2{lsEFGHBnm|AI}(!FIfv$bqX??tHGlbJgqA2&lf=Ocetyl7g+< zlCbmhDAAW?^X^(lcPCtQgNllZWCgk?>0fr+1)sC!x1Il?DuE9h5X9vi<71#&%E}PG z-mNsk7Om+PmpuwDuCUBZAUtlLmG_y-8-#_*PR#(SzWl3}!0(NVMtK-~k-fi~`N z*22?(s8J;idJ0jLDTBR=yV#?6=14&B@WGevXo$fO90t_T;FnQyAnEy}X^sJ^udiQL zY;`%C)azObfAr+h0+`)g=GH%BlI?w8f;iKU7Oxa}cxDR4g0>IVdjg1jpB}eRXdi!W zq+W?u13NxXz4q_l2#>XZRNcZRm%Voy1MX*fYNWiGS7-FOATh}2lU=2NOmsyR#hdFZ zlRAF8PQ3>JO}x_V*V<4#+db&C-u0!~We*;--n1HxHAu7Fe?|IgEiApx64K#%*W-1C zwFguI=;9RM$mUYgfQ}syFP+X1v;(eYCg~Ir;i(daeRgz=;k!mik8OQky&5fN>l_{( zdUWfpmXfzOA_oCXOMp!@VZ$Bp64)OWhIu4hZ!@&TSLsj7bx12LqY^eQ^1AY3Jl5k+ zSzdTqbCCp4PXvva`%ZZ?1tLMX=N;XfXjvk#3 z!x7mLKN-NO_S_B2rhihcAqp}t zEW&(~fQyX{c$7G1Eh!7<^iQzem}8xAY*0&XcDl9bFdM@>AA2b)F2Dz?DK1vmvHv*V z9`^Lr?Y4HwS^(ccWgjFrRbiyTmLMcvs##v}LQzpw6&n*%yXkCZ_C4}^cQ=Jur^?)7 z4QR!++}|6uzP#aK>g(;Dnwrvho3z&C#Kp!Y3hpu%{6L-XTxSJ*Pyiryhv64XMp3e1BRQPpTu)0R;c1-jE=<5S`z0Lap z?ARV6Hb{rpp?k@k0q_LaFO34^8NVmr_V)I+_I8liJDu%4q8uSNeHFTKCfldI+;%|D z{p92X0PZC#Sh(@9@$sFG8j&Zh01?3N0juvS?&`0ji>oV8y=^>QZuh;jjStds0)TSe zlCso2y(<8%yG;l#571rzHE7q|?3LY+^<|q8RLdfu`>vSFwKRd%-E!7~eZAB;ZxVlg zejez{$dv~Hy=Dqwn{*pjfvpls|LL|AyPBHy9}m|CN`FQk+YD3q4b0r2eoGB(I{szC zbyp{?r)~EE)qqk}%o`q=>T*D^$^Q2^6#zswyqu+OHyThTyEwmoz6b~a&JOk{$Aur~ z=hl9_;qw7z<7)XxVjC^Q6lOp+P>UCSL{)6D=B=-vB8KXy;FBjjo}$cnJSdKJK$Ys@% z^=`ZdAN5)xR_fCWZqoxMuxCRi~g+ypO{lN&ON{WSEZ7#uJL)HU7S?s0H z&C}|s5##K`)5(oTwYYa647#lF1v^v}iVABwO( z`EO4j^uIjZIyjSaR4Qx{yMJ(wQYe}&ot7NUPy1prl&_aDVoHUoTqigYL?f4IVtqd_ z_HujTbCSF!BWeKO)wi-+ zi^9)-sevfqdh=VVB<@>5!NVlsT$xpM?ml)FIrZ%g-x8Z;} z&fm@Rl5xMtxXpEmym95Cua%}%bnb`VQ-AIn841Z^tA~S@)=c8i&@rIVS`hFs@%0uV zoknWl)=cL*Rf`n~?1%8A;|v#OLg9CGn9$h$ahw+b9$MKuI5g^Snfp?G`C-smTUf72 z`A$=TEF^?JmeS54u2a~1qo=L)q*>?k)e_|CX{W!-<#F*fDRV_RLlitXkrvtr5%TkT>_(v+T13$v>-8}Ibj?D zby>4V1O+Y$A2R}|%)z0dN$cqb@ywNtG-s4(@oEnrAr58=j&W}L@x$=2@RF=)YzfX7 znZ|*nd1W+1m!|UZ18&gAy3l}7v=8Io`_y8U-oA~_V(HT_QVnisX+Y;<0HX#o^c=Vf zKhJMri8SrBuKCDRPH3{Aoo+hwXIBHc;i2)9I(4W5qxNX5JnvszK zxjncjQO?fU)(==|zEHgJEi3)az3JS3KUBfkTH@p>+@bUQcZh541@akkvirc-2^7w_ zTvp6+aFH^!l@7lhR#h12wQg>gO;HArr8sh6xQq-fW*r?h@LrJV(EoNoCO*zwT%Pagu0#wG1Sn8#T-7&EQ*;*Ufr2TV#^`a&k z1_xm)jjcSk1h27ufS&ALc=>fm5vrS^BG(WKaE7BIhKxPKTQ8 zy*=B@`3|w47siyIwqdR5T?(rK=;OonaZ&}|_V8<>vD|>&+|JIzpPZam2!TL=TzkIf z3sCessI4HAK;H4XH`U>E<U!Nk7e6l6Kp$bb`5ba7F1sl$b(i&g33l%>KY#EGQ;L8P6bWlxBcNh}Qdcflbw z)ZY3&%LPx$qawodwi?NYyZ6CrBzw^;&(1uBrpn9Nk6e{)@Gy{%V+YL_aA@V#t@+WK zb^{B^)5PJ#vCTq{f^Um&xm=sl#2{AdG zW!10j-*LXt_j!}Sn;u0R_J)LHwRWr8rB1a6qw9cE54w8#(+7F$^jW@Z=1Y7fmWZlq z{OQd@rFO;KAzykFHwlyh+5Px=zb7!-CX2`PM7Sh(@iR0HtnGqbQ58baR6Pp+?jRH?q| z3X+64;5PgzX8ehTATqauf$IpRl@IVg%yzSzduODt29N;QzpijhPfU2#cXR}l=T_bg z{I{aGmxv1(VHTzQxT@%gzw+~`sy$>BS!*!pT20@wMS+KKq|S~OY)-!^UDW~V96xmh zSW;rYL6GDLA=N5(I^XNK5+ab$FB2H4)MmhmDMoPebhL?tA#&h^2nIM>c-#am9K8&1 zK%qHzG;*X=IeVmpcYK!=g}jF22%NlzY99M5O-=1x7G1}4sSuBp>HYo>W@>6@J)zCG zU19;beak1#F;8decACsOm2b$1o6>^I9Mn(zc6chLNk#_oUPDfslrO#8%bLthK2v}$ zZ}bEOSw}Z+)7??20Mv7VZgK5%DOg#XVV_B=Xp=E2M_Y!*JoX~4^JS}JBoolYe%aIM z^go8qjb@1)J7OGMy_s8c>}~9L`lg)9!MQ0=6Y%m03lDg{ydx-xK&nCmHMTo+1nrPq z!?mFA3?R9tmOJ0z&E^Qvt;Dnnz;Eaq2h?{!-W73p+4SFy{I|Z;Eg?*xb+nO5ai?pV zOJU&^;I{+DF15U$tih!hCImd~gWb}`LGgORJVCZ=6Im+a(5 zU{g7xW5XvR;|*FdC`)0^Ptcwi3jzt#HXejcQk!( zF0;`_L~r);;#>0;g#8Q#V@rJK>x0>*1Uyc>8?a6wjn&Z7*5=?&LJ#UmUITh}QOOnB zxt)$8GTHIj*)FhSk5Wyh+__hv;?2z+D6{CZb>j%{``V-;;1C4Uspsa)7cil2Tz0o| zR~~K9d1hZi5KrvyXn$Ds-HHjP@ZMi+QJR~zhX=(CR8Cm$6l739BLf#8)2DU>Us4Xxn)P0&UM|K%$aRw3Gb z2(dJLIo@O(bM9{%8@MWd@WHF+dP5^e78jVkhg@R)UQ%c0!))eh`_t}3FAyQFtQ^{G z8p4ZFV`S<+_sTRb`91D$q)GCvcnc0V`P}%PuL?SJ-i$5*Z+m_oDK)NAG$z?;S6?*= z)5r1+Pj}&%^Cr+9gyweq{oNZ!ChR=VYmESkkvY8bROaCYw2}`qPgj;_7kQV=q_7d? z5xe=Z7qHov%;Xif1wwIDl;K+hIKKH1izh~}V}In1?D-UDQJn9_Qc*OJ75Hy!$)SUt zdjhE8sMLUJQ0?`E(w#FyHnv2BRF4HxPrggD6ALmW!4bVwq8paEYqcoa4UP09uap%$ z_@@)Cgs831?8`oOQJTx1#0%{aKHYOg$Tp%%Q{fx19MhzbvhPSoa*7kDela)*G9y{bYU;kyw*=oX>i=ge(3T0~XkciN( zD6$?pCP9Pv%Wgs4ayPvE*K$#3DNE2y#{OV&5ZrG)j;gTm&hR->NiF59g4uB*@%n%y$eIp z3`1(70&{G8{c!LEgFl@8jjU3}*!dTQaPetPx$|k?bYR!_2`yy95ig@NG*E$&l6ON2T2TVy#Ksad>92AVgQA&xHpu^N2RWo z+3LAzxy3-LQ9vbA3(gH?MR%XJ_bWY?({*b0pFCCpLHYz4sD8T_Y!-m%#fdJGuV|Sh z9E4?lMh+CteQd9&C*=_f4uY}LaHIPm_3*Rim|(ZtM@Maw_qZj$0#^C(?>8~Xhaw#hKDN5@2i1riVV z%@=Wi_n(pJBK(79IM0TNq3s^9e4xdr;K~Pm%(A3jPR38ciC3L}OYjs&+Ua}hENZSf>GbC1E1hT> zSR-QVC9S_X4IH!uxVlaIG^s>XBu1U(%6&eS z?AMWV0%*ltm5V@j%m67UuikXipMyK0^a~M0jA}ar{m- zUTcOO!&zM7n5jZ0reZ6LAu9{#nb6v-H-~eTi>Ifh1Bp0bkK&*K%ZVM|nq@7NVyD0m>Gt zpAG)??gF0StFOxP2qleOMC1=y${2nNQ#lcZ4tDpUFP8`#>ZlXc!TX=E84ryIZ}Bcw zh8YinU|ZTBLk)4>C*-ECXCQE5i3Lg6s#R!N>_j63b&Ym@B0>P}kblYb#_vXU30op% zZub7^`Ni)=n19QA>Odot(%0I{-hL{5${D+T%5K(W96TQxNXcBTG zQ3OG%`%gCwuuv+JILcP5i)r!~1^TAT_D{eq!R57Ax^3oXWDvZ0^XAyTl5g45#ZtS$ z<=4#AjN7KJA2_Z2M+vty0Ra($n2xM0{J~}Nt?Zyx{;%Er4asw9(SW&B&zv|yzJGD) zx8Ymx?aI^fVyFfFm<6_qyC7esd-vw_=^Xj5fWePrL3ikO(1)tB1o5hKy$egFU;G`=!J zC%eCM{@Oj0m03{GG$}cK(8<^CFjNjCNR000=FU>3o0yz#QwNMW*t;Tf!SBKp4EzQ_ptWTu zZim>J50eu{2VDN?R^8WqN@xrAP1*Ri<^v{PzB{?zKa2_z)3LJB^J<1T#GjIbm{Q-d z>eiQ5UYXulOGGR#+WmBKev6LJO)_Ft)d>gs(Ozp~Pn-d1`GE}Lz_bg`1PvhiB@ z`G*9m(C#rtudtj9B2Z-F`&5n)NP~ivB{;{qGW9=GA^%&#Nur58idx9HdFnV*vSAR` z-V$Eq2h$z0K#EMdATO2{Z`{Pqe>K7HZ1^qPYCGlDIi^r<&@fj_Pa3y))zSE#q#OKy zPZxftu_LD76>^Ang;I_f6+xlEr`(gLv9|)*+M|nyH)A{1r#fm{bVBKv9mX3~6RM5}Jl)0)*1A*X$ z<)y?m;qt~cCDf*W-D6G>lPVbp^sa&8dnI5r=VdIs0jon*kvy}YYJ4#+c6w%E_{x~kB zEXX^|Nqu9BXHg0 zI!DKfpcLbkE;L8$P|}}@_&oGc1cVx~xpD%+N40o{h7R2524wFqQr zdIG09Mb-FaBZwB}z#BbnV55^fCK96ti6Vl;IkX11)d6X45J;$x^Bap22xKC6`Fazc z@87x)BR++Mc!va;>1Hbnat1TrCmiHY+3Z}RJ>f~<%Khnz^vwvi!~89TjD+qIDjgaM z+`t4Ya8^{4h7%BAA+4%pe#e@Ggbqv`%2zEdpy`I^;+FQi?$30&I0w#YyxIJIeZ4AK z0RNIHMOzJoGsxQa^+BJIg~?p+dOH$1GBYTwP50{%DeMW{vR(b{M8oTb=MfFcL za>PXZLaS*dt200s`M(e?Rr1@y`4cjNkck&bJvXSPYxH`&3V(tCn+*P~GLVXk$G_=4 zCGz(6d3AoV!_H-kkG&%`jV9dQo+e_l+a2lK5(2D%@8%1f=hr!AsCiHp2)N{>m8GgA HJ_i3EhP02y literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 61346e7..24630e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.3.1a10" +version = "0.4.0" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 9622ea3..79995a3 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.3.1a10" +version = "0.4.0" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 31d2e06e31eb02e683c7fe7a7b0f1417ec3fbc2a Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Fri, 1 May 2026 11:51:11 +0800 Subject: [PATCH 30/66] =?UTF-8?q?docs(README):=20=E6=9B=B4=E6=96=B0=20Dash?= =?UTF-8?q?board=20=E6=88=AA=E5=9B=BE=E8=87=B3=20v0.4.0=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- README.md | 2 +- assets/dashboard-v0.2.4.png | Bin 346346 -> 0 bytes assets/dashboard-v0.4.0.png | Bin 0 -> 875900 bytes docs/zh-CN/README.md | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 assets/dashboard-v0.2.4.png create mode 100644 assets/dashboard-v0.4.0.png diff --git a/README.md b/README.md index 1383338..6cb7211 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ When you're deeply immersed in your coding "zone" with **Claude Code** (or any A ## 🌟 Core Features

- **⛓️ N-tier Chained Failover**: Autonomous descending sequence, supporting Claude's official plans, as well as Coding Plans from GitHub Copilot, Google Antigravity, Z AI, MiniMax, Alibaba Qwen, Xiaomi, Kimi, Doubao, etc. diff --git a/assets/dashboard-v0.2.4.png b/assets/dashboard-v0.2.4.png deleted file mode 100644 index aef75f78436e70704121e036a5f3fad767ebbccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346346 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

#UTvslSuU~%QTAun$%h?o`->ELR!hIAs6L^P1n z@8gzAE9?&siYq|F1(BfJ^A4|eiE){*Jn^ah7tbs59aeBssE22=8>XE`zY_@UdCp9X=-dH&mTv-bq@Hu24h(vJCEPxQe3MlH6?pbHSLmd-*Sui#c}(ej-ncGF z(QI)W9Z1~%97_oO`gJxxIf41LJ}#o9+Wg99|(& z@T(ElQbv1&1GHvEYSxFY>E=Zp8L>@Aa6XrHp71I!#E4EWOz->D4YndO+aQ5`bUpjo zhW3JW2=+}RFP9#YO9i32I)vvg0r^IIBlIr$#uG_gv%W>PRdS8W6YbHk_N(OmX+sk* zC2y7Bx$7@Ss)IeH(aZ$ZdMVfKZ$%P=AkIBuvVVL=a}-yMy(pH{ z8+v&7-q7*~(I;^YwG%qeZAy-w#%**M1#IK2q_`aWIfwU5r0mOC{L{)(VSl?kn)o}R ztN_@bg~(zvW!X|qt3)QT#aA4tuv{@CqIM!VoYAt}r*a%i9Ss( zMygrw@CTygZ#4y8MJqR`yi(pADWwS=LB7OY;0$u8k;-qx1_{26R_t(%o#NYpnz3xh z1n{oIqPGo&t&Vl0Y|4f!#5D>Mr9FdRV6x51Uvyj!kq-xGut6E>bXA6e5?Ey{t>N0F zeoZW$#1GOGKGY>iP^%x9CCZwgpyB5!7* z1Qe3>iV?fsrobmE$%x*t)%*W`V4W8Om4IMje^My+(HZBs5ORP4lM{^Hb%{jJgW4)J zkCNhr)1`AxIZ2mfrBQ;42@4MfT%zML>3E|$>is*b6aodT&@W(ET~pso+)`4D`$b8W z*1s(KzNedgZiV7khj^$WgBLQ6=~KHK-lIxFKxk}?n%gNuq>ECxnGFE8soA$ZBQ%b! zuDW0;Og<4_!HtWZzBTIcUpUjA!+%QsOHG=Et5W?wAKXc7KZdj$=@DN8MWy@tEK4Zf zi^*5r0gW=wxap#L(|<48WgRNE-slH9ek0oF-89oRM$##W|+N#r^N-h1lQ+esT$zEV;k$^HC$Cofj^w1K2?{%0%Cdk^*< zx9~dc$9Yv#B{+}yD{uzU`35B(0{GJ+8d`yB<$z&{=w24eY;k>|FLk@7q@u8Oi2}au z*;EpR^dH*G$0v&>oxueG8rnvtT@COHOmIiMs$WxtCDGy#$KjiJu#9!>#3orf@ePgj z7v!dEC5_U*-5PTO3a)ZZ>f%~@z!@fY4Db^L49<$Ndx{a5hkAz#K?UU10m-p6m{TJA z+iDWV`^G5@7+@66iY&}anmpBvkgl=poyrTdsAiCNgAf)X=|ss!g~`+Ysd>2WmvN(5 zR5NxkTy+v9ueyBYQ#xop?*`=S+B%NZxY#{~0XO&qpjn72){2{M)4W95z+U)NM_PV?xA-EyOOi?y-yFmYk zeOW@jk#k?eT`J4N7L?(HJla1cb2r6)jVqV3m_QEgMs}ld5b>ms%P&Qn;ag8TGwF{P zHaD(&!R3*SB1lhdrn7d(^+yd+ybc)^c$%}HQHzAy8<@Q@PR+1ou7c zs2ZfOYTCA%Olz}G3~et*eg~;Nod|mEk=*% zCa;9-*Jc5e;^N~2p5Gn$8*DeCLf#+0X{NBLC&wr7KHq$?c$ARx#3Ce&4uBE*edp{k zL~AuPMYPmv$}nc~W#-Gw@Rxg~%i`e)V?Wd)lFd@`XdbCm%sg=#T$(2%2t+SR64u9c zjUmmX{;{d&2X_=Ln|-dY8+2CzdkWHTjrBK0oqXe2#LAEDPFCP;nCn>mq67$)xql)M zT+80;a2;xa-}TKS3xevTb5oJ&&_N`2%~kzEOM?qBHvSwJ;7KwTdj0Fq~l- zu8cimmWCDi`gw?5YA1y+=vPcZ_bM&#Zxc(V)ExBYr9+yIUwtc!*Dp&Fm6&H!w&HyO zvB-e}KTtWo;rD@Yb?^zNtV20@Px$bShHl7!i5@*&OvHi)&Q3qrvx~81YxjPP$?8@P zxP3qlYxLS?SrW(NxCCDHWT4rPegl!MKy$tK8S|rqcPyr4=H6b~zHYhwZ^38Ir{EclZqki_ONF-YsK zNLjua377p^r*d(p^8Eo9G-j~MeUDnp@lv#eO?=GzM*lgog+ewZke~nI188zaM87I1 zByN70m7AxT+_?n-^Nr25#*J)J(`(A7pF*j5u%K}~detmZITE}#2i}JL35G&F>QomA zO=$c?VP&xX+4mUgxEJXd+B_6Pa?yaos)J$O<=Kb~K!~!Jyx6F4&hFu8Z{{s2B&Rg) zqzULc^m=jJ17lqnv{@H1_XT01UN*b~Pf>fW4+ljs?~e8iK6ft*$11Xg*NwM(`KIh= z_gNu_Hz8qTSuE!!Aw0jN4Da0c)ea8%cZZbWen(?p0^iRT8<68yhB;fsJS%vs-;C|O zJ@2)p=A%ODRIWV1PkRU5WGTVM3LHlMe1)|T&_ki3`y0+Liky*BK0@7#g>>PFF_qYQ zb}XA=#T)Qlhj+KvBwS>bd;u0eQu`@F9vsj58Cjj?f`y#S=+k#5b@-|ww^g)0n86on zYA0d#J6EEO3ywaO4KB*g5`oRw6Qz2bAdZ!pPTMpEd5xm$SCtoQ$t)dSB^&III-u zI(7E>s?DPZsu(YU;n|P+#{|bm*uRtkw1f>R09wa$#8@WpPp#!rQ^xYD#kDMQWOO@| zb6lW&6?219R)iF5CYNfa8yOG7O>@{*8WT4SH?HAeq~f)0=T6A&sHLSP3BWFy=bE-) z@~5oO>3dd94IrBD1@`Uv(MS2cvh4-lWHLRVc(y=)Y>CNryLxciR>0>Y5)n~}H|mub zY@I-t+_s)CElM56BTf{b^-^C45IRFc6KCO8J`Z$<%XDUIC<<^OB7+9!)XdGxBJ0gL zqT8+HsBSJd8SY~S>E8Li#cjw*56k*{8&k$L-HdfqJtpR+9(KPV#qd z!f5}7>W!PYnA8VMdJr}KHe+5%5hKF}TMK>2lr92P_i{WC|FzeQ!5xs0MHyPYN4k=v z2;TkseC@_P3Os8ceMvOh>gon|ZPXAqw%LfHXT6FCGw%NSN{F8?S7M$aO40e@TC_#V25Qcvq4V)}Lz zYWYUl(DGDq_!CLNq~mK(WwJT3`dlulF=Ye0BH1MkB3b}{=acE_@?0ozER~-yn(vL_ zV7@erh~Ru_GG_&U75E-8Rp7?cPwX_g*xY4-cPT+AZD z!5XU^@EW77{)wgj?B_>I#en0H$MW69L}A2AZhCrT&j6Z~AUe|#8i^R&LUvbEd|X^Z zJrnnEd-rq>93**1clFU2L=|F z+I+mZu@|FQDE*wpMLz&(UY2wS`s4w5c_0Gk6c5-)ZgH8Y$+tc(ibsP8XY4gaEjMCc zWl`_4!lBjloA&S^<`m*k)7Xo#?Jpkc4ijHHm}*l1$Q5~^z;egj0tzgLJIB0<2T@A- zGH zo(UsewEq0?y^l^;A;U@+ds^CwrA?qd7goUMBoLmJ!f|eHjzv%g#1~mW*E?6mR>%Fx z9C?utuQs<#Odl34R>QE#bfK0)lU?0nR<y(%au)3@Y*h?mE`j8*6M%)QLd?3`AXS z461l2MPYKPh4Q4&b1eAe`Ih$H8!@aZm}{D^Eo0GiM&e!UlFq8o_Wn8Ax#|kTRAyE+ zSUYC4@w4V%Su(2dM`Bk#uXAm~0QsyU(d;=jXaR#>*u&^Hew7U$FfGpuMU0!}Y_ z|4??Pj$t9&*_6tBK2XJ<3#{De3YF%5j&84XqK4t~@G^-;xsNL90=2;Oc-@yD&E1ZU zfCOp(_(T_H54gCU=U`AZ8W*5@EUUE)E+}*JE5}^D90_{J!Y@z_Q&PG-VNa+DS$XHN z1Zh$AJAJ3!^EYmHnAFxs5kVy~kk-H!56{(9?^1)4=G+1iK7!vYoGTS4Hue{{^%5gP zn>TNf&I`l$;JFxATmoTfOJ&Kvg9r<91`P%>Bm}!A1qM2eFPG9p-U()r>Jp&-TPz(< zIKKBA^phnqX8|Sp_HC)LG;Zv_y(YM9_a_c>=pW^HUSe9zoAtJcwLF(GT~G6|mDiGz zOck%j)g69s4vP~C(ybxx7HyPPwi66S5s;%b-J;D5N;K6UdYrpl{J z4dQq9GcicsAY8H-wltx^4M%`Q?Ew{@EbesXiQH1JI|w2Fu1>?Few=$J2SmHXz4o$& z*U+6op?I0^Fvqa%(D&V@Ly5ns7A;pNRA8ojz=0;K{D*iwWdd&HqJDeZE0J;ok@xkL zsm`6G#3gvb7`Up=jaxS2uvzO@+%&Ef8jT&@o5Jo~S4&~OkO~{>3+!8`r(X%*)o&&p znSmnCT#H-MuyyG=ry5C`Q^j;E6##rLaZx9MA7YdxmPQ1R`a2XK<+zvKmIX5aM?}!per|d_4SUkmrp04L?$AZhR7&hNYJZdGPSkeAb6Mq2Glf7hYSH=?r1qd& zEXySf>D0%Adl$*Vs2#WwCuVCu%=@vb&6z!{hf-WgskLH~xWs<0zqTd}YOU(J=#CJQ zmh?0RLeiy6*NA5WOdgd**S|Z`GZdmLV_BJR?@3kVFN`oG(_soxS83!CZ6zl=X!G$Z z8_hEfON=w45}{U^bmcpX?JtC?5O5!1?b&7Kbj;HG_QT_JjyJ5n z=njI8BOWCi@1JGpSJ|^6Wwb|KLlOS~2~dXD>mDI*@FA9E%L60KQs6YoG`FtcORG~1 zZ5@klG~s^I<^-Y4011i>PptytNcgj-sJnJKe>#iaqp&j3R zR{XI0R+6mNV|0S7tgw8Y{$)~0I{ErSL^JJd3EL`qXC=COvnko`Oql(ph7wmq>c_}2 zEb#UK-^_|L*YDW8mu#WuT2n;PhiOtuRY7WQHhd3gFL_U=RtZ{9A z_3DQt0-Bbs>c{E#*{q%>Z*j3g)}s3I@`7tA!&2mA3deX(Ar@mnJ$V9)sGF4=@?1)U zrz!LIq4h`GwXx0%+D0T!Sa{-m!s8X#?tRX~V*hk;;QCqAl)*uJN_=z(0Fah8@~)Yu zUUWxUe4Ui-fBz`E8PE(-Wh%PJo496|LQ^(Tp z6{3Z!JaHJ!p*wEa3e_OHnGq*jpShZ%3Bt1z5Y+Y{dx`siXXB9L&d)~RRv9vzFpmBQ z)WQ0xku#dUEswGp{Ms8|O*dQa=88;23tG}QU8 zk3NJXmrD<>-Wk~0+s_OE%1pAdD=d*0<>Y{?b1vUXD=I1`t_fm}+nRH-8~mZC$Dg|C zs5rBYNXxA-U+_@<-Ixri&u&*Jv3%$E7t69)p7XX_)N0F$?8*(&e;@O5*g%ohNf52> zQ<$OcNnJG|1;ayrK6#ocP0u)g`nvgXBBm2RI9I^%6>x&k88wNcRLT`F?v(nq0E@8O z%KUXVEo_HOGuFodLX`ATf9hBE>=7kZfNWSJbxFg7j^A?$wk_wA3S0+IGL&w3Pkw}M z=SC!sD%F)#quyyYyIs|drG^H@(Rby)iv@v;El5OY;kjtew4u>M$0A&>Q=snzCtC(z z18BO^b{hiLcK&{5K)}Ex8yr^)_opmFtj>K%!xN|Ddqsaiu7>fSyx6TSXWs_vM3Z%b z4aHG*x;nf{fJsTJ$}0NZJ)%SW&WNn@^B?)`0k`~!G<1G}7NwFzwT{CI5y9 zS*fT~6i5OCZO{7nj$kKlnOW|mhOn*{EyD-KKmTs&x?q=f3zCKdJV4A7T`&{jOo40v zG_dBl30EPu#r^(g+jbfMv)HG*a8f?F@Y=$e zKB(4CTNP1wfeP|(hi*A(49k{E-`<2^e{g4a!~3{OLwMOrkt6RLr%cHEPlt;D-SVii zFXs5H;ITT_qRfnFb|l#p)|0;jkf$kLrQAooK+B?;w7g zl&qMt@gCJ{!(9MuQ#l#g?Vm^20vwdM7mL+W?a^+K4r}!GkW@vHTwwTjS)XHg4nwG? zjUH3@r{d8G>vKeRm2J|~!~4UWS2be%8#CAN+(KrAL(oBVutqO^A^a!-E{wl^0}S-7 z4I%~H-J!3L33v?E2pU@@FOxu%bkcHdfi&wGOdo#{{rQkkLGXc_>7g7EW7_o<^!OBVH1y_=ArhpcBg5u+IR^a0^Jz z>4@@we}x0A6Gl0eFlbRng7}OOMB!U;ZAVUPJ*z?|Y~8Vsc!&J$V`&9*N2~4R0?w<^ zwI|M!|Mxurtu$uG?*-|f9|Tz7)S%NsPNXwJ^4~q@PTb*M4y>nuO>(X*gG62ke-0r~ zU=RS?R4RXa+gUXGd1n6|OvAl}cx7+6azs9xbvwh{eu`{B)Wd1Uhn;9D7fP#h1EpML zR>nC9QSqOzm?P*L4dKZX^KUb`P*yLTnWF^f@xDanGdDVH3^et`1t2ik$ZJWmdS@exR%f&cp@D|3hIs0Ua>*Y7U6kI?pys~=0&`d|GztRfDhR=ziTak z1^;p*%D9)QNXv`R}xIKW?TGxvn zETv!l^u4vR7?*_N`tP0!eKvu+IOlyotG%Zqg!z+{_lWsnR;@m%q zmM+-m&b&Eu=<}=pL2!<8;GpKVp4d*nFuKo&mx`NnW=DoLSHFf(<^DwWl) zwF*(qH_f)q{~j-Y<1-GT`++0RA+hTiD?CI3{Xg#YGckC# z-Z#)?|Ye;V(QtH39=K*(s{#0^6J?iVQRm>B5h3^yC=&9?`8t?q?4eEtevh@Nl z{&Ft%l(vy`5D(mJ%nTjDA}GJx2^tYujZyf4Ym*v|O|XHHcq>r|+KxrorZ(IM1HK!| zavoV+pidGr*MAo9Kg$9Pu7gD0%N<`)1y0u&_4se}7m>skX#ceW$dLz|-c++<}Tlxr|`uwP%q>c9}0LQ7qBu zK5Zs?N{b}vgXCcUm{i>k)|;*!?8gdbc#R(|HjmZGVWlA>yQrDT~MN z4P8NHDpRzEOhLIw%|EZUZs1?9+@xb3ICa<}+26H%?S3RdO(s6QVJ5>fbJo*T=xLr)sn ziU#I_Y2nNx-gEj4>yBS;!I1cmab(>CE|%fZ5M5FEPrkc<54d7Xv(yA7r>ag_2PvHNk8cLKx=2V`EE=1(+h>kCAAa~K zd`o~ID<45==M&&~vCO7!VzqYCFF9_I_wqt`q`?dXwVEDkXf9Ty8A_g(IXQo_nj&X- z-k{Ab%w^ejdN)0-9NV89=r37V;+`s+!27A7P2prUnh0ShL#J~hff!mca8o!t+0*@k zx$J_%PAoWpH_ja*UMxbyC$zl4&lk;T7t3fDD_e!)L=Y7gfD7s^mn0Co5#l8dv0C{# zD^+EtfB&=j2~sGbJJl=F(zjZVPk15xrv;iMy?;~se|Vu?D%@Psgrss01TXbaRfJ&^ z)w|8gdq15e;k|kLBBG%SbIGG8l=E)jL6yI|@HJZ8e?gE?mN~e409dB?0~j*?QnaN_ zTk&xCCFv#>zU_*w<=m3}!$G@CqU&gSnffi}S=+Jd2(@3Xop=;MfHt=?PRKg@PmBeKK}>F_H@HeIBym-8Ptkc1Qq{f}ED-GJHK!B%U%34laz!}HWKaQM|0Pz;yJ>yJ({<#&t}qn~ zBu+LT1Tz42QFxBrk8+L))+nmSo97SP#A_rzV)CDhHDmBgv2fS=S&$Syj}u*%W|ijg z_P8658$uFteX-?X+pF*5dx{RKcgo9qUy;V`bEnJZ73Ak0^x5BP#Q0bQGAzo;jdB>z zySMAyx{Qp?^4Z~2fyT>@y>S0^%S0m z669`8H{XH)(u?0A*rS$+fT@%?H2y1UHF3{W5f9!pDBW(i2jK^*6%8_&X)-x8&vyc9af9u!rPrQcE*+w7CJ+)f-xKRi_PnK%+4H z1hV?w6|#3=hvwx5s}nN*F-8!$GXq};bXBufp>;d557(R9Zu|cf4*XO~l?`l!VUa`d zt=hYSNL(Ksdbg{9iG()2ZhV<2Jgll38tYn`>R7pulsF4%oWBaf81H_;I%HnnLhKc( zvWr$flth0M8D)B~fS1VQy|pdw_};n^lkOk#Dl46ODk!dk#Cc2$ za29U%gUG1$jzH@CkDw=bfL+^kzmg{DyQ4E!h@LVqIS_-Zt8!% zaFz?&1yD-9{?t5g{6UvAE=Kcik0BR)bC^Mz=`hY{m3J%zg?UGxUxncBt04>`_%1DD zGXws6DVSvRmK~%wo#S=Q*4FN#`CSS5pEp{&W1F2*k-P!g=m5Ysb#?hpd^otUqLLD& z%u-5D93LAs0Km;{bh;A>IP{z$+!ezHuwR~)s7se3K1hh+r?bu|G$6D}5E#*{CL{>A zICZUVctzwqN~U0!UGat-R$YvdNJ0*S(3i-ea{Elyo1)VRV1S!En>l4U&FUiuCL#&H z3b~;xgAXL=hZ1^|ktIC_YeeVjVdA-EPVsTvn)?7_0_l>kF> zxfUd4O@io=JO1Y00RHH^oyiT{V8T~WcTbT(RJN=~qHpO|yd?yGQn9MM5FQnXwDH%5 z+@Zm+Fx{@6y)N9nZu!c14UY{BX~d#&qtk&6v7yHb5b!a2xLHcA8tE#R6-7ngun_dY z*jZUIt(?AzUN={13z?`ixD&onfNF)HC?be|#1e%9q!NR+=t4f`Wg2709pJe=Gmqs_ zirnk{KoYLDCcJ&BBZc?-P=%D`hIjKoFC$GK2I^{ol@x`%Q|IbL=9ADJf~jIoSxo3q zM$1`Txn1nfWBPR=w0>f8=NshcV|LZcsAFzvvT_GJ9ocC~n$1SZfwL$Rx>vZrsH^K2 zWZEEKVWDG9499OS*J1X|_66=1E6$^?RESx7R&}bE`vExD>ql$+cKAbvVAvZRuthVL zZvf1AchY!pntLh_%rxVU1T82tFsRr{kjj>-o$jJM#6qICi-1{#ju}Gg;0c<6|l0ZcH4vHDj ziRPa9M9@Mz-+he$17x@FdCX(5c}ywJuo@mQepC>r1VSBWiCT0%bL2D{A!w2QrWR~$ zs2Y6Z6>;dTvp)a7^U$MYXOZxwr(`J}{+ z=Z8@fd~9s}yD7M~J?q-7Rc^CldHIDqNx<{2jWKnOY)n;kYt&& z(9`}Fi!N&4SDe4G%((wmk>p}IiUt=cqMUxvI;|QNo(exO3xqu;A z<6xbtUbL}&5u+2A0x1pVmiS%Z+5l5j(d;yZixG~@ZmN)ZP?Es*iRoRUaC|G-2rF{N zrGDI~5T5x9I#nu{z^>Jyksd@5>nB5M8~U$&h+2UY-LE>x7#<`qbf(1O!0>Qo4+4fxKBF@8e5EGRiID^ink zHm#DYxIUcJVbmYXjos3u1UXy)B4We_0+B`(n>?&Se<=LxHA%omyP$SMJa|hQ8L|(T zi$1&F#3_*;2mI`;gUo-H&aH`BUpLQN^o+eYo+fBYs~QuBQxR#4+?5kq`MW`&isakt z{>}$Nls=Tk(`TmhO|T{I;j^OC+;}W)NnbDPa$)+M!3AvjoC-nM2W>kng`1tQTZ8B+ zKki^CyNnYz!eSkyVPPes3MONYZFNRM=jN1i60k)Xp^8>3Y&ZB>k>yGcA$>4l8Y|TA zliInw=}!mKiWFfByO?dJ2x+3JSwxm>|ASx#>ApKd@KP2@5qX#Fy_$(IgVpcO4>5$m z?LPhin2Ro?fXg)x5WU2%OM6v6I;tx&B0_O_2m-9dKl#6V8t1E0N<`?$n6 zT3!9o4_8?a&5<6h39T!lib@=)5u)?8=TvAuKDEs%J;-u1C#;8vX5$G_M4XI0tiw_LJQ0Lbe)Z#JQxE%su_)cgn)zqZWj0~ z5Kl5sh;%ho51rlDrVn@GF#o%L2b6!}$zVT#bqygszx?d#Zq6k^OW)W&Q{gMUj|viXd!#mpxkq%wOOp$Vl06Qba;?L}IULTP zMi5(353u3nElBsYaAXEB{ z$z}#hP^|_A1{R5HvFcIT{u`f*!Cjz#s+S>MJt`s+cV`4KhHpKDKwqymJg;CP!T$kG zmDu|MbLy9(Q1tVj52$LJe6{3Gs>j`2&PRm()c1yQI!k!O>-GCpU3bWGz?5Is;05jh zPn0w%sq36FWJ4yt6dufl)t>-dx?8zju9Zm=#y&F7|i9kb<_{OL{o2*hpTMJrr z)?_9@#xVP`Z-0(`-%MY3TplxMH(Ok)T^UBSs=ScI_TRvf0>Ef0BYKrU*zLTjtyK0d z9b&uP z2WyIbYqO2^BH%OMuf~*;THAO5?%0#WpdEXU{GnHv6&6C>iw9{U|dd7uVc{+m-K2 zbJ?%brrLiHYQ+}4mbC10gmpEm65ut>pqNSTj`8?s_2^I;F(^e{wdULlc06EODWgUl1~{^$yBG zv6XKSMRRl!n+;J(FqrFse7V%3nb0&BnUa*7mN;yHJXmP{U!LpF|L|KE>-x!zcv$Nb zP==7{$LWInSk)d7H|ZU|!dn^U3Ix7=H1hcGaA5spDNt`Xwrh3A+kAhs{e=44T>lA-=>89Kud5lbz+IQUkq*f%+JED)Q<(v*iI#<;r?bW^P z;G58wwpwkSK*zzk4>&PwLmOsJzht zO%@2!%;**kYjEi8&2-~bct84fCihVUOC)W`b#Z02^z0wN%Id5)%Kc7zcd9Ftax%rgUPqZ8zkY<4N5zrM_h% zmqv>5X-4VA+wnuGxXEVU`ix3rVtBQ%04+w!GB)k{gwBHt;wLw#uxh2)Aa#JPasu7t zXFs;099v;xI*;H>=C|nNVt1_&V5}>yhHMXmdGisk6Q^g_BZtTDccH=I&;Luf{z*8) zLjneMqSI)ofJ|YH$WmWbo*v(`oX?Mm*Twwm|L=nR8URJhx8OW`&oN>u@WFY0*4FC= zuOW?Gv9gk4@7`X6_iNiD`9dLoYDS-a;JKy#;{6q<1~61l*vlcdl?*g)g+%V$n|#R# z()5-S?NwH<%Xg-o5AM^zvKJo3ZP{XPJF2@DY<7O-8Y;#ink9L+ozP8ZVVRAGx7WrSIFAY zj^zLMo}hm6JHnr&#;3yZZt}QJcWt2tL*Oxf=ucN9#x1Hl1AqhWmLc!@61qQrZGhX7 z(1^-G3Tr|NT555loh#X!`voxP1b`-|sE;9uu2cJHk^R1UiP;=2HQ7q0K|c3EUZ$cI zPb{wrLmRdtntFykpye7FDOQbND1)erj1aXZN8dyQg2eMYEv~pCbX?8*wuiX!+J8Q3pNDt7irb#7+K@=ek7m~Q}!b9ZJ6|h2r8wR(wT06hLtIj2RgcaWYh7~=wG!aJFfaf^tvx}8jBuF?GDeMj^jSX zqA}k7@&(nz12`?=c`%>ltG6mI63#-)6wUu;RR34xVg>j1U@D<1RtLQ%L{3lIpgM&> zNX2nvz41pU5Zf_P%}*v7vDasVf9j7b{woBG?g@j`38?|lT7LTcS5c0{S{NGcNLh4g zA*`_k7on>U0dLftla8UGan$KDKvv8#Y*Jdv@G4n5Q)`KC!poh68f)P%h(ziRX$RZT7Oz^ZmYfSGD1c;c$`5Z5-_rX5Z0 z=T*lIeY$bkR0A?56)7vX9R#CaAK7M~lIR4L zPH#D!Zy3Y6>SZcavFb8>L2#fitnst{(%wZYH5Ju>gB`(h&Mm%#%>VK5uzvI;o75|T zE3dXh`VW{FN_*W6=aIh^%`0yOz>0v=a=yqQm3SyU} z{Au|KMtUsO+Q?od!s?t1%C4IC_>KZK$VR9m!`|Q!TFQQZf9ASW8SZZT!50FhixpZs zJHYY}9S8+XxCCv1NCnc0&sA#mMryk}xijD>VxH-95yM&h^V|E$8jNS^d^7(=rtz@H zFK-kTG9-&24!p62QUD5AihbDlo0eX zx4prj2e8KKJ#&9Z!ANtop={{t`~og+{l0CV_xxVMyFxtF)w`~Z)Dz+^G@QMYyXiXJvE zN;gmto8Q#GvA$JT_|k)4|DplGyG#lU{+lm2M%D)?V!i4A(?%N3{9tujcE(yispv+QINs6 zs+yZyF+I zhPuh@%sE73W@ZLWecrB6QPm82dU7{1-p_iFh~2mi3PJhh4uevcxm9|)XSCk}oZ|+0 zhZcSx(c>x(sO{?lBBznt(9vJCx>8^;oL$Ksi~fd$#9Aitb$xXS%rFS%HRT|CD3F&o6@YEf)pVsrQLF@ZzFG-X3ZE7M_7@8Vmhu=&_uq(0N~*zUl;!6}?<}&taEECH3yu z|9ej;1^m2erfAJaOBVQll&N=$JdI@zF_hY%6!)W_OH&73J6v9uF_&=~Qm*?Lno0mo z4YRTJ;GuL2tf>HwCglTWtdz&dV=W!VQVlkuiavK~BG|DJ*?F=0!!6;#s#X@}i0r|1+nSb zx`8XaG~Zs{P7&9|E?uvu{yX{uAMm>?{O`O0gE1UN$jk*^47(p(I<)TFe7@3S<9+1)Mkh>A5 zgXxwR6=SCz%XlHJw3zNoF)l*d=4(Jg+xff?@@ENDV0drv-V^il6Jl$BXXNjf7T ze2ImoL?xNz{YbEASt+t*oOP(v1~!V8UO+nF{?$w~MYcNy3*t1sQ9ZwfN9?KOwnejS znQe*Ls%S$wWbBbs;^SExtcH~oEe;B6&ZQpjHqbw37+uls;WEH%NfAcdHue?ev0DPq z-HuS>v|Qp>60~K3jQ>Pfjdj2no{iXLM9_LGxvl8$Ceje=L4aYR3vtNxYxxeBPc($v zBQWXsDaqG+SWQJG7%Tufr>$+wk&lLEG>^L|X3uZo7&?WX$fv8z8HP`9QvgIAFI{8i zyP!i&Wk&rqYb!K!;dWK(S8lRU{$@WZ^gk=5MD+r{eOB#BV*Y3z-|1H{!dtXX(|GGvD`Xz}E<6Wf|AQ=61Db_2OS)mi~2sCe|;u#<=bCr!w3vqME5D zJFt(Lzp>NUyl`q9YGk5sgzr#nnm@fa-FIX`G$Bm#E?T|Mq05O4$yejXQtBn@l?vAu zKU3n^)nl`@ELu!4yM3n)&!Dwq_=3$9FTRYuOY+!+(T5@>unqf2ewp``G)gA;6gctH z0M`qUf9L~)3teb!JarX+&hfg!>Oz`RwWjfs#rn=b;Jck4RP-|R>ELQrd}awFFC!+( z|M@P*L>QA64ohveTp}gLKW88L*A3FGM>@Y^;~tm8sl^BO_Z6bwO(~Z6L(O&{;s!_! zH!^qsAA4{87FGAXj{_3Y3JOT8gi1+wiwFp)NXO7Uba#lL2q@hkAfUj|9Yc4=5CcQ! z(B1PrJkR43ulM!&557M!*TtDRXP>>++V{HG+V{?3-~TbRoAyO=h#Skno^MA|gV1tS zSMWCFWd%83`rNg5zeGhH9bt_Rg`rA8Zj6NMBvo5>9wj}U2mA@Ohp{+yq*gO%Z*|#L z7!vA*u9)!L;n19V+7~S>jPP_JYAl}HmG*cOK?t;Oy5sjZ)$pceR!^S&kVrp5ju*5X z@gqI}=U^)&T|76La%$~h)?Ym?_!e;&U34@w+N8JYZNrO_438ee(QUoE==Fx=znvCX z#5`2eEf1ph-NDaGl&-K6pB*>rHHaG5UKo1br|s)$t9+-hR|+?si|}1EuKzm!vFahV z9k2_`y_DoV@7w7L?Rt>}F&7+LXKi;8X;W;yt0RL*)PR2_Lf{Kib>l#Cwfkwr&KF+i zaj$3ScW0DZppeNLaFe$8+Ej2t3Nll?!?1XTT*P<y2qy9LlM|Z>f`sppL^Ncg6&rYdn}0l-WkHr>R%I?A)jv9(&8Xl3hIUm+qtzJ zalIWxF(g5#FBc*{b8bv~T|TL&PU1+R_f2zjkWs&ER*gf~0SzavNMurixs7`tLT{Y?5jyd%nA?16f7GT zv9Vu)R=l0bA`{ree?7;PEau9NO-T8nFA3TVx;`}9oS46SYGPxP^Qq9;z(5?Lc!)^(sRi}d zi%QgKj$SRFXTPgyY`XM2Im@T3TU7HX5!s8|Ov+f?< zzI|A*#8j5mH_j{U1YJ;QH(^Bjb>oGYr2{9{-}WO>hQ~7=mo61hrOA9nA((Sb!bpb_ z$_hRYzAr=JVnBAy)#9%R-!Hnzd;Acb7IvgFXKtLn3YJmD7ovh?i4M;Fn&$pV?1Wt) zW|Jh7=Rf_vOD-YienfN2(L`AD5(G{*>O1s5_Y-@-R=kh&J5}9>G}3G zK7<8QL(=k*xFrmzBwtSRs%LjaM5b@0?OftlfZ?BYYhC825Bgg=zh&BOjg7}Yc>7p3 zOse#FRv|&mNa)&SVCD(i)0nxB^Y3 zWy?(kd?psk;jtUDpS1*)DI?_l8fwnxt1ULZILR%4H5eu{|AnKdIhSZZ{p`Z>o92Zg zmdom1+0^T);N-$(g%qX)Tx;nt%&cyjp@=Wzti1C zoF#9WS=}jeLIOC@!cw{=yUFxC|ICTk*5R?LsG)KT~wL}aKp>eam+HWv*XU4*<$TxuzpI@IVSQWKZCHUZzd=KFE~ zM3r*S2g0LQen7tn zb{@05KVnurW*AUOc{`?q$&00u$s}M~RzB~w0e3`SW+O`B)vK>%gyZ^G=SQaqS4iBJ zcJcm<>-SR29HpesFK{Qqsl;i0FOa%!OW%VP13iLvWz_Zj0htY>K+W0XH1%x0h4(bg zR^kr{gsjv8>k?6Ffqg=O<6hiL)sk>;(zW9%iG&0T7NnEAf^HrzE0SQfgn#2}Ie?41 zcz24jjR!+BR11FckbgKB<{_7^2?K)Zoldu|DM-pAWjqZ3jqGH5AwARJxLU`)7Oa|I3CRX zTDgGDvchc+?{nqdPfSfOaO;m8dr&BJP%g8-O$L2`Th@8?kciV^o|ElCY3Wx6a`TZn zo0e^%HLQNtNSmfu6Gy$Tn``V-$4hm^bQT}_^yE37JcN}u6z{DK zWG79rlVp~SeC!!ExpiRWRPS75Zg2cIR>A=_l|D7({VpNz2in;CJ}Mf5>IFK_L5oon@m zdo`~f*GJZS=@KVc!%TXC=&Rx%1>{oFOKn)7UX8ttTRx%Fk^k}EdoXt$~w7#IPat_SdidzCRozm5O}|Ew5RF<0q!W+nb>8p22G`MTrQ+KQQ00oAlU zUe0as{Q~WZ_%@YnCHq2JPD4ze{n9ik#}S*!O&#$uqpRqj{kF;#)`(5S%bnh2_sEOl zmEy6I(k&_T?fZJ$*4G;>1axB5>+Ajc(R%N}`+FUkze-53upFkrGG=(%;P2kj_T_!> zwL61eMVwqwqv}KVFy%m12d<35Tw9TOm^^)ADVP5F7xNjEQx4@kJd z!(>(a7nYc+X5*Hh=%V%aXA*J1D63~y0diE|n=Ay`341N4g6ev(GxSVXTv&x#D$MQC z_Zj1cURB>tTxn(VDZaw$E+JdWP&+r^a9ZIVLo39N#qsuh@=Sa`jeo+ei=qTzVsy!i zvWaC83BEGzUy=sxPF3zX!ocHqtFitDL2G6hedV%ms;?g&Ec^E7qlnIiP}gCGo8^p) zkOZ!0dPO}U6 z=CVg7RJ({=tf_gOH*kMlPqsi>t1vHEQZe0Ttt^;|ed(mTg*-?5QB$MkfPl0Da(b@^ zUEr|=RmW7bU+XFtcMnOGzt8ET%PT1Cwa}qDm$JtuOJ>gpY>fs|MKw^%Lzk5`NmRBC zxVNy0o*x}%m;)l1k$47RKUy>n4&9HMrDlteT2wfBENfG;pyTtG?>I#Ec6@6qXITB0 z0O^SNRo7|%9~|``!l;0pdXET82ZNGTkvbN$7L&3*rYwrvpzmwil>%b?P*XD`Ce(JF z&tq2gP|6fCmx*mtPv)*0*FYxlpq6*&^Z7!*{~Iv(8<6gWsM`STxNcZS#_p#;CglQb z>!ae@SJP9mMpkhP5`jhQIi?1qsBnJC)%_U8?F|pvgE32e^$~W0YIlZi1UskXLVMtm zDbvn(-z{5p5Z!2Z(BLrunA!DUn~aLm3CZcAp?VZsjk>jpsX8NO12Ht)7Y7?}Vu+tg zpcDH?+s8dRXw_cc@iTpI<96=|2XUa$Q~P(c1UTDWwm~=JdY!dni>z*r>ft=1&e}lGl{U0>Gf(=+FAkjN!S2Y?;bmeWWQf0(^BfLQT^mbdf)(o3(Uu$b)m>Rak zfb{D_aH}@tpF$cpndzw8nMv{$l_R*hZF_i67xB<)1DYI=HBS;h&Bb@rkm4c|g;L+r z(9s-dT$ZL?-h-k>=U8=~TFV&3`%Dyhb`}_OGD_csJJGQxobk~Qn z@73Nf04TO41$9F1dd0Z!cDVMo>J9rBHEr!4G>G;`R}n0p=kQ0>CcJ5R*o?wt^^NN4 z@_Ugj+Z$~hw0xyHytg&aE$8M6)&mb^E|v<`9Qq89d4-4ydp0ZZ#w8_(_j1UAp$Ry+ z;LJ?BO@C*{rHaqWwRW*1Nl|R3gddIpN%XB?gW4=MVY}fYYN)=>cmjXMJ*!EdxaART z%=h#tMCrWn_u;sc6wT}phkxap4b$C0{qh6t;sJL}6pWs*mQsXr_)L4M6&iK;Mw6EJc<>?|(D`17=$Y`Nz=WMmF z7d1MIC17NE__f(aqJB|nxK#qnE8x6FalDGqZI9yOVx}-j&4iOQL1t#=mU+AM;-Rw< z^YM?Ui{ROL;B>R*x{=k4vaEX>Ke#<>RZ5m*wyaQ7so8JMzb%@6_v1iU$XE)9!8hlX z*Hc%Q7*?Or(`L6&UN~5I!&2(5z2Pkma>lkB&Sl^slLIljP1=THMl2pIzG3G6_*m30 z=?PS7ZTmvIXfY`=GGMsG(0%75g{T#zJuk$6j+6#z@*7&SmvDi-f7EWBCx~q5828mF znl3SC%A39(-EuFT@eunB9&Sn)66#o7%GbCHj!fTo!**Kq>VD=WT@?5pO?!E9|HMG$ z_cs<^*Yw-Ym;(Yr174zg>xi7*)Xm}uYowik*G6mlAn9x){B@^C7P_c514%7dcn3Qydt?ayF)iGC4S>Z`Cy-Qv< z=FRDbR7~yx3{!u~F88keBuVr)3CoF4py*TJeRF}2MN!FK(V^-)ItjDJcA!3fFgPDrTNMC=;uhSZuR}o{?>zUCiX> z9i<{mJB0Ob-CN6$P)V5SwH(tdIv=^TyFU}RtztH6Nf+?+_?_@3m$rsky4HeG;3R|P z#@gP7J#sJa7CzRKIS{@5nht>g3U_T2z5(V)zZ?)RQ||5(-8^ zI-{GC6YsDed-fLwPCq-fbgkD5;e|O}`e?BAi~2h4Qk9r?Vj6{Fra#DuSU33V>%=>Lcg}DonpaqV9%(5ObpAj z*Gh>&5=>aqTq%=PV0rd=Tl7D;13T)^I6ApkC?nZcQNdX6Tk5)_2XOJ(@R#+o(%av~ z@ybT|74%!swQWT5f2x&jU~+6Y{MG^pZM{^sm1cNUDr=NarV+_nWYXHD+RBylPWGLnW(_(viLy>hX0pHYnl$*Q)XM;h+u(FSxf^@qy<prU749Yt;Exu%Pf{Z1U@2ANu7MZ>*z&1DeSb%Ap zB531W|G^c2gLu<5rjvn9?znjl<%oH-wB1_+VI(%E z+jtW4jOX+ASzc?BFldnea>CkAw6^#vVIOnr$f2nzH4AMJY~?BsVvILFPqcCF?<7LZ4Xizdxyq`gzN_}j!U=X6RZ|m#EPg4}%QqE?u(j$K z9h$6djLjH(Qpmvt-}Akf?x!LVn0a1UT;zH7y=CP|;k?+$c+qz|*`X(2zkc;wiXL?d zHm&5(sQLA4rljuDtF?_eeXh|*kgXd(OIl7|sku>7+D?BKp_lex#$epQJ)U#R^HtI% zp@1dP_stRU7Cn+Fe7O(H^i`yP`;LUa*wZ()MhUM!cFVMvQ7!EZJsREeW-;z4UezbG z0n0bD^gszTldPWz+@w(g1@K*gVa6CKAJ_|0H|M^JF*gXdZAwH+sX1>W;1wR2w!Gy5 znAW`Fkm_Fv*!IhT`BujeZWNe>NPW9;)ids59asJBP3%R(3a@V*eZZ`Lyzcl`T^+gI z>m%23FxAu3yErkSp>xq^`}is21HvOhKqI5wh*;DwaU)Z_Fp&|SCS=7&bpPJmLJzq? z+y3%Iokd`6eS;UX667+k)Ml}iIm2dFIQM+xso+k}EE2<{YTU9on`&|>YY20j&=s3NH%PIJ+8`{As)r8J`5NtDE ziadO0m$%wz>Z=cE2$w9ss&B0MzU#=+u)EsU2&kb%LpWd>7qPDfW5Xwn@kyhViX>bAd~D(7Mot+`r;r5Jn7gTNd`z zwNs|gCoqHG_Jt#x3hm*t0nw}p;vzQ^+a5Y`NTGKzw>nX?O8EXg%?p(%FZdiDVk2KG z#UKw|OYo)ZE{wYonHa<(sTZ7ye&0E`_-ruP&HW0r*OmH%0C7CDie0M++%g@CoAnB< zvZmWL{iv#|!)Pp+E^)44D*t@#)|UsuM2VZAo)4d*cE{SowxjW}aEQ{2itYfX&2b_x z7Esm?jJ~?UM48;QeRm&6d!627_6rgv1AosIeK)2SCCl6DYxGto<40!wsLmmoYZ<>x z>)TQu0?GbV3}!Nl=rHSVX;L?t&CS=&e@Zww;9(O`hMeJ((La267oaZNt$N}zAQeQ3 zVh4+M(H-=w}rD`sp%EU%|Cka6T#;wVZEoRyw-%I4zTn$#T zGlLrLAoEw0#*fjl!mo1D{B(`6etX;_NqRwEtS;UzwayEvcSn}? zW*g)ou^{1;2U%ZS-cRzfH3GeX%j%kZNCg>i4x7igE;Ui`rD5B=&*qj=`Vpc6cZ^H> z+|D@JjfDg!l~ocx@TPp(qKqdx_?LTy^gos%;r|tP^gf^@`tBRwx{yHj71}cBvY-RZ z?FKh$X6J82vx)1fLjQ|a@x>E4T6=76ZSCX>zdp|^oRbx=m1b9q4VX%#LUkv%fbqD+UD%v|wZJqFh} z@63NZF&%B=xPef?3;P{2tCXWO?k_%3xfn4f;5q21p1Z{T30v&)F_~z^v65hgar8EU z>r$bZ*4hj>b&N2>eMD?bOu{{U2%3$WTC7~~n})o?YJ-f(4h@+IFE#qx+yE20vYMj*g41;gCOWW6t9=+ZJJ9U}}CQ zXurxPfP;j2g|C=aPvk@&Az=ylv4ju!rbSY@z(Na)q(zPwY6k-EP;t+yZE$pV8A$d` z(;XHUb2S|K11rA?X>5}Josg&dDf|B-B>ukF>0zAWfkT2lu&)`x@<^GU=_y+d@AQl% z7%b_c#%{T^8e6Z)Gp;8c=otIPb~_lXa^n;d#`p{j3?G)0RkYN;#K&)Y^HV|`jg()? zkI?A&jPbr2colrT_eNbMbT!o-FJ@Wx0GjGM)JEYu{X&j&@TM}SQF8i#hj((Oc1*Jl zzhBebbdygoakpDR!CoJwcXF=3{e>baG`|-CeG|{-9i8Bu^n8s0=mx@2)h5sU0TGC2 zFCqG8C_uZAN@JqmW|VC(ugUYzh=vEpk%cwW1LbKn8~c1iMgHv%Jogg{nX%u}G%7|v zkm&2%Kj@Dw>d5uvVw#Tq!yu%d=oh!r^T9r!pP%2Un5zDnn%a9Ig*NUy`qY7wyVIoC z@>ia2=+sPmTStp&`S%Lg1$j9qCnpJJzeJGiT&32*mD{8p z%2>hg+Enp}anLto9g3u{-ijT>9eqE3N`TnV+jRKO4QkTXE%bfj!ta&`KQaB(lknlP zbceeMelDGsetHFZ?gmeqvrhWc+;0Fa{U*kFUdiY3lZSj__p5VIN)C$^&_TNi;Z_># zdm$TWHY!mqIwCSm=S6?SJqhu9gD1XuW6#9r&Cn|8hJLl*Yx2@L zaCxZD@5R6v5_)$PjR&r6qkS$>=kHD~6hWC{etC~4pH!bNELev`DEqa1C+D@|D=ntz z-Qpi`q$2^a`V>r1okx$YL!Q}=g#%@Roju%;xGFC!0EM3UU_Vq94PF7?k zvDtI~4(B(k{2|!?{EEe(n2G+VDsOQ3eenLk_9h(XUQqoGIl2xF|J9vB!8>5SylP5! zYwP^8bh;p;Zs{AeImm&<12n=^jp4_R!MMOuP%jcp`$3@g#AKKBeAk$#Te;oR7*?=? zGW`CJfu>9NlI70SOAXJpKX#t}VeZV+Ez`ffH9&pWb@K`!`}g~ktIk!lu9Nu|Qa^3p z`75ZaV;KSkP>(Fd8lnP4-rVU^fsGR=JkQg3@!v+Vrhri{9NYbR+AT}5jfaJTz?x!e6$wDx?%IlknuC4Yx+B{8{(npRBvdbJg)|GXO`{|&Z* zN9`nL4ht20@VDjbdp`Mh1%vz1Y?i)YdH!z6k+_Yuz}4}{d+O*FwFni^N%aJN$ULFI z7i>pt{rMmN@WU8leseTN>et3ZetE^t@Ra=*pE!*-&SXb;2>P@bpZ+HM?~rqiWw?Yv zu&&auc)1>zNu&xA{ZvzLd-gx6qXc@T#8|tmF%u-~VUj(mmUiN@y7d6S2P&Ncpq>ya zc=GBmg9bbx>q|Ywx(YOK;sd}Yc;fKFK~kahHF3x7rvF9-cj_^ia3GlW+{$$_?5vEE z(_n>+6aB}RofM5>yXb}|f8atOK;LHlDzJ7hOYw~FhJYw`i>kJ?Q90{xq$%xOH*dY*Xp^ z^X}y%?eixL)4W zE69;oP6@)8J5xS=g01s!6oQWDq@8X!<4w{Ugu4(vt@2rv?x5LprhT*hBf*@@t+1ru zyw{+!zkeXM0kG-YZ4Tl2MprecNjiApS0O0)>f$&(Tj*4z{EQnSecd(Q@`#)z4}QUC z>C*5ew!ItT8lwICNB(38B=ODf@YlD6|7xa@v~BtP{jNS5KTo)I&|gO7kA^|Yq|~fV z#Sg$&H8ue|w4k6M3SLtJzI<(RePm{y(c*|c2jYo8eA({(mT*nL-}CoJV&SiMe-J+@ zX8XKO{iLZ~7-$oNPk#6l`U6wEhUE`{O=^)MsBRB{KRdhn!Iiz1<&XIIDrUF_aDv6W zF?bU!QbXO+{%zv-ZbwM~intp{WJ?(!i3!-@^1;o5eiH)xi*5s*{pk=$#Z1G7rPa6C zR0JS%H}7|Spn7ZrU$(j*_wR@Zd@DoZf>rGrR7CJ=}!xb!R7yC zNH_PG(*?@ZJM22Y8+|20uy}N(uKoPCv}m5&(aVP_OtCHA`fU@xty$n%Bii;`e8g{% zmrjla>j~;U3^0-YNXYM*@HhB@=}ogF{kGY^hBa7;6@RPJHiFJm`A=_KYF1aq}j>vur=@JhmLmdlOm(QCf{+U$#Zpm_CGyj4Wve+T`? zlmNF(FT?{TUR^f)>VF3I4@s4A<4n19hP3qmaqfREcrvIC3}P$qafi?UOyTdl_+h*S z=sBBFVou_({~iB7BU{V6i3(%ijG(_U>ni{;1&o&QqaU1{uGHAxutnw!0ktxw>c#)lsYsWDsHQ{a)9 zVi;jgn%yI^WKVX4UNMH%xR=3HqL4SXQW`(;5h3BL*RNW;D`#7?38|*Gn5Sq@sjNiR ze2=dyw)%>dfa3M-T%7u;boHVRK7|V^ykC>!W906m!XQuCm_xKcL0iT^DY);m+!aj{2~2A_dp; zah#7Mw&b_!#XR??#7tn+y&}u^92=D6??} z<>l=iE=EY+I-IRtRvTE+k2%R!rSs9hUa_it^qKb1IR7f8H0H^>4y}u9BhTv~a)Zu6 zgMB^32eLCyyLEg8j8sx5xcO6pxtBe!_67b5K=rKYbRkTNiPmBg!b`+C519L-=f>UL z7QO}drVeOT-H{2#-&;Z!%GvQh7)Q#Vmh4Fwis*LsPLEeM5) zD|>AEiNb(*Xh0xNUw#smO?4k8mlb0=azO0sxF-I9q^b!cz>Qigil8VR#L@0fqBQ^PAgSpFU*7B2#rlzKZ188Tl%Yhvz#A@ZcxobA^W&8+$ z7Q>7-w=dkX(n@RL&<3&XYrQm4cQ7%XAjyc52s-igq8?8td6IN6aU4et^keW2D%c&g zyFzB}3jx>cPr*(yx%+kewzMngZ6z8kqy|P@ujgGME4^F3J}B%>{5v`}m6CK`gHgrD zuKnRl#V~_JzC}z1CZ_o`S5%+K$zkZE-E3c5K14g9lVypVQ{{ zHPq<&vZI}y?rIWeKhf)wC*Nz8jkIoT&*!9%{}S8Q8AZAj z8aN=XNf?~jWnFomN&Nh6s%`2I7NY|A)=WKBXqpGc5iPfGk}=afDY3YDK&4hrMoBZ~ zuhGX^3hBkiW_0Fo1SPVVi3#valIj0tJy8Vo$2N+L; z?Lm83NZd&q>)9jeP@xUvo6rVXTJ|Rr9xp$-PiyZi?&0pmL-oT0GpnFmo`^$|d= zFH_BQ>nLZzHh=7U?am@#Xj3_mx`+!(bW{}bWasyOSuxcVO3lG^Ff5Dn>Z2e#Hv*#1+Po~naRL)y{9+q)5rTWG)Rd*SAk_& zd;4z})vhm?Le@CE&sF9LrmuOXMAZIVekF)8C#L}a)r_S`AzIt7edYO<0 zrGP@NsFnQEtSgFyv07SNXhSpRhiTzWJ7#Vcd~JT;Wj!r5wa>l1tfV?)67SSIw5W!8 zXlO$F*@t~K_mfA?{zUnoiQZ&@PpbJ@;b$Z*SynYtx(U&JQU-ilDs$5<12;o7O1~kgU zdOY9CxL2E1dLd4Z#8Mg1r=v%CyihCJ-hMaD8-9B=;+$CCnPF7yELaY zvvtn2(Ch$0AinXA&~-Tc7^actw%;`YwJntEixk&Sw>nv=$TQk1EN~%|T@MW3F{7Lq zJpm77>>z*YAv(xeMTmoff=$%6*;VTK5gkVgl!PQGWP_(@?NY;R%!$1>t(mFG!n&`x zsj00l(6}jZkR0Te$%eLN!y~`rM2UPNW`^Uz{&M|JrEq?D;XrCb#el#8E34)ukNlFt zrJ&bM{e8ts)Tv)`m(;lyL^2rxKO)qE0J~l%|tOcukhL1 z>bhE^nZ4u!f%Bxqz z>UvYRV-*aq(W5|qXnm3F)XgfgUwENgYvT%!DJB|KtNoa{>tA_tBfNcv0XDA996Q;= z)7;kNK~?w1dR-crT|4TIQ|&AsFgQ2M?m)-4n~hSh*19iFFLoLNnYxU&x=pSsvTUmN z6Rj>}(8iG(vU`HUgN{Q7g7?Bs>H%r*qb( zcx6X2&Zt;Ne^=(r`9=EGnJ1XJD~|1)KRd5#%1QLtS$Oquq@mPpvQv z(LcG70sZJn4b6o8L3f z_b#8br#sguv;#+J)&sj;*p~N8!S$V!A#XE_-AAxXS+!8B;QS+vtI1l{Ixw8dNYv}} z6=^5*`eRZrgcqzJWr$&OwZ27S3>^`1trPXtxjL*P9F1ieT&-3tn?5=6$+oan`U;Y+ z`s~v=p7vTjI<|()U}h*Ip=47wQVa$OLQ?+Z8jV*CUtI(Wwt8HB4WXZdZzg=kX!cDzh=nX2vz1RB> zSPcV8}tZW5}6-Lbg18XOnsl9A1~RioHTuKcRC5KniW*?F1X40k7Y>%Vw~J9ulsXFY{A zlt|;3Syp`6W(OWYJCpk(LMcH>?EcfhM&X{|&9LmxP_U~toJo8{DM;^1Efm|I`4yVW zEJAdpxDa&)Ps5IG;xwxmO8VG*euCX&!Ee#R# zj=ONK_gcr#{i=B#afL)L!~BNP=4dT78EaPi&1ZHNd62$TF{(4}VZhHeVv-I1iD`Qj zO27sHsQTT=p509q<&5m9GbDbg)b))Ao93HX>+US_Iy`JMQAmyR2D@(Yt-&RwKfc;t zD(yRy;~zeJaFKB-e{|ihMObqohM+Q{=|0&5Fp}cA!`{jHW|x)c)fC5b=P4(kIzy5A zbHuE(5VWDV3yV`vzY5wfFYu0MEVVrfDEC0D6aQc~+CnB5*Z@l^7NDGcj?0_~+OqKN z=!x^H(4dkJt=DOkVtHZkNlw1Ug7Cz?yrP0$n1!4-a^%Zj{MH>pj6_gjS-yrCwaZTJ zP=lS#Xx@m&b$%bOjqBBVglTMcA6al7q?TxX{Xs}fayebM^5VG9UiD8hbM2IQH$e0( zNk@&c*BfN&RrBsy)$zz4Z1!3Rmf{PWTwy+;tE((od{!9YdyPaj>H3}ro_+F3Z}0@C zM{vA{)6MSTpU`zdTHLS3)QeV1l^L1sPdbDI1+n7f5!!vK*5iGNBB9bvQT4a-yIK%sSa)%EEMW(U@<$ zyAomTD#<_KEz@!(VN}qu)+07pQ7;O+#ZUz~O9)IU7_-k8?I_FxyW7CywsAbfN7AzN z+}4-5@_x2qw#BjPSvzQLaBdWG=rrk$b0W#XfL1|>`viPvksom^4Wtw*PrfCTHQgIH z*#jySIv#B?4hB8wE8dyeHCh-$%AJBaV)5DM#wikiA}QJ%B;^@iPNW88#>_aAnIiz2 z0x}>gz0ri6iO&-Ub$9V!r$oB)yAatEH9v#U)$-LWo={d{? z=6G}1h3$#I$-3WV|Bn*N;s-}dPijwu2U0h`!QcHRO8@-sKhzmeT6zOeW7uu2^8fQ2 zzZp#6+U6U6?X<62_V;r4umAn^Q4;sLAJsilmftz$zX-g)KHi1`bm2VzD(!EW`|pSN zlg`3q1n%?Zb^eS0`;>q2UG$g0!+xAi_WVtN{oirji3aW?$yrSD{~{D6{C5F9n##v< z``iDEF8u#r%Kx3=KP&~7Zu!42*8eu?D=Hq^gqCc2Mpp(_m>bV~vhVwYYSfeGk{^!B zc3hYdl!2w~42E8M)Fq@wZ^5=rFhgM&wRNjMp6sk>5&NNtefRU$Fd8&%A0aJmts$pe zjN`4~!J?x#*J=|Zy5T^e{U|F6Z)n4q~{>yTtWN0RCP!giO zK{-`+XeDL~wkJ7`35ib($jkX**dOvii3-AI-in`Oxx2&hYiQ1Vt4xfNjDcF5z+zQV zx;q)SD64|sF8Y1u@fBOH7np6cHvC1){657W?}I)7>(53>UzFCj=y-zK8QN=I$B4h6 zg5I5w&`@b_ZyG~G!AO^6DNJuOC2Hyx_J6B<(jaS(ac5YoI-*19nKe- zl|ec4`~r!i`K^=r{*Wd zzGh;PW)ae_y;j|oW3${CUQ@G{I&kaHs()E2No??{+7$l7@G&0_9t?O%ZnnzaUuir- z2igVy?QarGxL;CGq6C6_8GbYhU37u=_ze-8L)^Dugfc;0D%lH5nx#@h@85uL&bd$nA1hFc6m1Io~=ORM+<}55W22S%?Hn|Pwh^O288R~y;3js zT*Pf&@o_;?gFbXg*A>`QvaUySc1G6}TYTDz4PI>enUnI--Hh#dZFhfPTQ#Wm4xhG; zfJ>kEp9TDQER3{oEz=LT!~g4|e*FG*i%K1xBanlNZe+<}6Dg;0JC@$~k<+~9Dr@WM zVz?tew{`2QFAw;euBs|`Gz<;znw2&UZ-IPHx94Lbg&qnE!d!!htRTVI10FfMXg>v6~am~m~^jXw5RtvIbU28R}{C(=d z$kfzufJ*(q#$IK=c6v$ZI$JINhoP<|0>MZ3z!3bONI6G=yA&o)!x;qUv#-wF>NUn*8&M5^U z)Zj-`)Jku$vgS7?r1mONuw*eq&-b#a+jS52dAz1P&FJcKOD(7R?oC0=hxN|%xZ@Q? zNbtW~576;me3XENSmxpMw5Gk?7GvVR|HS4|Z4L)(@2z}RADW&H08ahUpT{C!0O0-0(iZ>L))ynIcOT0( zKa8lfIqRN@t#y=~e( zt%M2_^*2t9<7Sfgs%mAz4Y4bxxwF5B5gkBR-gEQLJJgX|vp$Q?(f8;iy?|}T2N(SF zF+VsAQHc6%U7BE#gqe%x(t-GnrfUwq$GD$V>T{fT$6qc)-xX6INOYuRq7ldX$)#{S z*mUcrNO!}pohM2e9#3;WHy_l$M<*CCAg;?ckWkoL6SNA_Zz#&mD`*4u^Sn@W<`vVf zr=)7oF@tdkoQOnm&6mf;xlC0;S7V{8wmBcG{#@uDNu^tXK(a65CUO5`Vd>&{6OqF; z&Jz`_{eoJ-VHExsriLY$W+2^Tt_tvEz!`r3 zOC_6BP1JrUM|uNI>%WDTD<{F1*Nw zP0!c4dUEBn6+}kQM=Z9!3UjC7h$;JZ5_{8>BmBr9-1-1U#Zt7NQu$mn0D3T>XAXle zGL?~cGZ(nW;f&>0r4hPYTJK2jEHZlgugHjjuMOGm+8!qt(;^^yQm!jWOa~P#2M+T6md8!4BT-aU9kk=ky zBgu)M{(PEk(}6nkv^n#*cCilplft8Sz!bQ}@6a9~`tSA>G_1?pJn!#6c5c)V=dCNW zwAe^Cl`ylsz8di5qS9bsYpLi1&DY^`aG^`8vk0}6*8Gw;4c+EHlj#VjvNiQ0qZMN) z)u-WlT!I%&Op`LH{q}7*F+$sd&$aU$VC}kC2St85cCubLjdf@MY7&m((ioA_CdbQ* z#NrXH{D~G%#QFTBjPLkurS#Uqk7CTUI~cF?$__89}5bv zAfU>Z0rg7I?$7c!oa%G^L3(bchKlw5{cO`RKE8)c4F_KgeZjmmKQXklgjI(^;RRQh z+$Z^yCLAIW^N(L9tWH+pb~GW(;}T|j7>i~;OJiYC@Otntbz9GPdmhJESX%xnHazPw ztrs)ntrFHVeYi8b>ecTw^_}(h;q?B|{_AHtY63;B*)@m$T59*3qf^X|&f#_eNXADAqzgPzyH;;A5OE zI~*mQ%S#*BM;Z%bCnhre8=ob7+js_wx}Znm#me6% z;{k!7Qsc@#f@ABvqTM31nDiZ6_A(sZ@zRCZN3(Df6O*LL&ccSe*Y8xR_ofNPXqi03 zVJjDpe`QnH#gq(_L|ICi6l70+KRL3&4m-u! zM7N-KI<|~b%Ym^9q@`sUP-^ObS(sII&%GopFZv$2tA;P8;G`gAOwaa~XeH16n=K>& zCO>3D&wjI}z1W8McX9v-irupXVac`((OW#f6AXifwq0oZ+^q+wM+O6)E3PpZwZFo?`bMP2^r^oEDJ zoRSi!1(r@kV7;zq?p<5!Li~!FpE*r%Wg_YnRb+K>cBY0?A8(|z8zG{n6qWk1Ne7&Qm&@(+vf{*6q^&kG;2!s#(L8(e+WGiuf4MDO z(xh@w^Z6@Il`M(q6q_g!2}aW!Z}4u*Cz;zbiqXOu{F5^l z8n(16x{bW)AbgXB8W`sH?C^0`N>)=z*X04`r#2JaxKOnfW^d!5znzlk`-zB9Y#hB4 zNllrl@(;S*9oY~VF;1}F&I!}gg0tPDBt<5e+|JBJ70eX7fL2#rI!l#@&ZAxB0{9K(Z!~Q= zEyJ~MP3;!8MPHx9GOG!8`cDB3F-B~^DLKzbn%Nbq->hO-=BXvGU0v#filrbcr%iL9 zn>6gfPhYXJ>ytJDNflM|?-^Bx6@+nhwOnMVNs)%5%3C|xhc|xH^b%-iuAfldq?#g;?6co+ z30u+AeyFOO#cn9-9e=;mX^>sm=`%cEk^gq0cH3bd_IP%C>v+P-t?nmcsQx8tctjNG z!tLkE&B(VuiXNk6sOy|I=6@aVQgMb7yfbv$*F`7i3==mxz}Xh~4^<2ZWI9MqT~ia9 z2VV<`$?XKWzF=3|D=uZ)71^CKvzJ`n+V0eG4lXMJY*u`I1ro$`IsS21k0ttU^6A5EB^C+d%vqnLooGoCs^6emRq$w-^;eUdBTxIgqo0VMo}Ou^ z&74C5gCX27eT+xMNRStKhRgiY`Y_&TUFFlr-ifA$bAu!;jqC3X?P6dpv)gf#6NhXF zow}K^UUO#!tzs5KWXaFJCIJm(|N`V|_>L-__< zH9H%%eLNjZZDzmxaz~CH+>xUWZ|)zJTpm0xhDOY^IiM<0o^aNR{}F0A!S_gVUEhJ1 zJum4z*9rawF#p9We;gnm!FZwrh`|>W^1qdb{eHp(0ye0wKy6g3*#P(N2IkLz4V)+d z|4NBb^!xLe_bb}-@LRsW0jIxx_fJsh1@Ig%EiLjtT;e|-w1fjp_GW#S^oQyDOAq~+ zwnqvyfR*$2i~QfKefVE*4Pded@&6q7|DfEjA^-0qN|4f{N&vr={RC(P@q;ueFX6nG z>#+Stn#}rfBjv!d(z-Z-S|igP;CKI z&Hd+2cnl$WZ!>GyIob9>R`p9fQKaqsbUt^wZ2L>(-a|U_j2tUVA`S*}W38V3#ft(j zQF8~K=k}%;15#Kyc6|c__e>kB34T6;NDKPJIdh{t2|EejiMng=ulS?4I+1MhWz7sw z_|g>UF*gql8k?STwc`58Onhx{o0sB)#(a{}P=~X)j8Hv6e{s(NDqO!lPcUq){do+u z`RR&@m>9EiTs#M2WdKyi_K%4IF2B%Izj`aNXF@tYA32Won?GA!PI%4se8ggP;IGx#W57-6^Oyxb zuHK!5Hka7Y8XDDkYgG!x8c){+F2Van5liTkn~V)c?&MQi7tfs-dsAzXA7uu=$yQS_ zHr%a#1DN1DBjRG5i0Dyc+_Vw=qH?Tgs?$nm{ts3F;u;3q(A;iY4&rV~S_8)1yARs~ zy}JJQ_K*$XKajXw8@p*NR`g24Sd1n&mpT-caFEEca;nU<464Ep#;;VMfea5eevrmQ3v^6=22&kujJ=vR#L z84X0gTlxkKx7pTZuMIt-l3QH@eyq_8otjVo;C_DzvAYJu?ade{`SJ!lcij_{UX~!g z4{E6_E0?Ponub)=3W-agV7ACFnqlEJwYuPJ=KdAuzJc3hD*{>^rI^^5U=cB!p=pO+ zp`93N*8@c2! z$GXx;5UdGDm(dJG>3!nU3T>$Z-9HMyoTB(Ebu}adf!wD|iyc1SX$0JI+aQ|5gUMA3v8r7#}--ztKU)!KMuC>gC_N%4Y||>9TGdI_PY(blZpXX@Qi&-I$Y>+2WMf zZ!~U3F+k3<+M+1VO+Ged#)&!66Gof+haC92LLetpbiI7@OybFqn;>KTTg6yov^N+`ApUm9bn;Z>ufVd3E3F=@V+70x_iC;wjrAT<_P~m}Xh7#6%G?CVt z^uav1z3!KMZB|0QW;>fn-SGGmX?!cwG|Y<<|MsE2^Pjc-`IhJi2u}yzFls%t9QmI= z@^A%!;HJC;_Rm@W68!)C9QE?yAaaLW?DLoS{AU4tyjYr#DwBchgMO=x`g2CU&VVf> zb^AK`=0D^9HKUZ|2T-=;<0PMdU5{V`5XB7T72YNOx48~UKE&g*paxt271>SlU@f}{ zNzeWrl$`}E_-w>uzPr%2cmhYlMNXb1VJn6+&>uc%EC6$1mKTTO4_2cd!c3zStQ}J zsCQIUlrK9|5Z1PU@-52t4NS{`Z^>w}D zW+e-yUz@muI`k5WMG+4lpJs!cMmbJJYC?);BZFefrK(Z<6BiprPxXhZHY;uRB#7C^ ze^4K_A2RebcCgV}5XM~BlP(NHrr$>wKrBO6-qjA4|KjcgI0GU!disHcc%vNi8!Ff))OP}9q^!(| zhYz%bhUK!%`&om~DahBTGkP4ERC#hUrqX^q+qGz7Mpdfz7q{-goE$5#^Bk8ifbQSc zpLdVky9O6TCV$!PoB7fqoGH$p+v4r&WqJyVa_nj*g(W`(2*!puVH}j^R>uahB(7(w|;6p8<@(Wo%(B zHy0~}YOEF}kQh0_KKYO%bGdE{8 z2bNb*Q*+u!7D}h7w}VE1_in$wzwf?|ZT{nMmkxz)*lT^e7?pwQ^Mr*!E3m_W(|l#k z^qgbqGx(544=;OUh^@hNjpHsPpx}ApwWPc^^gH)IUJ3AJT`_}~p8d0?I1mbT(8>{w zd>@KpfBh;Y4I|`E{E9`gZn4B{che0fkN4NeKgSQ@(+fL;1E&lINW5Odc6@q#h)n6`E)vPeQ`C;HLm{H zvEy7IWMo0rY0T@K{DC9w;O$4ua%)XC#n)CH+N}3K6p9S%tJ8No@yS}V#q_N!Pp!t( zQQC*qocrdVKUpiBhxhdK+EHU=qDCN2O+5|bB0K=x-BFS4^&3;-y|V0M3G$`UT1mp_ zBTfym`SRuEl|&Sls{Xrre%jaXAj$atc@6bI8#VS<9`#QjAA!soutfYeik3=ks`Tyz zfGcU8FTh-z^J$OA=WS5#F5DW0g@oF5K`+*Jx7}XyTqg@3cQ5uBKm8K6>{F?*d`(}((v1f zHw{Je!UCbI>m6QJ40w*E9@H8DPNPN*XXojV8bp6`$1XuN)sKC+Z<9y5D zFZ7(YEzo@$Wo_RZ$NEXbqj6-y4sV!G7jTxx+7@%;&6>>!okqXkpYJUYvdvb(4&Lk} z14WOyP8=p06d3ys2gG!edcrlf;uMZ+lL3RbkGnVKj2nH6jrW0k5cj=m{s!4TEtAFV zbim8e+(8yZ>~D2tNc;7-dig5@To@D*9WfRwhl7-NUmI>8Yvwo-+TQ@x1tod)$ENwo z+*Lqh?@-5?BhwavKmuO0w9dfRnZkPimKMkjnHTi* z!XG}S+J3!tqI)$<{6l&E)R6|HkZJ-=dt+SuO8M5E8_BM_O!7~4=xbfc1vSUQk=~KH z?1v_&2-f%Qf5Ugan+R4!O)~!#_+07X`0WlbtBm@ zYh*;4rP;oxY-_UQuvb~A?MgQeFJX&{lR_B7nVFf10jQ}sX${&(C(i_5UC{uQgZS_+ z*CY)JX3jTvPC zTY2?iHZ=4H0}Ty8D{r&eO!dg&GFdBn{=D-ojy$;d}e)0(P;isyt2?EOURMl7CK+&xdiZ%Haab)VSw^-^;1FNHl9cf(Jn5QYHJX zo*+FLzJpy=+hPm8d*SB0Bgy+D_JSv49z&DJqlda|d7~HXjfH;Y#dVV1tA$pa zwyO*kW>ZKxwQ%jo8CW2*JUhjC?Grn)v;EV9gWt^yA3o|PIwW}2aO714NsUCU5yh7v z+|<2*M_DhU!&kIi9B($!_7dn@o^uv8c6UmtsqJ+gztm-cWZ^rO6T5hRF>qeSze>-d z88%v};pS_z1$xO7d{XvmF9xpM5nT)oR1<}y)z-p#rvjnCTZp1Rka!6@)?=hF+|>Mr zNC0Ft94#}S2R#@-MHRBbYp{1DC?KPIps?bh z(vsbBlgQG_^4Vp7kMe}lyYXnN>Aec&&Qr)se+MgQRkZNI+%t}VH0eSG^^2FLb!+mz zG)VPHTKsfcr63Vn`^0d#QpCdgCqhCj@+<=zCwpufK)>$MhSTQFk^38`H0=H`MoKPx z{RWOe!(48&x*O?yV{@MeGd>;8Cw2>P^fpbxMaAIg472VuQd_oPVOW@0c)}IOWz=1Y zY4Sni{XWjc?n>~Ys2k11yJ~ZO6@Jng68oUWWdvUayR&$+)sQr|G26Nm!q_U47s$^! zWhJDQjS~@&kXkg!BhF=S%gNN76FD}FOd|W7%<6OUDZ=hXrs678^A*v?kKPku-!kFx4osx6K^5kzS zYWJH{Z&~)GNCqabHgz*X`PW7lOwxIzC+d5St`NwjgJo%y1brjVnMEumw`9nJeT!GA zNq$#Z#*m5XO;}>e#mZ=6M8(3P5J5=^mAXadSF7+o?lcZ<)bifq++&IzlcVKEf^RGW zh&(|&z9G(95LOv@P3l!4(6uF)STw;237_`R#iHmZ8rs=r#dRgDRu`Kcqj;~+!QYR% zN^YM~?r3mi@8jU8;o&OC%cm5joT1C0$+RyE=Y3d9ICij@NXg=Hx&C;WI~E7C1Lo{S z%9tY+4*cTVR7eBCL|QLwj*SC*?{K6sP2P6fwr95xU^nj!l@-zc6>dcfZ3i5tPz=Ue zuq5dlmngA5G%OdCjoIe8hJErp4_1u@if!X&A%SPDZfBCmVmC%xg;lT$yV!Z-Ol+`9 z{tK+F&Z1(f;CaXF2X-70PABZr!dOtXbBH7JgAeLniE7}tAd5!acxs)-Li3tL;8G*_ z!|mpWvHekX&w0h#+fhrqt^Jd=t-v)a9(u?!o>1TzkO5yc{Ib_O%_{89ZYYFU^a63@ zYMNlC!tgfH>bZ+b)SO1+6-9sj@JwN2=Iy|_%>EO=NC|xUlrX;EO9m3}+Y)ILRe}$* z2j`9Ni`_c{_%}!1f(@&?f!^*h+eAu%#6iShS(d}?gwz4F$GqW*N{X%Dp`j=2qub}TgZgcRbKXiC3^YYxTd(sHK&cMzqY zSdorWKUdgl^qtZ<>HbXt#Xf7veWc~3&i!~`M48ZZL1UpvBaih3Tz{AXj(U6CO!Y#P z-#N|LYNhzM=xjUcoZijil?aeGNk5YUZN{3JIIZUzL1BRq+qK&0%)LKPvO`hkqG+l zbHkIBC?of@)d&vX=WzPZc-4p$(1|p(8wq)f78`^%zZVotuMqq&5RiR&fZ_^mQF_o` zBe@nrK}JCXBA+YVEea(qzNpbvzC53IY%TWw(3^J`>gdnne=%NrdB$~cwo^D>l7!Yf zGiJ1vp?KkMPh3LsoBg&;JO&KRM^GvNF6!I)} zG&5d`jD5Ct=(wslwn?a5!(-yZtVBHegfDuu>y+(LYZazXLsE~lyF>9*hwFL)i-sVr zWECDIIC~n>!ND~VN?~!8$p9~3%en?vYIL}Gz(vEhW-P{$T!^Bdzq0W%#irs- zKf>R8j~+16ZG`1_(SWm~S`6N;r{F&|9vr>qj#@BOVtr`?+*71q?#ff3UuVf%q-;e) zgpmLRi#$&8T0`E{S?8Oyw5)7d94+#g=NErmY8tKem+Ie6cSv@}Mg0R#j>85LxzkQb z%Lm+QNjK7;gU0;BUq-5s8a9dx2KeTkb6FL{X0^4eO0c_bI`NvT>aE5wh6Ib3^rVBt z)eBXvN>}Pm^s^#UXt1kV-v$i_1)w;i4Yu2i0N33U+*YSak>Vdck;(4iDC7&vJ8~s! zDNeXwZ9R`Pc$RS*;BtLBa^ZZ_d_9eop|)RlSd&(m)R?`lCZXYSe9n8zU&QQE4*qVgiOAI zojN5pZvf7DOiHq|5SywWe*a5FC#Rm8+T^0*m8jv*wlho$AKQYi~f7<1N3r6+#w zRK1u&*=i-upIJAt5!3yT5CQ{b-){pA)=^k`G4)xOC*+{@iZKzSOfYH4M6~#6T)jrd zQj`P@i#O3e-dMUCmU}MTk?NAIab8A6-dY$rd@4gXYsY&_o2TPWAp#4OwM|C@7d(3L zFPD8qzF{_9#!_A^KTUQWZkmdF!#&D0q)S~DZ-s7$877~@Z=su*Vz>VS2YF*4!9r(( zu23kZfJT&y$-?W0`H$fwIf}$dnxJ^m$l-v_mS2yIE-3C9%SjpQ9MNPn0Ft1POw7HE#X09@ zs-_vQB#C+-!`@B2*u%1VD**YWXSG1lMU+np&1na|%BbW6w33o8N%HP4?FKb_MFt`E zIgeI5C?M9g!8P|DaeVex&~7L5s9{JIh}%M~WU?N7mE-NnHHTX-*B8Y?e|CD89O%2SS7yy5doHb- zuMGCJGBU{H45+nAeHV|^DMT7F+@kH6I~mLK39ea#qdwe{PUPn0%3^G5qdg_afRPlF z=kXMJg$dFbLn1_Z`CLofCCLD6KcKmw3E<<9uhf8y=?XI34 z4g7l$q>R<$J>8;z`R5CU5icJ_SG&Q&U z@ynXSX|G3b7kXSIpK;|Xl_1IYl8~#hC#OeQjYAKkCYL#)qgkaLY46m%mb;nuQ>2FK z)K7MlKHj0e)TLS><#m(orSVdH3bgBAY;c)g&o0(3hsZ9Iq}6THNJPpmONX^?Y39%> z^Q~l?FOkP6xV^c3wIi*BM`ifETr9H71-mooxja+_``37Ov`n*hdAc_k_rAIyb4&I0 z7eeZCHaNu>*TFY}wVt&2k&6aQAy$-I2714s<{eaOucY z-ySD-b3yT3qUW^xBU*jC<(aeAHww*Or+_*; zzYuzn0vZzYFiV>cY<`1FYoziycQt)W4O>=g!Ag)Pa~AuzJuGipEl?*LC&;^9ehXcC zj8hEdz^KkCqcyg3Z(}(bOAM-qtoM77lGlth%x^H<`gyRquXP)R5+tk;Mr{&H z)Qw(rAMqT9a+!39n}}qsPJN3)5IxaHQ%r1E**Ib{h$Qo>dcC&4r@aQrFR3LVt00cG zBHPWTg+Ybx6>d(GMj+SX{Ru2AsOEv(n# zkk`KF0}51>aF#8i5X`9bp2{_J!G2A5Hvi7H?eRyo#+m`$6aG4I?d0XN%7>6-lM0;u zReY|}Lhcyp^7z~HXt3yvj&!+#0OY*uo}75hYbC2wQW}xh5_(n=_sYf&jp&v_e4~S7 z^_@iIt0r@G-x)b_uf1)OXu0z|12};j%@Ux3s+n>OUXA4uZH?7d%EO?U0W4ULer0ey zaPPZsV=-8CrxN{+gw{3RxyhdfLTxqjrY0lTY6_DDo({WB>yXB?5cD+^%z2g5*KoIbn z1X5%Wt8CyKPN!+&oIDz~h3Z9>n*1ddm6RzP4t0o#Y&nmPUQ!V;G<{UFR96D4mTIN~ z4Mth~?YU$x)5YrTicjGB(NdDZvrsvPKVX^*=u)|2F>pqE}Yf!o0DAKil@;$uENb+ zMz%VkBCrBVB^5a6>8a-3uIaeN0$g{#nOIkD3d5*c5HqTBzdY2~eLtLUrn{9zJ7~kw zt!Y|wR86B*6)~6Ib_ioMm0vYv@ad_cplrI{2U=`p@gK3hK8w$*+| zDs{VG$V=*y34&RfD``ctH>N$oDN8T$a^%IY$IHLE;SWJX~UlCJptg@+57%Jq# zi)=+}T>VZEHCDbTh8|666jS1+_MWqB1V{=I=LOTbvJX~|iF%*0XcYEPPG_1$^BKj` zA4{epw2_F=+F65=I!byqH#<}&IB)J?U}1@gUKADYPFuj|k@HKm>9&A+G?G={NOo@k z*dlpqv`Uq8+Q7&7H+QAyRT+iY`p0{$Qz#+O^b(O*YlWt3Xu#^C zpDKBFj+TGIa%&3H(L4>r+hxPH7jKl;UZ^?UTYuSTAk}A@ogfH~(llLu|HfNIq&6~m z8G7xdd437&)xn${5g2=$;;Ep2BfpDu3fSR?pTOsYW{|TWJ9i}yEjjm@PsSw7^{wii zHw~f`d=wRA3Ut`j?nrR4l*HF=>C1lnM(azq8t`qKzx0)Fv(Z@ZSWjZ;NuYvw?6=dm zoli8-UuPto_$-?mE`aBzb3>_md}ni_mM@Jm`4<}jv^DNI9Y<|p>y~33v1iYPj45CHeR3-O^@gvT{DVp z1XJ+6hnt9#B~9o#WA35*oFs^ZrBO)OaQ=j>2$V!-KLMOqPk_r?bhVVh6Ka>0Hm+cj z<#7oTB(X)=4J<*bh4-H(`f097#zh-B^rtM>rm3VcrUH#@f-bHJS+%_5VqC|G@d9`? z&{En-6o-=txL#EvYT3|+_e%?VJKegx?;Y*pMUTi&Pp?XHpO>;d+eiMe#Q29DBOA&9 zqGx1gRfiNTnlv31bnz?&T7k#kulJ3bE8D)w=W*5Kthtnw$wYbi7qW|J?J)vDcoV1e z5)w4Tr-we28@fbeA?{fy4Q-Y(VTzBo_y=_swet)1TIFu)yPG6vjl&{QR7JG>$XvHi z$iBBGj!3b@D5cPTYLJF{j~3ewDHJ8dnFRy_m32(~jOe1IcP3oEB}TE*H<-riWsrrI zlUtUN<;=*+=|2_pGpkw8gb|C%UQ2&QL~6A@Ff#qE)(q7{vm8A|*PPtz zu&~l>WctOo(kc+@4i!8u={P4-NVx4N@)uH@p?ou;cQ}a2nPG~`60#oVdVL8Qm%^?J zBzmChtu4CpT?LXvv50+w-1h^XUT}-85s3chb7h$0`^{z#WHT^?q&tnLJ`IDH+N#7u zKpm5+Uy0mt|14G@7oO8>zcZ%rYDs>O@|&TEg&+EreD>O9JxgOYGQ6kbU9U?oHF9lS z!m|u-5epe24>F-D%=;tc4CEc&5l{Q>{rdIZ+pdo$Eef8geyFr0$A@Wew_*5enzmaBm1ivyZ!d*v?BqU{yq6yt~7E80UYH<1Rp z*s)@J7GmxX@RMEzK% ze{#2v;L9L9=*buTC$aG|XtLj4yPQYF5kt2X34sw2jIwYMHfqC$(==qifcr? zB}KG50w)^62NI2?ny~K6k1XCV=kk5y_n}5id)f9FB!k`?Y!c6AxSRof7-Ici$<}|9 zW?Wj!gcLF#THt%QVlFlorcuKJSunJBXmdD{eL|XMz`mMcB@Yp1=-K)VcnC7S?qHXB znj5eb7fTpuvamKR_<-kgkH^bAupko`zbdB8C>F`evai^nvGT3T_K0tS?8IBflqsDL@*wV7J%(o1? z&vCoy=Li^oEW%4hW2eI;eI>VXQmetcUI!}AO0C(9C3_S*nw3h{T$T{N>y}>SpOLGW z+S9hyxnCdP5P+R#Cy?w|fS%CnU!DUu$wWmJh9EVC5-UoyM zv&-$~Ki~5lm#rs{Uw&EUG>VH8#7@3pg2<=zlO)0b4^vp^lhb@{({E6edMhjhvh&$; z9Cuu};wY{vpjq_i@~s(^nD+wL>_g-u=ZNOnzTaI)G&KJ!-iHe*@XaV5yR12J&laDA z^xFqj)md0OFYI@;ds?}A9;A?_Z%iTDI2C9$b>JJx4qYY^G-(~*=m6f$vDu5N*wxSs z=i5kM8u=8a6hm6SChEJj_s@CNnGa;Wc#0daj2CKnZk|m@IlzKmAMw4+Br|TFe71o% zi7K`-JNvAwNiGb@T}K2Y!JT|l=Nza2)sDygN>qs=U?`XQ(<^NZ%C^q}ih}GX83pJc zmF?N@>$}`ldFlDzCCCJol;v^_+4AgfS16kJWyG1XxKvv%Qx+2O4x*h%cuwf1XRzJn z(c3X5kwTzvhCsI+@lYywGLGL#Se7%IjInJuCYs#FQ$G_-s11o2B}3l|Z%3D&9eOZb zpRB?ZqeSm%8|>Cp>}rW7La@lSGH4)LbcQR0aaau?Er8BvZ=OY`=%UYp(g&`is&r95 z)+j3_izX{6EZUYQl`x4=_@1T|li-QD(b2?_A%8f83>!PPy;B(}oGVp$DUmXM-oC9o zE8N|d<$D`=T0a-Th3G<}GEE=8-LFPRCQzezfe_yzk8rxf%NIX{4N}urc(=Q7O4;#4 z+5XIbZaPB0COCEw$PNNJ*5~b+a>H#&<#)^VF{UO8B-bF z`ZQr;Az2Bcens!`yGLqr@U_zgxi9$TES^(~9ZMbV*=0CKuYRLt!y@OP+O`ie0@~5U4LF7U7eoH! zb!&7;OmnVouie~!h8M+S&u}0Xyk96f3N=&mpktSt`31UDy+&oIlI$>LXfik(;{o6J zXywzs$w9Xivsw%P`mIk8Gc!pxSw?iT->OlIR^%V_%YR@nKi>@L!d0b-**sH` zp!oG*4<9PI+2R0y2&w^U%vONSHzS{oB0QMa(+O#a$7V-CJ;b9Wfbv5~CJ$9-XuLI_ zUwyYtsYUW{`JCTTQYir#2k+NF0lb*3jbGgDnQ;j>d_Y&1D{Gg>OU#_j#_iMVJj{(l zxLsK@Lr;Ugt--{0aa7_|`)ym95+cw)_v$yYN!Wn>7xCqrAO+gA?{Hfcnp)hyL)3fG zY@2zd8oTI2lpM$ILl5s$_6ipyQBkyYwmf)P~Bo zeBG0O8~!mdFud36>;dI|1~<~o^TR?klj|!|p1dXA?mML|c7N{y|I}vNSZ7F7X6wwe zP^5MxkuFTe^EN%5#Q9WDklZW9pvV6P8skLq_%c>9Fv3&Oh6oRRiC1j!j;MeTEn8_S z?yJOGym;l%H0araM9*&+sIN#NT=ZxCw~t8D38vfwu6c#mb4*10^0%kWCmjK86%2QA zaY01Sqh4)Nyrd0eK`K({6D$+WRQT_N0P2DS<<;UDwD@EJu zDj|`v9$nc636igU&KF$8xNx4M`8hpzh6Bzhp4?n^Mx6=wN{+YGCtvsd7H+p0H(F;Y z{>!wOlkh=Iz{9esBsEpBYvkcR_1*dMn3%fB<&dSt!0S?gBG1LC%$c0)0*elUc#~zz zaZg4)#t)Heq2rRkEQM@C;IY|L5RhdX!iHX_SM?6u;q454^SFG5PQ3;xJWHaLlCZ9D z?=dXwa{I=eSBs~o;~0!R&fnX9iPTEN@q|DC}C-Ps*HOREz3SSsL%y zkm}Z5k*cnE)+o=7RVNQQrBPf8@+`NsmP!_ZHUKpY9zgjxd!8Z88)YMEAZNZygr1#e zCgvaT?0NwI!*@nFIJlN(sO$39Wr~jz6B-{k50;)lR902tW{{KjvNQzox5;D6& z0$Dw;17EmKM$^CT@gw+AN`OmvFrHh4^8vC5PJHGcDOzPx5CE-U%8~j4vAaM==Q%DC ztTn!M##zpb?)J;Q!sXp@9H|cx5}Xg=D5-#^)Z6Q4*TQLNK+exnaRs={B{eq}fmu%@ z&;oLEUiiOZ;ow{gx^}3MB5mjmM!xHb?BfY{NYf3sj{NzS?)n?^ z`v@sjW`;-fZKPJUJON)F>?ihy)hbiWG@)S!Tu^WI76K!<_m}!I^*==1Nld`BL;=~8 zSE8C=&(8piugRm{sqFRgwY=bL-dCiXwZr=n=UIAHC3ZBXZpAlG#V5 z>y-1=$e7!eLB`AZ4OA9QX&*BTd|(HLETJ<8st_y=5A8QjCkRTn92~0cmr;U^v8$J# z12<(6%&?htET*=W;Rigz$5d6xLzd?sIyycwlFKV8L8lCQ-VC7d%2%`_S@vCZBYOq^ z%i;{Z0z54VX00cbkPUiJ;06-t+UNeQ%)PZA^AM!Rqo|Gqj8x_etmeh46?~s^V#p9W zBFhlELWSN^*bdm1$N^kJkAVxi`Tm5E5xuY>MKxbGf~)7V_m^*GjSxXDQz2{86xtF} zJ#Pg7!#iUhtBv^JLH$cWpwOvl{X17`| zt4Iz{{2Z~WBOcEob6ij7xsMf2sl5+QJZ;j^*CXL=d^Ax|1@Sl{#<+53XKm>(-UU8- zTtRO_JqTUSo5kFQyNk;)G~DmEVV~s^X-z7)I-`8@O>8R*tkO)qviNzPcCs#Cbh-&N zx38#W9e$#Mx3+)`h^F^y*J_4ZxJ>f$u6ljZYUcX6WLUcHdOg1Ct^@yry80J)_eTk@ zU7u-~)t`vn0P$_j%bqd&i^sg4(EKx{R*wfLDL4z(>Wa+<>1nG?pFSa&+;@(dc@XG7 zU(v*xaBzM`Rv5Uob6>iA4KQ(VG%}4|kIh4WX}?(9up(gqHM%(|v|G5*AXQnmAmDo5 zJnK|8Cbb8=Dxa68`MpkiHhZiz1N)AMlss1$)c!j!z0RinOSQ-Vh#}dc!h6%G5DE}m8wph~$qsH70 zi+(b8Re$Q3&{4;in8U6a6$)|n&sE+U{ttdu-T`QRsKoQLvnCwRHuEUenmpch>{)}FNCZO$Vse0#oBs&e?g?$y6} zEZP84omDt9fS~bPG$HE(zR&)96t84-%X$t8P*ojP4BJFK={VgBPKa>u9SX(#A=!;U zjZGUx(ZFB3_3Pu%M*wNRR}@^JOZ|LPyUlFl?Q&~5_Ym*!FcXf+8i=+6vqjy+c&+x} z$OgVGD9&e!_g28FFeSlxoV)+`6y5K{_K+t63N(r1pvKXTi{}$+)g3s2zc+K4Makne9C(hlzJkZrV zo^RAN%LP(^@iIxD(O|xn0r!G=#1zGo?Z4eTK-4x5ptJL=FWxHFLaaDlX{~SHy@bg7ILyZmwjB z|6*}mvF%HY$}y|Dl}TE2kb9eKVGat-FoOrURZsiMZr;<){!{By`-p!#6MXHp{YjzAzVrw#6#}cvrC)J5O z&K_i&JG-)p8_MOYy{?U29xmD_q{2>BG#tycCWj;&0>KtM-dBpRHA@P(_We)iQc;6f>)P1rE^$OxB+SdBdM7y2uRFLZYwCX8OG zi2ZNI>L&vx6x%e-<+N{($Wu*g ziTj`@ShI5Gbsb*7-)`R{c-0{HW*u*GVmuyhQq8UBPh_kaoLivK@N@*+gP-b!6G+_` z=2oOt_4(g?6IHYllZsSw-wtrdt_%6R-Ph7P=eYq)QaJ<=Uu^FwKM_j%1U3}nBA$4Db!Oj{I}XHgM$zYHopkmhG|?n#Qn~O z+e#w7sS*}^Q6kV5g+*HP8t3B}7GF+HqVqOcd?Q3PylWTkGhfX6d3Hhu^sL3;)|@qV zH(Cr`pMkU+1It9|S)e?~fC>;26@MKXHOk2eUpCWik5opUd~2Tpiz&3vv6J2(6Vn*g zs<2!#3;1n>;DcNa>~S)iGXJKM`v&yQTS_AHo=4)iSf9IHv2f#)JpbeI z!lqgiPLEWyC~5mrC#q|r0u!ME0jlrF?)dbIh|i%Gu>uzrtnxJ`h3P9&U%P6u7!9S2 zF!V}OS@Yx`8w`FUmC*J8Sp=9JStSSE`{CrQ?EOH`=1ESRLj~TD!g*XT#$rsfc#_u> zQCZNcnFD;9O}kF7#Ad^H?xvr{wX*)j^C5ikXb1RsJ}I%S7N=EkeYrjDksMUM@43_F z?!|M^G<4*bWId4e5q8-%mIr#?lHcX7W(m$U5DOzAuxKh;qv=INXciwLxn{^_-UigH zfXV}k@0_uMOe6&kqcDo1sV00LGXJI+DegP0HRE)f#!QRta*Q#fy@fVrqap=7{nC(5 zADp+)TKZ~+$l}3n`v+?oO$E68e6OL(Sv~|5f}`tKse?ZNHNO)gFVWVkfis(=SMfR zVb8Kx=GZCtpMeHjF+FC0TV1t!7Q^${-L;omH~L*&wt7=!Yc$rm((99@4t893;mLkA z6(7D-{iLTK|82ZdTs=V`({I$Ks2v12EN*ncTTCUk4DkFXDf2vk@#*n;{m=^DI_$u4 zNQk=NGn$dS4{H}@md#Q9-u=OXs#4{hC)5{}^!4^45@Ls<_I%#oy3?526_ETo1sBWy zos00)-;cj>@7iFw#sY+2=iA4A-oN+#hcpB!Gc$1o;a`ZD=`L0jd^CHzft9A;9lJ66 z14>fzt(`PFGkECRQXPhy&o}ZLcq^v=n^x58*BFa+Vq-{293?9A({){b`ejEyEN*%i zpY_#FclJkU#^t|p+_B6Ze|6&n91GKhr`-cHWIFS~h&xHwW!!}<=F(+d`1--~4en2g|8+1IV*oa=ny{SCzcQAa8^3-4 zN>(#ikn+F%zbkvZ(6#4R%NXUkf9>H<$^mnFo&fZ2TEHuM-=;)|D7o;0`pH-B!PK z>z1?`{oeDRBd@(d(?6T&pN}YA8|XJvL8|>iD_OJjjKdkZkyM~*>BoFC`BWXb{WYH= z_CMaJcH;l8Ed?UKTK_UPcSPx^gb<+W|_-%2M!?|YQ^v|^jE<97% zDMmD5wAZ!gQer!S~zF~G<|K|(= zUzm6mtJt~Z3iBTa0i7(i^|1ZYiE?s3SZyDWP_z!s*uorGCt45u=*2BHwbJY($Iw3} zk$tj%_Pu|qOgDb(6sFbID%(u$boeg}QF5irB5(syvcWLxu0w*GH+lZOuTMi&wd&UG z+b{Y}^?y3%z*XK9OB-m#=B151|7pe{*9mxc+!)I*j5p^P9DbCvvV-~3OID^69esGM z;94(9euCb~X3vBEpKf}33`L$>h=0Jq?E7J(3BP;j7Kw9JdI@oGsi_+wumd zfwp$11LEBc1C4haGr!+^HDApAOPA@|q(tK4b3i%Hbc4(;oJmWbclPdXO$Y?JN{t}p-kRN#hpD<&alEU})wRK@?@xr1;Pw2v%cFiDw-g+Km3<|_h&$}P3){FjzvggV z%D58KkV{hm>|f%0cpdwbTjmbQn4~x7Q!Z_~Z|;5RONWh|pU73ZScdpe%6n~N>x8Ky zTLhN{)i3Yr;s`F>O9HmG&=ip5_gc`6$lhibjD(0KN9HqrryKV({KNDIhcgxmf^40c z3K2Bu3aFolOAdsd-x2 z7-?|$o8uocG?BduDNEUt`DSZ%p+;ryX8`|~bhz0EyX+(tKx?m`8l!TTmOjZLo}~T< zANb^vq=hML^|(&_UCVcgQOYZ9l*mASVV3_gHrGBS;HVr)e0ufwR{vG+U8=zItuES5 z`(IV#U%yt~p#>EB5#$#AFAVY@!AXC0lA)IHkvX;Zr{nf_k@`a`tuk{3u^r-GbNtRk z0>}mZdB7U0ipXb&{Y8UcO~$y0GKtiF!5M`=A&URJ`HwjUbMPyZl)f_a(qa3bCx3pe zHxD9l+A-($dHwtT6&?c5>8nSPPFQ5?(*Mk<=rDH2!TWja)H&+xuV3Ge5xPen3I1v?|MC=qPoF6~Nx~FU z0(@kY7=p`63g_MgUlGvK)`mTBy=>w#NB#Rn_;Ham_Z8%ZM(CrLnhd2I6d?M$WmhmrZOsQmSp zEU4BpjtO4UpM`xi_kG#Tk_0DW<{T^bI5F#L?_X2-A3g|nIaByPi_XdBhE~{whjHn# z5eZ)0DWk}N!3ZTWv$g+1PGtxg6RPBbjqTNO55NtXd~;4W^HmQGtV-^E#Q#wK&#x)` zkF(ARzO*lD$2g=g*7ilZyFH8r;zv)cx2wtTxk-8K3mH>GiJ^^c*7&jI=f88yo^XOn zSZ;y%?ELR1l+H-`$2-1;;Q2^R1oqfirq8E!;@AT7Ndd+N*`Xem$4xI#c#mIkT|u-=KYH( zpZIYP@VFIz)VmJ;z88i=G76W5Bi3%!-xF%?Bkc)(Jam=#CNv`9TW03fjiuXnY(8Jf&b)XdjYaL`dq|;$o7TI2dB_$j zF8YJd)SYG-ULgfjpUq|eWDuO?pOV*wpr|y>MKzD$(fMT>Cr_SkLxqk$mBh5PM+3S2 zyCx>dhGW74s08cn1s;4UG>(_kd#9hitBq-%B~kRr`jmdWWJ;B5^XY*y3;*6k_ML^2 zoZigpd>ws3&|t7H)Yl+JN6B;sgEB-qj!fm*sjOe1Tj;}nf7`j@Izz|e^LA;p)L@y2 zPD@%^5-9Z>rs*OKq~NTpiS=ZKB0^p|`uT>-n3KD^#R3J<{=QpxSF1baA@SBW;8rX8 zgN)Vy49X?-p@Dv@tFF?3b%1pBdwKBJ9adKB-5ws^Oy5Zzg-7xn5q=epMxjI?ZArU1 zh;7LQ4)s@Ad04a<_+e|lAaE~ZgXpp4J&QI!+@W4uM2PSUx^3O?`*xQ_%pwH1AX(#) zdz=?HH;-tKfP_Tf`X{qdMSo(OS(X0me6^L8)pQ~+hbL0A`@r1&V0LPG^xzJ^fB0;r9z&4x$gtZ~0WM zHyrI3%)rSDwpZ}kb)6{k0#MR>$pft%EXhFYsWBVy=F^G?CWce;*|yeqb)1xVT`D}c zQyd6|!R z5&Ev;-KS_#O$Y>n_i9iscGmQ|u4LerQ7);;w#golvZ(Q&7g*LTpWbqoOw8{IT6A97 z%MvU2`c>mo#;3;oP|BBTIv=Lm16K%*vPv3G`x6P%hcz50m#IyiiN#r83Y9;n$f%B( z>=-{j()ycG{mVTVzMqb#cEQ1nU=n9p$?Z8hR^jdFOSiLIHag|m*EieohzF_u#W#qZ z!*;c`bvp4D-bRUXxvd)`3aII*!2PP$O3fMbOKWR1>pKnf5{aXOwCFE>;{p-^A6 znH&5~t^^4a2AW{QRI|4ps>9sdBQ}L~9vQc`GuF?Npf%C$tF_v|rq7x_Fcm^=cu1H} zRi?UJ>%vXcOWI(P6`EU5c!()O`$Pf>O!LFp1@Jy*=L#czVdwS*1efoIGBGIl*%IuE zc0=i9cUI})O8boCt!aCZAg|^vDCTgfnePJu3LX9+fpIn1k4i})SnJ|fR5ol_2)(xL zZkXZtUH^dcMcboEihSNwkBSY-2EGP0Y4cC}GX^zwmZh%E9yz{n9V&Wu{!r$sOFTS{ zA7FBNBUq7#f`%jdL}1EOWF4!Az(MVq#h*UG9vQv-r_BRAVkgd8L@wNE)1jlpl&$5R zmbNA%y2Np$4UJ9)A(J{q1ccm?^r=ejd#8#{)$1md`e}NvRxG>e=@p-2maxgJ*ckNL zf_$D`h)bi=FCxhw7UhudWHKgcZ@V&OXR}cEY`55>kKYJ66;tcc!HY@s4L-#o`q0dG zmxs6C4xwS2;vasBRsPnt`K2_NIp>M9cqEW3z?IV-X3a9UB)fLTl$5v`p?u=}GV9=P zB|~ieCD_D(8%}3eeNtK9z1ES_Tn*vE^l;^aJy91%p7}7jpM=TUHTGVt= z9-09$!P#ov#R6z)Pg>9Oa-u6Wh2t8XtNC6Shctw=GSxz1Fr3Iq!63-A%n(UFdvCE9 ztiY-DWrh(*S>~vgbO7ldN_D3*T2{dSBlt{+Cig9SkA;ER&bW`+r(8##Ials!gbsgD z+z@0@e46>7=P?e$zCMmxq1x*X98)eI`xLs#TD?-q4BP>5nf{Pq#tTR6Vum370L*ap zs zs~fzXU?#kXU0@c0mJmQlX`EY7>Z=2%-?&e~%lut1@-qEN>_VRLYGFy{HyUJ<0|5ll zSMB}aD^N|TsRXJKzGvHO)Za!=n{4E=o>IyrQwl3BG4?1J306rSn)b-uNgYOkUpsLQ zEyWXIAW7=Zlisoh&(aM{eXAJnnr_aYEUFzcp=;mWteMsf&wC|1{cc_qJjkLmKus%d z9J$6S#1a|(;qzkP#Hm~0V2OfwXRpODTuMOy*uzAl0iDMkWQjC1G&(bRl*}FJ2pb+Q z#iO_aNh8NiEf56jNh@nC7V%!c_&Ri;ghkAH!am#H<_9B;kl(tm#U9z7kD#=AmekjS z&|}pn-=1b>n)Bu9ZJoQAN2-mcLZl-Q%<5G>uB+>Uq5Jl@B8UXHRb@{1 zLCRN2$?a%#3U#z*WgA5qJZt(iQH)??j1ToXFf9?$7Ths`4fJ7`_9}w?x3{}ynj4!b zL-w~Svh+VEuIRhs@|o%W$0G*5&SA)gWrLD3gPX;EY%L2`Q4W0oqX*^Lt}o>@bGXm= z6Ohib17T@%LIWR>EUaTCp#22D9~QYuT8jQ}sXCgd;?*G9CJ?5bs;!r7DPu9HLLITQ zfdz;M5!u>(L3wd6y?%V8mbh*(M$xjA{JAsP{T7Mm`;oQ)B-NH;cL0cB2FX6fx%}PJ zbhZ6~&P;v>oC`nyp&MoB45rVY-NQ`WE;iF7^>W|!4A|kUAiS0&FJp4^n>!>rCg`Lu z$KzKbsh4+iZDdwFW{h?zXs@9OK-PslNl%yF=U1MxaiwZ{RFG(=PKmyZkld~hO|Er*&U=%ZWYL$rz08 zaI3azTbew<=<~X}RDfa^J8d#3a-=wbbGP}KPKVhdeztn`Ht!sJa*^-#qagXOizQ6& zktu@-6v%?H?VDqdWi1l%PVn>!ws&;G5f-FFGlWfp!|793?WQGCeSVxNs+$sg46RAp z;s9;6@?w}7&*+T5odJcO)-mK_TK)X@+{&NYde|r(MC~F3Ssy_iO?{tqd#0}6l>Sij z@EJ2_A9daeGYNv9;CBmvs1w|O9dQwdCmCm8>3`}?QV%6=ME}D_SLqP$o zL#HuUw)o(MRdxe7xjADh18B6AX?}3cSAxyRJ!a@}mf{g3@ z;kDV6e9zzyq24-9`HXo;d$gtL`kI<$oiRlJSs5}PJ0DSnEIy~$5$^;u`V1=vu~5>! zJIyZH-s*vPoQt>z+t}Dh8G}J5%|sZPEA#FA^rzH}2Lz<>Qs=9S(G~%nux=D4G(VzcfghN zDgB1Q82N*4Kc!{A?Om4xeAD9!xlw=obKOI08-FKD3@F{BQvKQeCLfkZs6LckW7GZGh=z9VEiSrWRH)k4h7t#z*V@4fF^fkk1$5NU3eagKbG+VGK)`Mn-IplvHz~FrV=0rKXU^ z?frTB^*B(?rCChXy}VOFaVCWXSmGPHWN=4_oxVVSF@Hp9R_5n6Dj1(5&zU?U*aHFf zwV__!wvpkm=44s_3d1)+@gL~0`j3qItnaTva@TwXJLm>&z_yftvN7E6bv{aa(1~*x zs~Grdo90;!U!-A8&dd86n;dXp-OUy@+l{>;bitwSF0Haos%W24A1n|eB3mzebdTLQ zms!wR?p2phc~$b`BI1i$#f}|>qZL}%BPlMjP?Uox&fqU7WY9Uh1x7@G9JV-$o?eVU z4~3OhcXpuL;tYk%AunD~>cPklVST5jjcn5d3aa-%iH(XD!6iWb98T~a?ycL;=)~1WBN>Se^av1>y|pkOjAzY-z9oM7hghSh6Ne@jI>j1GqB*yBrbz zalbAn<|?F#;OIS_#Z0DBIGg5gT)o4=gyXg`9u94C|{sd3x8TaM1B?J^j6*lb6r0f*U^Hsojtbfm^?ec&dB+kTq-u@mu%?6rJmp2@JkaDz{ro;CfE#9&$S?c$kSb?z3 z^@JE@bE}1UP_esGbHF#{>IXwgnEXnY^cT|-wcbnfJq9-y^^h^$<+$-QmTFN1SSex& zc9jJq3o(EdKf39pe}q(qLxf21dhk3eT0a!23GtxNT?p@8xP=}B;)cvmc_x|(vEuXD zlooLDor^<5f@?Dy(87{2NxPPNY{B=?j#HGKHot+3<~+!T6@wtp_>Y5iMv`RTH6BZH z=>gb=gzVjTx;CJ$*!d0k>(#4QWe3Wcy5L+k8#6Ye#$gX>y*OY-2Ll_z$+On)jjM*H zHRCBHizXFTaZ2d(tZoNwLgop~;$IxTUvK-D_{2q2$^V=o2F!ftDa>^K>b z;a^cQ2uTmhi|vF;`D>f`&o?S-4`Rbhp=g^~R>R%rV@n{=Xh;jY1=Og0qoCr>op6@P z?|A()6w(>xRUC=P)0@JSbF8^kXW&6^VZcx#AZEv7c{K8*%;ap zU?2(IZ>Q<=EXUC2}Dph_+V4gdojR$HU6nXXiiy4wkM!Q?fJt8Uv?n;JlK!ur_gavx~P z6}(&-nxdRW`G{cAvB21w;u$5zzR#_|-Ro_y(lTa)FyJhk6{&*{CL>A4a6c*pdr3;c zmLOtJhqa5SQz4OhX-+X>JD zLNYQMUpJ($VCgGjtPcmhO^;hHk;b>Z@LT(wG|fXdQ(#hE+2}r$xKU7!%?XA`Zlxkw zYXMXV!`ExEoNcd8gT7U&vcOTf;;e&RhK?TQ8$u`V;T4Xy)r110R$|}ntmB;AsjihQ zJ^l?|@A8RKa2KB5)nq6uZ`1om@iXekiMejfH`8oRyNFzM~YmQK^@C~g7BbEoNs~Sa^^OBXnWStAod0KHGc0?%gt6PY^>htdUrY6!wfgExx*lKhG| z2PD6^MdWz@CHZBl0u0cgOykFye@0iw&V^6raq`J~K;}0>{BwXOfdQiGAAO4Wr%61X zZWs4)_OAtvQU5)Olnoew0iMr4>;G@rH$EWyre@}$^BXmPJiv+&V1W59adX`Ngo%$a zv>$hm5&QLG*PeeF;CZ0V%Hu`uEzW%}#N5b1RwpvB(Rg_m(i|n7zFU5|yVKZ-H_OYBT&TZ||J%4{;PTx9|8^12ClC zJwq;@+qYFVxOpUmOlQw)_^YZuu9iEK#vpQ|yGSn+{Tm1Br*J4=BU9iHN{UGmFfiMe z8L07$05;9swbUz?-|AAzy!WgKJ7ew-yK?oa0|`>`ap_JN4%|@Tj#*Uncbyt!JJMdK zUrKn_E;vvG%@y?85M<||jT+uNJ=tD%~MGThr26Tsw{dn!r?Qf$S1@nL)IbcERv{X zK7tKeUI%M7va#@)A2bm}o$7On7kbYJZ+2FV)pL`Tu>k1@m#%cCZMOcq`xPXAodpm{ z^Ly!6PES;h_!^9IY>ifygvl%o!`1Zk9*|$5`QQ(_Z^q=sE+3WHr#UgnINf_5oid<* zb$pV3B;meQ6NSEjh)BZz0d>i@`t(})Bx(0``(k&rjr}USk@3gYx0V0MqW>xVArw9j zsg~QO(PY`nYhKpvWoyBXL+{@k=H%waz%hyjS5rJH9_l}A;qUnFzYV*Mkz_GSG_FA^ z`ze|~=6pd-ud(-IJ{Tuiv=kEo?wQXnfJVRqU*@6HWtC$-F^S; zneL2obV+dsdIX1)bplpVONQm?cJi&Cy$zP3rfmOeVKuS zcv|frWIHf;WItTN`)Z+*e45;NgE$>Xa3PHbCay5~ol;-0=SaSltUgE}?S|`T;M_`O zrmE^fSf3%5oWjQ%*u8DrahBLLo7l`r@0X$f@Zq(Zqs@ZkcP0W6h2}LhKF({FMb7u~ zj7TJJ#ffT(_jSV7M*1lNG_mj>{pWSqhArck^A6FRM_j~+8(t8(cEV_*r}A9Z!qqpD>NtcO253f6pFs&&ifate-8Us&bn6(c)4ED?pk zRGRtkz3p%wi5K3zb$qYgK!tZqzmy`V)G=zre^1;z>^C)vwKU9y?RbmX;lYI`jz;5K z(@>jMGyqM#@gvR;P^SFjoyVr_qW>pS9#vo7o11oJD*dkY^L8 z;_)>(U~cZIPiSGB7uv!5;2sv5dHR$Rkn6GrPJ)dtg=7nQEvWNiCzc_)W~uSn$)8wY z+jcVO%Q9-3dd49sjrNX@_vlCbn`II-3(E8~Z!9G!%E(~6ZpnE%CK#A`nE^Stl${O( zr`-zqwU!1}RBOWb5^)(_>eSL=3ZyQY#EGv#(s<=LrmZbrzGDbFa&!1q<9p$fh8lM1Vc{>^g&S4?oI@Ck?a1 z21jM6p})_IT~TK|1z_N2Ox1fLYt(Ujj>w8@0l6Oen=@f-;JtQuGGuq_lazH*Q(-t( z*Y&;UJh(@V2%(9hHQ!BG8a(4u{)T(6^<4&_Fi#CdWi-FeT2?x2QOdf5<^{5Q6MaYa zhHz0zX7hkVV8?2gH#B&#H(MvBBS}iOfRLczj1x}0;fvf*;`9~MO_bD*4_J?a%kR9( zDrII)Xvs1#6A}=Azqn0&#w_+5A0}CxR3OQv1dEkr;!eyZRc8aub-&^`S99o@8vnV3 zDR=rB^!he%^QZTCx$PA*&3magtUkjX>w0zNZbSi_Rt)0({Gx4_<;Jfi{sF=kU}YV)})k_JnJZkbbY^9S6wBb8nAT| zI_h1>J^N-L38R@=l6h;noTyuDF)UjonpMIm(3K(TA_AB-z>c@#R(3p;`-<%Y{bxHf zHEL440d#iy>tX?J0{aMa7-nU+Egerdb#Y>anfmIa8OOv-#?~LD3XATjxjwI|iv)&y^~#ft)Lst=k6=hxNZ~zU&~{c`!`{ z0PL4#CYA&p9c4Wvr#nR-TjkKJ4@Y(6x)&m;gjDtp<(%arkXTzI;<2gP4h%f(m28xp zFIB2REhZTAUsBc3&`g$cS*6+{gdSYx;o%MK(<_qtia$NW8L70tC%m1N2dWzME)&~Y z9^ei5Cs;W%xFD7w91~{HzcFVuuYBQx2I@TSO7=Nnp-7wO4V-vUwdjUBH zj^A`p=?DpFm==Hz?u|>LFS_GZs(c3ru1ZMU`&1hbwsYxi<9}$t$)Atl<0E^B#3z zIqFlaQ?b@NSo*_ZBgbbWAo#&)HpQDWc8N5lRj3`IT_A%S?qFL7rX4Yck9k^Hd}L&l zGbZsIuQ7|K6)C^9yfZ>Cez&HXrVykR<}m?yFC?^&DNAd{>LG2|s{#HWt zr{5D?$arnAsEwsE4;DTk3qyQV)$Jb4wQW<~9?jl#-fr1>!zht1myPI?bF9{7oNa4s z6Sqsg*q^OUogh_sMXr>GH(Q#AP0)$);&p`Mcdrgsgec|at77m2!IoUo2U0=vORD63 zGBV}sm`}Htg~>aigoeF&($u#gIV%z8J>&P+Zji0Oeh{nE6d5`jpD=p zJ#5|;l?}zK*;gQ8qyCtuxwIxGhF3b3h$S1cJIy`1irBMhoYb99KS$Uk*yZbE#_vVS z7zt@gd@OFYQs7Ck5z7=glfF8PS@~*vUsE;c5Ka! zcSFh)GNdC<_@OLA2~yOfmV&=Cpq&D84b6P`$IntIOAlBnU|pw%0C08EnmU3-$&A_% zHThc00{tGb7A<&pxbj6s#9g`;X>gl>V%G zU`H!nJt;DhE5@Bc3ccr!*Jn3biXCs@QG-x{x;#I`7nUu(%^hkKQsnHww7tXV$9O5E z5;{{iJeHq^w8A!fPrD)Fb1ndwJZ~hRYkX$q2_`}UUdy+c<#6>_In71pZJaC$dj~Q+ z`6fo!_4DqNB{J(V4ipRMHw77{cOH*^kOEKEE1?TFoS;RW$abtf3_7@z_<(s6>FnR! zYHV8L1bg6#Kx{sn1^FA(o*t~VrcL$c_qu<#x1ef2x*bqbt)OKgzXICV zraQf~0UVM#QpICV9TzzBrg`Xgur0dSf3HZ*ZFO%~M;UQPldoS|O`k)o%;*5`Z+w=k z%=$A55H$*0qVd>- z)S+_Fwuie~Pwi?*zUOMft`(|$L zLiV|kIH$tR(2{_B1a{9Jt)II~xgi|yI%76wy)x*5J!;Q$WKkM_2zZTQjAfkJDrWGZ zoK1IFyK3@jw^G0Pvv^9v1we+yj;nAI%rcBpFVFK-{)XdyXAtX zGvA3`>Z+^Go5}4hWtiZFHW~@mLR5yOn5$!;J8*2P~rnIW7j&>;1IK?^~1y6djs-b5PW$Zex?_*=uu7W$fgkU zuiroS+tG}Z>BA8!Vrr^1UtT_S$;|))%aJQ+saQhAgzWtf(`*^^%i;6~3qU^==OMoZ znOtts;kTk=D}9G6)$P4evj*rQplPD$WyjCne1PcPXCL~ zln4UA3YdB3w=V@6r3eGhdqqgu|1Fp`KHi2^OzZl4V231F2PhoJ&nE<({*9FX9E=c9 znGPLzQU1Rp`}6n8*}!wc4^3t2e_EKIF>P=>0Dd8t>i?~3HoX^k?y<*{PX2FiKm+I+ z$iqVTpKSD#YF+cdbGd`FUH=n8|L1Eu7(l;-P}iCN^PgkT?!N?^a|52I1klX=6Po;E zl3m3BycTcz{*R3}zy8YQTriNPyMi)UVZv!>c1GTqY%VR!s}iF=b@2*cPEK=45^~Q+ zOU@EZp;H{ReFeC~;5VuL6K)~3-VGB|@i}~=mw20G_OelsDG|=Nmin+q&BICdwwTC? zPnW$X`wYVS)kc#qCb|utGlD;zK7$^VvpST(wTVS2T?G!{xU}*WR{gRvCjGoKam$lO zhKI*4yrp1eKk+*jE1763a#crB`?&H7xHm-aaI=0xP0*H#3`zqmu;wf9Kgq8w#jw+z zEM9JPr}tf-7w4l`SoI69YGat&6J+tw7-)ll*38%nRA4?H3ZI z=f%CJI0F-aI*-==HAd@=rZ7=pQ@qa159w@Zg2#@q$? z+opqk4=*RQ*If3J>^<>ZP?>HhGRN>Ykn@}mnZD$>9Sr9F_9QJB2-9REnA3c*G%m{n z{?bJE_WmcuYjC>t1x*nRCnu%Er%i6NE;l~#Bqc{LX*D-}YYX~k_!AxZeojzVM<>3& zzf4(*k@0M!s0qlS{9sQmcwz=kMaOb^*1pzbw z===}9;vbU{)9iHERBxf0w>LqHd*{<_s>skGyq7Ouo}#29aUMlJGV`$rem%Nk zT}xHK*yaWy9eVIGf?*NeJXi`8+O{PXR1MB7OXh)cS?bbS0R+^o*k6d~IU7z`Uwg$V zU5AhTE__PbHq{voDFL4WKnpES zA$v2ZfKv8ml>e_*bNE*JQDoH9$=PZy|Fe2LMRg)H?sR9(XJeilhu#;z`wSfW2NaRD&lJa zJFrgl44n>V5en?KL_4NnjdgUwPn85Ma7EF?T$RZs;8AMJM~mjh_{_##Y6(?IS=l?s zabczgnz?doT~qI&;aDEA&Ud8+C}uOOUW2XJ!G`4rKDs{zImACgsZ(n~a?W3rzecaL z6ZDQnNyXBwt0aL*UcekhNYZyGZAgl9rQ2^bNTAY7Yp#+@o4609hrOBx@~>e;#P(D-9_$VsTK2zb9X&d zgMZ`*L=Sxxoi{gz5uF*FwclNQx1pgDYi{Ou#8VVR4OB|%g#Tq#Cr%sMfEfYn0vm&> zZ94YYXQMNFvskJJSjOY^H0?`d4xxlr`v$yt*mNv}jojT+*LQncFPny0NYVhk)f zjM6plc+GxkrG^+TK6j`V&cU64sks^8iWAAo*ROdYOWHwo173%D8yfm;VXs2y<}7uM z$Lz+CJLOqM#;o+~=Hy#ji0M|S^;oKjbNH|I*KS{H6RHoPGSFJSp4?*n9tT!yXUohy z^lDrE^MG}use3sI4S`o}(2DAt=QWP@V4{^4uy1<~SK15&qUbiy+Ver3WFu`R_5{g0 zCgUnvuH|ffyZgvGIaci|x}yKESQ=Tn)9c0q?bZ|EUXVi1tyiu0&Cj-YHl>N|8gD-> zjYV$JV|N4r@nhk=)SnPuwZPOg#c>rB4Ioy1+P~)uZ%F2itzJ)XDxdM zE~a`b0N}JwPZb<2PBSu9B6N0+RUy1yzM?L=*RP}gwofgc z`h?$+(n{hMrt zpxPdUia?(R4v~KoDILY`4&9K0cAi;#hznl5Yjn$dPXjbu3k0B%*{O* z(_YIH#5S|SK~`oF5d2G|V8OrYTsm?|jOuh;@a;{#PvkW90?UUJ7LaOHh^jF48wGO8JCvEkzxid!w}O|F1J+kY_dcEyEQm8? zw{Tnwvi25u5<&%iaOHlRwc)VOJg8hPT2sLNTyac)5yR;|hRJSa*XX6U9esMIGg9Q_`Ohxgy_xDNA1>GYHsa zN|f`ICZFhblx>UqwII25M)l`{|Imxjy>(joWUB)5-g~79;fR^ zr#O(3ki8lAfe91-?nety5#|1{oQ&`Pu=P&yd2h}8a2wk;?x3-)#%NjknWxDjtu+s0>_=J&}UySn6mjsG+MwU^0MSc@=@oSq`BxF4BBKiDc4u6zZ6 z9YFRw(Zr2Mr3k<)=XgS7R!S=4z(zP-B{9L-^b2DDRX_40{eGTs)1If*;J<-=K_I`v zWm0-o9vdEyr>=ZWJKJm(qhUx%ild3-y+iyqr&C`4|KFG`?)tu}mXRD!%kH(y_Umb6 zv}P|i5@fXrHS@J65zwezv36gZ*-|U$O74w|f=c}_Z9rN8i5-ATkn^+4^D+$8C-0ZC zEmPTPi$=l6&hC9=i5R(T4mJspOC`8)W;b$ob66!zgy=A_6lzqi^@d zu#7X!@nv;wE@ZqVgSzN`59a{xju0$lisTHx`jr&L9s1G?seX3jc%7bjjEJS(`IhJ zVy78X!&&$XJ1MCG1Og5qpX}wF{eQammh`SV=w5@3IXR{Vr;@#+&TsOj?_9oa{?61q zJH>NemL~X;g~#3(Y7>li3B0lZ_1ba6r#{S0qIzgP{BB;s&^FIyEd}aK^G$lh&YO@u zOthd5nFZl5K6JEKqnpNC4P{y*_cR2Y2L5G{cy!4z^mZj$iD$m<*Gr#9EjG2cqhs_l zb|0$JKUK+HzBSiyc;>Wm0i;FQ&7)vrC!$IrCllh;EVubD-)z_uw&wo1I<7GSkuY0y z>NUbZ1d7?z;r4hI4II$psAR5nm2h{@ac|LWzFiq1a)0Z7WilPZqVRUB+i#F_acKrN znT??Xzt`x!vKjF|?9L4r4lmHAlF{<=G60#>zxVPe1wvx5DkTe`DZtx--q6G4KbMaA;tBXk_lC4t(eK8RQg=fQRyUwvf9r zvSDrAco{h8lQ%1a2xi^BL5a=n>DzWQbIWwtcDp_gGWkyrJ{$dI)mT~7=YM%Qoz(g^ zzIJa1xtXa*8StD1VMfiOnp)^FEnwkcnjWYBY+&J9R~8Z;508_zetaz{BA=rOAQz8c z=z2Wvs57r7mKZomfMeKD#+53zjf_ z$oH){PMhx|;f&kb+~JA4WbzF1E7%If)qCcL;DD*JSGwo%?c?^YeymY2+?7?Vivhi) z>F-~=6NqHbjhEt@&SvnYM)))_G%ngB3JIeJd)c;L2hS++zbI~{HsZlQZ{3#hkK?UA z&$u<80LL%G7)7O}W+;Rl%Y%o`f3IxSU+09#e0s*5hy}v*U)A;@%-qDpawT_>Ia|uV zl!!w@B#3F98r5q}^V1w2IAfxUyqZizFOI79$mp#KI@xXt_X=bqJoWD~n0~C|AijY2UF3juEHbIl2}*F^o>}D2>J}?DN&mWN~Bf zq3~=MYx+*;phcUyRUVs?NTPq~>%LRyuv4vmtRIpB-gAJs~$`xz9N&8gSG{{fip_b)$N$0R4?`d-9c z?1yB3o#PjGPI9wYzxw8(seT22*A`29XlHJXm(?KK4O1Bn_J^;bwaDU$W)dSLxgEtA z-R19)x_KjLKBs7OGQ{NkZ|}h%%@iqUlTik%l(IV5x zzRLw}ZI<4J%I~u|8=k*dL_zZzLu%wc(`Bc)xu@JH#MKq4gcdL2>UOXsN`hmTR)lH& zrqoGDXUKYDsWO6>x?X&s!GNTbh39T(!Js|JQse$n7bGc z-WJ84YYiOSJ`3S~a%_}FCC9wSM59>4;o4r2iaCJ`JN|b+^NPxt%lEsW!CJHb82MHn zP*U;bLbzOv+whFT<;dq1D1qVnqNTHsQYUIrXSk}0w4heW=h1(l&b?x5lrO~pe>D_+ z1N|oNtF$w%GMQUSN&ku6e55h3l2)ZYuHs?!1%K-6O*w{%3xy)UvC*k%NlQgX?x2wI zA6^|gjdX)x*Elxn6aI?dN;EZh>_j!ce`VP+ z1-E@ydeO)oJ(sI=X$%@=YhG=g^n~9M6;@5o$4Z~^wiRw8ppe$4II@f3qX=0{r5^rJ zlvwDVc~SLt%6!;#64-5j&130Mg^{P$m$A%iTk-O~4aPc5^m&HdFT0WFv{Lc;v!qDh zD8>K$!rnpRf>Y$_?2+;I5xuxZcLj8EieE%3gVRqJ_)bH{v>`Wvp4hjmp3Lt7MX(AcuwUN=yrj{}^xI=+|mM?lgAO+d#ROKj6@)gL%pt})&g zl#rB8_%>TGTr0!3t?`~qi|85lSHu$KCq=!~*~*eS4O z2u>n+c(=TTPBqX%5u7qww9ZRe-jUq2lkFZz+R7s^r*r|U@cm=1aSzLmfI%h?UTmDD z@u?33@jpgc`YIGs4G{KX7q=4WRzY$7cu}C(1~qyDbvzu-!MEb6vQ)Jrp?f{}kOnh> zIL~r>NY5Ki9WA_nH$YxpfccWQpU6{BNC~4yLCM$EzxIoi8}gx0har z7j$_>rdxr1eUkt3lDcmU<~k8?_fm(WLm-jPVL2i>IQqj^sxBo!SxHg`G5T=0L0rwl zS?mXQE?Ft1!p<8gE78j6a;1zJmTFZ)ccTp9tAko@u7&U z@VWTcypES4uMrVvl(Y^p(L0RF!phih<{mX;n<>E-@=0;@+;*h^D}lDzd6swfWjy?` z`Ea@wW_t$ZrLX1ueEVg+h(PJFvrm}iONxfg2vWHnE*T;M4y`(mpMm*1 z47Oa8Tn?4`>q^1y>on@4YC0M%?u_UN*Q7D_&MLXexfX3liSzSJq}4?TUfMsqmjs|d zLbx`RfX%TD_(dB(v>)A&WOqKRbgP+Q}r6?{3cH?^@nb zv^`{VM#A#5o77B0{XXz>yMI?wh!HmLgr6PipRF|9<3!O(u9bJMF)g#HO0gOPOH?G7 z=aY%le7uw<`8Y(B9LESP&4)XoxZEEAja7}Ue z`Z6XYe-uzGE>&SKA2!DgiF#s6)={Cgb9zdq{7DdMQj|!UDbx0Hb!7X90FsH2vy>Id z_0zpL1o&W{Jk>qIAj~*PMR2I&fzyl$-t2Fw*`58_J&731X&J)>nrJ(x^Z4+1gPYvU z&%LCF-jRPyzy5cv(PQVpphqB>b!2J;{6B3p*QzcVs}9AA#V-~k5d&F!LA$#9*&XeB zsO_W!m0yGQd`UPB?BedeO=Vg1QNpjdvU1l8`ZcVw6g3N-oH*5K<+8~)%1A_S$X%l( z9>vq}b&#ZRJFyV#*+B<&4;IM$HYm-hpz^8mE^HFQ3T`BBV zdz~!VZgHu@z`H&|#Gm*9DKwku>9LR%GT$CL1&+Z`JTD*-&n`Jas+Z5er3KnQT*J>K zgdogf2&Ybg!dk_h0cx*Z7 z2wA1JUVQoSGvr>$_^bW_SGyV22t_O8!tkfjCHGct)5Q7Yg{hKq`(r3fOjHz7J1zsn zpYC>U$3N*y5$AP@dz>M&X?@2wF^@4`D61i_VS0nWUs=CH5NvP4jI?y3@zfzylNM} zKVT-a6XoTYf|ZAxql(2;cbuPJF{W;hw-ITj#UFh)=u}VC|H;GcUv_R7t>wHH zXrZhAF2X&$1|delV!iM^J(k&&b4W>#$>jV_GYc|x{wX?EfCK?FL*8p!poi-Apj|TQ8 zx1M_czVck~O2elekxzlRr&-d3Jd?8!4B>>Qo?fP3Qefl@Q0oBBRvH(@6^utW)dCW~hmxV^>r=K)JuvSwj@#S&V-dcVqhjkIs=oO799k}rxsbY z?tyEq#hI=rCES^u?rU6zTQu3-K!xBCzeJ?Qr^M1O1L!o~SZlpK|H=yf_0}UHHod0eyDZcX zC@{g^-s$<}fD*~-Je*b}vmX-rUVBsDlQ?x))2<5o6QUgYMFNC2%x&eFU~X?&aL0+Q z>?1;dZzCUVv9`99+~BdkYV*pM?e3tmtj^xl$p5Je|8TQ6p;rRC$oKddsCx|U!dGxs z+WqH%1&A5GBRSt}pW39hvTI1C>##cPS}_Y=NeU3999x_&Ed9yTi-0PL^xu^TFi#{) z&9lH5UVW=Yn&QOOfw>Y+@*|D)k-I)I?t+%lKC=xM0_Qa#^EKaBY{cl^)PPT1z`z{L$3#LFT#+#CC7|k@G>0AjjR}8q%_1c0;gBG%JQ+h@w}_4 z%>v@e?QFh-dNiFDM_Aa~&p~*I{!a8`+ZL39kb8cK5`VB{@10z$D0VW)wMA*}zp$jV zbrQpe92yX+bLP~mT>KG70=HOa-dz^M#`7>jALY?z%wsQe|DD)c3o7ZLulMxem$fw1 z{0d_xrATin_jCj4Y1<0Ext;{M*VESbxy5^~TAPkL`a=ptky@tNaI%sN*%Gw!q&l2Srt z{(pRrDvP#1-Te}%fQcRj(o zxVc(U%%}Y;t6tcV6S&t8M_UM;|7uxu}gb z<%W&A|0HV3bvnHl{(8A6&sBR6y>jE6CpySsxc8)o)Rx`h8}kZdzL=2YdYHQ0<6R*0 zLij?^a~N=!UDFeq54YNRMk)TV#a$x*$F|1&izXokas;r;d)InltNJuxW@_!(mTm+L z(T&VGFS-8(ZQ%KJaU!eoc~NQ; zEFt6y;l0~Zkk+uFN4qzavhEWxcOysAJP7sFiMnsAVlNPs4~AMr56vf6U#QTBOTj4? zqJdz-_*^An@w|-(F_x!EjJ)|>eT$9jU$U*ra%4_Rm0871v-0BM=0=)b3O*Vj|2a=} zJ}=+zIyM-@24109_weMMdFeTz`-+25C-L=_3PzJSz5jr?yhV)~UJ>$e)`}-mB;r_C z*xBV^&^KEFF8eEkUSqiz~%{bV#L(a37Yp2g*Ye)_ZV zaF(P-vT~>Ma{SfaWlc^S-eub}AqyJ|5hpA9H-%Z*sKlUOb_aq5>sBjO86}G_JWod| zoKY3MCuWts)uch!!xHo5KA=AqH{D@#bjh>xnxL#cUX|?Si><6m%ksdmnT_P8UsUE4 z%3IB!m5{=G>0BKM`J4q50wq5eH>^p^v8a&oa6*TQjM30Bw)`451#!=H@m%nmFS{$Z zwCUS}S5i!!UEK7ZN0gA%K};0Ty54^QIBXe)H~GJii5P8gk9-8K1nx^R{w9@JWaui!b!Hua2O<%X3YiLi0zX(qcxy8eR1XxE)K{%_>^8 zdL0fQm~RQ5>;hLE*w_C6XCrX?0|J_kAGnty^*HLhIvZN4L#!arso1RWQoFyrGHOOt zhIX~%O}20u0zroW@CM65Y4kvud+6e$*qVHe%I%$neZR)@m{Uu}qaYvr$ecf`G78e<-93nqOxW%y70o- zXN{A+bCWO9oy@bjix&_^b@sZy%s`coBc>8(P$Abys-{m}`SQJ;@dRYozP{JYNiOq@wYa!Y{`k`m`0)t^;-f+z1O8rj1OdS+r^h3 zNb%wLPZKg7Zp5uQ5BW$O^k98#+Zx0U5H<2hO!nZ=!|AIHrv9hsDs+Q4N-DdX^qpWv z{qoL$niAj+j^oj#@2qAEA!7=fNrE$1xriIH;=Sl9 zl>=qXw^jSK;cDt~=B4qq(EfAg#KX75YNpnN*wA3?^at0fnBo)Gyae z-vlb5;9-Se=UWA(A0xU~s-{{BoM^})W-g>Y-ynA=WCrR1DRworEIEoVc}AOO+dp-e zeHOn%x<+kUkCqqxM)}ok$uz9iU7vyhgCcmLWp{pG=inUaP*QC=jsu?>p6RJ;RkFG0 zQ-!gH66}}84Cx12L7GkXfVhKwChFUiT+8JeM1wlkV6_hi9@B_IkjA>bW)?Lb?iB=P zg`OMPmH)WtamOf2O9jNu|D{lCXrik(Jttk4FlM;r2xq%M%nzn-AoFb!e@2dbeBH@Y zs`_SevSXED+@_WtuHaI^^w6y6JnjL!_Nw+>h%P>CZJ6glB=j#b2Bu8f>y=d@wDNpCLF%*?Am9J;r-j*+*^245y$81+4Son2POE{_TqtI ztk@>YCgM5mf?BHIJh|4KHTuNEG+uG-j7+!E$%Y~bx25&WWZP6 z5#7Hkj5<82SaURR8tByAQ_7o0bS*h@g)E9QLXm|aZ^~9iH{LAKJA#V2d&un^OmxSE z+^Q~`Oyvrgqxqv9H4y#Lx1I19O9n zi&=?0E$?D0j{;N7fZ?koNJHRHi2(N6`JiT#gCX!J|VY>A0S@~9RF`>4-na!n7_T=t#f`^H#koD9c#%Xpx)r)kFKsZP@Hfkd@@Ri;@ zX(s%VHp!o+7vSv6K8ufwydsP6E+M4>JJGh>DJw>Wy%MhcO_@X1!%(M&K?2Kg(J)x4 zAYKw4mbu&M8bV!?A|B<2YvuQ8LyqW>M$gfPW<)BE>C}a8pIjr7xzjHYsj{yjjAF=Y zc3)_hA&W6W@~POtV_^%48j9cph((@$rr>@gqXoJ}#O+)#QD{8AJ3N_5aC+WPK8m%r zmhc92H3@8u%6wqm-ifj}ac|>(8+~4_-yUf|+}6%dPWaOlnbYudOUPN!!!O}WS#0Ms zPl;@pc*GwgH-BV8>rD7@1c<$;xTu}w=@4sj16V6dQ8WwE6p0r7=p&Bq8Qn99u_dEh zxld!$ldhfuTD+>z0V%D~r~^kZ`p=zjZ|_bW{`%MpDK2}xAqtPsYd7QZU4p!Y+>kwh#DSxr=j@`Y56 zRr<#LemgtlzFP5{g%!Vx-pIK>@F4Z=>kNml?k{-?Xk+poQD!QNOcG^1%n{|7!%lwX zuxHp>o~gFlHVlQ%FA|Y3g~Din_HpI#uR@uS0%vfvsw{5F&z0VtwvlDQE&>KM&gK3| zrhi#Jj1MtM)p3YhbllI(J}%M^Hzi8GgE_`Z21IZl8ZEz?JoAY2EV-?kRyp&V!iPiDIPNO~5EaK`G&4NAe!8Rg80Ag> zWNMTj(r|SoPq}444H(0?44GUO=j=81^6ElB6JQsY4a{9`N+8 z=+wqQ2KGom+22?u{j?K#(Tm8(|HsR#$u3V*e)SvJ06NGwW}}@7H%npHfUooeV!sRZ zaAIg7qcuFzh7rn1FG?$$@k1OOl78IB!5st#bP>dSiP<`}g>Nok<$5+P(UT(;V_}pd zD@2zXCX=&E19dY1kkSeF#qISDHbUU8C+;LNRy$u|;9CCjr096*wbBY+FZG}V6ZQ9g z7A{UGGp`EIpAbOC#TC1pe|G*zE1b^C zajP`T4GN;TM6_7B``qv^E|U96N0;*R`=dlFs0^`-M3Up}#+l;P1{DhnTq=9o`8Jm- z?u?9EaN`*~`(~(xI@@l5QRV^-c*lMFVEz0IJ2b@#!jMgfh3{OV@y?dwCZFpRUqMNY zpgMg=7rev0^C`d4r1?s%8ATo(MFNdF0Gx(vt!StdNEiFr^ z%rdoVIhz{g)a08!mJ9#NMCWfRQ9_?;FH`JyzETWeN#$>)=r3qX+Jbs}8a1n$SSOTT zmVP>H`|?IchocFgGP<-EHP(bFjNy!`;}z&X=iA78{2?+c)|^AT;%j0cTK2{QHGv=D z?9u{MdFSU!970!1BrVoK)7|s3A7lLau!v%>?Rssj?@g@aQ*?H&h5EJ1z2cI)A$nit z%*V#iElUw8C9d3Bvyd}uW(su3bBPm?5NbdKr5!w5X~7(NeFZ5YhH(37pUJ=lAO!RY ziNxRL5=pQzgMGoF?R%oIKnzQfkCsDkI0iYk>38-&_exC-#mMIcpi7qoKJXW%K8iY8 zgN8?;{32%c?0De{$V$kOLol!*Yanl2y{PmBY&z>1OmCcB$e-`C-Cs#qaE5r|fRDCl@`#w1%r1#hwjPM}#XrYL@A!l#O|WH=`{(HTT)hfQKD;itS|S#N1Wvc&ktKzElt z4|*L0dn(&b0L4dOE5YZC>ZMwJB@z}g2z=!Q4}}l40|bnmk($fpw4^#JCQ7!+F>mOY z&&i_}ov?whVjSE1CtOXPQ~vjj!^49po{S(8H5e>T4ql6aA7`7juX7k7KP<@`Kz3kT zt%p&@8@|V+FQb>pSH}R1snMIllIx^U%=;jIMa>=HcU4~W;gUpeJwEO)uC-_hqQ zkqS{1%uGI#w_QydeaooI?r6ZUfrd`0_oXf$C&|^T1K8EH*Rcclpkz*o8aF2op`k7cV##VZb2^y*-j@(^w&$K&SS@-ej+Wa={-g0jWpzg*@MPq(f3=k$9C+ z9F=ulao?88MsyW=jP+orNsNK5c}&#kOfXOEGQewDxh~->m&A!mVog|BQB@90!<*v3 zc{{#NZLP5tj=MrFObB^h^?`%%iy|c$9WmGp=2)*qW94@)$S|!WyZ}wSD)DMO0bO*Z zMtsuNi9QAF1mS**FN6=PPg7oTv&Od)YmQTb0{vZ3EDFaCNva{3)+`dp-&Eqz6ynt- z;NI)@Nx4ZuFKZuhNR<|5VO_>y%LhscRET=_k+fWHBAu^PHgg~K?Ji4B+6A|ANQs7r zPqfxxGPw^QS22IF%Yra36LFt{jY#b9-rQT6nvU-dMwoV#zOyYDWk1bMWNTMYyqAgz zvU%QZv^Hf7w-daquoDq9CJ#oWGsb^Tb%XxUY7o4&iuc#9{5*~4@KR;1a^%bh52$Qv z{{p1p8N};{c)b{;n+IBQOZ8!W8)n1tfsnD?AqwC^vGW5%qu+xKXn)01NE1u8kO7)mi<2)*CVVH@M#vH^A#5maL!uKEPSf}5HPwZ{8CwR@i zoO_3lAZrtTGP`rUlow%`l8WAtDrf)CqkTdmx*|L4ARb$vdu31kwQ1o8OQW};ir92k zvcI52%e6&UWKEu1c3?aRARmUdJh9P?+;pvY5HqORI~$m?Zy@{>Vl780P?acRAqc9r zxwCZeb%`Z(W#Vo@YJ5O4Fyo!CgI6q^Q^1}P7U^|{yN*JOuVTNXZF}0Bq^k_xf49Fp_XBY!VmErG*b*1KI+k>$ARTnlms zsp2}hLNiN%R)lUfiNx@Yu+6F&)s+b6kd%8NFzb-Igg$ zZucZUVQV=Uh2w6=O!<<>8PUhhAOz{}{q)NF}`-R1s!%IgflM_*f2$UAF z!=l%l+~)Yi6OStHLnwrnpFNLZtAU?Kb6coP<VuZeO}jG`Vx4pehXVMz`u(a5 zs*u*6Fq10O`E7{L3+V%rqpxe$<6-S4YU;rf&OA9H+VnhjGZO8F@x{112MGN=4@U4XHBkrpvp8`EXJv~9;C{9jjv3XRs zg*`4<(7qsd(v*+3gKUq0xT78FYxwB zcvYib2%!$!Px9lh3=59i(Sx0g0v7eEK+uB)59W&6lsmoQ7wHL)E4~r>q7)#QMGq3% zbsiS{;tm6Bt!4NMw*O~$AL!t&_eJ^v#2w>s+2cPHi2=Le)+nCO(&EDrIru(^605lY zD}IWQRRlAC)RP$6Bzc3raqiyj)gABjugY!FI{~~Cv&g z9ifhdlGo+sfZ{Ur7+TFhSpE}FV(Ct#79U;6?<6X3_GH^B{zyMW2rlk+;>I57gib;u zeKuMNESI+Vuw7n^g_mHW73gs<3X zp%&%>SRoqBA!~k$djx=JZo_VV#KE2zYk|zb(^P&T!DetLFYV`@2<(lL?NNfSs1{i? zcyPGla@-o;0Ae-jO3Zepj$R9)`OGFLN)V@=jMZB{CZJW>{Y(CbJh2L)+HP~*7+Sl) zS4nuTZ<`s57+dr%qzRwc2YYnO1C#s8m&oiPPNo?9kvG;goAkucbW76Yj^_d}3vsV~ z7E!Eyu`!YtNs}^+)|GdIBbB9mdxPF209Irv$G_AkOymV?#CIx38F`GGk$#j0cP+3z zWsXtOI3j}s>vmKH z$s~nFZ9Y3t*4*--2KBhAuda>g#g^t7BT>N)%C!RK7sm$2P%wEiks{I~j*|rEEp8Z; z8e`lU;`=P9Le%B1!)Dlm_@WX|9rkt8wTNwZox?FjDx6~oi9)EMCkLn`1(W(WY={r+ zFM4ZoOxLd0g9c1hN;LmN=S>1Y>pg;e_4sxnirkdA^Gm@)`QKpR(~SgmbvtknR2gKI zf$G`F0Y@(#Dxi@;9a9TbMU*CFmF3z|w5%Q3u=T_L^nq`(b3;2Ybjx1W=~u6ldg5RL zH+W$ft1=(lOF^xw0tw3jtgrTJ`|}ywaDG)*YThMs(E_sFk{xdJ zRQZpRe^dGhfOZ0StISavPga;t3e8pFA*R%beHPu5O^DbyUXyG*%iM#^-rKLDPpSG; zZ*A1Ck=^$TH^mh6Myp;*si^<0_H{jd7eH>>J=FNqngR60wRDtu;{UA6fe7aL(pBFy zIgLnx=YG|PE;q#NqIW^3{lxxLurWW)5n8>tqg>dj2G(}gw93^B$?}y4Z_lE7ycPEH z=WQR|;c~D5pCOwU!r%%rU`ppx#DY6H*^Ttbj9N}`rXeZ+k4S$rG7=N}nLZQy^<+FH z$uwC>51uqMAIqDkAuU=2UMFZUPq95J#10-D4fb%kgO z7V%GB`}>M4QAKtJ-d^*?Z+E?Lbh`N3fiw|>eNFg#qK ztkT`*lg)$xWpL}1jn;VR;VN4HwOUcUsMHTLmJ!`%|rr|I8|&4Yt5XkV>hM002&H+)2_IK(%kf9iw2|-4L=%^JkdHDyHs+;oasD3~VOT&E8|8RReAb znIlp9eA~I{#9|MRJFxKM?Ge`TkEz&yM4N%@Zy2<J%H4RE81f=eSrI-Ig=%NMLSh~875O^ovJH;iWE2u^Xv1T z0yM8Py9^(&RYv`}%daVcVhtm6``^Z%GJc4pJ;{vJd0ku67U(MWACVvp6%QlFyq)LO z{DLZ@v9byut3MI;a&&}>UOhPsvAFm~IUVpj^d4&GG$M3=#m}K0YwYR`**Q~T50+xQ*x=uB^?-zEgGr=lHQzJJ66ovCS z&Un?8%wl(xz5WSmb;X5;ed6MFHQ}cGx|3Un>5? z(wiSURPO7{U~U>9SF!!mM@*194;wm7_Rm0kML&vQKY%NjH0^&3o}t>v2$5mP8`0FT zz3a@|06r;_I{`b&y(uOu0v{U(pWYTzpeljVbw2_3z9bQw--d0aFDuG3;bPhw^(tBp0PZ-lLuDI=Vi%}|4+ z&7%>_EqQb8qriRfzAvTc$zuwMit1DJ#Ig3a#5G3EKtw%-KKY~x&R(bEc}o7I_y}O; zS&SB&i4X}^zYeIdvz>vU=@Wa+37k&`qa7AYrOvyl)-6ZjwbwAN~P4*}X!S*qKs;4q<@>*w zQUcX>-P_8@zlr`i1T~O3lM`*bh6x>TUA3Gtwb2Yso8iJx$elgih#l#k7W@YU)fBI_ zYBU#pRl)bF*@SKADu-&WyBOFZOZZvHlQMdn5oT8pt`U zUXmNpz*$;|;FP22N97Dp%PAy})*tu=#ha>?@`ot#+g5r4Ogx@8>Q&fj6o;5h5{mTi zb7Jz1>d{J!EK)+1=jt@ycv$jnWO@O1tiY<*BL$Tf25!5a$UOCX^t+k9jf@3xfCa$D z;l;E=xmvN79^g1=)5pSQdmu_n>sgkrfqP*Wt#5q5(0&zG+Kpso*!h3?iVe?r>u0p(8Fv2}c~%>xGe zUp3+zo)C6SQJKm?BFR2YZc<=tT=pDW3!#%ecN|Fl#dm>F8q@d4IaHF!W`>eKu!f5~LhOY%c*6l>HLOfhR#{L&4(c9BK0U=){*l#dJW-(emU zX)3YcE=Z`~-njI1iBnS^|EG)(q;5do0ku{w=m=6*3bh7p4MZXT7WhY@e10kHURRc4 z5|yqJ^0$#dBrM2|tr31lj}6gkOr1J%`ErgOQS@NdQX#Z284t#LQKROv5CVNE!Ne=rF5B4NYJd?)?CK1+J8}bzAI;@InlMlM zB6iK7_*pqPa`$TK-jiHo3-+-2`&%$bOvi$%33|`ucwg%?Q#=5J7h6%K_yZMHiGVri81IqYhneS^=Ok{V^|@e5sx<&iQ3~I|xgSc*l}GQe zv2cPHpn-EDFU$y1If=bXtw7Ak0|L&KU-6Y~%lQX(g0lY3g|9mv1KVyyX8Tkl_Wd)H z@Ky@s0y}^oZRI+6X%LR)7*(y)whX#7~F03b6%;N;#meU3FyTH{OVBi7AyPRY)=ULR^2! zA{}ZzXH?%j=1o$VbD7Xp9o9(4L~ca4X|E!A@1KGjwT}gJLSL<0 zi?vAVP*a;m`JD)evJ&`z;4}mIUxf2RCmk!C3dBh_P0Ru9pG2UOLwZH{vQ9VT)K8Bg zvRxi5KDLeuvRQy+??5QxXTrO}^rr~QvQH>ex?5LT(~?ECYPJ+w4CKcWYJZ;63sKpL zGwufZ_}vh1u49t%{bUe6-^XDnoN55xCAq1c3z436ZpY2bCD)4iO*{eQZK;Z{(}6CSO06ub_DoAI8-GiA(~G|0?p1c&Bl27z*iJ!_>~n-Wi?H4 zEm7HcoNgZ7?Xofb-ziq+=$p!>9o0yLtI&jiN>;aE9h9ZI5F{DRz@IWGi`m}#mS2b0 z5GqJR5iX{!^ho3cNqK<0NTu38S0T<>@pp!hparWyX0N`h zSanGinzr*<_w;F zZ4}tg8K}Ip;J|scFvE8W^Gu!lV`&BwM zqB9}&*XG*BAo*vO+8mINA0&#x_2-P_oj9nhYr-6ys9RXR>Z>dy>`mq9JF(RI?{YEC zKO>}#@Y2WE(O=t8Z3GD;Db>Fo)SZjyDG`~&?FQ?t}KWW z67BCaluwnYPv>DrFDg#b%0gau%79fB4?TQSG{d)Pd}GtwN?;bX;sK|EiN1UB>3QUy zs<`?;4o*n|On!1;b~&uT+GdEO==}A+$uGpG%YyoFhg~A%Dbfqgla&Ie_ED6mj4Lhy z`qz(<8{(4!^(n)XE0#;%)jP|S(Jjh<5*u0 zjS))|_wI7luOc5pLkCMSd!?^;e!-Ugp$1fi{jWCGMFYzswHK65`1oE5HDLe(y&?92 zsJi^0AVQ=T_)i{li8mgTkFJ7g{;>8)T+|k@Wp~gQ82d~>o8bVl5&0ZvU)?jveU1@( z27WqD2=!*VpQmS?l1@(Z?H_VNm6#?oH}SO|l$CFkWEU=iC2T7H5S`pWZxU-U_>qvs zC=zRm4NfJoynkp8odcNXDeXJwR{J^AinKbUk0$O5qKniaEdPP&> z2}4wgt{US~BQRX6nL$5#EPuWS91iUKQg|+7MtU1RVzp=!M3LOvk&rmEc zhV~eQ-l)gmuiB@>xlUOsU7>w|&{Q&mC;Gh2E#FC-%o8YnvvDuFlNgDQD$QtgQ>NOi z%XGbsF$5~2MP_f+Qd?Kn;wmTE6p@k%cim%o!6i+G#`ycYAP#*%!e6MkKqNhh+4)K@ z4WYZ^CE2>2+*3FW{#>`y@jcfc>0-g&%xj!9yg$2kk3W~Cl#(qSg_4V-P+J3t5P^tW2PcUF5 z9du>svOdXwq^ZDw9t`)QFKOzgszUI;Zkxb}h`#B(t?=dVhCXqAt(TZi($h#%ttAMU zyH|xK77zrTF;6d@71Hzzb8H3Z>-?FsR!t-hDim%Wlfyq=HmA!$!GGOqMZnO0nKO;) z-V|UUkCQja|13Z`Mg}95H^Ix=nK+pMAR%!pqG@&|tUqrNDf9@g?x%*q>7%G{kUhfS zt-sIdx8QJA61AgZI=YPwOqEdYEbB*L3cZEUW}8dKQoT8)woU3k8xf}+&|;jHo9b)bM{0zqP^ zGP(~E!%$MfmL+tWa!A;HzPA%QjszN5$D>l0-3nMDlhm znHnUo_2uQ?AN?K!6SzuS)L^p3NhsZDQ>V4U|Lmv%WQ?CltG3?}kdCT|*`u)x>LJ6C ziNt;Nt6Spm9XbgS?+8Ed29ZbX^5*Lz+~nMAJCQ#<@72}jV{N(Xf8FE#b*0U>NIw^8PO@U zGbFA8$YIC0_p&4D8HhD~95WSz^?N0mdrnbV)Rx>NJoqQo@OAGO%{G zQa{w&aeev{$i!2i1fnC$bE#)Q`JWf1)tQ``T$V6cmGfjK_CWtE)zgO|s|)B~sVmiI?d1Db)_lrI*R zpvf8WOeR&;d~e*NLgfxl544idv*pHPx~v_iY}r|ZoyA3=gYj@Sd#@O5f-}kCAff+= zZkC?_RokRt6HdwSa2d=7>za&EOiOdi9<%?On2_ysHw^uEDSepyv}VbVArW-$3qUzU8-Fq;Quv&R3vLer4G0bH5YUn_WBr+l#fG72LD zIZoFOcVgXVQZ#wJ*y_7eZRXx|_S>hhy-0+N=$THl-IxlBm#azXv38@7RVO}(Jtd6C zElB+K=VDNYDU)r4>#G5J7XP-0(1JAR4!#TyVL<^tnzGze^^++J%dW!w-892~gLw;- zeD~jf%x^D7EZ`R5-=d!UjOH(sw)^seRid+u0r2mL)~;<}!gQ_C&vNo*~= zuG)XB^)>@kR!b6tk3;4SWtF@BN2EeIyZ~ql%w6$n zbeJRqT^gwk&k$;`}+O|u1$u|mVxh=s}=`>=UG>OM&jJw$eH*;;kRPZ@Z>s4v_A`ayiurMpxZYKl< zFbloW{QKoRx3&D8dHP((`5m#%X30igF*iu(p*|v2-ghwJ!f@=p`tynW;>oL)xEztt z{}vw0Fz^d+D9rHp=l2luzEI#Y9scrCaxfwSssTgAvbsH&f#Htl$EYCbJ4X{_!55C? zG?nANi=ZH}woL`RT&6E$UQ95`+_Pu94i{QdlGBtcml5gX;jlKXXFCr;9q+3{e)r7$ zHoko~qGoj$UW96?)zPruTu`dja^+swGwu$|*?Ruf!|Za*e2293@jnyY zf6RAnKTw{QH!H7CtJ#aIqs2g9wEW1Y8r;w9z&Vt=Gj}Y(V|kYD0nVog$3{9eAzdN75w@Ib_gP{&K=xa z2l3-^6kiiO&V8>pwsT(o>t?CC`!QzIi$q-V;{=ddG0fAi)8~uc7p7%_SD4G=yU~p| z68@azkUXiHu+SO#O8o7CyTW%C4%h5vco~=0Fyt%xW8GsJr~?r{YC(z&7L}!H$v0P~ z&@CTm7kze)#AS;O_{v*83PWk9TnsXUYJTLLp^?;T{J*F)(nm393QnBRbbc9S|@ zQN8Lm3q+*Ee4poMe-&-}!7s4FR)Lp~C#flhO4)Yc3#(8(1LvC5uluR{_}8{J!LZ2~ zda0_@-OmpQud1SwATj?i=)Nt2lXBYlcbacW17rQ)-QB?YrzasJMIbh_cBD93%~kI^ z7U!2k&6e-W)?0aXc^UW&k8KTSSaEfB7G7D~t*A>)k;Mglh43BXj-hqK37dgn_H|`~ zx$yVF?H5h~MIKk_5E2$z5L#?a4jtk>>Il;6GRu&h?YW!r-+7uVYD+CHJD01%DpvA( zm?GNhGT_D`BmoyB?F(J?-QTVqh=7O=ne}x>)GtQe(C){MpaJ0<9xV(?~cR_ zL22=S-xeahU1d#N5jbK9fyG`i@F$NY%VqC zUd_uw+RW+j#(oDoU{#+7`O*I!P?Gj4 z@D7UfSIlT0j2WVZ2K)(>JQ?xN35rG6q2?vZg_tU9P7JXDj*exB#rSaXfoqeq*%zJ7!GfD=n8A}7wbi_%OZR13^qFK zmZW2omw+rTYl+h#B}H*m^~O#&yA@8>biPAMvN}1w8ZAXnQKi|1dVam&jmBZCI%29CiAvZSkQHd}SK1qb0uES>5 z*}vH{(ql7vO6}0Pf&7>&o2Yo8=(Lf zQ&v_$F?ClSxX541@w#jsgqqc~UrvKG25{o{gD93CP&-kYqog!Kuoc6BR=?I`fOk3N z_YVD$5VTs&qqrg#_(*NdCcRQoZdJp^q^sw>Fk{@mpOu`W| zbwCy>j%?xb@%T%{F|ZrYAF(=Y^iHoUJsoEBg>B<)=(g;kXe*l-d?AfV^3+#zU}ZTP zGo1hD)@i6^;-2GVd;p0qZjFsEanF(^U4dDgq+mJqKT?h_Ck|iP{<0IOk|GYx;UFPo z8f}dB!ADE5VzTLkz5>KAl2YBFga@0u?}}fq9$(lfejk5_m!LbsjB&w&P~=@>{#EH{ zt?b89odFcTZ8fPMAiu}JWcD?%F(7P4ezr08U!dxH92fB290~Pu7q%=)!UYagf!vLfXz}i)z^)t z&T!fQkK(rdprevZXFkmI zW6c#kMHiEz~(3Fsn0Km%~pUkmZ4LI=f`lQPotOheh7p#Tr|;!I1eXzi@Z@_L-m zjdtttU#*Hl4g`I)xKn5R*XmmleSM_D2(zX%0xXv|(kVu`If}iQ;NeE%2Qh<027O5& za=Nw;%jD_9uFG4|Z!Yt~A$9`djKBRsq3K($D7f~o%2%BbyUR4(bJXtLtWb!%=1(WY zrA9iMqy}p~Fw9-u=6b}R9v2%N$W_6Q<17?vx?g;i(s|rNpTm4&d~KZQ?`j-+o$X*H z*M05H$K&%^pV;BE)j$e+DD}7S=UHvR#IvuIk~GkAFr4m|8BaEMMT@}uwZ8`SVvrmW zSXMy**D8Zf1N#<=d(}bvk#DuJP{hVU$m}zbRjWuGVZVqp_1KS?;S||!g#u%88_udG zn8rc3J@c7L$E!tq1_M8YJl`${aX>{36Eh^-1hVzm_;)^=3ih8v^S5pfUH`?FD2w>t z{J(5T$uBh+(To-cWY6vOt-hS#hKK9xd?B6)rJJM+h4e_gC2(rV%V9@{+!!&IZr9lqO&y;vg?!Y<+4_h5eg6=no}MzC6&+vm(X&bG3|0Zmc9 ziEfngJ>dn-#C5hcj;M*Vd=G&vf(;mke|mbe>~F9j`1s*4QP_U?xF~l22gu~OqvR_ z#BExqWoKILEnHiJu8a=ZK9nSWKL`Nr*ewCRHaTm~&!xo4EuAMjZ+WtsVG7 zz#4mjX|gtYGnA`EnSaiS?;B9fM&F3(?Y`SC*$pIF^R=YnTGsJ`)-51MH^-JXMj%LHv+ee zAOS&DRIAFNhEfPecpqdeP3k93s{9@cj@)~Pu+d0x{zexte%nZ=8Hdl9)Rv^vTzF5T zwAmiCvJ%q=-xU#JP^5PI<)78#P$hJPr_(M3Ufp=3*2A6CzpcC4-khFzvK;CrzJxb)_z7hL^>@GfS}AlLg+1$vpYaEcdt#re)U3M`lc8= zU4G<+`E?=}{uY~z3|PY;$%j>PfKOZaw`B_KTDuwV5t4Vw%ywYp_}T&RP;EokW@98r znJn@z4!qfU?HH}Wf(?fQbU5@#RpxA4``ZoqqdE+pc}S7`u*V6QodS^_?@b@}W`Qc}VblcNvb=jg#G7bO9yCnh!;j{2j<7zsvlNPK+iqhG0 zEnKx^K}c-Me{&@qi}Wx@uKW#g;F`7!)=({pkX?o-SRz<5b~7Au0;ud z0Dh=b8yW6j&>#axeS7tSPFjk}$LNPva`B!5PfdtlL$`XN{U0ZKJovKHp2)ijAfnjy z3o7sW!si5^^tF`sGR-DP8LYM-SHjp~9hFxjd#f?(^-p$uTlJ(u+6Y@5T9#B**H1et zS`NAqTzuN7lr7n>sbU{Z>6jcK?ZO!Ru>TcYDUw9+Wz^nK+&|Wz6LT1`J#TW{@@0$2 zg)Ye>+{uV@L*ZKr1|ykUMhuS{#X1gr-s%QB_+ok-C)6UFv#TGmN$xmKd-=5O&uFn8 z75FK~yQ)~`|C#0u{IxalU)&9FY5$H76Um&0^rOl7IE_AH>^nI=w9VPqxHo(+e|bN< z(gSwWmSU#2cVrVMCSTg@@(c&b=48a-uUpGbtGSJm_|U9rFu<{*UyBM9rIA%>;-qu* z4%fm^o3#<y30^Di5!imryoJXoxIxUS?a@6X0>kbIPw$q9?pmds8lZ;Z39$e_k z549wY?O9A_#-LN^g<3T`YqYOvuhs+TLy}z!G^?-W9J>8l@K$=5Jq6_LGz@$ZQxo{j z#pGolYFdb`ZEr2{ofy&6WOPLpKeL{)9YUle$x_B@+i`aPk3MJ9W% zzCWK#MuNiLu426}OEhJ0{GNxD&ZENa=>7}eaoR;`+r6|!Ny39>7K6)P7u#9>3qjmS z|28H0X~ zjDs_$^KR~JoybEqpc-s;sL~nqNN_B9H#1F@b7Ghd7I0l(J?3UT?Ua+N!9=q|_Ph_P zYaO9SjIt-5XlF%^c@~tzZp6-8=M^oq<5#*{80{(pQP&9_fBUt1E4^&C@T!R5=S7m4 zV%Q%)32~=9Zg@Pndn9^#vofM*dy;ph0mBl!R3BDabV^Zh0FWU=hz|B5KXqpy^kHGQ z^w2`veWU?gJo)qVFj6^X`B;9}r3NnA3nJnz8l)@X!O4m}j+K!T-l~v5{tC{90~6pS zH?Z;cW=aU@BY*=m%1Q)6Hy&!>a}b#Yj?MBcnHZ!ZmtuRFdRJi*Lk*EFpdeGHCv3H+ z728LY`dn^a2@9%?vfs$@N9aNj^V;%kHuVkW9Nwv|ZQVnA*HTuISywiO*)G|=`~m>G zVjw2I?uU0W;UL46l%XqxY9yB!3a7{T^O>{OQ)#U4tu4k_>Q>ciC%&QsVm;e~i1deA ze4oqPr_UJr0#>qVbBr(o zsIJzha_&Uko+?W9iuNCjNNh*x`@VL_4yKCx`zZ06``p!;5nz=Ir67-jq*0f1HEp8O z<2ADG=U~HQWYX2Jm`A>=%5ZLWRi47DJ_YbZb*sbICfnA~7npZjq$Rp4a}v0f*O=g> zBf>oh>afXOF_3MAUtF1p?TgvRcvQDtHi4(SWdqJ-^}WMMIU78UvS(gN8@@?+dT$3C z_Foe6)j3=dU4*-R4#wFuJcvO*EPU$-?@Kv36Z+gmo?hKpSwTkTe^IaA6nekpvaI4; z2`|vYm|hCg*%ks{+3EqWXGhz$mZnn1M~cG|dTP!>S+oyvSjiBQB(>)7{uYkZgqNwj zGK`S9Y{N^c_ORWi17Zf3#HNPK+OwkFMSes=_HcECqf40>N%DV{sMZs4HH?v?bi=G2 z{p`AK^jlZ{uk5!uk)5@xjX;@YBOiYevZRy}lBxl0N+*Z>ABT{lr|)$(QUs;g?tNuZ z2F+@l78zcpVN0DJrkWc+e&BXFn&M+3sgHp1Q7nibIl*N2g z?ts=pVW^H_iflH5k%1b50fz}gm~5J8`5fNu`Kyd*&;+H{o3SleM#{ceNv})f>uF+b zO|Yy>Qs9WFG|oTz3^k)E-krGBF!$0vpT4yZqu&w@Wa0K4ZTkqkrHL0#v}55y<))`y zMC}FG+acTzmN7MYv`*pzTKFlNasmt)Et_)ukXA}lqTqOAB^FzPIuTwlX0Pf}iADzD zqKK;tO`0jx>zs6v8rBIStx|qYK3dY%ge}zoeY8pQ8^0(1QJ^?E7`##>wTt!s(-l2k zC2Kf+hk>T4M0So2{1}%;K;Y`gzF$RYihf+!Y^(GjUVdL89|VXlX~O8u!`x9hO6?1O z3I4XL!e8d9+ONam`(-n-HxwVacDD2B`g=x7j=TMKb(Jf!s?P*W_Gz~M5o_H|FCYAd!XDz9)*RMhh&uzmWU9nsmLhRv5}mgks!m|rfJCk6YoUk|sO0yH*(SZ}9DAY6u z)!2fuyV_HK<8&zit}OQeDdjS7RnQtM+r^>^;7ORn0U=}udbgK*67C2;sFv8iUGIV1 zRnhO6M7_45LI?Iso6iVb&6>?liU&y1#%2+10v3lujU219 zGokA~Uw?w7hLDq5heCc{S~sVex~N^j@RtgJk5%SY?q$Lm*44l=;)~gNW6Nn$U*)6g zc0V#oh;L*2dB@sKZXRIOHn)5E+udiyD6!;QWz@gAOFlzfdvsur=uVw*NgtJR4r|F3YZTrx*Of@tZC%&@NnDmnJTOMT5PK3=>T z+HNc~&EZ*;Hj_iWVuo}$%a=tSj?unK%5VLQH89mqA)3P{S^hE|OUJXJKC1Mm0N3(* z^?afdjDYN>nY#7O>QkFB}u%h&*=N^J1S>8H>0 zZs=@1OW(^+`K!jp?#Kuw!vC8Ez*Vi$y-s)8Z6wy0jH3$PUJwe;{a1x4Qz z3JD}jffxY->&OTqOUohMT0_;=#DgGTciLCc1MNRSA(l}@-S2IuZipNs%ed>IY zXZz7J&(PL`lu7qV;_W`MSFCj~F8F5UEAxFj*h97vn+KO0AR8rogSz@J^l?wdmj2Q~ zJF2p^iFEH|C=fA@ObcxQk&n4QjId9~AJ2CgGM5pNY~Uaw5xl;&3d`TF0}t`I5C1KW zWbgKx%WltUs)?*4R{K|0I>D(h?z{boe+ecdxHAv(n@ywd>M`H%6a!+H3W!xhd{HIq@4f^vXkVI; z&pqQ)U#}lQN|?c-86S$puR=rqH~t6Wi;QMcUGF7zE!XvC>E>h9mbmL=e6=P zviC(OFK3*o$(1@nI5D>ZZzzj`rO|HA19{z9pxcPVv8HpjWrfVqfQ;qp+vQ0i4Te6+ zB}(I^Z%j{H;>i`jeKQoN@q1)h_26#y4mMgu*h$72uX$Rh`(+=;k0Lim|9RU+pF>#} zclUuAW22;$FAQZy?FZE5NzrYoP&ckzjTRI;X$a+F*gQ#+2_&Hvw_T94d_S!&bOq6E z*4}YFBy0S6cp9?w?&NA+S(4jmnNa-0_!&`PU;_D%GVVk^rrwg%v(y1}YjN|Tm7FqX6E|Ap%^Y9CCtr!medeN?!MkyY^$t%I4L?8&6VAZj>>wiR_v9yH?R-k;o>xA zvE16TQv|gE%xpA1`YU(?OPhr_cGQ` z_@+qpmi^Q=l=@|f!1$FdUhSt*IHN@y)TkpaNGUq3KL#Ac+A4PbJ!id)B~gG z{|0DFwYYJMh4`0GEOUi=zS@A^>vLYR!U6XyuQOUkZF$2BG1}G5L(caP4y+z@#$ugP zc*;yNiM{hqGcQE0UDbf*x&|3+^=@Vc|mn~ z2498S>EG^${CBm$;WZ|Ww3=d}igEyU{OUh}f(9O2egu?qbJr$|*+{IwjMxC55qY&O zyw(0hJuv+@jpOLocvisf(beRPt0ga{jLn0dJ|U@n-U}j!Swp;;r7EqW15PV0@o3S5 zuCfmL2)3Xz*T>(ePwo_bt1}zaS+aZy;ix`_*nsbjqgw=HTaUG$ck1Bl*}ZvYJKmQk zW%XX0yikr%eY~Dx23mRq^N0IWUdE`lVZNR2#$Va#K)WE5#=7S?e;PfBtXxUREuWQY zt*!_znOH0>Z~zUm#*J}Aom($#4Y<}Bm&Fdpu;c3apiwFE;9ZuS1$kG+kqFdsq>5dk z*vOCR@-~G;3mdPDdj^0ExkPPPQwAfV;X*0GJpW3QytAjI!M;xzQ5{>gPS8Vay zInFfOJ|C2$ohK|CqeP9Ror=Z1k8<~r?V?j=A&=myBQA0FowWdcn#>`aSmdn__m60G zfg{Ab4-P8VD$|8K7M59yf#g|dpX@{O& z`oIaaa2sE;`rN#_7Y%wJ4`i3SsWE~#a)Y~XdEtIoT-f;doxlzGp4FWSbMR_z$Mv)n zX@SK&gWvsX(6zL(RZ&R;;Pjqgo_uRe* znAGVwES>EvzdAod@XGM3NKqJ5j7IPo0oT?j#D{X~&`>6r7p!$Bg)@n8; zKV4tnDW_ogl>uXx1j91`1A41d_FX=1F0iHuhI(zV!mSZ=Fvoq+#I0}cK-hLLD6c|2 zFydG9sl3vB5QX@O9E&;8TpX((ni0h~Bk zeAgB*&a}q9%4iBPqXw^4$X4R{lMLESTMcxy1C3%<#vh%YIchr) z*I4W+K_vaSpv?opV9n%Xb1e!4OP#Om)cmE{dV8q6$ub1wKJZxM|8KdUNBmd0!*eC6 zEG}`GTwUf+ZxQ0M8P6u=*GK=>2N$q|Z@g7sS*|#w=ETYJI6SOwI}^AXo*N8Tv*;_5 zip?)=aeK1?y;+lyjDx|KS$>$rnKC zLY8s}5&Uh6e{r()IcBJ3%*DymrQdI6zUN8blTxdu=}gn)7R6d7^aC`e!~Do5qEYOg<;b2LtkONB0(Ly2UAJ3)1 z^Tk~);uV)yMriBCaiU^9mF{y;BJ1-`jOUPu(-QDs$2XE-UoMSlOBU$$Y6pua_W1ZK zH|n61Ckcw*bBTQK$K7%+-aWW#%No-aNcf@t1g3_Nsl4AZ`@ zlAO&9F~W1yGjN)i0I2V6G%4WATo8WZ%qQVL(&++4O1f2xAuQoxkv??9++XF%NgiqR%Mc^r{a2)0ZA>I2d5IO`t<+!*KY392PmQFZ6U5hl2{JBQy;Gwt! zp4FI24s44=S92M-;S#ldVxw=Z?DmU1`S?9}e9*R_|Fz)Zm#0sX+G%Muj62k7szAXMHz%O$G);`HcIupSqazI@~0jP#pwH$yN8-hzEs-1y-U12kxk5OCbI8|vV z0n3LkYw%pD)-Q{g9o#8PTZJ*GO`+g(z3(Es^FzdSC`WCf!On*j?H}Bq=I=3eq4IVL zb?i(n0TKCJE3|BWStpa!=(H|K0P>FQFhUD~QyYyUvef{pfeqWj%Igj9)*T#m@mfiP zA?%)4V?RBr+%uQhN5tGCYm;dY0^-0$C8fKcw;4~*B5ZUCaW7J3{^QM$Bt>{@A zM$=mX#~6Hc+q;WkI6j#1R}3_ElX6Tan5N}tK#4E(Zjt3zZW?-0ZIy{s*^@?(yhr7G zi2@cSV9h5oz(eQz6eYKOU;u_pkcJGU4Q^n~(_h(eXkK0vwu}C{%~;ZxvjsvBO1j_sTt-?fz=OInP`DdGJ?OulTYI0FG-#n(|!_8tx7*>yu6?zGAi?Vb06&0h~N8J%#6t@uyfwn*(9GJinjIx-F=9iBNYO;jK2 zJ;S_!+zSA8L}^{iVW}U+dgG`_gkL`Lg)7b!a)Hx^hbHEJ+v(;u+FO{+7cZ2r4Bm3G zZNC*&b(*nkr1?sR6^wAN>4zulqcRDjQnGlZpfFaYiFqx8LvR;b5}G3cEBMc_S>_h# za8$~tJG9c5a; zF8oWicwufh+aE|$KcKi~mImqIba}4Wz;&UeDi5P52+zv6u3={Mlb=XM&uP=5qv~2B zW?Mo5IUxSZTW75o!2uQ!#c|URn`&%DOaB=b*mJh1khH^w`rSx(#8z8p0_mR|`vfHA zF^mptguTmjvLXGoPV^5iY(G6$#>;om%1wdyW$tB#)w=cnHpRaKrY~#K$>8`N8>fHK zNPB8iikb>)9rcW6tOv&mC7MsBURX+QsP!vY@1lzP(q|won8F1QtXOz?)lji^?$6ju zy;91dQdcQRVWTXg6~k7QEEX|Yn9WD(6`K`z&!i8*I82AT4mOD#@9hs>ClAsre^Y)L z8iuhb!DPWdL=nqK%S7V~4kC-xf}a`0AT5shbu1K)l34`VsF!M6k(xt!x*D{Q+n8j+ zhw6-S4txwqmRQTg&`o#tn$ktbyM~F}>*`@Oe9b;=`Is zNem~mTg0vBa8^nf8A$aFDM};X(j=qArq*G?f7c{KVi#b6m-}N@XtNT{vRnT2C#)hn zM$2p~8pbwx!c>yI5*C(9LUs<0Vai*VmJMUQ&t|-sTb2fjzFMt{V9X@SIaAg^j&91F zc6Fhu3);;QM0%7U->2d@lePN+&L8(pq*{1gxe=-;WQulhkuUJDivkswEg82g3kKkf z#i&h~^ojTCG2cz_{$n|UnI1ct#u-7}8VYk?nnc~x8JD;cR#wf7xBpe_q5XDab&R3f zh4=Qyg5Al_;nnL|JIa{=aj!RN`jdskW0_bm`$D^#Hu{oZsmnv&6674;s4gcbbDZMQ zOozSY-7Xi*;Wf4#ba)u6W5_4YyKXq9`nnZFaGJ)n@xXi|1y?HEfWyyvre1-BDDxuh z-M?t1+&P_-%gcY2!8s*yLJ(E<#GJm9cD0{<6MQ;}Q@EmNs{Zdw@oR*W=##;(LcKzH zT`6_nc4jhO{C3$ce&xFA)&ijyEE4|cbEl--X$KYrxlTI(LVHPI!eLadYe{uXCcjfl zcwJJq*t|Xsf@~poQ9RoX=-PWvr@+-x>m#lNZzdQZb}n7=$$o$imFUa+XND;(=b%w3 z4C1dk>{`Xq`)#rV5zw)gmb&zZZlW0P`8NqNG+Q+h+JQ*m#DTmzVU+1dS9>O2DMQro zx*`$(u}3A5bcn#hjYh@E(3OUot4fl}VL|AH9nBskg9d`~va}4EaZ5zdqY6ol_bS|D zJQQWHhStE5Mek4Tb*JQZnXq`PqkM^-Z1U@Zug2t& z!7!qhsT76gO{xB*HA!1F)H&ED=WjsHC9^k*0?SoNGYK4-K-xS!4N z9tvn34G_bUaHPef8hW>chFq5)TQH1FM-f0~jiqvgFVh z^63GmrvIAkUtYeWnov8WKl&MONr%B$4;B}pPRqq8nry3iD1ytJycHYK;?{!Kfa_4M z1aw^OHK0H0bQO$mTgvEa9oWlkIyi}v)CwEA#+B^UP96m~Mrs(kjH^6qfk!4~3+X4^ z);kX+X&G=AAHM&NT2R!$mhx=pR*})+5vrcNfcb6M$kZN2OytefkBfex(0V|6DHqbF z+N}E9!_H&Y8JbDSZZPxG^l9kx$!!hQK3>l2qi4V0l?g~RL+FH}KW-BXg-MaG3C+@B7ybebMr8=;|(xE&)c zO+`<1&MDWK4ySGb51i3N?TnI^0WX+`BqOpIu%IUzRuL~b!zG!$Xa%};_;t7eQ^xgd zm5*vi2kJsu2yq%H>KPjm^WLZP$a7=!Y9|&RDkXNhBzIo(Jh|*@G<zNhQS=a0cQ#uu&0Hjn#x9q6v-*ky> zAw{T6(T(_eewWpHyn>Pw)zzxIW)feS-A1D3mnH>$GPow1gmqi6U+m@VAJKmKmtges zaMaNRd3MUW-ldzYCM%QZ7&Ucq_Q3pcW%tyFy>b^|Z6TngS{fXx|8=30L66G9-oA#n zWSzi4R6_X2`CK4<%lEGrozo%LlLXa#F3>!o7KjiBav07UP$InnEj+!f_;YH4m*8}1lWBhZO+ZvB2WiF##FfYV{X};@rg7H(B={fd={=Gbn=REt-L=^wMBKTYtX&3*D*07O`zHiy85OAk%Oc#iniJd#-{@zTNs*xw!47^%VAOz%4oh;< z#;fko=+;L_JGEyXvElYme^cM1qFdYep?k?yR-9rt$HP(0|IO^#k+OhEzHfM#!ACd& zn!ShSws0A8&7?7I*5t- z0N{qKAj(+th4cOHmEQ~NIj#r5hHqhcnamN4ye`A9HS5Iv)n$x|;k>oT`=0z-<6-xo z82xNhEe1y*sh%QzmVxNHr5wb0bb>>U9;}YuYR54el_GFN|Av@+ookLwWI6djPV>>F z((a$Gtxd&vR{1pHddYGZ6Keh<^Psq@HoZSsdJG-?6+XT0he1zqigJ`q;+fo3 z@?M)c0$+v#m z-)c21EFoP^Lf?RT!>=zSMt-q|gPRMybNBLg%NPiIo}wE9s&_e8l@3FyrIpu~A5u3H zSHAG;t(SSrJXZMs-544PN(n=>-9B#$O*H2z1=u!g!`N*99x<<$PVr>1s$ZyWfzAEd ztg^)UdZH;eGpo{GNkHE<8nzuDph-MXu4n`xPH8UN3V_+?H+B}LsXRv-id)VJZuaCT z0a0E_NwC^tvdGa?l3d`FryL&S9;w;+L^`7NbSy}=c@Q$SfLrV9Q7!d5RZHR{Yb^Ti%VB#?lSCSz+7s1nU8>%1Ddm#8JayS4^$9!7OKt z#8D=7&d9l)$HIyTkK4!YE*#>dOz|CIXZV#yDJxUtTbOHJu@D3&@PMk-9|exW zBz?x}AQBV|E9$Mw=wk5z8I21W0|K$Yv|nBt=sE+kLjy`F7%zPjV&C)o^lVe%EHo4+ ze1xmY;nXHf2$coDJJYXegdhNIoS2xVkGvW6OQU@a&YqUeEIvV4%Q*|Y2a;4Awnj`D zQ?B=`h9ka;1q4=lk$|w~r{im}ry;4UjDb`T@c+)iB&f6BY94sF0gx8pJ2gEnxSX4H zV7aL}18Ue|>A2hp<-xWHi=5AZa^x)KF$Uzqk;ya?(kvxn@^ZumB-0ST=4VLL!a~e# z?G%>D1l5_`<+xO_wPfgOEyACa`3%T#B!CYORR9!A2doj)bO%p16STE?E?h`*fR3o~ z{k7+5?jX3SwJ_CbBg<}Old?gj7NmGN$I@z%PsJ&n&nNu~&b)i+66pv9)*d*H6O`hVLZI+Ke!B6`UQ}CytJ|ea z1!$|8Ke8SsLCSY-hM#z6=WN9;_*sOkXwC)d(1D!xh7^35&T?FjRDY5@lU#IV2=(8! zxNGhS3xz<`>UAb93?$m%-xGyme}QSk4A9m3uD9gT13*9TVA;a!Al}`bA4pS@H{4p8 zD7GZ$R;;}RsH;<_+M=_g1j^I$(aXVz$UXfu3}Prtp|(oRe@Gr6wgStA3y1`!qzJ1S zSs{7ITBgz%K_$brVY0k>VFh-bzZITp2I{vYXE+)3`16FM*YVIVfak3Jy5`dbhGF7Z zILo3w5$xWh{5>Vt(=4snP*XRF&r3a99Dj}t&>D&3cBy(3a6wrHO=e@I9FJ`S$ghTF z3l+Uu=l}lxsJ_&~x)e{Y<1C=O;GJ=Z*W!2rsCaHGww<-27REtz?p5f@r0Xh_>*D^% zk6dVwr^hA(CjcWw;oAJuQ%n9f?i02RQ1!oTt7?rC&0@*5u^J+cvy{dDr*cbmcWQH! z=Ih@Ve)UmF`^An{eQksSumYcnzz}z)AC>xWYkIW;I<2(vnR=}SfI1l{g^N?9wwzx0 zAmix8B9LJuRvvl`7=2@Cma+(@_^xynPD+WNFSwu}P0XopNOSP9vkQs15S#K0TzL$; zwpMh$MisJ2_RO_KeO>l-5he?LD)gSh*Nu1gZZ)Om0{1il21+v0NQEVEK}CyYh8stl z4ugd;|LvbH_B`CEK7~FnTbTln4yG*RoxV0W_*k1fmL#jH=H57Es;|ryMQq93Z=a_o zs_*$(s&l}8RvXzUSus8J>LqT~!e=7t?mc1ie$1?>I_;y{{`k-(*~M zBM;6Mn79{Je`!`-;yY>nx0c85OhXXOX+?lP(i0)0s5H3!9IwlTFY$yef4V9H>b8GaFzcL zQ*Xf)R~IY|2bbV5NN|_I2_D>n+b}r6-QC?iXn^4E?iwTnC%6nU5ZvA2<+=BMYkg~< zKXBIR-rc9Fx_VZPkrtKNYL;yBBl}dq$I+s`5iDJpbk4aiNKAkxjm=wQv~L)fhj`-v zV&oOEI`g4V!HJqIrCVCRpeX6Ngdy#rU9p-N$I-#*sr6$phEav!=s3~7f`K~q2+IBy z%7~1)!DYgvdKvl5}IGd@)`_71M9L}7;w*w!9cFf2Z%`t3$Jo@dV3U!y6 ztNq>J<$-FU2*SoNGggu*&q1OuV=+Bk&jyf0ZtAI8=fJc7LoUAmI-qY_=LXG6Q(!ty zfPwZ8$(7R`zA(1)J74)o3Awe)^_nQN%fzMX@Fof|KEvCV70cKGhMQB>I8`J0hF~c~ zHI#Bq2)pB9(D;z}{@Gzs`g|2z=5v^qlFBmFrAPzqnVV7}eDrG>3|JTki|NRc@F3dU zaJJY)ONB#$&CK}*D9{|OPbpaYsdaAeg>N9>V+`5|W|Ul-in6b!#I-(pB{-$2-E52U zJ&TitQDQg{V<<;Ig)C!f&JQj~R-$nIYKxk;{JN`C<51*~C&m=f_^Ir5-i4vkKxc)$ z%*r4nes=VMha7AGW<^KQ?cpaHRm#W=tqvmE%CHTU&@>Z}x~VjcP3KAFpv>T)&LFel z&;FYAT~0TnXsqAr;})aR6(#>~_XdTlJ;5|*uN@F#T4`C@yThQ|ub+NFBtD@P5PNwN zp{lh7c#$i5a;g~qRy^F$`%05@4cz?&WJ0JAr^rBRXgh$^9q*&d7?a%ngI)we57Xy3 zMzFh}&&8t1D;7rVG0QHf$*l=_+!Eg4VFu}Zpdxi&-Zpf^i%@?oS4?{;%*LZi%+VCD z($~uNx|8mvGZpus%(CAlPBTxxmAuuHJY?~k5cIi9A=*_!lm3uj!NuYo*Z~ORy7T4Y zn?gYIU@T!UMOIpiUeE|GB}EZ{TryiYPiH^G7R5fb^f;=yDN3D+0*ubzHYWD)ldO_n z^lZtO5^Ksqd8j719dvnEwy!Y@>y;YJFT$3Fp?>yxoZOhT#h?>A1mh!OwsijrTKEq> z9-VVRV6=|%V70Z?QpvN1zLPgO@%_Wj59Z>?oEQS(gemPNOaly-%gYxs%JCc2xzv1V z6DeOe8)Ro26jvKKZ;;~Oc&2x1m4y|yLjgc}N_*JJV&k6~4H+1+<7-Ky;pl2;B>>bj zklERbwZ_Pn#4xKSp!eQFf`B-+hE|I(zK1Sv-@fZwSN>lw=>I>x;M0r9_I$v7Pr#so z4EOPORBso7zoMNXD~W)2-wH6!j5nX8P;MKK;m1Y~AxSAPR){;f!*9Q1D~lc1$YuY+ z+kZulU|;hINO}enDp!70RG?g6Rn*ud!t}021FQ+cG*c&B1>4o^R;i8_jTh)^xkUz6 zOddGNc&CpUdi-NY4EnfdqLWv-Mi{(?2cEY^8=#xVGa?Sss9;2`q!f1~rVSOk8p!Ee zAoV@H`c?Y-#uwvJvdZynd_k^y>>2$byw*l9gIGCwLA-`JkdSJK~|UdzF#%;M&^;&A1z8_J};E zM>EEww9ikQzn@nErJy91!sES-wZiw>Up$WQ_JA}i{>{igBm49n+DOj2&2fA5J&5EY zY@jv)_ygQB^&Kvh;1gR(%|m2+(hEbexoDwy$hSbz#_UxRKDR$ z8+TxmBnhvZYXLLaz`~)mt0FYtv44{F5kY|=qb9$hCAv9tGfi%n`Nc}Z2#0-*;lxNP zW8dWFs*}D?vt)sYyM?Qokq#EtOGBI&rlVlr40y$~oJHd?R_;r`0hlk8L&$C{osK%x z_Vr0s3}eQ1E5E;&11UTqtkHWkIC{l_HRnXC0GwKSGI*~%oyWy;XnObA^gmL9*G z%CzCZoej$k&@xb00aT8@KO@0=(fzskxVa!e0Lo*Xd827RMGiWxOHO6?2o?VA^-cd` zuKJ2tm0+%L!9nG}s?S9T^Xi8>_zsD1+gbRT$qBX=&9o))$V{5zBw%e}@J08^+-an4 zt3I)K%HPY9JZ<~k4=Lwn&eS)j{vTUNPW?`>Jlxk1cul4OA9Tjn>Qz2T)M*!LIB5hKXxs{nw z!s;kx1

@F7q=KTW7BSLO7g<*QhKo)<`{Ez$4F;gl6KUR;u-)Hl+@-HWo%6YT^x) zbbZn)50j$(sgAxkHvqy_S7n}+(@^-zvKq?hjA3QukA6VnLPquCG#us#YG5d_J&>|Aliu!K>XMf=mCUpqP zn=k%L4~e8FnQ3#RCEZM;xl%`n`^e^vCqItUnaaDTpb&9WSOkJ)!Gy{Bg% z4wZ#?nbBI~z26K1nr{YvQ|nzOLJDi3yWwt6I2PPNgIzBjI+CV6;ngrCp}D2-Y5;K^ z_LR}=raWQv9H6JF#HQZ}@^z=0Bl%Zarj9!@>WA6U5#;@Mn;Dc*WV_|VB2slfbGOh& zZ&+QSh{1*l)Ta4S=GYG~DX`tJyu%b0WbWpCwOu|4xA9)LN^OOVT{N#B81l0IWg`Z# zX*BRXtkIC{oYg4N#^S1s`jE^YWI?^1d#O`bD@J!EvH8*}1>E%33+oGc(`hFAn!Uc| zpR)XW4er%A#+%G8^+ezE?==0a=5X-A`%BZ{C0acO&YzuA+&GeEb$s_a9TZy>YcFyw z{O>MXM+DW1ND_sqj8YVmwarHHqqt_b>_Igj)_u!S2>G@WR2D5ng`hR5`06_RcgXu{ zHupF6fdMlzR=BU9Jv`07e}!U`j^L%X361l9A9B#uwJN6HFd0fceKfb_(GLu9q^gX#(X2r0yE3_SlJIJcplOC{8mj8o`D1_DM3KrI#U}FIOytJ5_OrZ>my|v0SGAWTBg? z2Ao1LU9su3xLFOZ#xTjD!=b`cd6{nL;a^%U9LK;dz)I%e#elxZASQ}SbHRW7-}$lT z8;%I0?#FM&C`oR$hILNlD;Z_B12yih(w%kDm~)Gs|2p^{20V@yK2cjqs)VI32ni&;nutjTOs$(Mk_u!SmTJ=-N2D=Z~ zTU|xJS^L~l&!oaU+th75Y@2RDxMpVH>hlcWYD`4A8f>kzf)|EfR%9Z{kE<2c00!#7 zmwXDMIZF-qOfF;!I?V&db@}K3PVnLX@!;(9-1B)SjKnl^b|df4*nzfdb{$4lFt#{( zW$TMWQQ#1^exoBII1Q9+1@wCGRu3w@$obly8~Gla1ZW&nHs9tgMmq02?Xmhczk23P;9FRDKd_ykxHNp3TIqQ3Tk-xP03rx&cF}j7vJi=Q zd#!z%UUur**UvuCi&>Zb6;1y3uXK}aPvS*6;7y7ye(!7cY)bK1I(7Es=H{zksrL4G zjK$-pN#D;W^Zm$rUju<_cRCqE*zDc-qCPV1Y9pEOGis`pV;dZb&@MapdJJ)G!H5xl z%g)U_*a6nWG*K{&j#u{B@YCcdrQ`^9i7|&Bz`|A`KDNQXkfW z1=ie!8_DVgH>DBQf?AdUTA7X7sN;ISnu;JA+Q;*o2_L55=ltk0H3id_V}CglJNEs* zyG?f7e@upxcj0H>SGOd(p9t|&&qiwtstBYDxCv1gEAGtL^-5E^=)nxm;+rXR`jg1> zhytInwou2b6Ef=glGH!CtEc*eir&?+2r!P1l8^S~2LiUD#xmeuD-AEjvH%TnaOBGLmsV4{DCW_y$C#1`f@UV(t9 z&JXU^!kfDeUgU-}&d=!_Jtu0hS|y!kYi<~X%zs@RQ$je^qG_KYMai!5)fLs2DMCe=fN@#12fv0|cgF^Lsa}ed0cvSX zX%Wx)+##1tZ>U3ytHwggo*!MUV8ebg*JkB18zVX?C&rBT&*N8-aK1!n8(a;VP|EC* zHo>sFzlI!km_2on{Q!e*yk$X;1W-zv!iKNEHjG{BCA~r9ToHB499>_^?!+RZGB)%3 z#zmGu=lNF~VAA83fNk2%Y5!M0qSwkxPRLWU!=}WYZ$X)fHE?1A+1LI=4$|#>z(^lp zrU)qV_gfV9HG3MdXjKObL}Uncx{Dtwq&HlmYO&y7U%CWP#$+$hiaf4&Bg0!}aDyk| z9n4Z`<`)~`?lh$qq?_%yUWuM9Z-W; zufu1W;Pll?Qjwr>!%;SgofpF=*yp=SxL>KFs!t`9-w@=Si_LuM#3Ve`3&tHow)dCeMy_D8V?- z!;6_-kWxt1f(1D(-aENZnjx;Y`)loP%G{qddso=Ck+4KVwqO&1SnqH6p<9W*W%`PT zI(+r2+LQ#oMbWfjg5R;SMnp_S@GJI?Xw7{1kEvGWp{jNRRZ%iFd8nrsDrqqzJWIPz zquvZ7oV7S2-OsJB%oDk;3tbjhCz6Q21MO=7Zk{zU;-dDrV)oRlIy!8Y#gWLS`k`${ z2WBUfgMMkSZ!c1|DZ0fxB)@j92UA1Mla{KMa6AYvRCY+Uas&b^J29Yzxi6slEbF6* zeB{W>Tl&RsZoj!+8%2bDbZG4XXV@FBlOEX(ej*|cn2@)RkyM}meAmP1A5TND+ux0> zK??BdRm*49uZKNi)lSHLyN}T7u?B!^3_=EwFt?&BYgHGJrk*b_`P@TE37OA47dxE{ zHw=y;J^B+H*Ws&J2}5-ci z-gi|aKf)yz-Py(9=a+VVOnAFBf`8_Z)Z4n)++DSokuXW_*tN*@MkO6i0JwOs2v|e~ zmh=h92ku^twGLYUUDyk!d2YBY(aWn|BKcVpIb|Db$isnXAXEMW@PT-{%X56xHN_E3 zQC;=q4GC_6wWr7w-d9V5+!$%gJjbog>?K8ggChFpD|V-} zrtTnuTj=SYQM#4QhVU7)q zBYufBfIng~OsM`{@E5h~uQRRvYaeS@;#w5j^FIl~_#EpP=MIZGUi-py(|d+mw5DW#t!Jr^@SLwQpm7xSDfm z;|Kpaku678xd;HmRO1)C&o%EV^$F3WyKW{u3R?Gy9^DXR;)E`isF!*@*zCJs;+8xg z0G??dKoo_YgVimKGllIL*&m}kNqQgV*#P6++oT>_oo~13{o`1WF7jsQ&ssfvq)LRA z=$zWve2jUXzE*ZN0~4V|%CD~;g!^X$JDU1&GYy=C^hEl*&h01;x))0Wn9#4wln@0& z$Py%0#{Y`qU2s!Cu^)d@J9A1Q^vZ5+FxTqLLd@1la>T2T81=U?bV4S9B*)cH`~EU5 zT}4|X4#YHa|D}3CaMn$JT*osWYKV*}biP3!nplZammA>D<^E=kRMUMSjU4-WfZ2m7 zG=JyO^VCg9MD+VbQ z97TUSv>t^O_XBb1Sy|vRUr<$3ZRgL-3ofkRJH8enp-o%-zzXe)Jb>~_AZ+Vap^la$ zWtRGc0E(qeN+u7IRe4@<0Z%#1O24DN>nstSDN#JA(%bU*@L!{v(U}abOKC{&V7&x|23eKUB!pc4(?{D&7)pz?bZzO zq9q@dIabFi18d+TEsQXO^7HQ9%2=HlwD_9Z1L{|QM!9^Jm?DQ8{RPs@aWDWAf4!t{ zAPl{UaTW_F>gA$ADMvt4f|EoeTLK49* zBTGin^7fJ}?u16fqV~vZswU)b%g{4bK;;hzb9-8SJ+%ql97}<#ik}Ugtq%7W1?&Wv zsl}Or?#L~YTd4FEmnXy>eZ7%6R3qJXVA2jLW=T!gtVWXJ%*&_bN@!Mq^PdQ&t&|j# z^+LLV=j-5UJc+O?m8$kr!4THasi{=yEHwX{NFH7#>2*!F#f3#Gtoz34&pe9;J33vu z4|mHJIhp5bPg}H!F3X(m_J6;^li!cM@f&qN2fz5-sbKqxP8hhX-N?NFb2 zzZ8Q|6U1>!cI3Zc%P4CS9J?cp!_UDg23$1e8ZJktf*3c#d{E@2c64PlYUjP3T^%hf zB6L{yXfBR{Gp}OIL}dQwLC;W)RSBuntE^nr*$Yp!v$xHN`TBppK*rJgk-Odq!uhd+ zN&PNYB7A1O$i)^rK{N7|aY(f21&yh_{-TsiOBRa+gPS4<+-*R>;0VSEl%-;)7g8c^ z;&Eg*O6}t*)j5q=B9CR;;vkmg&uFTEha>q^Ym1R`S5=ZnN?!SqKX)$6)5M~XDr;l~ z4Ic~?L}Wf@Fy#KRoVlNCX3kAn%tb|eB>*>DO86a`01Ed$X9hq8ZUXSVR|@}BmMBDX zk7Ne&@!XCz^4IWuk2C11DcE~ z!VJE;M+PA$Z3#1!$1o}OI*QO9_gBSfu$XAg2Yp$(A8Zm`M2I1Q!2bQIrce0bYFUujiRix7<=l26<6*?$A2Gl*HF z)Sv=9Hd;bQgTj@J+u!tn8nv_%R>D2Ob$^s>9UZ9az0|_ zAH(R@`0nI}B21Hvbb5KWChkA5dWP=Fet&8lNz%+cJmSC&e9sB$qqoV>8%5Z`8FPhR zIjt<5PT6RxH!xXDR=mtlkCk0BNj$p-xh{33tu!pp`bkk)V6Uu0#@caVgm2s(0v)}T#01Wxc|uUp?XwWoBRm()W* z6JyApi1ihf=#_UZdBDG6Vt&ZHah`Ro`-30sMEo^5QERO@g;@9?9RM~SdvPGf_U)#` zdHkG0z(B-SXJ|0<}G3mJV0$pcC=+pw^3+=qO+YiS#lxVF#eETdP*L zvu2qbW<NuqWd$IkNMH~_bq>!&;Xm(WJF^jmeTzTU8&q|e?5 z`M~O>@UP`XwJtz0d*Ckz(&U1Py(I2PPIhT~AC$8Mhxa&72+VO8v0(J!GlleHtjh17 z5pieMrC$xDNa;UuK=h(>!FmyAzAs1jf7Uz*8Z%lZNh14hzpJKJ9V?VF9sMll^V+yC zX@vxB2;bX;2G1US@R(@{+--UXmX?tI;Rc#Y-ls2#iQEv7GU zo6A$qI+Ll<#CyZJP%qoE6UKclb)G^q1~^?$Q#QxnZb0Jto?p3tcAl+vv%JIf#A`}}GTeJ2+okq&VN>CfMs#>%&Pnx;e>RA4fDuTI`;*m;}gQ-Cy zFGK7~SeBAHil8;)K-n@}?+6@u#2r!*DO~IJ)Ob=nS2?K&aR%XNvVoRKcUO5#J)PFJ z9HY%-v@w_|pGBjIOWWD{TZQipn8_c3Vik*062I=4H!W`%Tx;m?`omcXfO3oXI~+tB zt7&2=8Xjn8DE^t;Iy<|}&BIvYWwruC#>R2HlW^EKh6C{9sMM_=HsoEFOdR+FPl2FP~TpuNaw@Tf~ zT+$%I#^Hji3b$^hnH+ZfFP1yJ(N>hbV->Z$YFPg`6WVuV4=AmcgK?BMm_hgs=9iO) zNV|s`R(pQmCG%F3`(F=fe%aw9{TLtG2nRIDBvSrMN>q4<9d~u%e<<%rj5GazUI0Wl zpiFrwg3VHa*7QS&fd{H?*3#cUhp|VI(vQqUG@10;ZYv3o16hdo{oZ0`S*a?{##IAxt2 zK|1gHv|(zhTvo*QnS?8m?#_nm3uX2hZ9q|NmvZy7_PnPE$s?gh_HEd@2EH(ri!~wl zf80GTKL(nmR9xH+#ZdM%Vmxl}w6gZqkb(*lfar?j8JtmX)m1H5%_nWH1JbF4wvlq$ z%fk;$&L<8X+trckgihyu{><79c=Pkz_a_%77GF#gN5%$|#BhwGI$D;FSRn`fVJBLW z%?@mDJ+($(WWpm-66$`+hvK8Z+X;tUQs6(qs{(Cg$59J;c}uwi1;;j85q3zn4*B65 zg)w5j&x>wKi`q~IPBe!${ay;CF$_xwC_8z6v7s`NVu$9RS)%WuSebccYUG_P`9j@S zu8$)F18jf!ufEh9AuEmlytnbLg2 zeZ5osHh9jBxa7;YB z!AnkQcgom6CkJfz0?DN?g|d`2-C4B4vuP`x&|d?&;Z`}YGLRhzW{z&Xy$v5SSUi9Z z%y9Tu2kyM|>3ef6O@^{j=pRq?uc@29dd6Y4W&iB0+X!&s%v+J2(t$crVE|jbK~-`x_bo>YwAX zLX@Fmi^Qs$La|f6rvaPfy_X@4b|u}yW7HHQBRxGfTbhAC8qq+xsC^A}95abiol<4`gzv^lbD?4Q-f_G_UwS23x zT?m8{l=+Hzji+_u#N+|t$aWFTsiCca(I<_5Dzf+8&pPNd86@%5S+{UCpg_Aw%utKF zfy~N$^dEYlPw8>Lj-1hSnUu6RQ-)^RUS@^j_rBAKH_{rS%Wyz2}9dUbU+6tp5=S6qR1aHx+g z=sU`4H2(^|9)4u6AeN$j$#6LLR#B8{yXSFmLVEDZeJ&M{?Mym3sdW6a5WmWWnP-(p z@OnQ;nN+z%-CN#E4#(5kp!iiGDa@k=QB$UvMNPh}1<;91clBAVxaf?cuNV;X4*2Nx zA-krQ)J0gY`h~WtRfIeXQM%%=sW>xM|IZBW5c2i3asFzukr_RoptNLnr{ka4TO(@S zW|adyA@^O~UV!ckrEOj|U&f^zRn1OaoNR&a~BRLb`ioi9f1 z7-wk0@iGC|EVh2`4%oU@mE*U_5Qs_)CW~&YZ$D?f;`^G0jLj1T{aM;0-c6hele3ov zUP?Jg5!waY`QHihVY!ci;tng%&Q=I1{)a9BasL6Q^hp(f9)p2FznC=UUsqH1V0>8l z^xD3xjYpp6D-mA=SvojDa;c;rvX|`S$=Ol04)szsw7QNj79FRvC+bOMJAOXHwJs%# zziTTe2nb+Q6%#xo?)iORWR$Evw6@*t2Up*`3Evr{v{!|;>{|UQ{ph~65)>2Nhb(5= z+Z?V^tkVo@cO`|_R4hyWB}x@co?oqy``KiwmiOB#ZchI}y$;VT0r0?B!#Wd88~;j~XVeW_3vKU2aiIpu z=2S;AEv|n37#2-(U;X8M{S$cIPQ+}sA{<{U1irnHY>x9nCi?ue{U3(!jb`rPMc;+` z!o2yeG`#TD>*{oaKPefDeyr^>c5K>Ro>vc?ALi7HgD_O5@kI9~)jL zD+XuC*PXNb1p=)xEi~BfiNquF@Vl%@y}bR9nBHmDug7?nfD~>Kku?LxT#sd)L?u@NK2vj>c<2i*s9k z8|l5F<1}@1{qPp=*qRWNRk{{R3VZp+8JQpaYHPRiE~!neH8um)`)m*k)z>SxR5t&^ zkTS8|MqsHJIUwA_?rgf|q&A=~Ceh%&yCtXKzJ;Lo%X) zHL%dMPiQ!i^7S)Ut=zsOl}W2kArIKh&L=_lQVEikPKgwEc^;{keypzy?c6t^tshaG zR<&%l%$rqk3Q+zCna5eqv3!? zXMdrIuaN>HEoJD7Uh*lUx}a9w@(w`r-GQ94ES!O@J|^(xd>y|R^FsIzrP$w}*qH_* z>QIN^FM^SlW~})z*YLD^$5pwaKy+PhX4=%AAE50={_BLJ!tTjp-pZPu>y3({C%f|y zXGzwPnAcntd&UHcEck+)Jb7OFdd}HjX_eh zB%7b%}Enu1Fq&ZhPBd>`~tk+uP6%SHun6hhx7&;GhNu-9Xh^kXR>tMPnEc1 z%_uCe>T!WlU;}*cg(G=xKhz;Kxw|zqhqhc&g0@gi5tP2&zBS6 z`%qz%1TT>1xN$Lmbs>-prnQPu|CCNGr3v6fw-=3B_)~)!+gz8!ks+eucpmQv@t|Zx;1mBkVY+!GTOgMZCnyzZhS7Y2XaSu2Y~+lxVyq!tW%fHbnDfko3oAF417Z+- zUu0_PB*@v^mI9rlpC+$0mBO^9YR~|PY<#Ccei8Oy2L#!DRcZ`vVJDejblAHLv)U8h zqn>_;Gvfv5XbXF*Q}D%CZ;e74&G^W1GCDPF_j03cZc)0SdIB2crx9c-kRdY{=iM{W(sNar~ zhipr#3;$QX9mD#bklp+1GZ~!}?>cTh=5Gl?597uAO}zPI%YRz1QT!&qReTnXuDJhD zVJuNb)7Gr!nZ@I>-fz7nVD4?4!P#z=!HYBVX*ow8`v-8K zVQbu-n2Qjbmq=rG71>9gS{k?iS`aluThYA7|J9*n$T(k9>{gPOzc;l&7 zCVI+|N1(bXp_C_*c3XVHQGx>VBGQ-;p7RGuZQd^&T|{rM_Z#`ZCH{H!g@s%wGG8{2 z?~y$DZ*sYG!y*XMw;Svw9CJN)OWIEfo{kEOL3OMJ@!qn1QI*IJEbwo&7cLEJe(tpW zH48gS2ijqZ9TraW=Z*U)EedVHnT}etz{bDo3e33P`?H@lV_4VFXi)6AeEa5TEx(Ie zjxlAly^CQs#ichbrEqGoA*eJ-MRF%34c(T1{=|PeSf7jjZ^(^60M^)IMm4S9slplI zP|oU{2-#&qi_=gopq1c}#NzV4V~$B25=N5RfJAh)EMvuT<6R%?rmF$4vH!QSJV~#! z`@43{VesaHK&9c$%6I3iH=sqaY4Lvrdyapl{!7p`T>%$@A{aE>ngDpF_b){z0!EqDfv~k zYsj0ty99lSw+rzpLeqpne17Az9HU12$MR7?7J}+dbc34cDQkuEfK-|DORCcf@Eq|v;MOkbI>7;~`Q%oZllN_|rJy5q>Q9E; z(s7^7N6oFaVnC|}x#*E0eb?U#l&q#F-?p00k7DjgU3&V3uW58upONqxitVgvf3c7= z5w%ubAir;!$ayH=Aa~hRYf|s}Lq#FCdUAvEC($mbIfgc9CQtRj!N4@VLO&iqD25Jp z>${JFA?s0@(7=-hLtMH3DZc|KnCd@a}i|0g}&e@Sn-KAO>s^`7*;3R7+gl*zcmB-Q(lEexJn z3q+ROiP9`we-3oI@JOh?xZU)5qW~A5$=zxy=-&ThJ5>xkG=`O^0K{ znBZWN1;C5=-P(Y5+!e3Jn$Z`Cq z%+yrAtj(@)>px-HJ0o0;jKLHG`a6Lr)-zG1XUyjDnysr9u;&Q5LNQq9nN{Mfsu;;G9;%DX`7%f zrTsRRlgir2vYZqL&4pRy9A0xv+q$V zdXUFSn^xHkJ@Rtx5~J5L7`9SZr2sch;GoOqaxzFo0J6j9SJX5u93K?tJB(Th=geDF zGZTY$FO5@VK)Mg|`#0vb{Nm+T+L`tvx#D|AS%s?75wbN@_9r(3-LLV$RtJA$;d#4T;*h`I-h8GwnL&A=36*y2;B++T0XYe zavci$(;k#OJmVXKPCv7rS@ljmDnnxQgZoyEn~IRES1#mEiY7;aB#%n4fYC92s#C6F7E> zFAVwzAeDg+q7F5c-^KX4ukf`$woR!b?8x#W_rb&d^+c5!KOW~@+eYd-g3MvK97qIw zR4BWeI+-NW_ok#geXkGOe=-9Ce)BH=nA|*ECv&TPnGQxEY{pCf^0ZTezCXviIRMu? zEF)4Q2H`@~_EG(Bge!*Wzw4lEeKMn)@clZl{ZiV{DrUnS&$o)#MA`x_Qv@0hlqK9^ zL2mOti~V6AGA=x9;`}5b#T@M{zTzCLtGciovxI`2h&Dsc^XK@d80>q@bBg4~l)1~J zwEg#(IQ?d=I3}W@gZW*)0nHm`shrLCb(^9E!#WJ%Z?`oP!7Y4hu8cd_J2&5cX=Cmr z@`+feuL)zzc~Vf=)3W>D$bj*|^Z9XqoLI>BZOTwvJV@`GBAP6a+ziDA2*2yTqPlJ- zqo~iVHX>ztu9?qbi#SBrH1=m}ehvombgy~td)GM2Z)Zm=z4@*8n)29QKeR^;HhXlN ziEhkWr>>}wr~}#t+qw+PP#?4j-mH!Te~LKfICcyx?-3HLQ$C1WYB%J+ZBK(buW_{* z|MR+r*O|LOeRHV~+3q+cORci?@Z!h7Bqwmzq1BhICR2x4Z{CXc5UkWI#{~wi zY9ibF!MAFN!KGE$-d+)qtTd>$HBi3h)R_;|Sy0zm6pgy#wb-J82l2{;xRba<=v6f1 z@#kfmDGNL(s#>WF8fQ%)K@@uu0t9<@Tmg=D2?S>F(q&a5YDz!k9ggsjyyqX#wf;K% zcCK*Vv;JGGi{i9MRe2`8@CeTq!W&Y`XguPME*LyOGIFP)OYGwL)2}IuhTErL7rkr} zZTogT`~DBTh+Ag2P0auG3r_#jFDyRs7it#1Ul{0n+8!l&)s^TG*&m_BniVOTS|XqN zVeL9M6?T#^v)yF$#J*ToQelInsLN=os{b|J&+oYR$6xWo}t%n9YI))tFad%s0I19t@0T>`t#0$ECTF0zYUgX&U*RyF_ z1*-WkYik3^pG6I8w3zug5#iCSj_Ed6y z;Ic{q3o1aN$uE}X#-FJHbd*f~x#Vl%xxzQxT{FGSKL*B+-bc*iZB$?A7ma#{gG9YB z-(_-g1sGMQT9F;6&i4fagfr;5IEBq(NIWV|N3ulIQn{i!@V7He&>iW=#Dt(#GZGz^sDxb!C#>-_bKi5*X9n3u^A|@8SVxNxcGY(;4@n7P z^$+tEp!$N?RJjQjK%=?)r%WXVOP3X0YnNrQ%-QwB<%!hAjZufD@xP}!R*o(c?%x80n)1WI=W$;Nt64o{|p@W!@iS0@pu?*^8cqf79&W(Bk!d!~rMh7_`;! zR7;6cQJjN8?GY%>JA!?aByd0!XU*G8XmmEI^<)dfs6#cY7bB%T+iSq>I-JsE)t4(j zrqW4%q@ADKpJZ_fe@L3M6RpN*+a|#oy4NqR``j55*KTvSaPZiKEZZ0wg|kNm5&a-3 zBC^7h*0y$=T+>*a*XLi`6VjOHuL!B=oO*as%4LhVt9(7Ie7pO(r?`adggz^xoAwCT z7AFV6UtxHzYOz-;#bNkktk&oORm?YG=z9G8dOY^VQ+jhPE&%)A0rJCs+N}9k**Z8} z19OUl^dsx66#&(_Mbw*E{{t0omZ+C1yKOBP-Qd}SH{F8j>|Pb7^tFWAaX^hbzKT;O zti{9h55c%AUSciCZL#a)v%$i;#vr6!!GLOlXu!A*h8I`Xl;d_IlWO>QydA^%7U-D` zM}K$AKv``<7xG=R_Y!jtnRtJ?57*rbv%p959MEO&g-pX4oPuStBBsTJkJ>Of!n?=d{@4@k#GG)q**HLDj|0& zkCURDefQIKyenM~8AAxWZoV;OZ`GW@Z9aKyvF6*CST*0Ls6&pcqK5N9w#W2tq)a2y zZ>f{hqmLTh)nQGa;mqIqAon-QBiujK(F4EWVg&U$+s}^=GGBhmNdH5~J5lz7rZ~so zD2lz5ldhtp;5e^7tUa-2fBun)-VSz~8jk8FxI-;QBRFu?dg}09Chw$zcP3*5i3=vI zY;sCy5dQkjJg8P7Pk2lv#A87;nHgNa^NW z3z@}n(e6*gs@8`DM)H>u*lXgC<&f-Swj8Uy@&pSns_6{kf%yVLoy%l4wicX!rzPFu z52%fr?1Pnt$Q$C3tEs_lg+gz1(hZYGL;l_e-#5oTSBT+H?PNXpJCrASTgYKv~zoQ39{`N;>oeKp1#(EG11g=U<6_k5$ zO{%97D?|8xPDN+b#YaQj#E>q_r{j|Pqp9u+fPr+w$GKzI7Z`vr4i%g}Ln~xTO*NOBvY(-7~s4#_SRr_O?Igz!eKKBVlwXwUC$0E%JrkqOqMS0$(oG2(cADw zP)nCD8rF)p+H^}z0?L+vb>apzR8X9|%E(dgODqc9EvA{#n<2i24V^141l89e2dNER z=eWsyDSWJEqHX@1D&9LsW>0jj?WIWO)R1?W<$ZX0XDkYrmi9U(McFqz-4iBE#7ApU z9R{z6Z37UzYD45d{dm404xfoi<=IRZdfP>a`Yinw{3vjDcz{lgx-g@K*~x!bz&ARY zL(>kLFNq0U!VY6ft&sR_yTEKFlW1Vx++=)}sK{NvB+6jMu}x8rB^c?7&9^3#xN5^B zom-CF{hO+IMR98JWF;nWkxY}~&YI%{@I$ZVx1B152OKU@O^R`(Ce9Yw`}*>Hde+po z-v_z$t?g?|qmQ3_Zhtc6tat=$dGTsg50C9i+`}hl`l-@$XAzPK)llbA*Nwhg37#@_ z=EZmkeA;9+_)IMg%s-*in^+4quV5_3L-GOCRp0Us07x~)m6|mP04=El3Lr^CUEwcZ zU=iRHs1{`0s>9EeX%TAwazP3A`c4N?s+4Iz}ec0uhF@SpC z3f$m`c6j#;oJ&9me9*odl)|?6d|e3c*CT5v$fq#Ea*nPvA{5(0}DoCrk?$GS7zx?NJpcBT1o>t~jHo7t5BXf^-@cle<)-vyCCAQu zkDUUs%VPM|iXMk$$zFruO{ZDQpY)7h&!qkXgdmYNFV)?b(7^ZQ7w?b2v-jC!IuMB8_|nNOFe$ zIdGptdxuyW;g=l@G%6);BviOmU2N3=R`(3`pySKM^TJ^p5Jw83){4K@YGt<|i@lYD z7irPO#eo4uN8}}`mJ6y6_mVu+eHI8MT#t%SSy(I-wGS|~M-4xyiP{G){sp!Q8%ns1 z8s{h1sU+p1eMIJtZF8&U7K zUl2X}lKNMKyMOkp#7Kw~qpO5~SNfQkj5-G+Hl$sbpS&$q-+O#O5Y8af09qV~LE%=~ zrhD+tV4R(9Z85duHunFc>Z_vS?4l(DX$bBb+%0%;C%C&c?!jFecbDJ10Q}1qHy@ z^vhE=lKAI(V~8M}ne059lc1`cjSn`|1E1_1U368S-VtUywtR|)_{sK+Xf)yU*Rw0V z_T}Ic=7@;~MRsLtYWY1G|FkPY&g<%hqOMrn3EUy%tBi!R^zWc&+WD6m4BN_uv#9R{ zA8>}Fn=c+XCFe@Wh;HRGQEJ495~IlZ-3=AywyLVQy*Z&NQa#c|5vO{mS zY(uelAROC*NA;#&dQmpKaPIVu$|DS08JQ!!2>SM!d(n%SIr|-d(!D44e-~}8_yc-6<;pdxAhezyZ<8&hg9N@IlN`U>)z|w*{RMtS#(ejSY zRXg?+n0P%*p9W(7WA6YLleKfe+hH=jOWBC`J4I}Ame~-y8-v6o4e=>RkJ~g)0=X4B z0CWj@zF+#PLb}j3bbc{?xX$3rNyRkPhDls^Z`ji3i8cbd_KoN7{ED(Pi%Dv38TE=J$(@}uk`n2BAYXBvc@J!s=pbP{>?DPTMy3K9q!9)d0vy(o1DA+1hz-SpobSr+CQljx6S4vDG zQrCE}-;B<|Vc8B`OpSWIL!p?K=Uu_XpyT^5AoSQ6(QP_Kn^?>kSc>)g>IXwi?51Yp z^07>bN6&ZtRNQkyuFlC_S-fT4Zf1g_&*HR~`xIj*!F66~&2VqC(BNA#INA*v%MSSf z>(9@YdXDObJSO~$yG}>8(gX*r2Bph^>@Xe5AvmkJAfyO=hQOJ^-|naNo@x+1KTPzJ zpA_zJgLpbJ0I80bnzrDWQ@?UffW^R+?+vk`?w~x(6_COPZ9zZ4tw9jH@w>NO5Yded zUD?gjEC6_Ar-y4Rs#l1v-Y6B%X7fiBcRmLixd`Z|)|Sp}MtRpvBO%=Bf|!n0%`K5T z_Itwgr^=vPUY2mntZrYk=+m)+u4Y_KHr%c0h+{r);Ha#13bW8DoNK zuFP+~18TUrk1iJ!r>4KlEw<>#bDglyeY zy4$~;`n5)+bdSJJG~&I#CplhfwD?}f(vneI7f`+mD=GZcFlpgsl8T*d=RdkC?53v8 z1XzaELm&LMV_?fIiemcW9M6>*6X=il>HZ+`Y0cm>tBX?o=4#sW{^BZCqM{w zjvu2R*}ir3vm^G(%_(1Q3)qQ_N6tu>vO~mf;gOTU;T&{aL+^JD1V$V|c9eEnWmc>Q z`Z}YZ51A~@`u*m_QvD!Z8K*RBac#uJAaM9y4pa`cuwosIgtvRRZeJiLYsOStrH-~u z2em%8E+_%2XDhC?Y~j|HSs^j+kjrPZ#i=M*IKj>~oYPRR&7zO3F8BwRbIi-NyE z)j+rEYq05Ff)8Y6S3o>?Sp>kj=uYkrlpQ0AH;A5 zVR>`>b*ZB!8jZtKl_I>7Ho$h2HbOZ#+cGtSz>ap({Lqr42)@*RI@)o#-@>j4KF4h_ z7(AOGfn1m~+Xm&C3;si^Z2zIv(N+bnJz7Xt;XNe=#p>sa_lqx($;Q@8mELfmuX5(G zeCJt?cZq{U23EOCJ@Ne22>XWP(xD4zVRBJ5tB8v2RYO-ou!Z(h7Lh@ZccWr9(EcXZ z^y)I(FF{Z}L(#%olJeK&S~=>(!}`@|?tybl=R$!RA~|e1?ktI7Yl+ORhIScSS~D1B ziCO*%@03xhWJ?~6^%4}4Qp%waFWY;Z^i}c?vG^eIk7(n6;fxZ8qlM~?U$rWY$sb+O zVEF*B4NYN0ge{Is(6ZD1kGUj98!>NEr9}yzT^pe>zBJeQ(x@xuUP?p9yz|Y7biNgs zsTEwCqLXfOc~I_QzM&o@>Mg3e&g=$wglDJzpLE-};5+ZkjuDGmgWyN+i!hSJlhj4~ zU0liX{+%4deUkwUrmFN-nZ`^ZY*LSHChRiV?M5uTNct|k?{69ys}KG! zg82VVdI4){uu!T~^EL(}hE67jm4s_3+RzXObXj$*m*v zkP;7n?(Yb7s9f9>8r0QT@>JrdwQoAMj}zuaqg|OfaZnjPp&T?*R!;NzJS{k93-n9q zgu1$!d)|OuZ;S`5O*wBGfoM9At<6=Z_v_*k;G(a%w{ans~T6ShFR#S#pp%!Y+;_ z0}fUKp~5zKsrENo9jy%bHgV66X{REW&kCs*#m|e8?$pHn#qZX)?egnA)OJ8YAcQ3D z-w_poVyZW{Vij|nJxIC42{x8f!r_`dz`2p#PANMmjL)$L39V+QjysM<878>Hc!tg%wP8n;_WF%^Z1ad=Og%b>IhO0uVc`p40ShciaJVtwQh8}L6xs2(K3Uv+&T*alQ zKe+YA;3Bw`+tVBU@$h495Fpm=uX45;7-Kaul9h{J z*bDI7Ti2ey)1ip?sZ3S`Xz~3?X;nlEJoM<^R*%L)lk9ra1`EbfpcQ!SCqzC-wT!QL53F~HmpHVC%#w!+@5l7lFqQbbl^O4T54a5Ik2W&3H z|0$7&_Tgs4O=yN!g%MGlMb{dJ>r_S`9+Oj{7HlE#`nDuLZ(CfpR*WzLTW;GT#+1*w zQf}UYvB?2^42%<2Or0kQ_{Uv^lfMRNU!xcKomscBsdT)`iJ0~8$rCNDW^6RpA1G}1 z6HC5P1F{$C3%nz0t+`A(!yq;TOr6@}PusQ3>mOpyXC5pcP^VGZLjjYRkFOVgRH_P| z6C{!g?_3lgXCz@J15DUay-f|5{O|HeIo{8qCO6%vet^%rG(C^Yn2F7GJ_k&M+%62= zZ#5ff-|h1-1wV=)nHe8b57YlvzaPj?xKui?|G`3B2i<{){mA zn931$l|O4ea;z^9`ndkUI6Q#j($;6(TVJN%Q48~ zG8VRN$h5~2y0z|!T_+Y4yZYkdyyN=1oA*WXo@>_Iv*Pye#yb)J)8LNB*;3sv*MFZ; zJ3oGuZUakt9ut{MXpY=M;ezEkS14?T#6`h&)RgQ>1e!t+eqoC`2}W|`7~UHr1d^c6 z+pMwvX=tiBaRKh&&;l%NNx)HzK99sV*Wd!!M-Na?c5KMTR%hx;+GF={w?_0<13^>* z$MHkFCpb|@i@K|`VO9G#mZQ}J%cnjbGoHA|i+TfkGdTtA9hk@h;3W6+N`j0XXn|XY zWDu<2a|6DTL@onq%Xj0x?!0e=x6~g7p_X;iW{GA4hvq8v`qk{hRA(}@JdMJ%d5d;* zRoH`~`O&q!3@K{FVWre;SJTMW{Sd!zpOo`@Ev^>7Vg4Dn-Bev6K59K zg=cU0<@A=HDMmGm;7nA$5<8?29Jgx@i-vx=iY-nU;wv3q@xmudG zji@;YGK;?a_GAfnpD}naI(Va{``SAqcmkN#^t$G;m0ohS;NES$TPUXeQvJ}4 zJN33r*Xer=5X*bX=y~f{YO-LS%oZH7>t>%)v_H&l>9)n_W!#M^iv37i@9VoYZqK5I zt~%B6rL$n~JJW!vLiq82sV#=U z8z(VRVf%lw!A&X*D&?y_0s`?XQXJ=0kjYts_b5KHamGPHc}z8^aZi0aBW0?8H0w>qMn2UTdX2nXHA>AokET*U0Fg`w;TBjR*N+_%Ry875 zDqB=t>iRiqvy894fCp&_-ju3Oi#V={)Jnq^9V|-hzCta^xkHwV-4U+ezoJhqdSYN| zm?1cqI}{K)s*^dnfrv=nDC@yumZ}s5CFi5aD>i?2-YtkU8~3v3L`^k1=#_fiwx*Z^ zuDb1nn>o1uj!}GaG`mn0+bbW{Tgw=bdJ@EKfFq&t$G_m2PsmrOfVzi!mNFf{z)H+ZSuD8dL711mnnMWXCnSqsNWM8xX`T(raHrpStih z#j0p>zE{YEX(JP*&~ho9FURXPZ86UG(uYGHMAh@~nM7=@{m!zWb&m%1 z{gaVSknLLC=a+kuLHF)AMw^W$L_YV6Jej*l=xk%3%hlN)VUr(0E5k2B*UGxx9#9sF zSt>jInxcKA*)%=rTIE*dGvZ`oNz6FZILfcY{4U`v^QCHi?i(K({8Ik(#$9!LYdzP3 z3MV4+dPMXL6%O0;JI7k<@8=J_{n?Jpf-gw=LRTwG>cxcJ7q<2zbWFH38MKTU&t@4L zLMvWNa`7D|i*~P>(879Ge;!Er zwr9%_3FJyl)ZQ_&A#9gXx1}Ic>ER_0Xw0vbXRwV4ZiQOE)md`Y%dJunb;D%JT;FSj z`xEuKO#9YX2JA6+Qxub7ACgR;O8>?(ztw>4sZG`tcaLxevH#D#3-YTN_P+O|@48B8w1%T^q?9o`!$?g)_QD6FFxQsg7#~ z2sVq9>lH;Ft8dx|myql^LC5ZRi~r!`Hrq1X6r^O!hf8_W-hM^?#nLZfp!22TlQvC2 zRTKw3&>H(FR^nDuR*p^gdbX9U5CyyGE=vo$Q>c$PZ5pkm#XtA^+l)NfkwQF}E2AgiJYrxlw;!)!%ja z_uIVep{k{Zf<+aeFc+M3tPy<2$6K`|UjwFk*UUL`FwfG&x)_?qIcWz4G!Z~?36a<_yiM07Z+IG&JHtEElsfNG39DoQtGb*urzMM`yI=~NcSq)A zOLOcHH*Gxe!gNkcuU0#A4hsHz{y&fzy`+OY`8XT(_t89KBE|tAiFEvY}ZH8~a);8y5fQbW75RVEeWw4}=dt7`G3XZ*3 zzB@tDp@NI=blHMF_j}=UIQ*mBDg4Q5=OQn2m9Qy0YxHbog*W(#@Rh}j4>DQYd?Oj` zdEMCAlP(!i#_lH4c2`1e&{28BtOU}wK)n%kQ^W>X-8gGmqq(HX0AS1=*IAM)k|5voNGXG1=jDX8l zBPIFB(*(Fh5cm2hDZ>L^T@9YHe@{^9)#rD&J2h@VLG1O}YO|nbr0J^O(-MoPp%UIZ zp%HvrmL4mj(QS9oe_9xQ%yRG2F7q2w)x5@q51uru85ND+s4&B4s9j7tjael7+Cjx}nd52&3?Xbe+pXV@;wI-^+q`UgQd3%+Iv6FtDFApW3pkmhz2k9JoqXAcNeOPPW(S;cD4NN&&TJ3^&vq zQQrf!mC$2z@Lc|6Dxap1k<|y%26;b=xHyBAj`BRhEp~F1T6*ehMlKF+c_f==d8vyy z4*{o445s&Z-nXi0x7|;J^m%QS2=-X#n{g(5C|~u51wT&0TW#^eFZ1P8-EJRtNYz`M z;yV6V`;mS2GNtsfOV9nLpLN~l6C&7>HJkY>yON^T8y(MK@MkJo|6T&iHJr_bO>M#N zO$ya0TDynPNm>Vn(bt<4TR;ne$JC$9LhuBzm<0qdQj2@eB{`Z?>F-`5e(P(o-oN zr5C;@tfH&H07IP!zIQI`9|}yF<1lrJfh9)!J|02+A?dQvUqFhR7DW#`B_ZIe`JQJs z!MhHI&)bvU`qs|pu>H$tr|%y%1|MHZwk1jWizJ=ek!H?oTTPEGcKZ4P(7{1~oS3y& zAGO}~$QwGhj;yZ2sF?*e?SPCQeT$pDr9MTJni*vPRi0m_>3DIHbA49aMeW#|r@4os z2{}cws6#v-?>+A@9S^7Ki4drqmCa$zP;L^?dZTTz5OWLzd3cyV9(7Sq`t4E zn%SW9_&n$MG(R2P4eso1w{g{`COqQic;URDtOp((9o47EW+Lp!0-95gtijur8hH?r zj8V!+Ot`pGrhmOfjH1PsBn!ZYl1 z;}-TSVQep$t7)S8$@hV7wrQv`;6&6Xb1VBj;+)rSwByNP2kvF@ zBl9nc#0N<+fuu|0W{l1Vv;JAkzvyKg>D_a5-ZciImiG8!N=G8|r1~1crNszdLOxA0 z(7tyVGQDS{9VF&z%7QKYHHVzU8fk(p7KhFmw`60bJ9A$es3{yenSQ4By7Mj#mcS;Se3-Z+% zfiMSD$*s*akNZB}Y`}o#SWB$1pCv4V8+P)i&w{F~U-DZQU-*efJ-_HPo{r?aKiO}^ zeOwZ-SLGitIsu>;C(BLE*dgsJy$p`s^T3O^*F@-vHS{Udi-IaDQ`}Wkw$GqW{xShZ zDq;k)Q3(&*R(q*~wb!%)FdI8Py)tPV0)Rv#a}Yt=Pl=ll_Ft zj#7%L&+o0^qk2Cb&K$Wi=c#LIC#U=QLqSJ>^5xH2%g($>4e9U)$$wxK6QYq(ojE=L z4?w@yHrE3ygth334l@8Qku369 z!wNq!d;WUjR$tIi%62=$SQTsCTU=8{yvPy>itS^uJB*wA(eegDNk zT-%Qe9E|bZo8}S3JnZnCf)tp?_dLR$RI(Wcj$-}fZvsz zsE~VRNey=6@-5_QE+(tb5Nru<89lhy89i|89Niyou3Y?wuB8R2P7%ArIK$wd$qAzx7K9w!Zi6&f-;;eYI`fteT@v`OoZ;9v+6?WV2$%;JAd_lhGns%g*&r z(t}i8Ar{wRSyn(CL4u7T{jm`PPyCLD^Pt50a9hSk3d5_~#g*ZSjO2^T+ra87gD|d1 zIgJ*L`MK$S!}@29W-^{=lvO9V1hlGDh=qSxCAs9N!RxdLSCZ3jGXAZn3 zNjCaPPCuK?m(u31xuzd$7cZX_u1K6Yv`M1{rpiKn%%!E8#peaR(4*zP(!i%%g=JVK zPXD@Xq-w;l2ht_@=ozLgQCJq8siDu$YFGmXh2)NT1aB9vVj3RzA{QGx3iS8K3K@di z5=!lxRfrFR=gx+s)b=ni+RLx>UPk<7Hd97Z>n8kALIi>iuhk}+=>&wZp?c;+&J#p+ z8J7Hssl(~SNY-&a;1^Ii`_C8yxLAEO)o3;fFOJRvw5X+w>u=Ob!uxq=Bgxvc1zQ?r zrFLhi^McBO@1=`^E$MFQ3%ggh9mcn9$TOI1qNq|7>)!LRk$vOImlsi)!|&75IzwU( z6P+ljmB3`&qu-q#&xPzv(7vEX*?;_HDl$i7x}##2#%&IikCDGqG!B|)tVH~)eXnx+ zon}A&yj{pIp3=`OFGsQvFK>+u>qkMijUB~hur#A@|GTC4X8Bo?%kL=JF+LVAyvhd# zU*f!{_?oVP_P?b)WoONzylTgyW>M0dd|WLmKlYZC ztY(d8Fa@MnDrsv+@CM}Fonklm^{hzXVlRE%PZ{JmdCkh77I+Meu7~BkFdL|FrU?1H zvU;rk-Q8pEdE^&-wf=zbd3)L@*{~z{O;DrQhOa!Y-<8=Io!;sne(}Du(Gx+`NMFnP za|P1<&;{@Kdbk$OjJD~y_?ZNnXSS)pMq6lM;IJYpFbUFraN`bHwGLaPPDbck#F-ixV}<_3>JAEEz| zrTACf6I4>K$*8_seZVV9&zO3*IuWVV^!+HC_X3g^{^p{2hFhyzFp%5=LM!?tixH*<1ZMqJy?5|XURCp)8 z#}Bp~Hp2-K13UDuM0bZADdp;M)Y(JkA7;A`Adc}Y@-+DVg~@&l7wpvSe4h>-ew&iKuB~&HxZIFSM$p|H6_-kzn`^2U%J=Kp7*+_U!i?)xsPQ_*_O%fXw}8 zSNZ7*sxh73v9BGOc;~cxU)IkQgvtvI0b}f2ie=6naBg0Y805>J>ju;mE>^94t1G5$ ze?N8D+j;$yWt0FgDTR22lBPZxmrXZqITU1xrVlM$uQnTn&)1GjLJ6`r7Gq?@7}Rj1 z4H5<0{sSLIth8UTm*973brF@wbzA|@B`-r1eSCix-R>5J3;$mtUXs@+eTh2!+Kt+y zLu;fi2Pg5REcR`9@f|9EFeW^v7msA^*0+%6M$3NX*5&6=;(e6gqvYdcOAkkan(gT; z+kN4BqZy(;Xv@<~wbu0orSqk$C$Q%!N=TA&9t=9YmKFGxg0Ov8F?Jj-jN_N_(BbvO zvy1GRKK2`?m3>HiuEjUUex>?T!$i(c@J&|g-%l-3@X1UEHu)=V>>G`|X(7I8)6MvN zYpL2`^@q!HtilHs^`*bn==qJ!8M|JJp?kcD_^Yx zo;P9lWoi0L00mad>=ME*F*sqE^5Wq?cfN_k4Y7St%`7?VjBl+6lHX!uZ+1F&$jE3! z+nq*a2@`oCi*+glo3L-x>^`4Twyq6vy=@;b;^5_HPx9x0b@2+kj+{GwDRx0o9u{P> za4?zE-Zi@b?6{$E(|z>RTJ*gLPs&)pKS-pGBr+q!U&ZaoTC1WsZ?Z?dAc~t$%#i=B z0RqT8E;B{Asb+yg`ne4*>j0&j*y?s2Z5UORKSGynvo%13Y)_A$QvhU4^Y5p5@kHOZ zX>GBa-57Ify2&(T!#i@OP$#68vNN&hJ?#W~vr7|7AD$50U^1%WeL7Wq@YX^xUJup{ zHXCx@`faQapDIY9O`y(WvLQ}ip7&WAUrfKZWT7I9b5jHMK=HokgOkFKan@&_aVRGN~Yh?Lptdo6XCNhY=ZEaYbZi&z;yRjP?l!HlYkbOut2%<-G}RnZ~WWNKek1G@g{f<#xAS)Nu#FVhD-+4w@C2DOD z&#;xn9PyWvSx{)hpqW0N`uF&lW3(J7Cn z2QKv#j28S^8?XQT@uU=0H_V#FKkxFCp7%?`Kf8;Ifmp0o+np|jPhP`axiVUbo1FDg zi>x9JUfO-&2x7O2WAc+kZC3QdNk~p<=!_bk$W^WM(`t$*yKGZ7N-;buA$e;urI}F> z_Q5x><9t1t0I-D@x`G~h`$ShX1Ex-gHs)?xmTQ?^N?(UEz%E23`^40e>!9AwK(~gizR#p1lxk zu6hrb)hPLg8)k*vn;XywI}Qu@))-KawTrU--WoBWIvGn_hrp{stH`WL5|dC-gYO3SZ)<7JDf-Voqy}jg?}k{t3tTjHJNePb zK?M(54a$UDMH?L0(&;SwD=lZ%c=?Z?)FRf!_61nDp>;Hl&`o&~SRetGcH~3EqzU&~ zdcJ*=AyRIeWVdfvf(ERgN+!Z_YuDNiY^)5C*98! zZdk~dF4Tnb#N51Q77L#t^)OGUwd-JGVGGmGrYhe2y*QBQo zBLV~pJlBb*w2DK;PFH{5^;Z${q6iH>Xgl^R@no`g?YCM{@-ThZEN^G$UmtOwodq?! za$|c{BsS&D@M`8@p0a-T?%PGFtmzcJNW-RdK9WLWC@SMPue-H^otueHyOc5mB-_7- zVHrIE6=IOh~5EtC8 zClEs=9H#ihwVIYw8v}yS7ih`U>N#dp=f^D&$}}`&$xF*Q(3Qqw?bJ~jEdYRRoRKuN z7=*Qa54Nj#-7Ze3wnm-9!YV1;ME~RZTXZxJuVV5@1}dZ7@G8*)WMF&hx<(%waLOWP zEw~jqxK&Y+ccy?S%X|HLtFHZ-XV2-9)$?><^2NdL(o<~X5&iwDhB&KHUO+@r81j)~ zLiAI1)Vd)^0-<}bt!LwgejL_8Dqz?{>kI$v*h&&Tpn9o!(P^TuQDzG`Yi4X@I7$J^T9vl9PUajo3Sj7Kl+>&8bE%*!2 zYf!}SM5;+aR7+Vzp)N0iU>_CpD|M;N>8QGCX4UWELySS{k&(vj)cD`o?^}tts__+M zRP&=w6yl+(BL&oB4$qJO2L4u2LDiwV7?S>p!91oerH@sSCp_Q=%D5%&un~&%j#|Mx z^8_^QM6nM}$+IBxynow;t^YN`$!z$edZUuGrtgqKE+1i9xB_`0IN&dmx;*t1UJr)= zrz(K(7p+y=QDcHImr(NG#$RX;AO)tc@OV4lAA5eW*%TYkCx3}!M-@m>alw~-BRUEU zdmdCz5^rx+M9u8}^sO5&^ar4$a!mbn|C6z{T4#r4gs}aYzBTLHlhw3YDIrhr%Al*7 zI8X`WSmeAGcPrP~bX^zLrgOvgE8b?;RFLRBTYTlHJcdF4mcLnO3y<^iBgQwA@P*k_ zGgNzQaX^dDtx}#|V4WBIeIZvF1v^4YEHu2^((79B=n(`9EWh#&*&1{U&ykhh6Hsvd{7tF5Ca@R)6Wt|M4+%7*- zSYrekhfnd%^bHO%6rz!rbZ6>&TNkZ4+jr?x8u3$Xv1G7OwQxzD+~>8BFwih#cvb(= zC>*H4SZhNP2oty}x^ep<#BOI3%Z^+JDcnX&HUsh1=hN1v%DPq=E9xgGV*M5reFneq z2^G*7!&TCmLZ{#3fyWum#_$v|kKou>P;;z5K#0wR6ks{@o>_ zUPFbO-0i!%;f53jsy3W8jEhVzeQr+=uADtmo7Q;MVb6o}z{WeFN+YVLNnjlLqHX4F ziNMWptVQ#NoEcn?LNAj=MleD|=+=)ux_|o(#X=dMZ4Fg6AO-#Xn~`NXu zrHzgLr}5;s$e2iQ3aZe@hrj~=EfAqhf}p07?#GwI@R329u0Ii;zp(GF_8?L8M&+gX zuRIETD4(miAEQuM=_gFo(ng+ysD;kv0-(6x0G+=GPSBO)o6aP325d+>lmAIx zRPJZm6t&A=FemE#MM5q&M7m;o@3~B4gm{3#Y)5E!b(LFiNZckKMV!&HMMlXk7Vae> z*)i!4(3CzA05Kxu?r4N{#le%CXj@!wKqf=gBeLfu{>|18CQRk4qQrnI){NenaDRl8y zZc!?S;2res66HTh+c&{Xs6%C6N4m%02g;k6Z5# zI-W7X6T2l1**Ui8>cOxred@h|dvlAC|K+{1=xV9s{mGhE6I4x_ecuQyF(hJXS#x^5 z(m*T@v7C4YVy|gEg4k;wiVXtC1^kPkTLtb_zMIyRthiC|1K2xOV_G|QDA~jGO6kyF{zFI*e*|utz)IPZZtnr=sW`2e_!%`Gde%V|y~}>9R0|AT2hee#6_^yUS;! zLY;DV*L17^jQ%m14Ho*+aqRidUfqD!iQqQITbnNQjF1Svh`Nf?++?NRebT{_^}qdU zhJZ?aRVG+?6m$B2$SFkj@X!gwAZW~d1Y|9XS5}%76i+#)UjzigZZ>esr(~N*FouX| z7$b?`-#>fUCm8OYloaE(?i!^W#4YLiQ#EX()tzzj97Cy%z7Nu?Zl*A*pTfU;$fW%? z=am;wlr&r>C(XVZ`I+p{NnMy=cYfMvtT{4xv0=uS$#Zrn{8%WXhC_+Q50TV0w7Dsq ztc{0=3Gm5zePKp`w?SmFp;g+{=(T8vOKVd7Ri0EX*8X$89J|x6Ur~x-N~od$O`K+a zPz@uhoLf7Qeuq?5Bl7M?JKU=472goVjKhgYY&x_?sMy^p%Ul8u5%2ArGEnYRgjyqq zUTYN9?0$jSmN_e43lv`a^zq=L?Ew&zb1Wwh9441W`#ESE?xt zA1JOqzqW>q`uGwaohnV`3Du;71@7b~h%>qD21=eu`VIu&o*com6#ok{x%eRd;Pq36 z_`VkdIsc5%=0!+SPXrFiz5WnUmPKt#5B#L%^_JeNO^04^vrSj?OxS7>(yzx!lxxq4 z3M-5SlmxKn-)I<=J*c57G>Kd|e}1+Y8vMoM;`OA!kNy#^(T^m(%NnpA-~am>cCNFUc)Q09xQ zlAso{H6@=w#-gTL2XQ&)3j{u{bxxl0R*y*mWZ<0{AYOMkTJdy-B7rFQu0jkYkR2)1 z%Aa8iyvq!tM#5b8{0PB_;5=4L$bQMMWu0b=+GP<*LqV^pQMmciuc+|G@~4s35#mP# zjH7xeH?3K9{yOHNdXrunJW%e8>SM0@%uXuV>$cHRgOV$9jGJ5x3a))D$|1FW@#+{Wc#dZ51~Ic{I#Tn=l(1c zDwHRT3@h_{G{6xy9G?BoI+Rop4Sfk8#J$hIl!)_esN-U5mz?e1mVE(jTkiQFiTyRC~}n@|@jgA#@X>y)fP23L$1(04dCn z5@Ir_)LhNRL2&4>jB^l(`uhjY);jcyL+-`b#Q3ZcSo?ZD8GpSbFEO(d2PNARavOYg zn{OJmlpm~mI9rub4xCX4I{1?+^g0TN7}F|Ul3^NxbcLU) zejO9TSi|3_KtN@bD>R62>}vq&o4WvH6NDzTUB4b`#|CJm)HNz}0?@{^z^{gs^e;3o znpCz^b5_r3XY^xMIG#Z;7v6+9kEySki53ZtjQ(66t%aAQSbT*0Ay7v~F?F>IVKeW=h4tXF3 zQaEH;)tEGqh2xr}F9z$Wt)(C_zB>;EqPmR3-iH}j86HvxHG@f$m_lDR2$L5>lU|C;Q!|_H^i$A@T7Ar*ns+ z5$bAKKyxxFxUsH1%W9SAmee59INX+OaBW!fIx4u8ITk$R))j-|@eeXr_sbyY0Xt)yOMlfauolSg7 z(I~Lwjvbpc+MMbeE1`JbMkjN(|`&?KcH zwE56FDZIt(0H*?%ve^g;>FA`tVTyx>T8dm%a$qxC<(N*Czvb|*wlzCDmciWfa_EH;0s&PgX zfRbn~gEV#F?aljia=VbrEU%d*iZsn!B>tnMzb$^pIea4%O)DcD)ddL!b2XeT6`4t~ z2S^dOzi{LX#kY8fUIeRU5zem0@#^Yf;b>uT7Gj#>g8LXV zXor&HU<*#mE~Uw){Yg<*>r~lo-yQ5Yx}sNV$-og>W@rC9-H`Lm@!$Ej zZq;0v+=q53kZ6EzCYHs&4s^76Xf*aS_?#!M;>tY;5cUDE3gp*QHD<;2%gr?mV38m# zN8>f?aNAH9ayVsX7psY*EW-^CQUZ?QB$FRbzJ1CVBn;FhaT05vGu5?PW0m|X1V{Pc*I0ZE*mjWN#7(7aP-4_SL`8yd_in^9(;qysn}x@D}+ zy$h8n0J4{_iy~IlkztgH0W&yq>TIEUT=VK8GLxp$N0~|;l(l(p4qB6OsuMIpevX+x zEP3WS(#ud%Qo_n!HZ+#%2kNoWK$GdPAdww$oE98h*4D)@GX6v-|NGBrM^Ek0ZRVsY zYSeP=vn6YFW{~u~SUN+5Ow`jyyrOzBR)kkr86gqEVf`Mx=ZfIfy z9L%_)C}9g!1Fbes8$0^Q7xwS)+Rq*|&Bv0c9i*d(VZnW4B*KvB4;rT85m$hn4xsSM zpf#YSMt$souQp~ql8+Cc_Fwk<}`p*~gDYcyMT!nvwGW1Y*J zQsc|7ccr~tl-B|W@t5-;pK4T($wYke%17Tu!90efS#e^iOq?lwVTRwi-X^L9v_~k| zcGOCx&dHGILA8mGO15bBt=$&GY&T~xB;ASfeM~ipauKD^a2iT)-qBO@Fhu9N{1M}* zCYtxw&>uGrzviKCH^Ufg8r*Iz=t4&6_V6=ZYvsq`ULgI8;@Ij6kpYTGL@Op_Gr4FL5u0$OjS8<0(_aSh<_Ao3tY` z^0bZ4avG8)HKn2D25PYVdVUf=qe!{~QUo^{t$dYJ7&MGXhd29aH+75zT+&(ky%~+S zTrYtk7f5*mpN9RReH2^Sce?T{R-M^EL_U3H&Q&*g%Ke5{0C(*t9Qnw$a7EU%U@I|1 zN}_?Ot;UT5eMR03?LI60?~#YgO}R)mcg(HovmQH1>y65^nqjr@oDHLaG;D5$`Eg2f;{(GzH*s|au>16RpEw^t zk{%ui@~f{Riwe11k^$rNn+EPeiGp)IVan~d6{tVuxfA+bl5TBU#6|MmxHj7!&CdTP zGLQ3L6<0)C?Ur#MpdL&Hm_f8Pe^AUgTa$aM;y5wZyL%}Od^7Wp?<382>W5Wdt-Yd8 zrmZVY++R%>jgEYo4VmMtO=Hfi(Epq)<=J*H_j2eeutOv%het z>08truS$LblA!$xi6ILm%oS3BI>x*h=32K_n}HrdAIVOH`2mn_#p%RXI$a$Fg)`FM zcSpcm2=!a&xMz z)mW$LSAAtC0J#3*DahPiHZ|K9OVwkrhn>fzSx@(2vKFYUm`2MCA)-1pvHQI zZ`sOd!?=aRi!hc_)UW#zbd9#o5HV}a{u^P4>!;TKG79RRkvmV#(b3*n#W~;AdF;8q z$6yn5FW)V~$FsA4M1Wy0LZ;g8|59>Aja0t{(<3@#+a(Fl+N6FI zQpU%K3X+bb2W%*uJ14Q-!WXq??6ySyah-vGXCJRZ01xaWHOaFsg$>@3PHqlalA>v?nrBe zL!>2$h0pv@dY{T!nFi+06#h3+nG^y;*J&Y5Ti|%_8)+|ksq;Tlc|ba$itp94*k7$pQ2*MQqx!xD`hxXD{s9RTE! zEuZD0O=Q&=7HM75lbQ%+s5pPAYL$-K{4}gZVZ5k!_4(*N=s2=zyoFCE%i+xe+L zf*zNax-Wls=@iF_`Q&`$UY1kVyZnhF{CdV(lfYQ0r1t;ykk%ls#nE*6hhsw9gS3wV zhnc=;lCg#tr&uHHRd|+L?^6_)(2gF#FX+h)kxi>Zg)mbxKP5u-X-e`L_8Vp7LiHCq zY7=jby-~5HUd4vnI1Ax*XT|l&W5&Y-KsoD{{|}FiDwriV;rHfaw?)M~jsJBb;@tCX zd13+LYzmg#zvEvB*QdFi%h(0frVSmR1ST3y^*_El%6Tw8(dtlAO)|d`HGz2RI+P4@ zx1wVDzKU-oz4f!O*2|W)ZLK#p^i{*?S7B}A_$a>U_ZY7QA}?3VftZH|o2J@uiI1yg z?K6pQq*S_Khwo^5{^q>?nN1|h+CHrSQ+R<;2xQr10_a4wu!;aq!$RO4T80~_brv?M z(+Yv7OjmL0w_KK3tmFF})h|lNg7Nrb)g=T?Iu)y$%xls4nXc1nS5LBl_AN25bor!%xQN zMavJPb*aagqexM6S1t;9(B{Ha7CE-8pBOnqWu@cwWCo%$p0JJ_`cWVxI$Zg2j%~)7 z_DM&qy!P~%9{DR8(NKG%B?gL(K*CW64Y(7nSb{#`y6h#wBLuZCkkKS-^pppyLxk9; z0KG*8Ljv1H1KCUeEU=E$prG_qMG9k=L!$i1g!0cZK~cTz-nTb!2jeS=H7uMOb5ah? zNscCF^pxbfu=w#s0VNqG#!an)kcCEYDvTHq>zJe#QLKXMc1^~70FK6+u0&Nqc3^CB zRMk8^*9=+=sG2YLxj9D8wUvieP|tWMBi__5;#h`yD)RL!q(oKnN@gT)LDg?YK5?s! zkqf3>&B{BD`-1Ab;HY#gUJ0vLFLMN88d~g&^zJJ+^=h)pkO%5bT)yy)VAg?AGnJW* zn>>b=Z$h?n>p&XH3pSucZ~3pE3Wzwv1h`F8ic~i*(JhqS-wUz`nV*U6Q!mayYsFT@YtTS7Bx^zpHgWGHB~L&Huyyc3kOw2mIfe z#`(57cOsN}7h;4il00b@d4}#DzZZJkAIA2E2>NVXeaTDwhcDu7GS9B1u4(ewFChoz zxbxbNz8C&^;{6Azjg$DIC^&aCMEB=*SnH-YX^nn+%#HtvNQvGb_nup+!^7ja%qK1X zzqAP9mMx=1t>QLA*N(fp)vX21#jyP~)8%+`3z|P*fN$5GzoGJ#ER8W`Uaydt^yyGY zys2a><(?V0u%s}vLVDP_YK(5b@MdL+R8X|cajr`3@cmG1>akG4o)OC?W8=LdW;(&< zm=#G60HZzaSPozzl!=RuvQOyJH$oM+`)J2Y&(pmWQb_NizN#*;HpvGq|00z@PH7*t zk*GlG+meiDoQQGbjKsL|Cz}U;DFIcR@<<wTGND+y%e2s=~Uh!xHrsSQ;vho1~32_P#Al+RJLk zyJ^+CmrXT^-&O-YWl10LTCl!+*TAtU7T~R9i%bHZYbLSeXy0)W;6Ot;fLuuOV0*oC zJchZO`MiI9UZnlB=oo%{P>1!H9Pp>}D|91Rc zJM_=aD%rr1yJjG|L&PP&T9OP^BDeKHIWyo0PLInpThoU{8ZV2Vt%I;6z zIg##q@w#BM8G*&}4Tol_jqCc3%&`VOi_P%x6<&NZLR9bXQIqh`^tpfoc{4Ww<4qyv zDG$3XeiR+c7W=vf^!@IU+`aELuX|%idzGILgwNeGKDIUC^~b5$M^};_0^A53H_a1w z)+ue&5A=RJ;ldnlxGt`4yWd5gdwyAPWZZ6}`(U_UEEmR-eSr6uMd{^QuU7+oU(xpk zc0TZ0Zq`GyJD-$`y`&(O>V-Y7&kXbG^Tq5B-br8RSPZ)Y8cP++@4UDFafeu;-@b7w z{oJUHQD0IotgJ+y8#}bTfer@__e+E$sKv_S`aHcm3<4Lv!ZgQ*IHSdB!J_Nz+B;tE2&iRAOY%PcGkIUT`IhTG^%B0IT&Zq z(YKX_)D!*5@fDvR{qWRe6zPD)1h#cp}-aLlUqG?OfzKqElC6?EuNkyEQ<1nu8V2kdxinhk@ zze3wii$(HE86t?E7?K9331(g}c9))-zpTjA<%2LF+X0`Osuj-YYT4e}wjbi+PZ+~~%&r0mU}NODo*Y-o+dWD>D4NS6 z@82?i!N~g_i^$)m4M*=_;^XJH8AfBQU1kieOB|SeVdUQ7Niz%eeWW3Kpb7?$3>~jp z{Zq#s%b=RakSDqwpYhw-&cC}+Lm8;yjAh;EKSSKcEff=io}hCQ8j@B*5zkY28*G}S zuO^1GbHWvVTlLQPejh^zZU5i0aiJ_XEsu4yaqF6ju5P#^T}U{omva9m{Pw5V+l0u6 zkk8=YSiW!A*7X;@NhU2k7!)OqiV9mCx*XnGzjv=qIiuH!(i};iYS_3aPSD?8c(t1M=J9Xr%d%{l+qahGgkI+m7}FiG_tw*5E+i>6pc)nfI*!v{@N<)_>#o zo!xLJlgJ>p>VP2&8g$p~l>c@)BGa+Kht*V4H z5c>a4;?z!~64S_5MDvU;$z{xJ)89NZY)HM7QKs;kFtYbG5hr_0d`HPxJwpQ@WNRu9hb8Ct=csK{tCngt) zptvCM?j;+`XcGF88UhduJqT%g0MQI7Xy=XuY?UOpwPNmXZ*9hmmJi|P56V+lmf|}w zdJ~8=_kMlC{eHLeK^0c}_7rZRW3DhQ=e<4ca?i<(oj=d@|CWL4(+mmL^ah(NDTP}L z2yln5)uoIMC`CRJRP(ucc=rBe_7>sP;m>4e+T2-}BL43x@YGJ5C-R|oTxlHh?h|A2 zc@eA{Hj6%Qt&gqw!*u6%)nYHRAj{9uYBCp~fiP|@iOfKg3u35*m4p3}0~_>p&y63f zf@Pz)BfowfmWAAX{mtj-=ST~&K)KZiThE=+XW3gYV;Mxt#&_?N7Uf8mjkoaLm&ymA z)6qONQU1=Y%h4HauB6(*~QKB`&L5pKXbdE0$L6$YNS>o zc}}t%PO^0CJBxwjhyb#X5STsERXEe&sk-;=FDN3PGth*=vEyP`Kgkk9ln8FmXxmuI98YsP=yE;Pi5&4i%j6IojLnfOb8gbh)+^b z_y~ss2g(8IM@RrZ5V&8O$<; zzZ0Fx8$HOGA!I#7pk3R}P9|wt_BYpj_$B*SuUsC6R?3`M&}1iYq;&C0hI7asHBpQm z1Xa4n>^0)CHQnZ9FN&G|9U(^fB&^$cBl}^RSp9_KE5TBGlfDrYSL_*ipZ7Iq4sMBZ zasqx?ijRMFG8}`MJujvXpNt+>dsf4TIMTNFb=kd)O6P*dfpA05_vK>my);6`hpBAY z5WP~BY^rNKd3`dc+{Ay+yzy=Aps!)0hUi$f{!Zf|3MB>CuAZ!8AL*4x@56pCZzBH= zGYvhh2Hu+n7BRIEL2iS`%=d*ieuU`c!4F>eI8AOYZf-Joi3_oKS6B9!$blG4@H%;t z3QD7mQ#e7AmKK_+>g0hdw?>I|f4L(}2KoAqYONP zHnwSe_rqN*bOIs1B%;!RgwQ}DfnA!9N1@7{fFKhE526`MRJ0mKr=o2;w3@;QH&Oi= z>w;mT`HAPx#iChO9x__ct^}evQ8-)DWHG9Q;t7o5xOzaxZQ&(DYcfLqm-yJTwi9!} zVA+R8-qA{UxhLA416=ur9cD+IW@Fc3N=H8qMl+e6Lag;g&z#0q6)P#47d20UZ` zRJ{b2JBg8t1n2FyY&J{T?Q`=u%HD&w!u=OHgEd{Xq>T2+;<1AG@rCEHc(F83j%DDP z@Xz%si`OBk`FWxK9hZbBudy+Z-5j#))t1-5ut#$D` zg~Pp^+yy_;0q9mL2jnH8{eJHYqVpG>?r#XEx-R*3+r30Zj%@spA+;Zbg1k+ZzxuA4 zl1^uU;j%$MXwI6LDTMC2FPWgB%lvw8nDBjno3gbA@pq}nP1243pZZ8QU5*X(9MoTC z<_Fnq7cuyeWS9;gyVdt&H>Alm(`N~xk#)>@pd}iA>r5lsMf?XYNF zb<=c2O|z22&=?`7VqkeyMD;;Q1q{~ukQobz4#eRCXd?f& zZ)MpIPGXlWLHCFad9@{0QFNi9c$^N(*>|yYMl1D>a&3rwj8YEDi=;BZ|M!u(SIwofTE|5kQUAd$of4c#JaH$B8?= zT%s8g(R=)OW-?n=K2pkwOuhXdv)qUhwF5alT4s$m5#+qvA?D(&iBSqXUUveT*XsoJ zvSX-O$vzmZBwY|o$}p)6P^tV+M0OHY#;sS=b_dyV;!iOrAU?`8LJj_<_A~X9pw&ks z^>naqSvgt&f_dc7#w{pY>c%#0+8aK9mVD#mEZS7FNp62^!$T(LUJ{MnIOnk0EHx%{ z;~r$y%8u^8ng4>6tfI&el7)d6*(p(ULxVVcndYpl>XjF&O*U*W72Lc8lc1$W z?v0dnPbTQ(u!EKSd1u|b`SeapyJ~A~_i;V=frzNL{FPI*gX0W8{4On9z!nP>n%CEy zQek?{V;2n1Fz$QDS;;@q?q{h zVwuCuyXA9XKaU=IQ=UX?cD3%B2t9N1{rAfnsgPBB-;kBODjq&Qt#0eyjfCkqMIOv` zV)ujBz8oT?*NLje2Dxcc7nL)%==n(SrUF9Z<`oBwLqf0WvWc$CGm#ZKdjD0}rUH8r z%gKi5wd!0YJ3Ew27b7(@i`u_EjUR};n@I8OwM-YB#Sm1iDeaX6U223;7L_i;9f$+Q zq9y|iDZ({Pa0o^Oc~H%ZE*ust=JAR0&K&XcI&X|uFEdl^zP-qxK3aN;xWe8 zsk(+v+WRdAw82m_RS+HEt{J9sj=nTD_E>3}J1 z+1zCv2L)0AfLB!*37`Dwqa8)UOFVv2D(<#ax!A!5769UM=u*1|8F@AScr;!-pI|-r zwuradVOtf~(_Yh$G4#c;=@00Vri1N{$!7WAqNmd?hy6r3Vb=V(e~nkN;!@Ps{3H&y z-6PTQgzG_o;lm`ha6Q~Mt>El|K58}~T;zqXs$xkoYGRwr@`I+^bV#YHx;~8-9{*7* z;!O&=AxW~pt1sxYdq$yc$E5c5Ffh;O4`i;-N6YE!VSnQ>_wrXpBqXGwWV2I_glYjM ziu#%sX}`Dbo4DqQvWv{T_(w0(!$1C?)Muf-{U6^+#l%@7=rL-0-U>D!>p#i;-&+j> zc7Q4B$v;?A!+0b$uB_wp3Zaeq3Zr)-Ldxv=%g$R)9Fk}!r=BCx=QJxT;t{PFcq6tqI(jYF=l?VuOgnyxz*)+$@ zzcoUREdU00i^_-|3V4a#C*Jlo)Dz_ijY2G|^+(e$Zj*D)%)lT|L-OofebZxO*D)f= zHN)=R(cUC8cu`E?Nu~?SE7sx0yD+WiL3s~8#s7DVFdTkij1@^1C)e=R*9G(&Y620* zScD5F5H?2iCy&`%qmntQj7G(yZ)SL!;DpZB$i}i~|IOhs$>h=p=LkpOcQ5D)T{Mv# zMVQ+y)$8pzKf*nK~SpDQ%`rSs7(Q0aHV zE)%-JWs?S-Rc4plB<3W1q<4FLQvogb_+CrUgYMimu*(VEd;rQ8%c;e&x$7Eivu;8x z-*aA?->y$s6-{b~4Uhg2E51xl0qe0-=ePrZZ`_S-tcjbCQm6e!D>L=Ky>dWIX%iN~ z=~WT#`0Hen&mH@>qlB-g?+04+&BU6@weJe!811*4UQ(vp4fo zE}_ZPEGq7I#z_5SZmnNU0gJ^mTIkER+6ZiFZ(%w=>8q7jG(|rAj&qCOOFR7T9jcxH|sFEDxW{~BAydu%zOC>mg(J`XAv{aUR)E*2A4kQ6<#5$FB z)qiEJqjjJ4>$MM}K32?M`vjC<&Bt}g9IA&h)kHRsw5gMW+aAg5Eordej{@6bwM?wf zMbAm1L~)?TZwD0cp7-E>M(*sTxYaMVUy->G>M_bsd6bEY?*tEA}eRwkhK9MmQA*;JXy9IIyN?lI)JpM3c#Y0){+B?E%f4Gr>pd0Ylk z2}LJtS(?(ieiDF!n*R0#>Gm-?zPcB}nC2t~@7isV)uyjbp16$HyBr3jlWD4FCz62~ z;b^z%+0akN16zBHrs3o7mEZ1$Sf{;;kBxEhugDdLq&A z;Wa`ZHVcAQe(4NdQT#a`{%S)9WlBDa3j4v=RmBH=BU+LAMczdlW(kW~Yo7KXR!H*z z*+|Hr_3vX3nUu^gm-%iTv=O@u&01SMTQM&?`2GY6>wW@^R@z&WIf7q&)o`w~Qs5L0 z2TEu%#pn{RAx1n6$s?>@7b4$QMqi$*s2j?k9!!#|KXngT2149G%wLe4>2^kFqGg<)uwKw}AQL?gdmfO#~6Ku}Q}z zBlNEi)BWYPNzpKY(dB&_VBz~mB==>X;LCLK*u(7Stt&ugWa3=*B@eNbv`+?=lx87Yz1M1&5Dfd1w<{R9{Vcdab+V<2$|USGGdWWu#+on zswHh+Q?HY5X$B;|Hr#rf0%1!uyeMpa(uV=TK)?s>XZ)Cb&<%KGXp2TG?3;KL57 zk8k2qIVa3o@r`X}tT8bW6Fth~1|o+-q{yUL-@=9n$@0l;wD3+~Geb+-LjpFq)9Pj0 zl;1PZN89ao6_TpLcdp<~+`f=LmOn&~r~K9vD8hsR5*ffGwoM^v$`>P6S0d0sImd`X z6uPbxKTJGF^mr(JsPsq=f*P4cgRAhcqXMp3LsJ4UGhyD`PBKzIV)p?J=da z*ZrV#pCUECo)gR^f=QT|GxG+s|AjUWg!Ffzk~t~N>%_OAS!P_;)Ff2(7>9ju!qw>jK=HoqBM;m`#B(o})L3AFl8RMHYB;bdR{i^1z+97(YYA(V+E z!iCjd4w3o7`&JqJS9W_q`x1c)w-68*(rLo~`Pc_YzA{p&Yfk3M?>u_&~_-dfM5Uh~hki z+z>J)QAR;x(X*lA_(Lp)zpdnn1NXq{J*KzLl=X)x6F;Z@%EJ@D#e(gOx6k9qV~2as z&omLsK7;r2g{WsDo{$IH4QVEN!%5X`CE)GmCT&zU4ZwwktUzN&eZ8gsb3EVDuP}0o z2Kv|Xe?mfllHHZgo6XompbHcr!qnGYFKy&e1EFX{ zIdj^FX5bqHm+71V$C@2cCCjT!E5hND*;F8Ja=}$kVQII(F=GFR^bOU0xJI%49tL*M z7dIqj;OqOnHlTcwno7PRoYuJ15yB10J#a|qZXWu6!aFB((N70}sSJYyN$vQ^$wmW~ zR~%w2P#H#AimacGNAx&oQDKy=%LSv;ZQxt(AgVdAWwA4zKBI_5aBU#!rwXAi6=McO zEK>M6j=x!(n;UJ!reUff3{gJYP@hn@P-W&mh@*cyQVJ(FQWb)Ld2zU-SyOtlvuV=4N}d%#HUFz8VXcr2<2}r zS~6GfxRZ0FdlKwYUoZBI5oP}Hvw2p9@t2^ov;HwaW}LZYj@jY^NL;NAv41d^7i;)k z`D&0{Ai9*yjQvYrMjbkL!_Be=;FXNN&n=ZiDm7U7C#tUi?9yM*_(RS&i4F=Ul3W7= zbA5|$KF>I0+M$)d zZby0{a!VODI{dv_s6q5$zkkb$?L-P2`C4#UGwc~Zq~9X{%jAG&sgX0(_7JrTr>pw} z(OUQ|-RDV!B>Vp=Rw@fvrC7FX!L4e>Kml?|9Wl&wJSZwBX7Sb^9HN)=ae@8$?Nm+| zqF9Ta&P8Z8`rETCBVPjc1AE%J#>L8E5r_9|WAx}?qc`H^5s|hit~`E=FGF zp#p-DUd()|aO;=%FJet7My$3o53%I0Q02%bD~PJ9 zrY101@htI^%=cm$(e&e6XqJgm#~o=I-g}X{8Qlb<&eoN)taVZFk%WwCnlagjlV>|* z`-ae1Pcc+seCdkTkW)KaqRZI>Fu$Nf{$opAoI(hgMb#-{Swe_$vjnBjPNnEzbVM)7wekfX zs*9ep5p|J-_DfoY+LO=+8PX=nAC_+g^-F!~b|HYbgmGGwD^@68v?ZP$0xh%V>@i!` zwphl4eljmz5MWc*mEPd4T?&{~*`j&027gKC)osf~bl-K>J=?aENr(D$%0JhX_|HEC z?jbzzB^EKupQ;v9005*pMH?% zxO4mF=4;H5h6we4)P-NKlsgpv$3v-r@skfiqMGW^!PoQFg{39(cVA6aDz}9rkSyQ~ zWDT@V{kz;x2$?oPU2c7*y+ZNPH`dyHhj@o|5SyZDmn#d70k};~H56=}2$EoIkz^LM z8H@gy4*d|UO_rb=zGtp}y4>+xSJ!5TU&dAyygp0gtb5?e$h42hTLe+DDPHE15fb^) zen6Ya)_LY1)z>8%(Bs{N#SSaMUEb83^l{fX9X=wDvNL&%6MFHD=BFqc6I#u=H=qGJ z7PQ%@iRR6tU~_`Bf_LC7hs8tdIP$z{vtIxZD@_5rHwc6#KG5BL_W7osM_0)gd8~Ns zKuMrQ**r!k(&7+;N5bu7%YQYNU&N>Se%$iM+=c;%eUp2R7=Y>ZTac@L_sS{*)nJX4 z2QSnxnUj0akbNSRr{3R1lC*#Y`k!gZV`hNO^*1cf=}x)rji;`|Rv~7?f19k~q|#}) zkYMiy*1aAdIN^_RrOfC(^k+(auaC3R!=ZXp3qICf(d)O>Tv=0zZZk6rfYch_%ezB$ zt8>PWwfnQ)k1D~JXD}uv{rs}Flk;*q`YDeTjdWD``DzH}C;i0`C_taylt|$yh9MI& z1%=y@5jJa|x@gqN$6}8!bGl3*p2o1HM?T(}9z>G+2oNiWA76?v!R{z(L`m2<<6cH? zGR#9S1NVG(F!HcvpmCZX|3*hjiunAk!pFX3yu#optGWV5@o)bj{yt4oj^L+mqbo}QcV+1E;^IMX540kQacT80H5*- zFK=Lx;S=Y2_P_CJ-{kWiURJ zyo|u^r?H}QI(hjSqTH&o#qyLUS6qp3c-4YvXyr7<2`2e1iy6$)dND|OP=1``FYpGJ z9|9;KU`+1rg?L<~LBW=y+x*2#3Gfs=-`7Qtmpe5HVpQ)2=s1<>f8-+p`XU%(6A+Zs z9hbW|lX)?=L;a{kgLiI^-W}2h-Y_kNWCD(LEUHGOTi6=8GHnE9+Ab1Jg2r{WCWFi%qr{qRZmua{HP| zv1_N3*U6E;|2}l13=}DW14KXP9L4t$ek5N;z~*w>3L-O>?Ay(kMDwbD9R~jsBr?eQ zyybg{WWN`%l<=K`iX^h5y*aw9M4&$xI6>{?j^)$l4MU4YSMq4BR!>*MV^IswewKT3 zoluGG%Etz4Prvl&Ycmq8PK+8I@p9U;pL24ncM)oZPP$ar|7%x-bN?Ot1y`&0gM_kt zPlc2GduGHFHRcZWJaHEwXGSi*@**cDzD*(Nc1WSRGD#PdlNi2VlO*nr-2p~ycKQV&lr2KTOLQhrY2?;5PpX(NgaPZ-}E#J5R z|7!FlYWf0s4AO|x3<$^_w}3zG)*CcP{13_7kN-WPl~2Idu27;$*u<_DG5%Mq3Xp(v z47P}JjOxWi#GiZ>Gx$d}A`iWfswC7#D(y6Rt%Z!JkLK>Y7Xd6Y*a`~D*8`r7N_+-* z-ag5Ydd)GiE5my1Xb6RqFR!R8}}UL$?-{kUmNymjHn zE*{BXbyYr{2L?NCQ;pA|uIp7r<3`E_TK7h2(f=abX6iEHX#Fhtk=@^xMNf-9GKnpO<6hP@S` z?XJL{=MsziISx?BsAh0`9oS)ixz{AmrhdF_jO3k)&x=OA;`C=92=uO~{vX?Bix4#_ zgXLysR{i3GPYH`P0FG=iP3ttc4X97aTW$V~!5pnvh1Cpj?u+dRP(;RVzZ=(+smijE zeNs8n@c26qHB56QGDA7y+w~j25mY0<099xr};zIhiV;Dp4jD(T%XV3K{)=8bekaU`uaPUL)1d&;D;iY+#r_ ztoV2FM=FCpn$rQaFrtc@C<37rYaEVaJe8YVEhp^v`#g_&pw+!t=guXvLyxJW#5jHU zT>TJ$wj>)1|FRDgF2(DwUn3ti`@}$|E}XA3Gy0Y^{lIJ^*N2*gkS_&uC@`m9&#F!I zhu>8H$*Bm9&+oukamB^HFpRcuGzE3CGV7*QFsh{u;ePo4X;u-vuMEc82?kA-%zo1j zb!56bdXHRY;kIofK5`%sqoLXi>{F%J!=G7u~I&ilvz!p-PNh#PGC zO4x1MR{r~9RLUxwP1|Bw?kF&yKo!S9b|$LoN=IpTx=@b)==G5EFyajXU!c~@n*!T! zy|V1ufw7p%L-TSFE<#HCiRiK0!4K1t`ub(ciCg4U%+|tAVh0R%NWn+ z)n`Cmv&{OxfBc>=FDK>`f3L#&s39}cza>{G$jYX+Ea#7N!NI{DKF?7$*pDiDzJ#8b z3oLel`$rE%hSK&1m|r3x!b|>A`~mWWoj=JU9RpTD`VG%{dBi00ySw>bxGq2<8EG`j z$1lZ;#Kh(qL#&M{=wGDR)CcmvWKn7i?$Oh2kYMycla>A8 z;g`7{3Fn{W8x3ElHdtpTs#4ewws!_OZ-@ESWhLO25UMkN5y$_r-k4DD3m!Oc%=wGb zd>dNjdh#`tMWbWzmBg0>**vF0SJ&G1ajn5HkH?x8p(AcJ-em};7@NufzeJ;4m=CkK zu4yKTqy$k}lO||Zq0ff`!7#Ds4qDMR%GD{|QYiK%9AaEM)h%;!)YSpndIN624MJ8| zVDs6i=z%{*)|-!HUR8A4*|P~{@vks{Hygt3<2nmUTCoBOvq?_$2IE1uN5P6&hOGcr zvbl_GouVd;!6>wFcnP?Y{2z4d#n_Fgm4Du|_{S(esv~o3vZ$Wai1TD-J9LJq{d?1> zJ$|xyD{Vv>hX3|$Zcicg;7fw^-2hp}E7sU%+F@5EoA|Nn5ZjhaU-wSRk--l*|II-% z5UJq`<0$A21iO6X+D3gSjIz>VaQDhRzOa^?psyg3mdWrtlnTfNqelS#33&)iRNyik zs$unEGR`uWkc!z{J@21bz)Ei9`2G*ybZGX_B+0 zqMV%`(VN4JEHLLNfv>BEg%OHVEI@V%Xh{%8RSak?3M`TzCcIMTEH+s}tAHtUEa)I( z){doTf>SmjqO-_hWq|`=d-smHWGN)@<2!}@(~ow%9<&Zg!ibx*)DeGBu_kIzAN7@X z%A!-KQN`$za3DJnJEVcpRZu0SSq2QSb;3|FXDTQeRN(R_e5sz)x50=ReH-vf`y(X( zV>HwHtUS(t3$d&wx(5<8CRHm67Mb#Ll)jPZpLr{Ah-;WGub}?V<4p3v%u8_HPF1t_ zwA;t&B|%iJ6Lcg@Y9th0F}Fc!{V|7Al@$ACpDP0u5$%tP4!CTVY9Z5kIr z;ulkNXf{3`$okjXHu>=OYT<_)FHwWVmKVK;xFSt;7d;M(PX|a~f-eI%37mo~Om6+*O3rBR#Cb~Q#B?E2 zFZ+JT8-ER0cOnA+WMTS$ zeGwNc*{8Bjr79a68T#U_NbMy`r`4eyH3?*|s~nSj&47&WP(Hi9Y{jAnnNkX)H|dwT zpBVk(tc;{6nLlZ-kvjxjtJn(|JajTsq?rM8Gw{!j7L&!QAi&6{r%2HMh&R-Y!(5Fm6N4=f4f0}^>}u_E`v2MDdi zi!9o?Ytm3iT1+`t7aeq;i}kI&i*efu#9_SolVRwIEXLPQIzrzYf~BiJ^;*GwV~c}rpig}7}7{dyk&E02yhzpW#qYm+Z05Q3Q$i`TeowgbSI^`9zFvsRU36; zP=R?_{7ycT9j(5HiZ5I5y;zYhU1@6DS|Pg@?0^Ne?FJR(k)>0ST!qcQDBUk4?g2Rr42pN9Q0N*54qLsyCl zs+bytypH=aYbW4^Ju->BEaUAWw`;%^O%H_G^E_ho-fT3y_!hGBQw7`bJEze3Z`6(` z5}#u8vf=fR$|5X;`DY4zW-ORU^^$>HNaI^{95wK6I6_SYeerD5t@{?;)6M)KG6QU^ z_DDMV`G^HetguGAnUDjSjsQR0mz-W{aACVS3DtK`i;eJp?D|tbJ)yj44`rLC* z$@!vk;4ENcu3rvLZowmV(qyp9TJ-Y)q^rSg@Dq4C%(ox$tTk4RqF6kP9@BKr__x;6 zKUS=J7mzrf%IxA@Vmu~D^Cy{;Ilzw9MK-6st9M=HC;@jWwR%8q;`NX&ax)6@huTvC zuaCfy$Nm+W)578UAEn=a`o;NDQn@Wp_;v_B=38`+8Z#XT=BxERZ9|WA!%35Bd;aXk z+vA(;_3wOm>4g921O}6%jZ!!+aB@&{(@5KhqS#KdK=JtQ;_*437gg!^8ZU-zk^J<* z2pVZr=Gb{HB$a_uZzKKuqcolhu9;**JH&SUtjYQhxfQbU``(B698?+xYKVt5xi<|m zT9yrE3b%>8e7MK{Ybos{bnu4TA^OI}J?8(hp+#9uEC76BoXppR3SWqj-V_xk1XKBfkgV zZo|X~(}G)9lb0=3Sov)pF?!LSP5380xxC6LwP4c!;p?r#+IqIIQLMN-#UVg(YoRR; zrMMP%r$}%QPJvP!iffCz6Wra4LvVL@y`krK?m6Fg?sNYM3EBI}o|(1QEP3BG$SZqa zP6?^>>(K6xG2@(yG>~l8xW3Mi4H8#L(nMEe4xC|vN83JW>^ixV zGB1HEE^hKACHi(2Bzw>jaE@`~mAs_)383Yi1yZnj>8$xT{O|rI%+=l=|M1JPPQOS;Hc!B6d)yziLui{!?T8dtKV<}ANtJ-Bc7O^J zeik+!y|WHIU-O=Im`Yy5CbBgFMS#%JADvbmwbLg2ce+dj_Q$XxDb%1MAI5Y8#ic-L zy9%T@aA!Yc$8oC`KHR)lbuHKbpyjD2B^!HhbGlsl%F{H^BIw8LVCe#DK|#UiovWKH ztQ0b_>NqIs=rNH0dgx1~)#wy1DXG;r8+L)`)Vbp=ZQB4-(dMS7J?1})B;etFn>r=6 zQcdH}d_-~hgRal}LJ|ks8ey&N4GlO=n9QY+IwiJNhlK3h92s%}_$F}MHh)lNA?OEUVgH2|&fhDW5cTCzxt?>0xY~A015o?}T z{f{oO)A;eIGkVW@nqb4M3t`E=b3u=rv9XVx@yfotm%PoRD@(JA?9g;Y>hATY*@zj1 zLZdRTV~ku%*w$t2qOzu&j&j;aorP-CB5IS2x#zA#1RGAzT#K}m1#Sg22z|oU^72Du zbog#EBQ>;q%u)B%b!>rue1@mtHIVQvzTYm*7#1Bcg&XS|FrC`wwr45gJz(Ou12?bJ zfZHo&jKV@K(zIJ%I!+Oz>3sHC0c>3n>|)(Ily~V}C-k|8;#pSi+2<(bx+`)mb6EFh z9;0uE757AQKvK_sebgGzOCXvpuFvR`vY(lzuQSO9v8t9S z-NodKcP`}qLJkXTQ(LCax6$u4X96Gzq-+8zL$R>vyIEX;anjdnlMci&{#~pBGcOfN zXkqUM^6bEZX}RXt?ngn@`isF5`(nJZMx-A)QT63Nr7))1#NFumx4)XQ_3OwaX|sav z^kSeH$DU}5YE6Tu@0ej)sc%r{b(F^l8S+*mK?u?d%hs3u4GroWXO(8rSLBj5@oefm zQC+~O0L_3=Q@ol+Z14n+;ctVqieh}p8?TKl%2@hYnWsG>q1c)e=VrWmpO)KW{n+AS zmio@2tXI4=E`g(&}_=>MuJfqxTBWb4LO47DX0Fj&wQMTGB^rG0LgS_ZxxR z>F?rE8cQ4IOU-iC4;LAjSMOyuIYZ{I7d=C(-|~_!1gW62+gKl^n`eUb2R+D8H?w}Qo_nYdO}uEh|-JNNTC zjr=~H($J8xxw%#Pc_ht*RzQ&Y(8WrH`NjBC)1!K`8Xu8W;NT#8%ZT>LKOL)Uu} zk~#OPjMs&|o?f$AGuG+TK8rU)&W*Sbq%DvkeDC*Wc=!q- zVjtICyCegxLRIR(E8TIV(`=hDNNYS4>@@$9Mnwb`gmKZD7{dIxO+RqT#Td1E z-U0VHlg~5JL&F&9?Z}OUf!6p4)?72vzSA~+IuSgO#p@pj@#?bv%MKn}YfH&b4eQ-Z zH|wQezrE&NW{~*RCy)-(a8aA=+srGAHLrZuVguIeH`Outz@rosTFs_|*VC5WoGYuU z0+;fxp=`NWdsTH+Kc`~C7!N4;Fm~Vvs{4A4y4?9ar58R$fse&x?bWHC_p1A9zWHZw z?_b4;I3Lo_oSJxcV`WHX>3e>=9(@&oyUrm>C#?uUc%uq-(Wkr_E{hs#vHR2<+Z&03 z764$9(4ClZZW63IVtNz6JTTa;R&@nm6zOv|v0&nls&-XGI9pL1jO%(iUlY`3DwMBS zn}xf#g{~oD0(+nFbQ5g2FiL9VemfAild<{Cr)oXtt)tUKJp;|os{C$UzKiq$V_BUL zFJVO}wtCLkWW@`j{Z7ybBTzBK^C?W;6-hA0FYL?RhS zQBFYFZ6M!;B2y_~X<_4$tA{1yJ@UEtL{3Hzs*J3O3`UiXhkuaK;-ok4x@q*CfQ{x^ zw2?4r=MYVjpn2dfsSV{ENEf3@gKR0(fW3hWCG`UU+MBAMSvB|hP>wGF?sQkE1s%tl zPP1J=y6+H}@7kD1&=M0&3MIzh)D*s71x_Eb>S{|7s;f3qShFbF&wA4%a%FlxyJdCr zpY;Gob7sz?Spm&N?fFzjN#A&yUK4TztTaO|@W4%#K6P0VXoib7uAZ*V)rk)wf`4B5 zFggz4aPE1gCKXG@coV1N;v#@R^c-nzA0{THpIfck+D&N5~e5k zbfm$FJ38-VIMol~g-^ke|1s$FX2cl7RV#ZkI z0!GzUp3@J?zt8XR6i7F(KJuaw)Y#-lHlIw8mo)Eqz0W}8!%WX0|FbPelgNY5ORGPA z$=foj5+c&r0y{`!zwG?NQi^V7R;gW%4`bmEZSUar=c~n?kTn1)v%vA*5y!U2Be~rV z^8#AS6`u|!e5e<{K950=HpKITJ}`Mzd!wUY44NuVEFsaj|IU2(4J}dNqV3qu2L5xs zj*ha?_q_`KPzK8{U}Jd|WCHs5aG*9ztY1qlDEA{dGp|RVC<{ zO{9RvNu_9?vPJf>ADWmE=f2TAE+E0;mwC!&+5Wi|AfmfKwz~q@G22o#dN70tpW#h zA}9=hnGypD2keD(k@m}1qhXkf2br5H3sF9?Srh2#II3V0rNs@797d%mnDy6eXT;_G zqR_FnFE3aCFq0lPX_yyh?!BX!hP45cPQRM2LS}`Le5z?*|JjvIUfV1TB8?FXrv31$ z$MF)onkvRnXpGbE-KNQW7iE9G2yS&%m7|IkVmcBK>0sq{tjBLZYdzVjj3}l^=;rvD zYujzR_vvlr2V}~HuYrX~gs3h~!ludojy1H5?sn<-(H!0n(ZRHqCXEz%Lao>7JL24w z8Q54g)~R)43U~cnF)=Zl3%e6$>CfSThi;E#Fco)gWtsfFAI7EqcyNJrdcjNHph<5I zLrwJWrwVPOi6U0$Jw(sDJ_F4{5AE1=Zx1;o5sap&N36@8{1^VjVJqcf;gsF zPARpc$d2-E8-fJc-e2>9hU8cC^raH75P}bY9$QWnP`BuNoF>xvO;3W$8hSSKhRH?U zFuF=x<7qW67;PKZN&$)jFrc7a!MK#BaM0ga4J5`}kLla25|1rXk@qN#Ap=BZGx4&% zzr#Lt_p~G`w!)`NJuBv-!*m5)!qUD-{oVti28ICP(H_@t4^Ca@tGda zX%tAIP_@tb9xUHfk}(bZv{KMzn2Bqpe#Tjkt9|N@4Lc9+jrzo5dssIU3%(> zPO7gGlam4l5@Fs`viDfU-aETELy;j|Qs0#0dqW~R){F`$x}W2nXOHCFs<=)y-aUBO zdM*#+W+YOz)*UbH&sgDjub%h`D!*bo?7qhzQ2Kb!>Prn1_ybUn(rxn-d47b$dW_j+PsLQql!;BnXbSr zcrgbZajJr1N*{%MEUadgPrnW7_!6Kri#bu>Y!;dLpQP-%^NvpMGd;V_D@eO+YCvhH zitDFFzXUV6W&k6;s_;Uw+!#WL7H``;{JJq?8f4#yDDx69Emj*e;@^)-;L}`8(xJ!( z+Jp|$e5+pwPM~;6gmd^{zwsMA#00z_LYqX1C27G1O<~6=Gfbzs+WdU&Im%H9w~Zcx zO=+1S#PCZ1ip+!x8xFNFb27q$KEbO9nmPLjoF9`7Gst9IbQITm^?nmK6oMGXI*$|- z`<2(Ce>|tFI`G+9hR#-nbXLmZsTjnr>mM<*tbquO_ibgzlzMV{pj*>= z`2LQk)r{wa3i*6Np|21-#BFUv(eo_I=WiDs+n0UquEIfDQYZ3lyw|LNgFC8u*ET4E z6f)gLI~(yBDZoT|cLF^unf*Zkzd-(j*IqUmpGVgczmfDp2%SB{?))oLPJ7$@vdE}) z;};)$_qfq;BJC{D=fNCBgv9d>fKC$8%(r%Pg{t*_?0goJ$(lqKL4w^V{rM$Va`Puk z88+@T;DoT{G9r?AS*Oo_lU0LLtC@U*-}nZHz}VjNqkT*#8q z(y^8PlYdul(a?jD?mEvb_1ll9xfp@{dBiB?qLS_KwoJ$n0HA1G5rK^!PFFH)8j5<1 zzl3XcCb_7piOr%TjkAHT?7;Hk7SMh)3%XOmu4jA`G}{f2ylrgwXn=%Q^lsfYKafe6 zD9^$TCx-q}^5n0TBf|7s5N@^()`eqL&aW2O(nZ2L8ka=UI*B=Ja)dunj$iGT#ZC{4 zzhkDKBrnL~{#zA*LXr_-al_aaP4jjij7RFz^$o%f~AEYr3!2Q(Wp79W~IcR7c*v!Lv@gd`sHD*N@(E4g@sc?RJ>21vmb zIYt^T4v7nLJ)SLP@(V2@&w6(|F@1EuAV<>S)nXm$F9lvREI*beyM=ilNws^0^=_#! zvJ30z*rlmx_{q9y=^Cr%>duL@EGg7S2|5NRwZv~qf2+dK%KaKu8VrLgUi)WDe?ZRYo_;n{je5umrtvjEmK5oeuI$MSbvkUu5M~CpUn$lVx zkIVe?^|avTPK^y#a3t7=YT$XwhS|gN9$BI+<*Q(F6SrOrk8l6n@+C#%B<4cjVtEhiUl3fm&r#mM7Z(pj`?!s*xHO z3d8q*``Qyv2*$Lup9ekAK85*JHm(d;5PmN4nMF1Cl=F*y#)ZWNYu{lFzII!@JGFA@ zs8W-6n<3uB>G!qV_Au`4xJ78f9zgxszCP`dNIsWb`qxB5=`~o$PHjsAG>)Mnrww$l zwQAKGnF&YM8{&yr+it(^+5j!?hFl3ehUi*oaREb*lj@W|3$H|0+XMF|e)D0fB+6>_ z{Cbuxd^aOvYQ+-ced-n}$i`6{N--*xx&np2LBW9`Xil6(P>0ENM?3qllEY&E9TRO! zGrdI$#p?@~q(+LbgD-)!uhdQccnykfOv6)o9IU>cMz&2XATSxdU~t2e2-@LvR*t5^ ziYTffRe_AhDdou&;0TF6$m$G4uO0dn_DP0ZLqfdlh2MZov9WJ@-iD(Yi140_-ebIK z9>0amLOdqba^|($k`}7Y(^Yic<{P|!hg5+9ZJFJo6(l0<>E?(7;p#SQEOu{mgM@L9 z1X#JigoL6P4*Om;XAZYJV%vGsmD4ZCzHa}vZh+mCs9}ZYj|+bKK;hUTgezo4NP`-2 z#{fp;$lDvqoL5#C?as=`mO0(NFu@XeGU3@`rZy58v{DTSsJi)1piGYv`;u4~+!)TU zRZ++UlvDK~C%*EC6*9^*bOAp!8`F|xK~ZkMdkGjW*_dH{7YV%vWBhgB^PuJ#Dnq?7 zph}>NfV`ASbYBhf6292U{D5wu8`KBrju7UIi3PrX&y;ggclm+;tkk@@e`qnhHT3oN z>w;GnkXNQSB{&Z748!FMZf{oqosb};fcry;)|6oNmJqGG2lePD$W`_E@4kwo#*M2TfrRqR~35 zEuIv*qYJ|cN1dm+lStsmY$SAT%rd#g6|q!G1gM-r!k#W-hg!#4j8o;r6#<%2QXBLJ zJDR^UeHS*dTjntD;z>l+VqQHQL_yniFgfA*ull>kG%=Q&zVUqwVPF!0YxW3dg&)bo z066m%lgzI`AU`%K+>oHuDKrwlnsUimm^B`vAJi@AA2#Ly=1t6}u8lgDX+<=a+Dr!t zx63isZcH6X*3=o5SGq5$ZCG(CRM@3Kg21J?-z$yddwl`wHk=OB*74GF)}M*DI+%G! zeQ?3bmMGY-Ac<9E6~A9%cqp?&R2XI9*6Cd}dsUEdFgKs*{FVQ=-~Jq|iqN*^T8B7h z7^c9l6|};tdQHMfL~$#Lf=L3R9oz(6HkD4I{k;jaE{Z6kxCwg6rzbcv*gsDmboe=< zeja|yv(00+N2nhZ>=p&4B5c~gNkSLcqCe_Kwq>_l$od&Zx(4NU3uYYckNmDudo&fV zSzp^lyoNrHI29~A%k-_hZ=Hadp2-RKL#}HcSw#J(y;NqA`Om(zx=;LhSo&w zUV!YYI?RW=2*?*S^*EFo1w3mfiioPUw@-L6I3KZ+&5tl97i$wRv@ar5!Vf=#*WX-17b44T?W)xyewdhs4x4;nJA$l z#1Hh#OoL^zUcFt?Dvd-uE;s??-X2?yM%;9*sSLB*|F3$m@5|U>by*JgBoQ7Ihm{OJ zg(7Ital`~*oIHUb{N>~83NJg^79ng4*{?!&rOX3T{2C*>T0Ci8?1mT<6<;sKV`Yrl z-2s2z?MwoA(DtjO*Ak>iQTYH5%_zQUSz```<)yg@n^}6N#ilKM5w- zgKB<8Gd_CLLGqvX>@{?`C3WM~#P+n#0ijUMuNU@}K2vR(sGN4i?Xpg}Sm(a+7>YY< zxPJZNSPzLWir-PgLp9+BD|xxC{-!Z0)Nz96U$Ah5Eeb!A2SI>L>`%nZ0cX*;eU|u% zbmom}9lvk7d2~YGqhBkjX*n*_3i$ssWhyUI!1UE((LDf0wf0gG!bL(7P}m~+taRQc zy(aN8d^SP29(h=wlxihno0?su+exGWFs1grf!`Pwmop54Z6h~P2qGT(EvXlx{7ntX zB|AYI6-ZO^&g0j8xX5YZrl2gy{NV7jLv4RFwcJS94qKuLAtO~{EIfISF)zt>?YNJc zkykIxWy9FDSwf9%D76bWdOvAFCijmvd~Cbb@IEHb9yR|u)^-_$9+BgmGv;H#59@Q5 zKaX@IC@uGS%Td_{KGsYB<8nahi3G4q8Ky{svW5`>^w{;oBg$c^T6CvJF2)s6SgNH@ z>0ziDr7C}cg}-0QDdGWoSp2F8`D~RexN4%!L{>p}8tLBKzn-j;EFHD?zqXiG*i)Pe1x;Z*-~2+mOxLbb=&iv){dgTuaE_6r2g2SLgZyC;NVooJ%l?3h!NPK zT{L;WFA!rlR!nXuyMy*RD=7i&t-SMqQS6qiG{olBu-`;2EqYl;fxmeV&PlD}8;2_8 zdLpJjv-fT3si#h2Rv8&oR&OXaW+N&JA3)uH*$&3WaC!6J)D9^k2e18!vTaCX6fIZ; z5WYf`ei#aN<_k#jBe zha0-NL&Mf1>^^i=>D<=wS>1O*s`cTernvh@Tp=9i&|NdXw|?KR_J#HM;&V~Fkm-UW zY#QGnE2^poQ}bWc)_4J-bz(`ji+B^703J%Cf9%tB!6RCTx<6_1UcSP%fCKYAM{)$N%F19g`_C8E` z{My+>wKVAS@P86GUM(FJ{PHMHS`o9k8h`#LaR{vj(zYp)i~G6CS=i$nASj{e(cAC_ zQq3p9hZ%Gbsy&8t#bqKxcZ=Gt{Cd8UOj`!U>d zW=O_7apUl9$n4h?#cd-J+0@T#38=bad&(tf|a=?BFA6?(JCpfVe@yDGi7` z2@Ejk^|&dT0q#;KTHej%Bi7b3zA?Pg9--vAledTkvxn$-&568BOY(2nVma4fP>2@; zh8*CK4YQ^(v^h)yW{t<+^2t`dgW4oOoLtA-k-YU;P8WhSy-x^|eR*SBR2%K)wBqm4 zFXs}k*H(Gi$BO{`7rBTjyzECWT@i(@1q{rtGnIddC#$X|u%PP;?LlfT0h;81{T4 zr44^6rGD;yzG$V5r@t`Az~sgemU%JYNCeyWI4RVg(2gPtbp0}gyyzDTbSNRSWK6(H6F;JEm)O&4ov$Qg%5?1KHo-wd$bDrdr-J#zs<?cT7iU={NYVugMaMBj7{^o$|N zk8--1KkL=~#{)2MKz0*B^>`&%=#M}ha8(zb1|(pQH6STMThj-Ub&agH zG+2Af3@W8S~E94H=H9O3;ufT%TzB~7+r?+p(v2ef^L{pcSf+>Fgv z3P~nqGB}h1+kbF0YCOW7oSmhBay9t)1R=I<3>cTrS?cL)^D*P5kpKjhH>f*C9}U98Q%xjiDSum8Tn;X;IglM)Zlm;wdyj;IIO3=CmCaCCLO z28_rT$$o>B(PAiW?xn zfxkl}(HEJ8kSUCjoH9W5Mm`?KMg@K>`;OcRWXhcCnp9$v%{s!JoJ3zUWS3lW(5O2L z#-2yT@1p&MMl`13|TjxZa$=S9XLLE-b9AurRG$! zxg9%HR#9OA*f)YaOrB}621C|+WwpQT_9h}x*0#UmIv3j+RcLt@a4hZQiEPwpu&!^~ zZswJAk&h^l@W0<>NRRq)hW5<+^B$31za(I%7q`?T?e zNkHrU6cld)r}U$z`h_|=Keij;$x$l_+3ZW#Gk}o_>ZrwUsRaP1X4Hge|1PnPCxT=S z7pPj@qj==gc}{18#M%UnYk`J1=YT4EE(MG6kHeC3t*1UbWcAEKhWN5gme~L@N{xkv;{y`%1 zhMhgSL&2KdA@yh4ZHKb+s7S%XNQzjk?)N|>pZk3aa> zL_*E3LtajuT`#*6=VvWiRM^7wy;EbziVhpp88wsP4_elehA{EJjXc~Wo(dcJ>%Bv3 z#$pKXFQRLCD;`3jIuUG>G)kiahTPwI$G^ z&-adcyl9#qui}HqSjPd(epvbp3nW?325nASAA6{HS4_y0D$NU!$O&{QwB)(-*lqgH zK8yXm7j1g24d+WTd0>Yp1WS z^~tfTC9qpuSzVps$q-ek(B}O7d{cY*roqX@De)1r={Cs3%v46ia1|LY0aY0{hLi_L z$grhA#z(Ipc$)alU!;EhC~`n5-vz7nJi=o8qrn6g=o?W6Xqx4?ZbP~L;s-Owag=$+ zg6;I&GmgwOLwwED)Y-;*q?C+fY%{bQx_3X__~hgp1*N#KbJKDgD0aab;vT{uc#Dz3 zJDAI=EmGX!epgr&zIGF6o)KSJWiIy!P4Rm-9miuy>*)!WT7+8Mdj>ko4UZ^2pAw^> zpqvdoG4#;cfe&XHv7WAY$D!THuD19I8lh|fVVqPFZyB>=5A-r1f(68v5gOg}_M@e? zVX=DQYR98vdi?&!1k>VB!9rt8vD%nl;iyXvTHrJ#=EFH^=lT`YgwUd+n#Q~@|K4Pw zKA->sR}>{(r~a#=EH}5!c*)oz$q4tWeyQuDa;EFI))AKG$G-D16>^Elh+52Hra5hf zr<71~IC|1ek^Y11bjRrBh|q1K=lOCgy{4unw51t%uu4J56nV_5v{BEddA;*&Fk{KQ zNq=H|!gO@%e&d6+f~@q<>!k~C^gP?>tY9p|4~(MOpRd_lGYy7#mOURMMNJErkKu71 zJTGjb-Ep&2wh`_)u&TFA7Nt5NBq$#WE*T?fh{5O2|jSCLUKO3f0x8;^& zV`D`mvFIP=WQ8%QR=VD>F?PGRDCof?$$*e?i(I0RTi{XW8-I9 z-nafjr?`Wo<>ej4UgL4Mnum$jM!Ek61=m#(lj1Scy{Bllr-aj#{(U*kCrGo5#cTjA z5QHB;`%-H?pR^sDoKFLDM}_W=Tn|b==TbyUyg>2z@5YV|b#cBIQwoZKeh^1pu%*(L z5XRVfji!HKjTCwaUR8B=|M8;v;%)KDm-On4O*jc8Yw?{XyC{+wzpE8%=xMd3DG>zJ z|Fcy8c;(oRkPn%WiobsmST9u~A(p3|AS;gs| ziMcu2qrwO445_-pqC(+mHMEfCDXSSNI+YaLrmI2=@8_&Y|E7DHtlFB$>oc^`!QEJf zA)^;0m>zf}D)Z`Ub>ehBTfv6i(`vU>+QF%s%I|(0Z8UuLXL2&3Qc%R~`vFuYYfWN+ zUdn4y01|+sfBV#k0KbD^bMtHWy|{^HiPF}vyF?7LEZZ>U}oN*~1sPY#c`B-`Ky=f@to=u6p{t6(Hbjzd+IpM%S#w=wt$@dKw>612{r zQ+|miOIyTL9uzGuuR60Y*FfInNcEgO^rAAAlYp)cW4A?SkqlHtViKp(upW=V#)rB4 z41Q1-CKkqmQFWCg-UCTe`wei{ejgKq3f?tNX+Ae7$UB;aPUk}BpG?`mPT;9j9MeqH z4?_0tVYwD=MUZv1OZAUlNj1W3wdr6T1D9TkN?Qa`wZ+PlY8)*=-NEQyja4titB;3C z+Sb>H`2{g$)qFBVUb0BdXGqOT+nFDCc==~L!>@%?@ZMFwnm5Jb;}wbgO6^--87-~5 zC=VS;_=-WGOEnlQen9i}cnmJk(ZeIC*?nj?Hc|l9;S&Drw)Gje@8op|{rq9t_jV|S zi1GUICitq5Gw&gcLq6?2wYhu-*ZHWxV|LRqJmt4ogwJzXKFU0jcbe0+Qovw(6-c>K}> zwAj?SPuw%dfulguJJ3lREZgTbD9k8c`1NnDD>s30$c$C( z#PhpXy%jG&qZab*&zC1Nt!K}#DfJsizD_hWXld3O(M`50h#wGqHE(y`&J3!d!)2RGj*dIS+!dN>PR!oO7=Mzr5eeN=W`#dZK_Kux%`p_c@ z@Jcm<2%xczN!+pO-0ppIF>+JE#-V6S-@NPpOuZrk;d?k)Pc{7aOxj+N{g%tjG5FR$ z&yVEJg097&X=0ZGJ0PcE1KPt|cFAiiZ+nxD^)U53iVZ8?$vD8rX1y}&Z~j-@8TU;| z=9R^9%<3;79rQo0Q%hDucK4;FrG1>P`d&5EC}=-^n4H%h#+O-{?Dr*w%pV-=btyja zOMUz3JZXm<`vzP4DNP>LT`1Q(TvN=_h5^c(IVFFfRn}lV zRRV&f%;x`~zG5lCmGmButTmZ)0L7}%L_-EtivlScF8mfjhc(eaK=iIU=v9OiSA3%9 z+LsKTE{AMox2<8J7J7iOZPP7$(3pHc;nkyJ6;~2*v+p4XMNJ*gsm7?whmykTp9AZc z=be;~cys>yBFeW=zdOi)T)r|sgOB<8VFd)m=y+QX7-I>UVBWvLby(;m?Y`v5t_dPD z2L;$t3X3)}%TcZg-yP385*z>qWY>5bTR*0Kgkw{XeMrb_fyiDXuMW%kL+Rr~)xX4B zpPfNv-|~ir+^>8)nJ-HT=m)nskKZZpYq5Go0P?M^vZ?G?L}z=Xwtx4kC@B74%JWy1 z3=FB;%%_|-jQi2jacuL|J${XpICq*)HmiOlPl|dqP)tATeNdoINGObVQCn82OGc3Z zuq9n=t=>xyP=0P)H?9>`HB~iz)z`jwmVUiNl|#jREp+!?3V#|^+n?%Z+{}_)mQIZ; zzC-5T1L<{}``l&?C3%Dul! zKcT~WWej3Fh#IwUOy(x@)m4}#>C<&hn?q;ra8TH$I~JCf+GN|d>;4saE>?n$OZ{!J z(8E0vy41)W;CF!(vZ<@Cj_c$en3L!%n`peEiyzB5 zdHQCFWy{O^>E}h^qOIX^sbmR7kYD|rkW8-I_K|qEXW^`_Fei=^N5n2cv>Dmn=t`B8QtaFmuf@#r;bYXBSI?Y2{+N&Do^c$Uq zQa8O6=xmzE#jNjz_Nc5Od=Q}tt{i6j^SP9jlH3HcrYVpmj_fWUtk%j^nyGxxWEx=| zGjor}*!1&*5;!^^-C7&RVV>!$_Hqk7!+DP+&VN1p%P`&m{CJA036^NoOB`n6BhjmJ zF&n0C=h)J{e^oYv3dme13F{tPN}I%s9qO18^WLJ@v+bG4vC7FXx@l~dq+2~iHZC~o zHuB4%vD!ICrj{{=5q}tuHNrwhfo7BeEqvz%3pLD4p1~?x&GsH+wNtK&dj((8q7K*i z=w1Qi@V@)Qz#&ul{^v!Q5#^_LX!zHAst3lB6;vTxJyp)0rNWQxOO<${RIVlvIMP3N z-i#F+wwldThYdB4GjLkBTF|E{B7ht`%Iro~8ly#tQcLWsyUUl>?O7ICm7gDw8JJm8ZC_G0zgMY5(MN8q)UxnVfiIu1UbeFUSEUVdY3aiI9&ZydC@C!F^W9idbfOo-f~d` z1G~^dczMd`)iJ_%Y+a;Qx?t%v&r7^Lz;#yqK<}t7~d%x|!BVCsgogl8doW zkY!xS+E01*`v24^s91Wij2T!Jw{Jo6E48%0R0Wq@wq6%TRO((O8KG@I7WA%fhC-!A zSRWO;?NDa8WWBJYsOs#@;ma6L#akYmYLDXzwu-m!-Z8W+9Njt#)q6KyyTSj@kNnkR zX)!9ViP3S5r&N~B9t_grDUcx9dpm=KQ!KLgebdF7i<<&^|1&@T$OaSuv636R+kJm{ zcvx#W#RM^(EKM^e;WGKIs-`yo+9%`x7VdxULw1tzg|Tt{>A^81=1 zX^EGgBadnR_nF0MIGhjquWtL*A=#_3on)i>Psxi{^Q=6e)mQ;N|Evgsk?CSRAUCCt zb)$XQYk_%8fdgdFxY8d;cJ9Y zZ8v;`M#S2>UI8WgV7ARDXXnf5**eZmb9h8_GLDWT`#!v8fg;MtT~j4>9!VB_+N!F+IMuk? zf(p)Vl`pLXyv>u#D~sf+z8>{irE_b#rLvHwI^*WL$JS4%x3iUb=ju&X4L4i-HXssp zcJ3*QtMzVmB2?1|Zs7Uah{)QW2^P7RbpEs##y1X{rg39M)t77~uDISHC2K6wMYO;F=keedJrx=lc=>vuQgPV~+2 z-IDrNi?xEl2W~U@AxlfdS@8sY8w?B#>i5?jj-&H~(Dbv*a{bPkPr27MsqKW%6Swy1 zZXU!d{U*rY&^+~#BxPgpX5Ht$wbp%te(>#a$nv)PGn$E(5JReygGNRPu;glY+*FVK z_y~P6f`o5mq<%%zYN5Q{g@S)p&+Ulhe*b*bm8~mUg3>CO+&vq3v0@|EDGb_a0UdT? zEge7bPsP?Pi@f#hY(u<1n`yzx1x;YgNZ96ik?n$)QeFRu*DeM0xh}d`5!>YJhw$6Z zi>oQ=8BR@28MaW|uZy)ZPcvXK%$1r{|YX^~_8It-b}BU9qH`Pad#koYMHf zMd00y7vBw&KqRG?V$Q?zDie zDRWlM(h>K!N7f_VU((Lsd<9*7*q%>Z?9p=kT0L%wwE$A+IrorjYEKiu1 zv7{u_(j9$|rUlODBrtf>bx9nZYXtvztq2`CUG053Xzq6;(LB7*jn{X-10nn0d7P?{pc&2whscz$ zMK4!U0gtfe4Nk)0L8#9`6p@#HX?$PL-b{?qvY0g@$IQ$OoU1(C7TaD((07kpyo6|r z?VEUM4qmr|jstfAk=CQlSG5yD=X2O%4O=P8wY?PHeQKo|hUz-bHH*+y0A^+M7I|Kh zE~9SmSsE7I>Q{Ky@ACe-bG&D5MeRf<bbb4dVtO8P*aaq82KhTSGt^}{LigJDM(HnM7Ht5`1C7Q?Z5Amukq6G70^E0<>h zpK@_Dp-Omqxk|@}V8_r5sshskPKMMK(n`9k4ZO(Um7|=D#&LQ|&+p9_Gp&i3)}xI( zMxcv!Br$C1va-58w5uaNTL=SXp6#0V0Ezi*C7sM+L@(u~fkU&`?!G=)97=rU!T&=e zoA`E)NuaI9a;k8rq&l*J#=V=Uv{rq4_iopyql>kB9*xC)BtU zpv&s=B%Uz)r#FMxUpl${yeVSoIk@pr?T2{oWf{ivepxf23&Q%MGx_*4C@S7VJsKA)~K@n9ZQ)S;Y$(GjV zp-hOSIIevG!EXrCbkXZ!fB&pQp>0+bF5_xFH*uRae~}@)aK&{*25?Lp8TRH+@nGy$ zxj$WAJcY2eNszmy9=^@rXC2c;ToG@Do=JMn^`c|jI_c*oj%?{isoR-in3oGV&Mxbh zLMYn?4JUTF88VCBgJt(!`WARx1Q@YwaUGVC-1)1?(&FMdj9%?)3bi%fX*=7$75J~d zH(&OU{`xhG~hB#5erd3HVt z>%Blu@VG=kEU${cqn7!;{-9z;&m|ejI^*Fy!+LIs<$A;EVwMulBTqu{If*7_a-*_wR2PJN;7t~ zYCu-=^&BsP^^}`!hSzmfo>{I<6Zj@p{0dA2Wns&wzD}LOw)0)~D{*JPZnIKB1Q}?! zG8BG&y1ufvOb*#!OI(*n7SW#DZ!#~*_`*ox{5u1DaBR=Un&Cg1aatFD^u}j%Ga>8G zxkek@<|}?%_q2C8jBb-oC zJl$Wd>FXhn5;$qBk=DGaxUwC`__~3PFd3tLUpQ^uFSQcffy?lHv+K(>u`LPoy`ngJM7tvKrH=(rxhlll_7-*N{RIs;!>z(PFKnkVaw1yUhQ zX}u~0-iDeQ6-%+cRUIf2H4Icmb@{dl(LX1`Wonb)_Y__uwT`p1Gu^Ox^ESdpQ;{Xf z9(Z%9@itAS@ikEz|4P-$!i}a^{5%cAzH{L+=^)Q+(J-3)2rB?9wj%D&h)eM`Iw(nBoL5h*`R|vBD>i7Omhz`D+ zp4`CnmYh^GbupZllMu_S66n`i4Su^I(1|=IpEFo(QcjxQFpL6whvoHamgY#kAg|r^ z&4q3ST(b(*G^02x&?NU`tp_oR@3E8|*R`Q(zgYDmS?4*5Jw5h@E7bxURHnHb4$FL< zYTys_=I(l1()x~f!%{k1*_EF`%7rXGiLec3ERjyvDU6IZ91RBz7Hc~_EFUI4q`8T4GhsWA}=U6v;~WKkAo+xoj84^cfG;>G4PmN7CGyZsq?389Z`xK{lEg zFy>=+rtT?Cdu9dx7G;5QZ0N7sF4}-y9(H1%kWjfw^n%@Q?fm5=es?;6!0~1rjhCzb zW2dfvl845VNz|mv+x(?WGK2*7R_DxJOk2n|W&(asJDyOPUZSYu#fZa-lH*A5?t7)%e4b zGB^uM4~K9etJJ91AJbZY7iD5+hJW&2kVaon&mt>0Rh#TLf2xE#s)qYzSnth7?ASDd zbvx^~D(HJqvV?h|vSed)ni$CmdOO_lT0*%1S+o%WB1xq@d%Gk%FpQnO`grV8(>cTG z-$(7t>+iUQcSWlept;PXi8WQ!%$o%sMz;5}?{6d+1uS+qwC|P7au>Pxi+`DG)776| z)x;R5r5i)@nDFm+u!j^Rk-k)i(?vpeyc%qz8w`Y2j!U1{uV0hFJ5vI6@V!{UlRPOK z?kq!b{Sw%`2w&}&Zm&|FCYq2F>V8d+4`1^7m?4&Ryw|47Bu43`J3T5J(UYG+)I_WU zKw3TBO;xZ$$ZI)gr$0i->rhGJKrj}?(OLZ^N|A>`@e~yQ!~a`Ab~q{7a+$cEjPEC0 zPU$^nSNTKhWpkP$DKpw!N=4L zsp6mBDrvg?>dxMK$d|J_Qtrb!V-vD?Ub7-kWL>WD2Lngy{@YjV&WA<0!Bqpcdi5@V zgL6<^19g!k=uR5~u=^iq1sR)H`gy#(k!$*C%NpE8@H_TaTuHHgn06M~W};?xeQK{I z!u+K0#Q8(ifW#xaFf1fNCT9|d<9a%xA};|hOSqdbcTqSPA5F~=5X>!lT@5r4=;+2G)|_p^MNu{T~UztA?9?uCwa(V)Bz)wi_-{ZW)>f0HX1x=XHiYoj!}HnJsOYQ@3vvhNNf)@ zYi;B5_B$Tm>Sg!cDq!L72)uWo12TWem<9J`Slv@xIaLaWD{psmTmURAol2JjvX(!l z#0pjcmhW7r_tA-;nd_IV`?D_>x-Ufus`OW$U}^g{_&~r`<7$yX27~2=zM<-NT#n)k z1qGlrnPFZz05UYNLtm`D3uaDA@X&)l4H~U7hz=4gFEs4p3M2ZbUb_m$ zjoeT0xlH%SqiMQFj&Y0Mh}kFaqJ|QMy^r!gB`Ne7^mo`zuKRnXCW9&4j=H}g-W>c6 z^7KyJtFiID_F=?dD=2%B`dKwMwKS>nR$*^d?mtL($LnOSDmtEM5BM~$nCR^s%fT;>XrVb%qF4tJy5 zG!|k8q)a~p)x|AC3`>%=m9YEKs+cm*dc<_tCW&+<&4Osi@=$nKPG8j20}Jl|SU5pj znj4cDl)IU3+pV+3BgGf{t;(1+H;j%+p=X5<&RDu?JXT|ZLqy=xY3Y@tWJABxuo{rZ zl5qbo`Ng<{QUnfkx3|u7!vzQ8EFA$Z@jzxx>`IqjV8#?N=o75!ii;nI%JOVbEyhQ? z<5XF=CO}CrN3V(iT9rEd#8)JqQndG|=7MvA#Eas4f`+`6j2MLQ!h5Ug@;n4H^kN^- z9OU5b(0?DOlU$5oo=V);j6AAM+Z|PM4d(p77RH;AZ*Yrn?szeJ&p zh9dnpa`k_+y?GpyyS2!EG`Y}e8?#XlRQ;+q;j|Xl%C?)-LQ-^G?XA94K%=Xd9Zy&P zu;J4|8XL2HC=v^7&S6&NCkuyP;B#{hu;t*AO;z0-vnAIO0M8OM%(CF-NN|08kv;8! zX@YNQ|GOo$4!ZomRR|SXkq6xNqDJhQh8iQ z`c~NStFG#Xfw=o)e_ZYKK_Mlgw!~TCl??k1_Z&MI*qqREQ49%2#ZSM_V+9HYmXq^y zU@+8{uhAuEX!X*SDLH-LFKq&=no{HwRVHjwYK_M@KfqpLM~cjAa9=yi$$vZpoJwCc z@P%q7%-X(6D7k?b%TLZoR^FU>7*=&9C0;MYi!ONd9?kQW!y6Go9&4grDa5JexUum;EtJbH@Ff+&}#%c$J!;dx{Tg5it z*tAXCHHtCa2j*=N<{1(Q3o!s-#ajX{N&(})7jn2Jgg7oRB=3L>z~NYBtKoeDsiH=l zWm#ptJ5Ldomz(nLW`Ic68;vYcmEu;91tMmyxCC>xN_7km#5ii9VD)zFyD;=ilqa`f7+X>`^;2IfpuDB;HQ(dr)`50q0>oNm39;e<#Ccw*GR;k4PQ$-X|oQ z1@*H(60D9jntwx*c^1jzv6cD4ov=dJov3+|(LC03-Xn-?Sy|aIf}9O~1z1nELVl0@ z=t~t*QzWX4Q#+7y7ac zA25OTzM7u<$Nt1~Svfgy6xFu{?sj+pw13XN;wv|3H@43D&w;&(gSV4`|Ilr0Sky~i zQzj`Pkj5F0>uz8LKT-)8#_C^%fr5>_66@PnceXqi9|1S$I+TjjPe3q0@sP2f^=bF%n;%4dGn+zHY}-J|ugn-tupm!5&9x5vU;4WSzIAV|wliq!4O;!jKZLEAz(wD`8k>TjbIHIf*+ z2rd)l%KJ8pQn^}mv7}!~%r4u4vU>aTaoT+Z%eF|;>dCQ0D``Y}V-WK;QMzT=TNpvqo{Pu}J6YBcpK$##9F3ZQG(_wI? zwn0_d-?SsX#K9g{qpi9tf0$+?4*SZF(#NHZr@mB`?<{D;uPQnEp%Yj#?j+7>PBs)? z`dE8lP8X(LMjS*Ia_(&+r^|iVAtWUDqcN)*o5))7^Kie7)F`SKgN0EI1S>N_2UFDWyw9O&mBzx(4jzqP?xJ(u`%;R6hmn44Z5Q0v;&CpcoLD5G(+6w_jz&@M(3FLEtwV92>Etr9UrREC`I|~Bu-ZBSk`v&XpwHR@Vv9AqW*Z$DNZH?GbH1eJH#KpO(MF%Gw?lDu08^_;d zp(I#BAH)AVe8Fq*RgO2A_krxbjhs61i9>1i`Gh%+Z^Z2e(}gbLWjZ)+MY88>*YA|@*WD|gVvn^8%diqRTGG8^B-ivcQErF8(=Kg zvaYiDJQ&8!%ZO=>>|?pcv&*_(XOb(NR9c7yhe5u{d6Iu7w&;ZRKJ*8(8Fu2eOpUAYh4L0P;(@WpKNKM$64r4qWx>Np} zg#QCHhFCMx@h_K<&EtOq&i`@tN>uICJ>Qylzy1JDE+^8dwe`k^-T&hkh^sy2=I`&n zo)mfeM+7$TS{&}FJ>hhnE7{f5)O186^xaQCvY0=66{1 zHy9jepmtlQUFOSXJe!;}gQb)c08oNN)(o)Rv*mhz>ie(M84+wTEfEfTY7c3twFfcJ zfGKvDpH0;{=9!q8EwyGkeuw$~9Y$B2j*a0%gi%8A}ll~uQ{cZ(jT@28=c;~Y54^?mbh#|ICHh&_fqg}z7<2m~#N z?z&cYf?PuIw^{8j{|OLOGeuYl=r}n$J4W-tFAILZkqQ@{cJeMs$^R`e(!l2ou>05> z@}|~exf1=Lb;1+9J;e|5ug8VcNH$0f^r{nI>Ex`1g#~}<@WjN#5%G1(u-na_-(3FR z6rNs5waYAGw*c1Gg1qnPPHT~l72><+T3)cY7?Z$!0=j$#XlHhdVY2*6?N9D`YHsQv zD3fOiT;|Bc0%ZRD5r(y5;I{sMn(E)rh%;A`<(~!bOt4! zl@VgDdVdZ&0~c2I1E?8LLQ@ySzyCLI!at1&yD?w|S#JfWm)CIQ%`gKsbc8>jI(24B z^U(w2EzTdfo!HrsO~a>8l79YC`D6MVrS`g!6o>D(6ftIc`Spr4^Cv$j|LgaE+3zp^ q`K$f>ALGaOri=YEvs2;Nqh0Ze5CvZN^!60}&{WrZRQB7m*M9>kyk-CZ diff --git a/assets/dashboard-v0.4.0.png b/assets/dashboard-v0.4.0.png new file mode 100644 index 0000000000000000000000000000000000000000..14e985b537a7c24ac661c058aafcdd8d3dcfc096 GIT binary patch literal 875900 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�g9 z;<4};f6zL}DiZje1e6keFxM~vB7}c&J3YguJ?8VCAU-H25rN961Aq%en{JgU#yt$e zzA<<)W-+ZndudPw1PvR#94uQ-RvD?_vB|PGp$KVUdM>s5~nt69%rlu%G7VqQG3?2(nREVagTu8#N+(*)(Ni^^XSY>j4nfPaP zWq#t*VOe_iuVc+UN-5PhQUogWC^irCakx*s-%F&Vjdyg@KI|)g-_}8h%&sLDvoWVt zy!~2CQL^J>g%1dTzAvpnr6kNSF~vQ>a2}F2>X&9)K>2;q!)d&@;L`=H#>P^|t!rl_ z2>6bTkLn_yxj)DEmt!802lBqg&^N#3 z61g~{a6HPhGzgg-E42GX3r_hie`pgIs!T(3Vt#%tiajYrIYW|}#x_U6&n@9!jWa&N zQWvwxpIBo;(0^$pe7~OFj@3YIHfTI}qkG-LVME60jf>51(cJms4c(1teMCg_ zN%F_7yfIcjr%kWI(b^C2PhHILVq{&y-oK-(&{>kGeB6%`sJt2+wgBdKTno;^=;UJR z51<*a9xftHMOK=T`+3uypE7+yBREBeC$l;kxvnJ6PWGm4*(~mSZ;5Gh;98J!v?Nh9 zjRMA9<3bBwcTIj=1OvE6NVya>nvt;di#!C=t_gJBVHe09-gn{#!7P?n236?`D%{Sh zTic6a-{WQ%^YHrKA_Ou1l__F&pv?uDQDA-f2rdECAP}*qya7tLa}Xj-ao4Wn$Ij`q zp`6+qoJQ_8bw6&@UVnGtLT`M5eO*k9(@s?NHhTYPP=T^0|HmhaYH!Dj&#gE}d9gVH ztgwo#r~&5EUQ2%f9`>^Ivh=n*`dnyPJ61Dxllb~mK0QBDQV8KZ;@92#hnSJptM|LL z)TpnGiO&Ts2P}V2y}L3Z!%uyWe&rN>@zt9=Kgm{=#epx!06UZUcNc=_R2R$?TCjU z&EadstTs|NHEJ{u~H-}{IEryM)1Y13c@-D64+8{9OF(;=LI{r7T z2&vopOE0lzD=(49%nGscSm>l#`?;^drc>?6@ zPCr2gnf-dI@{=ZCaK%#g5|e@c)tYxMoV$1XMt6$DM$hQ_6_DkxA3=Kulnf=;AhrnMEtR_=Ig5O$Q(aVecXDozPXiL@tV&l zC{L8rFNy~M5<{iAY87wq{_OhOqozz8@^}n!2e3)E-1mujt4Kkw@=`$aLr!Q*R>EGP( zQNp!R>}6R1MTRL(=$h^uEgh!3Sii)|9SPVzPIVfkz^I)5h23fQftns3xki+Wjmeh@ zm}u7*LN71$)8h=l4Jd^O@99$QY)Lm%RY_=}!K-7g)c36Mn3-n~$DPK`OG((

=>< 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

IKh8>J>I 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%0DNGLyC9x|7nB#Pc?sq(r@e8?APlS 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�yG5e5_)BVx2_+qJqb+yuIIc_*GaAVi!Di zpXI~eXnh8L}d0kz9`ME;%lVY^v7$BzLbeB-ND__MDq*EJtmH-I};xJ?I7_Bu)oUfwN<-Exg(J2D=<^qzW$2EDV zB!o-8pQ}Fle!2rSc0tU96{l)LMn?@u9lF*8Zedoc+(PLO#kHcQ0a|C@PIia)T1soU z!p~M)AnA$fnQC^N(U`~Z$cReEU~B72yp+h`B_b^X;EQTl>2{s}HZjbIp&qizl>Ir2ZU_M*FInqk*cjaF9h#|@NgkQKBVVul+0oV^EJ}KS{uzN`_yI+SB$=Y zso`3iNOE#|DFIH!Pth%b9=26&xoGBME(Ptx^H|ZeIUppe-wA9)vy+nAiZXoKfSHq# z8r9ava)bsYP}qJd|CK{eY;$!5{Z4=BOT($s60!MqZuB-4GhEetC#?f({1*AqyBVS6 zcHVTZq34He76Q@3BcU%LsSSx&liTN}5>}{}z1&46>v5YXwP_1MJNb#(b@XOyBA&F9 ztlIPdkBFFMDrAD~OC}bTu5{m_H0cE`>6&k3qi5(PA)Tv-ycrX+uOHPA z)1QhJZ?S8tC=f6kxM=}D5taLlYUm$62XNl?{ieftm;4!gF1Zdowy@`&9-g@FZ0Fdm z7S)WdWVH0?bAu&hHHfV1Rxt*=PM*&@_vqB#_#qu#mG}gx7%r7aEGp31%x_s-m!qCnV<-@YWtK%Z&Iy#A*yq{ADk7o76PPAI@!r z$qyO28(p_}uOG z^}CZ5PB+4res}iQBtBhuRi=l%C8O`*MJ=>TgpQMzp8H@9dL{R@;u3Mk?SwE%$^u6& zrNOyt|8o8bTYv+AuDcXDV;3%IX$vbT2`WiT%Q3a^Od*uu14W8lGrvI^%CPU;PIkIO z2a0&|oLv*MN84p-4}8|J*l9rd5>;`eHfTu1lD#%PhR%E&X62 zAD~oBHkjkWn=h^yt0s8|>&Q|-#|kI@*AvVo?KDb4uZ%Ce-K`H)hiCB2jh^_!3Ac|_ zo@_oqXL$Wq-63DV$>H}uc7!Wky)7TLdlHT@++WF?OeQRf1?`Bs{Z&1efVJGZaexvBiYf@gj*WgAE z#{x6rS*I=E-8`RemcyL;u_iT>gu$=OC539BGG+VruX#*lZ>n}JFJaEBYL_4!_GP9# z@Lb^Fh!nxqjXCSL#s|&86o{hC+QX-(SXf(ijXUVlj@!S;Y8HSI&RHK;E<6spyfB47 zHyn7uctJ0NLuS#HD5r}LePPwS$zSiE3S$c8Lf0-up^WFN!Ty90;cM>1z8eIG+{1?v zqsW32mxm6A=XWiS2@2&mWUJ2=l&0zqy;vt@v@z}Pfvpjb?E%h1d(ZGxOpV->le=&b z8c9$vxzEekvVp38)_3|z$xb<@1+T^+umutuk{tgi%>qh^Ah$)ng z0i5)dZ9H<6DB#8sQM;;Qaov4FSM z(yb2<_0ART2r^%n4{o`+M`~R+yv2XpDt(8bbblovDnGTrr&ZMh@FEtu>zbXry3Y@2 zWLpN+UT3C3+3@7lf^YCd?W*@qhsdX%JWP+%{hCZ2HN2hOXX__I1}E>K(*)`;zi|Qi z4;!zSZeU}3WGEi+O>{hj+uNzr%@TXK>NT%sENeHQB*#SIUup-}j=84XiVw_BQ+9Vr ztm_dXMb0heCC*0!CW3uF_U)~0kLMTOXfW~{o|)z|kau@Xb` zKap~|0Mu6rzSQgb);I2pS0=U8RPEg!mG z@!*T^CK6IyuGf}v;7q;kJKvCR?U_QVC~k_FOOlX@>4enXMYYycef{Kws$`TRzmLI1Qi)DHgod%V% zD%?tQ9u`E$Q}_p6wQUUpa~&IezSQp+j~Z*u%0FXdxg@ZupVAyQh2{8S($XTE8k`M) z0j7+MEHBZ(LQCFL!pL?sKS#OHg?e3g_g%hAsL5nyWgGTfSn+v6D9_xVNQaYzCcM?z zcgBfk$m#)q`_!wN(*~l1VOU))^O{o!z)<0>zG4c=FYtx1^UPuywp}+z4QOP>IybA3 z(a_YqoeyV205H3M2N}CQ{uR6<-PYkq*9})uvBA#q+$k+tjso^q3)OGA7(?8zP7`{`PNJUrd+?A z-BBy--ckipU0vPQ1V7?i9Uoyb!MA;1v(1n(Fw_C~|G~nS*w{b-t-U;QfA<)rOm7R| zF#5%9O-Kwj;e=l7Ml$z`FfwYyPU#4`K+f`1kIqlqMzCqv_xlnmx0KyfW=&uC6BfFS zrS=>4)j3SpxL`(*g-e*ddggw95K3a*97x|kr!MCJ23^hEzIpddz>-Mrvpil>Qzw1! zwBzCElefAK=>BG-}OcW80c;Anra&#G;^j_x0X8~9}@d*9D5?Z@j2z=9GMYwBih~*5|Br{daHmC zzi`_KN17$l2Fr9PH38b1@_{M-_F}LISxP2!PzCQIjQK-`YCIb-P)hYKq*ekcPdgT< zpl<#q;D9)fVhUJ6a~S&^UccUKNja&Bi&J4x2uRu;%1BEK2uMm9?1V8-eox4Lqgdg9 zk$>L}5CCy2v32UCpj`-;(5(FPpxXs(AGjp3)A6ZC3}w{ z)P8Q(=SBZFwz99A30u?8fsvgve5EcFD-ooKZ;hst#9 z3m*c#L$G3!>fugG-eHeypKpye5T57c0HPZS=(nld&`fwN6DeLY&i;N&S>YSkOcB0{h`P67F-z25&@vNZH=iKt3Y$q0aeDpZ)N<_I)%6_Ss=>tD75m+-x8q!I^uP@} zay!B30SRLcK~Qyul}ObF-RzHZ^SnlWwq6sjBJBFF*Qp><>t-xfyEM{~ev>;tx`*c@ zl@vuH#deHNL+PI&V!S?Yv3N=|TL~KqdJ!n}^b`_>@Sg;usV=%U4msiUj91CHC}cDv9c~q{fQ~cF zh$mGfu)xNP!QUL*cA^m2U)$X4U@l9I{uYiSsBo`PIqxIPw|TwG_+5|gX5NhmtVbss8dFL@0HgT-&QOb6-@ z5G4U0k?ed%=dL=_`wF2=ih_T|CxzD{N=W<6~oaMVLM46*kgo&3C2)HqPO{)^C2aV33KttO|#P73Y)kic8_DiE@Q< z!959J^qHcH8#8AoW+TI@gAlsR%E+k99KX49t?1P@TMSE{yaG|OV@(YVo3txIW!=e(LOw;fZtJ1^?Ww2-#KsJF+>uu&seL${5lu6L1`?D^}prd2gUpk2?aP^&pY{P)> zgnRB1oL*b2VK-A{fdowb8>x~}I_mFV7&}pZHwq4B6}|FhY@((N zD|w*U9rn)|pqBwc!7fM)rrwiRL2~_1m>bXwU8(XI zL&^Kzd%D?}Q#a*OsQLN?)$@Ft!F9iDbF!Uk4xGwU^?I5Z%&6x!I9clc&J6B>a?yR= znB{(h#PhzFy76*I%Y3ECV>oqdyriW8qH?cN#~(l3ab-8Z=J!Yc#Gd zw636`!^-N2n&~9|z=TP@>q)L~dh*QHcE9i6sXfKFlOMWCt`7P^$HyLr%llJ$2&hN_ z9qsJ)XQmVD6iU=X-<KAZ_9pbDmDWsTKn4#Xs2Q{L7-x|n;+H<`jpN8VSuw#Jl1 zh?^%Of^2M#sGlrVJlxFbEe|zb?Q#B;9kxAV+8m6635AmmCl4t7#KY%!1heRRP3I{- zeDXHUM|yZLX}Zb?$?_hSh}RD1s?L6Z`o@@w4OJUgvC{~+$MPJgxivn`>vQCi59ao> zXQorl!qQ=mY!2EjUs0cCQ!xvY=y}~gkF|4WYk|rM=cM`Ea@3N#>`Y6cKuK4#kO*1$ zRuKC9{ox9=tMP1_FPNI|_c%RI+HN$ihLS2vn<$dAu`{J5WQHqZ9*8|TRG%IGDiW*} zVn`E>lv0alPqO(m*mKC*IoctEMNAxVjLV=}o}aqIodDjNc#ha;WMhBg#$G~9+m)#b z#7u}PzKIIc=#=^R+zVc%?lfQKi9mr(GlR{+A4byoHp-9|e!rJ*DdSPD_SBWi(AyV}8bvQ{Sy6kagi z*`n#2#vQX&YKvA|VATEF?-523u6BijRaPv0ulVdpwGnHJ*1g*ZCz{g)>|Ub42aT)< zh-yW6OXTg70ebDqIHo9xXVl>$e@Dr)ev8KQw#|dj{)(Mdp}GeMRb+5(ku~L)4+v@m z1qJ1GwE_5TzhMz*)a-R+USmt3vFHOl!L;pz-!2K?b@4r6@sh?_Pw39(5Z!XHO-qKr zx^UNq>gPy3wH2vazpv68u6a>&)fOer(+WyT9c7s^p!LSt3vCw+Vu7y&SDvM2cbbi- z-MeZBqHQ@8-oC>GUcRe#GNa8#GG}CbSOQ-B^15H|jvEehSs#4J(J$+275jU8#hK1Y z@>3}7rfE?sbG%P{#RK$t5=zalUkv2fcUbMq9D+ItC!`(R_UEfe+%FCg_S+o{hmmjg z$8#uH)KPhgv}E>A8uG0kOqX94YC}Z7wFStH%F+vAR`eyWJN)yT zB^6^+sw(*wmUsU1joMX^MSh;@_Q<;|iyHDRiD4@MmJ@e(Mzi?C4rYpj;8F1LDs_V{s?$EN-2_Za&q99)lsjKMX!+tJ<+G9Le1Z+Zv$MGSUH?nda++3DKb}M)$L!i1atae+XmNoy(15#<`K{whi@(@d@;zrlQ#9a zaniAy9x0zUrh*kZHz$hi6Rtl)^Mwd>Tg>r4hsx!Gi9Y_U-cPnSeUZcwHH%9yankQK z-*b0Tp`=DMU!5k90OM`O7Ps@1^E`x1*g=cS_DH`}%xZn?hX(rt>$#`*ODky41VyB% zHy)Xw6I{H74F!cvi5&ZY|6S=3vgKkW_PpM@V@1M4cfmw;QO<>Yu=m+*u*ySQuLF9^ zQOQFoAN~0)KX?4mHUmYTqqmsT>-mfhh;tKRmk}yj?fajNPfUBh4atIEA+})k7{$uF z=LZG+thVC#b`Ve!35vU~g+CnhN!pnoKIWM8NW+qE#!P8&6t|ozw#Boy*Rvo!Uv5w( z>s-wn7P&`0UGkI|tZO{)W4^j50JS>VJ+uY1IWP!#xuvBOzrtYve}zFk2WDsg&^>^D zgnG@hoqA3QIxfZU2z=1}D;98f7K2k2PQ#R`+ zX~#virKi82M85eUuA7hof|RJGA?p|JVUE#ZUS-&h|JJuZ$zmsGxDkiP$0wQ38SQk*ooq=p0dmsg)v;Gd3WTii z@3!7eH8eU7oqARj*Qp2Ijbknq9B-_Yv~*LuA1r#`Iqf86Q$|BaZ(sT;9?n;PW1-h} zT0k#-{cgVAsba^&`+Pg+Dmr!Q?eoDTUQ6FLQ<#Uok8Nr-@vc`t+5q4xW$4D}=J>a7 zH>XQJ*Z7kl5H-g!UhJiqLbD<9`SaxQpUIw$eK+(aW6+?6YwPBVoyJYmdDZqI3oF-y z_ajjTeWH;cL^9kEbXQ$(Cf}A>+&B}V(GS$$cgr~x2{e)4wy%L}hBBZt@`IE4Vr#4A zIJxe>F3ah`)P!){G*OlM_@AA-rv_qbfs)&FDO>HP)YoOTvVm;?)QQPuR%}L0Jy(qc!kFC$ zP(wN2h(5|xies~q-=2))e8nSVw!m1me2t?qpSkU*PXz)gJeP;+Q|aamaWFoA-jOrx!cj=rx)Ez?9L#O8IP85io)V-jLGsyB!>=>~6YMKH3kbSC06PqLX_MDaDTti3lH zA;FS5*mL%r;39K9jtcCno0;)^rGQEgi2TuN3AHZHpP_OWdmAHnOQp`}SEkh(W;mi_ z)(B*=28(YRWQKL$rv(g>@KW*$%FH=ETiU)IhH`erj=fu!rBQE($}Z<}c}nB&I|QZGg+Pb#quS)9dQpRCB~>atxNTkFY0s9kNA zdoxjqvyy5Q5lB{AX&Lk|G~at~P3A<_$2WFdRu5{WXwat#MmkxjGh;iuy21-c%2e=j z41V*CtihzFrjGKwC#|+x{1{frHT_`x!FU;Rf5(?#`;v7exF)1jE6>Q*_7l#=j~ruV ztwzkv=V;Xs`*=yKn+P(&E9TkC5XqZdMknisql9RtCB6aF*jdwEW-_m6jCzc!2r3KrdVFZXTs8PzryUE>#45u`1UW%HZwI1CN08cKVIe_e`k; z9yQU*L!v;*e4kYeisHVyY3?U*u&{o}PoK6ecObP<|H9dcnTr`bziV#t$RlI&9VEzg zPOX}IX4=*yal>d1nq7W>i&DB(!rmhG&LPSE>WHedi!A$u;OXK_#7$^lw1|QUr$1bP z{tIF|-*!=jJLmes`@UQopQBb0{M58G3f5Yr4iyD`RAgnVu)(FE4y4P11=x2VvxLTx z;vdN7YE~2sslS_2r4gQP+lN0)O9bbdR%Ut+yX{m^h`3@s+urtkSJh)DgMnSqkx#Ld z3hmKejQx>>d4P0m9h4&Ik|A{&0D;ClD;s|?*?#(NKWxTOTFf@eu=2yEBB_JvoP5ao zVv~pM*Mk7jNhH{6n0#h*eC)uFL4LdGA8{E$fU8{1vDjPLA;Lx5e}Jubwv$zklRE25_!bkmQN zXQim5Bx6fdcY3ZmwNJ6oaH$5`P04cH&uO-xudA5DU&HskL19=~9nIDelvGY@7jyc& z&`dAG)*`gXp2Rv`XC#QDlmfKWATd0U-&<%P$;<2AlJg3Vic;z0Do4 zT4;O*6llk);wM6t^(@Y@#qUT#HhOytO{g-t7%TSXn2cX$&jYv~z9b|_-R1I>qDD`r z>ZwDTQHN6suht1kMcpf3e(Ln9c%p`B1C(m;b44u26Zo65wBL7f>A_j$DQK7})R?Tx znPVz-h#+o|TFt#2raNEG<&Yp@nwpO|a^mqEGIFNSqu9$5alxtjp)FdfV<1k&qq>wl z*S-~zf~Dx~mZMQ^)Um37I>~v93e(_nC`m4?LcGz_+w8m*;CiGHiA&vzfb`-}Si%8rhDty!eU=u&H(1~u%_MZUWIt>-v?~N}?luLCo`lcT z6;^y>=MoyoE3OF!^=!!a&ZVZ0C?9cFoaIm~^S$lyx=HiC6+hnuVopEo*VZQ@q@4CX z9sQJLa%esI(c;@P=nN+`Tw!%8ZL8-oQi{!<5a!J66!v*X*2{nfV_#HkbuR_q3RNpR zCwt8Emt2*dj9N~_Ss}kXIT9v0;^KNLZ=yz(gQzWT7#|sj-UrI|G|%z+mE-6Ld22RnMzB|YkP)ip3pZHtx3<{k2P)tqb_zy zC&sg0Y9U^`TqE;|?#F}3a2(E2KJ_ypKcZilEW6}@7{f1V{Up`_qc{M%bY#jv@Uj)x zj~leO2TWV|Cr0XA;SsbET$6!NqDCs<=t~dJtVH=^)R05z2Y|t1id#l(Jr;~ICA|G*bCrA zR9l8?L+F{VZP6gYQSALO-^CJP_-UX0aUMB2Yex~WU(Z$t3M&YKie>G~v=X65LN~F=+ zpnB}Y!?JUHeyZBAmZBgFkyp&ljam^(%5q*udy3*0k@~9P38;Y36_!1QzJ97i3%s6l z5<$EmX}J_oLNI}HjrEL)UP072jJ+8N)Ho4jr(Dz&(ow+Yzv@aj z5O&XR9*EeVo4?5XX%_x~rgo^wVp5v^Ksx#5_9W1P(vww~_09fS$M;unJzSPL7)5V6 z^9D|~Ml&a5`W-eEin(#&w1)->aP95OZAG>VV~BcE0}J;QCJ8T&PhsOZZ=6I$eI{K7 zhle|kjbu`EEe&{Y+et$`$F`oKmLdpD;x?-VIi7{33OM0xvNgiAdhZ1h&N<{h3>w1O znAd2SzOO+AtOURsI)8@KN^PjSS3NfqDHBQB)?m}@SF_~0u-!%3;N=vdEmCK_S{pf9 z;k{Dp(9mtR>fMnSgR<@~n|~@4*uUz>wotD^K_wC5F`hTP-)jXfxq(7E#Ln5K+-?p1 z3Lb9fh2E=*e$tbLq>MJ@wHUgr%3EH?^Iffr7h~>C?e`=XS{|Xk6GA+qs-e$U-E+3L z^oDm88r)wDxpIA>hiZCxdQBdr%rC9l0(S3wi%lfX z^7O(ncf;|;31Xy&Qkp=x<C%36^O(@g~SZMADz@d;XzqoC-$DlC0(QD^`A)t3?9-QAqLGvGd zZ(mu=H^qexqz0sc>F=>4&;2wA$F;=*0|ZiCZ?3-Q=3?dK4X5l%n|3XGMupkogIjV2|(3+r;ddqBQ_=VmmXrdoKG*Q602n z=dqrMK#oa(M?lHW^|5w&g#nI$`j{4wR?MjO&-NDT1{k3VJNJ&L74oFV|3AVP& zU)&7ypv~&If(xu2`Htm;Z7lqv&Xrqg7Su_dxhpW&LyXjZ4Mlj(HG;5Ai;&INS6&xJ zJuAwuSA^&{xQ=cqhJ)<{`&*v2P3>jN9O^PHt^?sY8S(Ok)H_zsUDn&1hr2hiNcYw? z1-%^QR)YDP3ThOoNQc&Y#6uygJ$6C|j8`cQjD{IzL;GoyJxSeib!wnV+Fyxv+$uWb z*5nyrId}}fPp~;WfaE%O!7BCbs`l;iH&T&1(PM} z#`xH<26o%bu1x`VU@wmFXfLAAbc}_T@f-bUUlbOFP0OC+8p=gyCnwBc2?7FA+kHu8 z7SZi#MM=vU+?eT?KJTU#S%V5&*{11%q`#uhr_mg)BvYBT|Z z2glq=0Kh0m`&Lua|0C|fY0r0f0ywk8ATb8m(=JAS9iV@xjH@IGsUS{{Gg6bO)@6l1 z06r7-5m|KGe^ZM~YMLk=TC~_%h__uivPzVhJ>J^hGWMcX1ybPfjm6m!v^f|LqvW3^ z#}^Lt|A*D{zQ~&kJMya0Y-$a?diIQv@cY%X3shv7LmV&qV=i#m_>)zfmsG6mFeuY}$- zd#Kl?kSEiN)Fjn^b!rmF^hpATq^ZWJlI`GoY>A0`iwq?z0+l#G*UbIzfgK5Lrebp! zWFt*7Alj5y?b%=wQp;WMMDcZ(W8Njm9m3%X5vyc z>Y9#&eFM@sQ@w;jyJrJquFG22Z3iW{NuE4!;TV)?Aq%`qoxFP97;M4C*X+tkX53mT zYHE__4_#e$F*C@bdVuG~EGef+?8?zM35xG^*c@tq&(k(H+|r)tLb#$stLL*#SLLA` z7}$X#8aWR%eWeX1;MiB!{`F2FNh%bQqoh~(fvX9Fg|xb1l}0qv@~V-iTLINpqE$ns6jNEqbE8UIaA@mFprWrqho~z+B=x9CbPkk zU(B1=Awtaja^Q!+GWK(@*%fo4Zrx%al~7htS(NDu5ru;)Lxms*Fdjw40Gp>+E0R~& z`(4QD{EvB4t`7YdG?CCyw>m-uZgq2zMp%cT4Z(5!X;NxjeyR-!#9X+ji?68Rcy@{@ zsz2(1ioIFN*|Ol5y{*rls5Ud$-!B1-oZWlS5bN9*j4yj1e9|+_K+@1qPtHGRBF7s_ zKAy|Anu4m+v9@cry$xV(0~Q))PhCJ1HbA8v27&4k+e%NQ0BYb2SV!UH+Tm(>&gQ5W z>2URGG&9!UFpj=CSnY#@*MPreL#9H$goA@UmOiR4fWEu4?;0I8QT=`p9gPFncI|Iy z)s~eN6A}EfvN*4HPKS@Kzen2ctmVm>{n~b9Psp8DSz==lL_)Y;7qqXCurWWa-IxFI zB7Qx)39_)u$;p{JPn@@K>aSSx!KSZJs{--%Wa^?w3sOv)Fi1d@>oZ_SfUh0K$w!N~ z*en8sZK-0OlIz*}5(gHI?*iFgpEucTRsu+^hAuI^{uOGe_VyLm(J{;SuXe8A=ZBu; zF0CM$EU!V@<1t1@x900OYeDw5hq~{T?`+%hbukL!Kpjb-mMmTJ4d@)Vazz(h)1ug2 z3=7`thXLzh5c9VX2d2T$H9~a)-SURYO1!mkVL-DrFN&~_)P5`pHS>l)$t}9yTa|K6 z+Hi3Nj1+$McSR$+XFoGIJnZaL0&$Bk>sW>5SDS7|-hqwR4I8Xn^fUOJ+*5WAPe86SB@Q=671ssV+2d-wGjqh?aYj#xrZ^{`2N#^-DPr&J^+R%Slr_|lefly} zH(p#Ne%k;;w!Y9jMkv+NN`Hn=Yv+uslGv!Mzq)&&v@OM9O({H_nC<5?+M6Ow)MnHHE#I@i6u}bZ1xv+Dwjt$y*0Gi|t3^>~QocQye?_G}x!H70A3i1x~ zmZwCdS_K>%HnmUf%y!S6y7+Ib%P)M2;*Y>R?orlMe_C}Qw!Lm)>F7>YSeg1ICS{!~ zGH-l$rhX9(^@sQZ@xdv;hjr-jdb#gITd_1{mSa#&0B`haWn8Hh1kAmn4W<_pn}Q#E ztmHVCdmOP*PFPqx#ZJc#)CDAh{H{m67U)H)O&JVPT^g!lLjRoFgvsJPdTxJu&G!6{ zW_OQOM{p=W&@HveU0f!{5it5Csyig{2X&|@X_1Z3L}Tcu7ff2ve*TmV08m6v(d>6S z7o;+KKNSmm_%ooak`XpMPagS%%*_!W9gX&cRXd!Bn;2*yhSqZ3L2D>GUHP!(U+;?v@51V68}kATzk74kY+!Dx|YnrmxoGrx@H(j4FcvYEWLFb5u22Di{lpVmhxv2}ujAR;E2 z+;Azr({&H3&;32m8|iX;rcgM(Jwr`d{ZW<%^z<%e@G5bX6}x|k3nrQJwrikUKlfPj$ki2$}vq*{ZONYZKTE>h_8((Qeu>+Mua z_ukxwervk8ep%H*8mSf=EFi-(5tggT1SlB`Ocqat~z(^7O3vf)q?Qm=J$wJ>))`hMTGmno?r8cLFCzOy8 z58?Vk%Oft(y{xkx1A~J*Oe$1FnVA>cR8lL6#_ONk!BHyJ3WXY9&R+3j3T@5Qnkf{*um!<&$`|Tqw4a>vV?IM=>&Ax z{5**FhhPgOh2=a#=QZ0;PP&9*Z7GxiJ-AEu$0%Hj8|+%M{p*90^_qkqSWwgTaAM%rhS}p zM6R@&!eC)vj;|ZbJ+xdxpL%&GQZOSQUhwYdt)})K&nQBj8>Bk2KR02Ps3t<2tz08s z&-yf{dTVcnmYCuFn_7rB;uP7fJn8%|=ZNsGJuT~wn2F*CAUEW);3HbK`?QTP!%*8&TeTzmkz*w$DhE+W~cYdO`+d;@0XbMzBkBe@1^l{C=?@vK`CFP za=}aA77I-}W=D@e<(Y-jYUr+Y{WGQ83l}cyhfMQT0Jt2)zEiVv=7c+Wt*X;;iax`& z$aWmnQn<&GSi|TyI7}fFX`qw?w2CE`4kwd8b%dR+b!Lr@87_d1S}%>rG`0DLsOIED z-5*jHAob%axdW@T!V7bji7wBdv)Uz*5@4NZ=Y?~oOwcTz8O8t zKtsbRF{nC++uKmRYdVy=ncds&J+uAOc^(rj-OUYL;GHyAp`>@j>3loQkz?Q9veIFf zot>PsOSc6CaDlo3-c)xerrN;+jP+`dQX<*|Ov~ryJXL@5BRbz%WAJ!XY^q`b=7F&N z{WLv$)D#)p#&Br2KzhmTilV+g41j`WP0iv!DxsM79u_7N^rrs7;oGD;tF}xXwIi-9 znUE~4iR72$!2uld-1e8AM!fX5~y)F(}( z5TG!31Rmx8k#*K@RYmRAR#GGtr9(w&*pzfgD_u%=Bi)@6N{NW%rW+)ryV-Oj-LdIz zHk)sH-t(SczJGx00@hk{KI0kV9@Z7X9&(cdjp$VSonnusvBGMn6vU!HK&w&$ z!gvq4$)841!!l4Y8NET~0uuglpDZOVCLq~1IjEe_QY?z79Jo_urvehDSrfQi7|rxt zaNXO>+nsO~-Pv2CPt-q2dGxFcs^R$;e@{%!SS?3CmdLCiC*p{JvVD*bE77lzsdI51 zEnAADR8l)TY>%5;cl=d zkl2!pJLl=m#+&rEw7$9NW5QPKFOB)oWTk{Ha{mGd%bZK5oI?(GP?5k{%vS6)D=4 zrEm6R1cl|H6VPGeBD%z`qxb*fDvyrx`W-O4?oI1G$4SA8F;urOmu?&BQF>%ZiP&5DG3y?>q(qx{N}i zWj*qwsDT6RU8(S0*usas>E=ixZpZ;xl6T%T6#knb-6Rf?sQHa)sP|7%4>$Ec;>=Tj zwVu)7%$d}u%VTz3U_u?mwd|Sr!Gvf7zrLMC4 zvap2pg0exq#pTK(2(j>NrDf32gd#)c&Cy8P-Fsnm57;5L0u=B3yvw>OUHfp+f|@c| zJoKW&C3FesS;bn_&qR<%LMRp~E^wdAl@(Z8r?{eE045bQoOQv|pkwy!m1VEdNA(Hy z`qwGB(ycNZ6>j&)u&{{EW}ycAn~C0U5;sc8wi(rs=+yXju}f1ZrBky0d(-y0DPp1> zo|7usMDWLXK}(CloU*de$Z4r#eQBKer(|k-(zX&c1gEW%$z1vRK*B|a)zQiE$x||^ z{hLPv2`+CzIOc);_@3Tp=ZS4+E0|W+=$H9Mif2U68_v_j9f(ws-Ux34R~p~_g&OKt z1!;~6n^X#&FxC649vfawSlqbb(M)CxnIGyrO3L<{#BJ0TM<}o>4?JG2;n2Nkwk#C7xw?um_F4GoGce_gnB? zI8KmXTln$A=%{pz#B%Sz0=}KnZvj$Q8F}V**pV|89GpxkS{BUdS&j+6euXSf@T7vc z)7DdR+0)0@J$(aWF9u_eW$A&L6CLpirG-Rkr7nbydx!XFT8NH`{0*0|8yq?(Rk8~% z(B23Hz?j6xYfy1YyL8rZe&sFmqkc?rBX!VTwELEDkTN2Tmz1-lnT%)2Re;K8Refu= zO2E~6CNRxUN5%5e0L&m=i8FkU{V2x)ec{731bw*SNXP-C6@E##f<$PRMM>1{DAO#j2d~;#w&!&>ln#XVZoZg2K8MFyw=g7aSzxKbTqb4=#Z$%_T1{{h}<(M|7vm9ir9z z?lWW&3CvGjW6m|rR(*8vyjc*YrKW~fl67az?MUY*pXgu0K&LSFcl{Ap5!xFTjbOlB z8e|;&p#cU4vXE9+?fg0a|D+e|d#uEE;1d(rh)YFLhH}T)l&?3~9k=-1V;?pm$x?3*?^nhpsRQT+|7XShsP?9G z2;@taWy6#CldhNXpZMR?`f zfDOYCI?7)0e;CAOu>7v7qvIsa&+(h$I9Jt?Id}5%+FE2|qu`NZMH6EF{^%wgvb^Cj zYz&NOCh(x5k|wGQ!(1z|nH;qCT*`5|!MStSy8+_7;gdz6# z@87pp|JF_!v*sc*IKL3XVi7J6Bc?(g5BXc$v5_uI-l5|UF|yWtjQ|Nu<7LV4&kmvZ zYa?wzV42-MoYHF|CXxL9EW>qo;w#!fp6i_{B#^0PE`l&H54gzjS zSFodSrLwdpxK-zyJTD(&Z>Y0qhs3A(;gt?1OZyDNkM`B|U%cTX^|?8NEgN>ULPm6s z^s<7wtb>EQ*}ybM|9Y*LbFQ4+%#ild)eR%|N%@3X_2(t3(2GMD*iHZYhjH`=pkii$ z5D8b*`_49>+wX}n$_%y@U2=CGG)kXxZ}gDderVGu2Cx6-aD}iZ57-Z==R8;!tDrMT zclEmJ84cT?m5-dlr<^`~O;R!DG&t-eDk}W#+d{ZLDN6YKRSrK<8%ZQ>vs#WNHRbOe z65l!-fk-FCwEC-E>b=qT!&D-$g?tK^L-45@F>Jh>{p=2ESqlb4!hta_fM$aF5jH+- z+F{L7hq`ys%9?qi_@)f698?R%>auJ4oH zwt8X3g^=e91%y}XAG|HR%RSaGUcZ4lIL6Dltj?Um4bsbpu0F)JLHM_~QYepkv(3|l zNd&#o2KBF$KPq8hmrrejg7@~qJA$VnqyO#A_VjDmtv<~vB1A}fPZ1G%stoX9BJ6Wp;DNoUd^TU_^vo@UP}-|e z*!QOyl!}iF(&ka7?_!L#>x)Mks|Ky3O^#n3Q~q@cgQBwbn4fo?V)QV)xq5u zfZA7ROox-@z;GF-?};RBJU;1n|GN28-|JfPb*gZrf9r#R=5uZh3&egxYEp{R646L2 zgpN1&A>RETr#}pS{%NvEAm4+?eI(y3jqm}R9;k0~zY8Yr8^2l=Ji-=go^Wdh3y@_# zg3uSAo%GPJ&{cp@1@IWwsNrdj)M@X>p1f~Pq%6pm`9Wl!zb_57dv4kB{5<$ALC zhW9*f?K3sy26tr2L9$&7CE(<$*b4aof|~RGBIO#byovy!_vwuJd)cO|iUC(Yj3DJZ z1ifOnFY*{x1~GH=)%bqg|Kkm>`|<-8e~r;5bNmJ#zUmh!i^7WrPVQ|512k`-diY4bC8peAv_rgF&#uRv)IvM! zsl@cPds}Dx-_$z}paTD#-_LZWO~3aG9-3Ts@aQwFC|J0Yw0HDNZh?pAHCJUH2bUS* z%eO0y>Eyxd@m<4=uI9(s@q|zXOh}*K2L~)i`e@hBe#y8&p;1Z=_tp!4&>OS9FO(E! zH!o5^Kk}#))?T`dvsZE)T8@27kF~t!0&G*V$S{4+Bp8XVIoolGJ z>C(~~F?oq8z|6|n9U~rkOt|3X%l9gU$Vp7RV_HTIo2GU3*7puGUBBfaFDZ3&T>r1a zU=Elyk*ZfxS~9+GH8a($u&W&#No&L0$P05f3+CL=#Y*;IkW(@Vq4Iw*Zfpg{hrz6oAp!_5x2k#_G7M9 z3y1N^NN+n$v{`9M!>yy0veCfvAsg+o@j=#cbhX7=N;WciwipNLRtt_c0}d5(l?Oza z^-jhu-8Lq}i%o3yTWmWpxZ!Cxt^s??LTa>5i+yqyAY2e1&Q{}+ZE@bNl>6%Br%=En=&>u_u-v5${vnv2hhPlg>wS$$YAj z0j%9G%vpjTh%kxg4;&wqZd(?}c*7Yhfu%tm(n7Ya39p`0U96Mm+KQZz+RVtW9f{?1 zf!>zVNJmQn-vY=fg!*`0)79(~kyV_^Vld+fD(>^wY|m2*xp8C3T1I%k zLZZEzb9<*`A4cX@;kNj}ZmhC^s{baNLG{VArvnNF%?wJ{V0@Oc0-5}#`h%M`8~!PL z#2>1bPU9N$5FZTO2bapOO4NyS9~9CSnhR+zMM@Ib7mWGo^xOmf6tdOo!jZmg8-DwJ zaaS2?6MEZ*T~{nacPy2=NulTTWX97zxg>R;V zzgk{hRgpf78*1|LVRxC8duz54k96CgS6I6gq;o@`aCNNPBt||}NNF7wVG(_L$Sh~9 zA+=6V*L6Zmzpgj-%^z7r9)GM~vJUA!*F6#L*)v z{dTh&7&qRwYV+}8W`?hGceSx|B!i~aWzcnpxPZ%Z8hx69?WTP@#bfa8$J|&q%{O^* z$P-7$<73RjmGgN0_J3xQ(w3XR?w9-#c^9{T1rAhvJmtsBUZnmXFW|vXuaB0wC!ce? z@}H!g6b+>z+Ou=FEffNS=RYoqgCe2deE+hm2@Zo*VHSj6jk)xzBWC5ME?$PFI3MnqOe%tI?=_GWSb=>imXAzB>8j=*G9p&S7=|A^U+RY;v z{TUu;Qp8)cBZVBB;E0Ff1llNQO_DPX|6T_zv0T2VRn+@&kM^&9JIg9_T#2uRp?R- znom*w!(>v5Mst5<^VfyP-*1zBMFQmQRW94D_fGdLyY8OY&Z<$i}9bR`z^P zO#yKSOil_8YhD(EE91iwD5$ybi7zszSAry^6f;7R0RdDUV<4YQGLAJ~+W5F}`b3B& z_h<;Kget)ltZx(UZ+8D}UzJq$8o&1(gn#>1=67hj#V`=oQ~l5E{tC!+M$=(2Ry>K> zoL{+C?%rO}vFKK4h=qUIw%i5}&(Z0rQ`M)XYtrK^^j2WZ%hspQ>TBN+&l`Wq!SR%{ zq&~^Iugs%^|D)7a_&7Dpa;booM+Co7_KiqIRFwP6pf#EI@BL>iFz#{E7gD?UKgPY( zlc;GhZF@3hiqV%=Q+kVVsAuU6Kh=~7-)!`Hbjy<@AGS07M0r&Cy`am}Tj0O%pX8>k z=o0sN7F=EV=;<>xRy}*-biizCsbn*~!Ffg;Z*Y3!vb^wAcY#QGW~g^SE#5|O zF8q+`?9tW!ZPh#j4sC!@%AN0*?tj_3(WJQKOTur2HuO5R8-UVd9Fg8RI7DMclr7(l zxsqCKl;2=Fi<*yg7*!QkXQaQ--(QrEUqGT`U>f)IJlUG&!;r?K>fG7rU#{(_Tp)z? zXQCm81mI>$&<=PMt&q_3c}Tg6HWkUU?48%u<_@p0_2xV*mO9$ox9hkoR3}-@#!*s6 zO#-_Nl@&Dky%Ty;*BI#Ov%5~i1&%8%$-ge%-4q13Hwm~ELj5TlKYCbYIETjiDQ=sz z1>^;L&f1lHNaXeeh4=>Y_f0FVg8wV2~SAv6lnA1&=?5mwgtu*|WEr zo2#@8r<`*$IL(cW>oiJHCMtn%Yy<}1d@2fteB>YskK6mbqfX^W`Q@Ml4W_l^?Zzznnsf8vl(y^a*H`044UrK-FBS_} z18=fY`@RD=2fyxhySJVKm7~+C+D%>apU@R|t^^!5E#{FPMNwP4J(pPO^ZmL3VES4H zq9GTp!(!qDdqf|c%)0u)u#Fc$Y@MGM?CrNd2bawT2Rt%iovKOlsoz=krz7Zd;h0dp zXmH8N)V`!L@gorNzQg@ns*CEYxqG&)YM^{MHPN!vY{L{8Jey&@)ND@y*TMNPl*9zK zem@f$4_n*lvzxb*J{AGfk3NII%#7xlHC#2>7QMzMjzXt)S<)u6*IGiswc3gaqEq6$ zydVgRO7q849-Xc><#d;B)4^?G{QRnXhJW19Mk%n3u) zuT93%z{_^3ZvR5SCL=I6k>6-o<*y_+zB?!k{Um? zX;lnwf%Ot%#i6;Spi+$!jl0hS=@g?W06Yp-#5zF_Nl7iaLW%`3O)d>Gn%mAu)iZ5E zFRX~K2g(1cUe`_2RX6kx4ZQncS$@+e)}q50y%XMn+0qkhFGz)cef{Y3I0kLScHr-j zqa$vrIXT?jZTb$Pm6uzY+n?{$L4;XS36g{ny$lQ(_=aIS%N27u0J5vwc z1v#D9>8E#v6=cn{_-he2*Vp2uvJNtMsolB7$;)!{sUj>{2vi+X?*HW?Ke5H^LF)Z zE$jah@F%K|eP4bW=eo$1qn{*A?Gx0WQWYws7?YN9d>s7nY6fL%u8VC;wkvJ2p^>_K zLqJHVY1Okzp;I}FaOACL1c13(n4s_pJpJdFi=-%$_}BLB^pZfkk`TZ%lVu&>K>vUG zZ@_;lm#t*pWp%9Ne8)E2||}tx`-z#v>H&RUox;iNy-&>mq4rg zlBBjS*`ThMfaw@PIEx4U1^Y1F@ONHKC8Ky{hn8Q_`_(O~JXp#$8xH6r? zWSULJmODe2xe`h@vXa^s1e&}0 z4iXj9aAd@AnXNpZeHH#X<-n6*lP2DB%W}y?=oeOyK-L>4X)wJ zN`mmNmDW$5{Iur_m4-pud0kyOJ=y4d)y%BS?RBT{tI8jSqVIODPb;S_B?wr4R0MGp z+Wq+PqmWr#WUQUO!Bka8M*=$qsDomP*Tw?+L)7Ixa>MC=bdh60kvlb_;vt!3Wdxdh znjoA7q3HLlv0Ye^#{O=mWgUGm5wmww5Kqdhr(nLitx7e1y~zYAqWnJnyJ&QD_5Ev> z*9wX3v3)ssbKG{F)hyaN(1Jq*hm_f;U;Gey`ge|wrpk2MC#x9PECZFxWY3_Uz4tcUf?a7*+7h-*J*gF6%l@IO%t>zH40j z+nOOh(&VLhv^x83Ll)R^P~GmoJ$@YHC93u_Q5V@*Utb~8e|?S4Xv3W>&&Q|e(u%+2 zvs=#Wb3Q}&p5IBTjwSQvH9Syh)ap;`I}c?dR%)qOEWlHjc@`%rI6WKM=O~vqwA|%h z;-&F@S7XuZ`~aKimHoBJs6xxbyEcKSS>k;~3Xv#$;>KNesK{L{$w0uG<68=N`il5y z-DhLn5-kf2~B-@fbV|u1}{9ZFQ5yB2vz;Ov8&Uy?IZE%Y$wf-o&l4 z!X zU=quxgh8_lyV{Zj4LHq(@gR-?u>62>*;w=2IlR}r68U;@G$Q&d81CRg?eIJDO3NMy5+SD0y? zfBR?<$bz@FzA$w|Tq&nC9mOJ}Y->Tg&K`-1>W?R4ckbE-=~-1NJjS5WB7-Lqf{8=< z_*cwPKWC#ccRc%)^>L}`I?=kah#o$696D6*a7V(2M>QF?I>Kyq`Zyo@kyuyQT~5$- zUP8j{TZUsZrFQ;(uaOV2`Oas&s%@RW*Vu;_`ZC5k!oZZo6*AP{kJblwzq0IF5KloE$T+X>DC!IPM0A;w$6HeQoupmNnr*2+{mTetzl43@xAr{SD{wtq zX9K(<{x}!gHSwUJkNU}7?|p7ABw-088jZz!l<;A?wfR+6G<{= zd&$XyI}g7kh|sY$L*sYZj!<6f2BBkM3MIAFC-H7PZ}ZE4Hx%ED=)~#S zrNdvNB3|VS@aS;6yIs+fwVVuP6n$crri~0(s2dy@D11NcK~_PmtUm{IOeSW=T#p=r z^OQfyV`EQ`@R9_FH-;KpmMM=?C>l&-6H}wcei$XW9R)9n>u$;#yF&F8*KXzV5V*P3 zac%^{@yu{dONS@oGoNiE>A_EZ(n4%DF^{XWn<#|+%k<{oBg``*A2Z!?O<0YW}(4* z6>szjal$E+Kkx@yw1WGfZ;NkpS8%90?bJ=$2^jm61ehc>BzT?Y4PW-F?BF+^&lXYj zk4s|{18WgmirAe7-VzL?pG1}Dhy0L&=8C@=nDAB$_YwZetCM_5wHY!AK%pV zom+fcfwl;7bI>QJM~%j%2(VcZUK17l^{n2f_WHNnGwU+#TI>P*rclY| z8SHro$6p2m&{Oi|UB%0P+-F$j5Ws+LzN_785+ZMH9 zW8wY9!EDZa!|n2irphxe)2`USD7%58aAIMuBt9HGtc(x!Dq3m+ZYzuy$y*zgMq>p4l3=si zJ%Un|r$#)!&JTHZdP+v6rBoExg=m=TrgGa=q*@JiKO_qZtizcxb7Z*tcO%hc3;Ep0u zJ8F6_43*pb1A^L2TZa7~UgTS@WbQa`nyD|o`2cco!J$EJ2XB)Hr<*+pxr=poV@$Df z5;Yx#Of&fbA36V(FN`p&7fmD?H@K3%KO8U0)p5}q>j=eX>OhFyvmGrvo7TANkEuaM zK_10%I4AQXo>9(W6fHs_;}YAZ#>OWkPjQIG*G)|8wTcdfeVa*mE!b|($sZ75FlV8Q z>3#Y1%T^d17%{PNS$z_t=qr&$oZ!tq4}C84Jw85kVBjSFsf=aJ_x{Q`?%3HeX3Uj` zp_<>*N+q~-Y=Z&=fvLG%1CW_LB|+MbpfcRn!<;p1vKS2=Kr#x|7W0Nu3ciTVH%m#n zW#8Bmg(#7KZYWF0^Cf*D)M32vQx>~MM*;d&TpwYLBw;go0xb zVo@J9BJ{j5Bi5F6wPn%D4fY5Bz@R8WffJ|QknR1&ChXm*;tcqFlSV3MS73c(iq6&b zO~=x3cRVAhz8^UP#aa#TobdDskq zrHS5MiQ&8G0Gq+bmihi2`AfUEuKTmwF*)&*j}J=M$EJf1bAKmiji?{CQDS>7(DJVJ4vmNsm?5?-iuLZdwhb8XaEr9ne4<-GiqdVO*j9AGlve6nd%k1r&Unc8 z6VtWBmNK#?8oyhy9z_|-Zv>CpUxq4k7Wgf1ZK}XM)cl-UGJf8?+xtsI68505BGK(} zT}Q z4w|tR<3G>xu-+vj8ZMVl;(z{+o6`Q3P~&Di`h6C%vPj_8jWt@32!0rFMnPtQ_kCD5 zGVxzPJN8S1&nfvNHX4S;G-Jj@s0t)xYOB+DwzuNGXNPEd}l5ovuq(ws56% zd=?_Ztmp9lZLg!3e8LNN$XM~`7wvgpa$N$xM%pJ1gjg{+Ar?p3wT8&^=AaIPkkU8y z$k{3z{K(l|nV6Aa?)@HxanV66eu>Tv&wqLyQf^!@JEmL7I!Et|+flNv&4Tpoe!zN46_z(aQ<@ z;e{`HDY9Uw$2q4O2*iDVKq+5#PR^@zCzqP#l`2Rf=uYqL-Pk6unyr&?gTIxKL*F){? z<3B}+?#?OSU1v!?m-h42N&z3yM~xOIQN+(x|GoOiX3s81cMkHu#meEujmu>&<5EWo z-qO*ORbHjX%Hv#Ub;Hsp~u>^7gshPzQEI>o_cPWwOKd;;CJNnG#Bkfwir+ zcj4~){LV_lkMAYe4w3s7!|>|X2X9Q^!A%R5->jhufRt_s|H}df>&Z8o zC+)j29ifI*o*6<5Oj8zbBQ-p|vgA#)pRL1JtXI1P>+9nV2SXp!s6ve!jOM?5sANls z`q=*qm?w4Oz%+VRT#REfX5^*e&I>Gr+v|GL8v(?R8eDgy8t1JGMOd39jNP^*hgDjT zsOZH0KN4cH3RF)oi zD7bRhDn1pv-d(Jq;~MlRk3OCHZ4NOphrgIv*$8cH)S=*W?=kk!Z}F^p%IO4k+?-(8 zu)Q3joWShMw;f}wJH0q>YX#@J;2It!#uW4;Rt_a9py^x8HKWGuy1thajLee86VU4S zz?u^;&pU!EC$G?kFap7vc_drw*l-aKH%u z@mzh;D zb{yQC%%{SY?!L*ifzKJ_2_<5yanee9n#)c50JD{9F7 zt4HJ2P*ds#Vh4AH&G z$S?aodvGMG z5kI)fVS!(#P!}$^zyWuiziSOzW{>|Yn3QYS+A0d_v{VBJtam!<>SGQEqu+r&CaoeA z&rkcoFJ$GHz8k%dsfB%5@xcg$pp|jZ&v#R+rY??DVm3Z<@fu`=S`Ja&l|Z3XxJb$^ za1iGyWcs0y)(#P2mC}-#G~!Cl5&)ruTExkGOxF$topk#6Zkvw^VC8b=DU2u7`$MLt z%Xse**QZ<;!JeCSX?rA(hF#9!bsq|~e^?0iLkMQ~>l%+6$>Tq}(SqGkZ4|G|Dq2;? z=W>@046@zz*`}#2l4WZDj1Fm|kt4&SOpe1Lr{o@2u&d_vImsUP+0a*KWM+KF7J1#^ zy#1Kw98P%`I_flZaP0|8{+QZv#qqyja{GDkk=MA!< zbUTsRh$%XxW4hrp9j~5mqT2W_V;!hVSk^Be8%2nUA+UZjase0?zk~e4ytJ2nelh>2*X~^f9hks0(gj@GC92piKn8O1ScP=$1LvaX>qOe= zK{L*7`4lzwuOD+Cf`%;P7 z)LHM*nH!N@#b2PnTtWh z6LIwoVM*2{9=;J2il<5#sm*OI@xk)?pqj!Ck0qi+vrc7SY3HEUc7d!)mKO5DI>)|AvG=)nMv~@mYhc@I>es(`b-j=p>&SZ1O58#L}F;tehS=>Loy1Ftr zDqE=>F;PQu$p^8#c+g15b^mOyoF+78=Y^}eH29v-$|vT!wy$wiA>#F0Q9Qv0sf^yG z|JUGh7t@>+W}g;0HAt z8ajyJ9AV;6;AHj6or`kdjicl)Z~%ibIZtt(BfPoMZl)2-vY?=ci5`55zvH7l=tZ!@>?C(r2ryZ6k1bVC-E(iEn1(bPRQY~{> zU&6u%o4hWS8)l$VEQS;9+@5WRg8u8EE?Azz6f!6FbfScs&zWG}?duLnB;Kgq}(C4Po5eAvl*`cdpdS%a7?&%Q_+!Pdo z3wTp&%erKm+3?kYwJH0>CLV600)}2*A~!Vj^K!3J*mUQrXHZony->{W(Kjiv8T;Z|Uf7$hUK+rGYpU92!-!^NJfc zVWm^u_Vt8M75rh35h^dHXfEtC^XE_B+KMZxAb$*{RB5kF^u}tmxc>fkkR3DI4-5{9 za-6$W0}BfEcjwKqyMk|zbQE}fI;5jMZLbsGyILB&Z~P@5oV&@i5zV20+B%*ni?Nh0bw#ZsR$AwqJMJsac$Q0d(*5! zeWZbib**)I`T=uXBoY-P!0%1Z&VJXYK6}3ax1Okj=_fi6d%wEkY_*xmvo*ldQh@Ro z^vOeZn7)KctDynXPo{e5BDfH=8Cu;Ar-|fkVgYJfg^!mjkl1vP!%8=rt)2T@^;MtC z>@IDOG}7*-CP=<+kR&;6%b3QZ$80pb(684?&G6)ZD}*a5+D0OF?(^OvLA9y3A-H=) zXq}xgP=noQz(k%&26eawVL|B*Js#MeWOYYLmNxseLM{-9wP<_FDJR~80pMVnNQmE! z7Yzz+D{tDkf+?m(iNYH?2yR+xAY3vG z19Ebk%^Q953b#vEGW_2s8jBvMC?$loOJxC@yVbUfIKBnn@BU6uWFCwAiZ&PW)cJKo z*!V-*e4ro#I6fal97Qeicrjq!cKFr6o!5m@ix7TLul$2S0V^{3vLC3ve3n-|F@5@g zTG@HxTs8aPgwb!%|D7V4IFPWOx-unYbcSuVbAI@q9T~n(6T*fL`2$6EyfLo4 z9lK^fC^Qmq2|EAEC$~De0(cQ%y9479bThR6<@SK(5rv_Po4>y7>2#eM{K&SWu`X1> z&p}u-Z)&CRbE&F}2J87pMPj%Ax$ShE};mVevN!ZVL^&&6xiR zV+u^Dd`_lFIDH!(&F|@17&5S0OD81$v0v>$^9~~q#iH(|P&!dkba$5_fU(&l^2W*8 zc6UBMc}9i;u!%2eq}09*r-oos`=K;Gu(%wK4GhJn>~3E0vIrc&1{FM*HH#j^w0aKc zw)N-S^QX(=N0+CtuUE!bo4b&`MJpF(X2$MSyB0|-7VeAfxoB{np6~?FzB5DAP%VHR{N*YOw)3*;Y3By$Od%5!Z)daFj9c!~7ZDNB z;khNM**I8%`2}yQ4?D^*DoWTbQ|5ATj+Cp?%{vVHB=BB82AOC|o<&D;03BZa#mWam4e6s`mSHPS*k?K-(&{&II|iKd^=Z4q}-bCimCY7(I4%6(30-^@1d zBzK$Tz{H(gh9iAdGZ*xc6_=@z0)~Hl}7=A1aLcxz(!EgS_Y{RtJpRD zB{qR~x1g9wc|TF8tML@x*5vhb`BzspuxbT;9nUS~VBfvjZ54aL>ZZ+YYwzhHoj0Ck zEN31;AwUEGSvIrP9fM8>_S%bwX}2UA5(d$+(SVHsE1{gTWEaxk?{m2f!e1-=T+$H% z@c1bW2W?^O#@_*SN1mM9Ke&1?k2|-v?2+_Zl)+^Q)Pit^h|^3re7mBg-F-(|$LS7N zMz8~gj)*|VO1){eQ=d`<9PZ`14TdD=(Kr}EPYo6wZ*>neh53oad!fd)U_JSd?!Iy3 z3@BB#{iAwA+87TH6fbj;m;M2$hHP7ttLLECCAi62fT}Kf%5M2VUPM}$i0Iw+f?8BR zoA-ppy!$vy0-GgAN%M-7TmtWt`Fr77H|i*gdU|L012C%ow9l8FDtT7=ka@yqIR>`S z?X~vXiD0sv#;b@8fD_kRkwQBg0ha1R?KW-;!T%QKGZSgc7f`ncg0*(k)x}Hx0}&CA z{oV@k`5jPb?71Qld^>Qw?(+#Z5>R$!59M&_jtfga8Me6x*4tL2Z%HBg)CbqWJptmO znW}OTJFwIK7<}QIFWSF&M(!N;=o~1!&!0`z5Eitw-+8+_4MtWt9Ez*?>3KEHCVET_ zL6<25>Pl6qEiayh=-6qX1c-`G&_-m}HwjhE(3UBkfl{k_pHC%qNU0-Ps*7jkJ&~|A zfP+S9`NFwdzsu&Z^Gt``38MrmM6R=Wh5pd@YvjW0-Lb<+`b(MY?sHLRIl6f+xI&GC zqtAGeo&MGtF}kpM0dyC5IA~Q zu`~aisrKMpEl>!zo+IKcZTd9HKv>Y|l-4X;WBdMta5O-_(YLADtmfm3h=)c?)YuA5 zU`w%=m)D+0H32 zF7WGwkm;6`%lNSUV0*VQ7uKsTC!Wk5GqTOKqaNLHhcB{up;;HyJq+l_3ey_a{g4pQ z)Vu{b-2UpUbOTNKD{NTerb-(nKj%H@vTd;dDtq)4<$nZ}oUc}p|bJ`yf z@D4FKG?hCnXxWSSY=x~XJ0E+ugXg}@XF`!u;@}#6>9FOR3=#N3WIW1YYF!XH%|7X7 zn6Vo73>n8&+LQcz-u;xtz#(hWs;dw<(2|n&UY`|xpm1?XPEEpCG!&xaiQn1zPzw(T zZQbXLu1gq{cd}LAKXpx#o^Nu()IpC+wutBw0Kl*-BkuF8TqWJXORzD#HF@F!>Qg>J z^rKStQtD|xB6yyl#MscVC*C-kCBe%zifgYg1Xc3h-x(-1L*;r)Yk3AEfS(m7oGG=!46Tl0Xes zAwQ=0JCsF+WJ$!O5TYyzlHf5|<({zl3^+3aKtK!t@i7fnJcD6cDPYrs0@yqHyA8>I znQ0ZE-;RI6yz(KVFB!=YV*A4)tfGnitZj(EgH`Hg%$9sk%N?$HkEOd>qgiLU3&**FyVh3FCbL8Uxyw){X!4U2?-kbA%}W zQ_nkVS=qb>N=hr6{4`xymCv83VD&)%DF_z7YiGAQU%Q|FzPM~|%< zdEZVFYakYCmeIfADJzq3c%x+sbou)^I!z7jUs;c4^6%rcACKUqJjM5|-$K=TCWmoI zz~MMRQubX;5!<#=01n)z3fDyow&ILY{Js{ITWiE5>0+Z?@^|x@biY6{V#K+x;082% zKZGE?E01)6Z47;pGF!g|3HD_4EWBS<<`X$JPVU^Mt9%+9^%bd~4w!=IF`1lMtfw%q zCsYAmo^pHT*EDgw?fMy*e}Gp;=A`|#J|_t-RhqKCogInp&9ixRgMiWaG**-rK|%lvO7-y!(l1+C zK-M*Bm7fvsWdz&fwXo8%ym`L+sq`Nlt95&S&h9~ovIwY7eXT&-X*>gISyrNSohy-@ zoi2^qu?X*yJFiY`VO&YeyM>E059T_$^|AYul@-ZOX=EQAG)b>6Gg7>uJDEaxw1vyB zk&igR=1QRy_ViR}+~#8^liMq92ZZi`;I#e%9aB@Yz%DOw=_rXQ(6?6J{OGeKyU%!t zi~YjgjCHlxBssCzDl!=E{+o?Aj9^-pnLvIJzuI^mPf zv7LSN#irrZ39ut9)+$F4VL?6w0NyrV=|59Ff; ze?EwgXE~dnjkPP+5UeiO)BCh_&flQwBA0G%ay=|kKr9>xG;fnFdmIX0jdKsT{n@Y2 z`+qSUM>y^s8J-{KR`=wW*i){F`v5u;ef0g?!8(zD4Q1Zk9&2xW# zU-xm6ehWvF?fqk_*@c-bK>!xC3tIyo%{HT5&{$N+F3>{JDhAtdw&PLp8Eo-4x*Y!! z_2VZQ!Lp-C21jv&Qb^HG$0;I8FVF2U)D3p$aD2I}|7~nkM;Ubautm&XfXW1WkiYRh z?II2n@lEOW+h}=bdbtOOV+VC;%!kiXD4Ig&eBv`pZU)nQ&R$*xYwA<$Z(OQV{#Oe) z+n-CDoog-|)p<9TDB&%?cAX_1m0p74oEoIlWW@LPx7OGBc|oB4qJknPjPOm5h=%os z!?O79Q$dKu@Z1LP32P(x$xra8rZKa6CAN1_eA`|LzCtNrV7S^2rOx+3k{(FZ&)eN! z?3R`p!?+U)hPFfuzSoC7v6=PX4TOkjq9LmYd|%!;uFJ0$`=K=Za_3!>Q(Jin#fcP6 ziaD(hSuV$`isX6hs^&daYvA#opr4eozbp5;RQT6+v-3vFT;HF%s-J(M3yCs}?)fc# z4p71Zhap4WM+XhdSE#5#6W*eS!amEAE+jR_U?YXEgRGmc@79eyMEAJ9TF=6_H#igq zI}sIXGm;QxsvvQ({78|g=tb>(*C%eo!@x^=e0+Nt0DEq@@`Qxf4HcC0=j^b&-8x&WGkBycul>$xnRbqYsbM9HA z9+$P&?s=Y5bSHX{dKVPNN!`bp#>#y?gf_Ep>q&LGZ9vyV0I^D+?H6Buf`1Os> zDC_HA=k2{aos2YX76;db6}_4D0g`#qKAkE+Ok*eyT@6je? zzW-OfExSZ~y*WllVmI}u8C6st$S*|(2Gwjm0?HJ9OZF1M=vEBVbGHT;2_PhyEn?E* z-8*HKI&(YWhBu)Fs#o(`pSp4&H1Wa&x?XKllC(Q@#10akx{vZc z+OyJNtixYTAtM?$4r}p1{R-PO(dzIWWYU|Z?!nCblLkR0%2m;<00}S?V(AXCEf^>wVVf>Mnl$a2`mDIe)#ryOdp}v{W4MQE+&XY^glh`o zDyw~QCUyI>w7DU^iq?t1P$I37RN(utfc^28QC*a@0ls^ywskuL65ai>{=VsMfJ-*fUc(l^Qr?;PiKb0hpFDOZ-+8u#xj$(l#7xU=V zq&W+xhsY=V{Vv3rpVWJ1O|>3GqSYovGP2@Ejy#`t@pmvW95mCTYx?t+4YFEwt|kBx z&LZmEq)njX`93|-RdvCl$(R7sao0D}dLN2G>S7KhNxny|fZ?4?Df)y!2C9fY!cCw7 zSD)^RjdjGu%Dhdj1|*~oMiiQ||29$B;d?ak+s~(KlO-&)Ic!xMSm8}#8(Ut(H1LOC zQ=ULzj_blcn=AK*KgD%vp})$+%<*!*AW*|)?WD3AT2Ms|pLE|G6i4qP33ufe#1=SX ztoV>dzOd)8OH#fVf^JDjr?01tO=h|A>Q6ryNz3nPebno$IsUx%t8p zXfdb(TKTT&k$LxSZqebz;c)%~-1WM{0a}l_g}9vXZ8jnIu~KWzWQdB(C-nxS$CPL~ zSa_>-oTut&3QEZxm!NmG*gI>#zi6f`9Q3VWon}>kvBU)^e<|!8-dzBZ-ye}Nsl!}2 z6x_~)_`c1Y&9aR^ zv1_=uH)6}5x1Rvf%-5uBafxF8A#Uu<+-*U8vB;31sr1eLm(UEfx>`?_Z0CTH^2AAw zww2=$zBIr%f@#2Lj3Ys7nFhU0P&TaOzK)-)aKf11Y{i&tvs^X5AhbI0;g@8%G{ELk3w zv{HNyDpUBlw-u$fLD^GK|5VunO-B13s$lW9qczaWdhJTR=);A@`RRKJYOtuScG#VU zAPHOt-Yr)ueP^nm%@U$-cY=x<-Nos8W^ubyP@01zm;!!|Z4lj`w~Z!C zyI2|(IZ6~R#VUXz0Fo^u#D9T;T%L4nRdNdi$RT&ATx@^ACcj!q>UTRz~8Fz zcwkg2a^$pqY(ML)$MKVhRt9v?t2|(vDp$tjh*iKM!~8-H(h@+#CSQ9A3+ znLpxgeHo`W?uhd{m$63&JggJfHNO*aug_y(W4fV!HT0mgwDi=+SfI~F7HM}~BlvP? zOyjAJkVI*rpRKg#c+N_A&Ogu-S!<0qxXcz#{UtsyT?+eyJ942OR5w5+kkJ zw~k}r52z+_!?HJDAeY6H9(I2E+G>#;V?GGwq@vphk0}aIQ{C zBo5+3k@L0n93f$YiK=z2D$FwS9Y%>+==AfXN=Hicl9CjJHHhxUFOBuK?97}7n2c3o zm*I0yF^`nDE!IX$g3pp}{I2IncWex3yTDsuyktDAmMoz_AW+;@p2eMSdhyflkgBS{ z{0V=!H6lsDu3XAN$1;`+!!r%^H_F5Jeo0xU3W9At^Y@Go#V|OKnBIu>XIQw@8D<8X1ZJn5Yh+yrwLAS zeqd*p#rfSw&-o~)x=x#ZYdD~CcE2P2tRe15O8)G7Y4gjY4zz@87IrfZ;qI^cOHUV9 z?H&hjb+YaV|4BsiXXGjW@-2a0l7DuJ0siyAcW0eaI&7|&bXa8NZWaHl`?W&l9i__d zSPM(#b01GKTGrhO!bz&Fr_|DpUx-S7Ao?+0Pf#?JaNc!bQXHYBq$2K6-qL4}cul#hnuN0c zSX7`lup(heCHHoEa@tPG#{c&p|2T0mE#aSw{9cpZo5JS9e-@YKrl9mTblR{;JF6D~ zUiqAPvSNQoJc3dym)nnl*esqbS#Mdf+yd83k?v-%5~fd#RQ%`J-tzxo{?|c|_n`5%u4nOn>6|vI%B_*XFgI+u+f3T)M7@RGr0D3oVqM*>okn^8I z{q@O}Tbh!JUit*ZKYyHVI3aYd4giPW)Gw{#d&j_d7F>S%4*W;`OECZ3f^k3j+geB({TOsSj%9Fk?{Y=`e!(Sr70b*d>T4BKJn4xG^!4s z2nh?*V@UioF)Ya#gm%mG9j|QbrD5>T3(H@n==}J9U!Hs)SlM^AZ2kRJ_IBZ~!gK*L zX}VPF$s+JU?<{2g)%rd6&L}~F)9Wh5DzZ-h4NYnGJ<1{ae*yRy-v0d3=Sk1ro|uw) zX?eGUOF9Bv>LA(~Ds4x}y%iK};%#20*s4Xf%Q2^u-hG<=fjaef;r}}s{0;Kc+seR_ zDbPr|4Nn5IQ5>3KH#H1K)_#ehuPdDzM{p`4#qdc;>0O(|1ax5nb-MU)9EZf&j|m@bU2;l)zypAAf!JFN{m$ z&PMzX;J@5d zk5&2dd(po76Zii=@FxEp;I=5IJdMS}EA&qq$eoDJi_46DD;0VB7WMgp?f`9>!*AXF z8&A^8ly{!~kHBUBN_~1mWw}RY=92bX_NiwRkD_V)E??G*1Q~JTgWPI1$`gdelOf)x z%*l799l^dGWhQ^)<(Q<**w3n4{p&Z!+Z{9TGvLD|8Gsmmjb4bpb%y%%mdel2=aCne zpH5GHbP-P$2c%AxZqbUXl)(Nmj1SAKdL-%D@Be-Hzu^40toaX-vA>nxpx&y06a(($=bgq)pqWQ_?!PFbB~w#e)C^D zI)0<1+DrLWEU*)q-Gz$&L)nkcgO|yLekR`HnJaPE`6pntBOp(; z#{9&X-&_1~Kzb{RQn`NteWv5v(OnfTWzsVp{O4PoHW;QidBli|FdhRTmHaSiD?5@X#FM`kAcJ| zkjXg32c3N+z=URw>+ZPnPY@ZLeGv8+HT_LQ|6tvSI{?l(Is(6a>9_~T!7Y0M#gMmW z^4r-Q*pe@d04hv?WG&RhkgoK%GxXDm zZw%jWQ7HmECT*|ECGeK&Sjv=E4(1_`fnR^ytf?NuR-X-dbej=SXI>N|e@n>!(~19s zZ+cuCY(_~5<2x3cHLEQU z&mJ2<<$FKwitH)s^!K6z>$9dZL~#ETFn4lKEc}mKF8cwPmi%$+KIJ{`;yHYy24J$> zOFZ8NT!`{?UoaR4rlMVkZKjA{@p1&?;{0x0{4euCn!TTjlkT5;{s!Tn$dChY?Vj;d zkZP8**tdh0irCs8mw$1Y*U#%-FZK~PU|V!ib+1MKXl+~nOuf7F=H{i_0JM|OJow*n zeyl?Od-Ky(!0A6zHiYJwPy+TAu7Ur6i$dvnB)v2{*PqHI*ay4e0x-mdY=IIhfFWuR z`@K9X>2v;C%I`A0*~R~>O#M?$uyX?UIAx*qB0S?Vr(uPr;Z>NiP#*lA@feM|U(V_Y zMm_BZrAmH(GPg19jj@AVlNyryMKr47vddpv9g{KpI%WRf?EE(<|8qBav16s<5T!Al zc4lqw0IUUYcweq8jQ;fdAGrrJ#v|r`U_I_xa&P(cBqOd`CJ4@h6I6MHNOS#{GCt

oc&88m-N#yc&ao4hMjPj;{Q(WSlaE>j;9LV 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 z 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

rC{8{SNE$VrHmU+HfQ@| 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 literal 0 HcmV?d00001 diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index 658e27f..4b32986 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -30,7 +30,7 @@ ## 🌟 核心特性 (Core Features)

- **⛓️ N-tier 链式故障转移 (Failover)**:自主降序序列,支持 Claude 官方 Plans,以及 GitHub Copilot、Google Antigravity、智谱、MiniMax、阿里千问、小米、Kimi、豆包等的 Coding Plan。 From 1be381758c2e6ba17e92ea691f3dce32886aa108 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 1 May 2026 22:40:18 +0800 Subject: [PATCH 31/66] =?UTF-8?q?fix(antigravity):=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?v1internal=20=E6=A8=A1=E5=BC=8F=E6=A3=80=E6=B5=8B=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E6=96=B0=E5=A2=9E=20E2E=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?;=20(#234)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(antigravity): 修复 v1internal 模式 base_url 路径重复问题,重构模式检测逻辑; - 初始化时去除 base_url 的 /v1internal 后缀,避免 httpx 拼接时路径重复 - 新增 _v1internal_enabled 标志位,简化 v1internal 模式检测逻辑 - 修复端点路径为 /v1internal:generateContent 完整格式 - project_id 自动发现仅在标准 GLA 模式下触发,v1internal 模式跳过 - 同步更新单元测试断言,与重构后逻辑对齐 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * test(e2e): 新增 Antigravity 端到端测试,覆盖 Token、Vendor 和 HTTP 层; - 新增 tests/e2e/ 目录及 e2e pytest marker - 默认测试运行排除 e2e 标记(-m 'not e2e'),需显式指定运行 - test_e2e_token.py: Token 获取与刷新流程验证 - test_e2e_vendor.py: Vendor 初始化与消息发送验证 - test_e2e_http.py: HTTP 请求/响应全链路验证 - conftest.py: 共享 fixture(配置加载、客户端初始化) 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(antigravity): 修复 _prepare_request 中 v1internal 模式 project_id 发现守卫误判; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * style(e2e): 删除 test_e2e_http.py 中无用的 if True: pass 代码块; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 5 +- src/coding/proxy/vendors/antigravity.py | 51 ++-- tests/e2e/__init__.py | 0 tests/e2e/conftest.py | 199 ++++++++++++++ tests/e2e/test_e2e_http.py | 263 +++++++++++++++++++ tests/e2e/test_e2e_token.py | 93 +++++++ tests/e2e/test_e2e_vendor.py | 327 ++++++++++++++++++++++++ tests/test_antigravity.py | 17 +- 8 files changed, 929 insertions(+), 26 deletions(-) create mode 100644 tests/e2e/__init__.py create mode 100644 tests/e2e/conftest.py create mode 100644 tests/e2e/test_e2e_http.py create mode 100644 tests/e2e/test_e2e_token.py create mode 100644 tests/e2e/test_e2e_vendor.py diff --git a/pyproject.toml b/pyproject.toml index 24630e1..f6f0da5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,7 +84,10 @@ docstring-code-format = true [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] -addopts = "-v --tb=short" +addopts = "-v --tb=short -m 'not e2e'" +markers = [ + "e2e: marks tests as end-to-end (deselect with '-m \"not e2e\"')", +] filterwarnings = [ "ignore::DeprecationWarning", ] diff --git a/src/coding/proxy/vendors/antigravity.py b/src/coding/proxy/vendors/antigravity.py index b9bbfb5..b4d7199 100644 --- a/src/coding/proxy/vendors/antigravity.py +++ b/src/coding/proxy/vendors/antigravity.py @@ -141,7 +141,14 @@ def __init__( config.refresh_token, ) TokenBackendMixin.__init__(self, token_manager) - BaseVendor.__init__(self, config.base_url, config.timeout_ms, failover_config) + # v1internal 模式:base_url 需要去除 /v1internal 路径后缀, + # 因为 endpoint 使用完整路径 /v1internal:generateContent(冒号格式)。 + # httpx 会将 base_url path 与 endpoint path 拼接, + # 如果 base_url 含 /v1internal 会导致路径重复。 + init_base_url = config.base_url + if init_base_url.rstrip("/").endswith("/v1internal"): + init_base_url = init_base_url.rstrip("/").removesuffix("/v1internal") + BaseVendor.__init__(self, init_base_url, config.timeout_ms, failover_config) self._model_endpoint = config.model_endpoint self._model_mapper = model_mapper self._default_model = config.model_endpoint.removeprefix("models/") @@ -149,6 +156,7 @@ def __init__( self._safety_settings = config.safety_settings # v1internal 协议字段 self._project_id: str = config.project_id + self._v1internal_enabled: bool = "v1internal" in config.base_url self._session_id: str = uuid.uuid4().hex[:16] self._message_count: int = 0 # project_id 自动发现状态 @@ -159,8 +167,11 @@ def get_name(self) -> str: return "antigravity" def _is_v1internal_mode(self) -> bool: - """检测是否启用 v1internal 协议模式(与 Antigravity-Manager 对齐).""" - return bool(self._effective_project_id) and "v1internal" in self._base_url + """检测是否启用 v1internal 协议模式(与 Antigravity-Manager 对齐). + + v1internal 协议由原始配置的 base_url 路径或 project_id 自动发现触发。 + """ + return self._v1internal_enabled @property def _effective_project_id(self) -> str: @@ -229,7 +240,11 @@ async def _discover_project_id(self, access_token: str) -> str: return "" # 发现成功:原子性切换到 v1internal 模式 - self._base_url = _V1INTERNAL_BASE_URL + # base_url 只保留域名部分(去除 /v1internal 路径后缀) + self._base_url = _V1INTERNAL_BASE_URL.rstrip("/").removesuffix( + "/v1internal" + ) + self._v1internal_enabled = True self._project_id_discovered = project_id # 重建 HTTP 客户端(base_url 是初始化参数) @@ -339,8 +354,13 @@ async def _prepare_request( self._last_request_adaptations = converted.adaptations token = await self._token_manager.get_token() - # 懒加载:未配置 project_id 时自动发现并切换 v1internal 模式 - if not self._project_id and not self._project_discovery_attempted: + # 懒加载:未配置 project_id 时尝试自动发现(仅标准 GLA 模式需要) + # v1internal 模式不依赖 project_id,跳过发现 + if ( + not self._project_id + and not self._project_discovery_attempted + and not self._v1internal_enabled + ): discovered = await self._discover_project_id(token) if discovered: logger.info( @@ -450,11 +470,11 @@ async def send_message( body, prepared_headers = await self._prepare_request(request_body, headers) client = self._get_client() resolved_model = self._last_resolved_model - endpoint = ( - ":generateContent" - if self._is_v1internal_mode() - else f"/models/{resolved_model}:generateContent" - ) + if self._is_v1internal_mode(): + # v1internal 端点需要完整路径(冒号格式)覆盖 base_url 的 path 部分 + endpoint = "/v1internal:generateContent" + else: + endpoint = f"/models/{resolved_model}:generateContent" logger.debug("send_message: POST %s", endpoint) response = await client.post(endpoint, json=body, headers=prepared_headers) @@ -496,11 +516,10 @@ async def send_message_stream( body, prepared_headers = await self._prepare_request(request_body, headers) client = self._get_client() resolved_model = self._last_resolved_model - endpoint = ( - ":streamGenerateContent?alt=sse" - if self._is_v1internal_mode() - else f"/models/{resolved_model}:streamGenerateContent?alt=sse" - ) + if self._is_v1internal_mode(): + endpoint = "/v1internal:streamGenerateContent?alt=sse" + else: + endpoint = f"/models/{resolved_model}:streamGenerateContent?alt=sse" logger.debug("send_message_stream: POST %s", endpoint) diff --git a/tests/e2e/__init__.py b/tests/e2e/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/e2e/conftest.py b/tests/e2e/conftest.py new file mode 100644 index 0000000..cf41f45 --- /dev/null +++ b/tests/e2e/conftest.py @@ -0,0 +1,199 @@ +"""E2E 集成测试共享 fixtures — Antigravity 真实凭证加载与测试对象构建.""" + +from __future__ import annotations + +import os +from typing import Any + +import pytest + +# ── 模块级门控:未设置环境变量时跳过整个 e2e 包 ── + +_SKIP_REASON = "Set RUN_ANTIGRAVITY_E2E=1 to enable Antigravity E2E tests" + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", "e2e: End-to-end tests requiring real Antigravity credentials" + ) + + +def _load_real_credentials() -> dict[str, str] | None: + """从 ~/.coding-proxy/ 加载真实的 Google OAuth 凭证.""" + from coding.proxy.auth.providers.google import ( + _DEFAULT_CLIENT_ID, + _DEFAULT_CLIENT_SECRET, + ) + from coding.proxy.auth.store import TokenStoreManager + from coding.proxy.config.loader import load_config + + try: + token_store = TokenStoreManager() + token_store.load() + google_tokens = token_store.get("google") + if not google_tokens.refresh_token: + return None + + config = load_config() + + # 从 vendors 列表查找 antigravity 配置 + client_id = "" + client_secret = "" + base_url = "" + model_endpoint = "models/claude-sonnet-4-20250514" + project_id = "" + + for vc in config.vendors: + if vc.vendor == "antigravity": + client_id = vc.client_id or _DEFAULT_CLIENT_ID + client_secret = vc.client_secret or _DEFAULT_CLIENT_SECRET + base_url = ( + vc.base_url or "https://generativelanguage.googleapis.com/v1beta" + ) + model_endpoint = vc.model_endpoint or model_endpoint + break + + # 优先使用 config.yaml 中的 refresh_token,否则使用 token store + refresh_token = "" + for vc in config.vendors: + if vc.vendor == "antigravity" and vc.refresh_token: + refresh_token = vc.refresh_token + break + if not refresh_token: + refresh_token = google_tokens.refresh_token + + return { + "client_id": client_id, + "client_secret": client_secret, + "refresh_token": refresh_token, + "base_url": base_url, + "model_endpoint": model_endpoint, + "project_id": project_id, + } + except Exception: + return None + + +# ── Fixtures ── + + +@pytest.fixture(scope="session") +def e2e_credentials() -> dict[str, str]: + """加载真实 Antigravity OAuth 凭证,失败则跳过.""" + if os.environ.get("RUN_ANTIGRAVITY_E2E") != "1": + pytest.skip(_SKIP_REASON) + creds = _load_real_credentials() + if creds is None: + pytest.skip("No valid Antigravity credentials found in ~/.coding-proxy/") + return creds + + +@pytest.fixture(scope="session") +def antigravity_config(e2e_credentials: dict[str, str]) -> Any: + """构建标准 GLA 模式的 AntigravityConfig.""" + from coding.proxy.config.vendors import AntigravityConfig + + return AntigravityConfig( + enabled=True, + client_id=e2e_credentials["client_id"], + client_secret=e2e_credentials["client_secret"], + refresh_token=e2e_credentials["refresh_token"], + base_url=e2e_credentials["base_url"], + model_endpoint=e2e_credentials["model_endpoint"], + timeout_ms=60000, + ) + + +@pytest.fixture(scope="session") +def antigravity_config_v1internal(e2e_credentials: dict[str, str]) -> Any: + """构建 v1internal 模式的 AntigravityConfig(无 project_id,触发自动发现).""" + from coding.proxy.config.vendors import AntigravityConfig + + return AntigravityConfig( + enabled=True, + client_id=e2e_credentials["client_id"], + client_secret=e2e_credentials["client_secret"], + refresh_token=e2e_credentials["refresh_token"], + base_url="https://cloudcode-pa.googleapis.com/v1internal", + model_endpoint=e2e_credentials["model_endpoint"], + timeout_ms=60000, + ) + + +@pytest.fixture +async def antigravity_vendor(antigravity_config: Any) -> Any: + """构建标准 GLA 模式的 AntigravityVendor(function scope,每次测试独立).""" + from coding.proxy.config.schema import FailoverConfig + from coding.proxy.routing.model_mapper import ModelMapper + from coding.proxy.vendors.antigravity import AntigravityVendor + + vendor = AntigravityVendor(antigravity_config, FailoverConfig(), ModelMapper([])) + yield vendor + await vendor.close() + + +@pytest.fixture +async def antigravity_vendor_v1internal(antigravity_config_v1internal: Any) -> Any: + """构建 v1internal 模式的 AntigravityVendor.""" + from coding.proxy.config.schema import FailoverConfig + from coding.proxy.routing.model_mapper import ModelMapper + from coding.proxy.vendors.antigravity import AntigravityVendor + + vendor = AntigravityVendor( + antigravity_config_v1internal, FailoverConfig(), ModelMapper([]) + ) + yield vendor + await vendor.close() + + +@pytest.fixture +def minimal_request_body() -> dict[str, Any]: + """最小 Anthropic 格式请求体(用于最小化 token 消耗).""" + return { + "model": "claude-sonnet-4-20250514", + "messages": [{"role": "user", "content": "Say exactly: pong"}], + "max_tokens": 32, + } + + +@pytest.fixture(scope="session") +def e2e_app(e2e_credentials: dict[str, str]) -> Any: + """构建仅启用 Antigravity 的 FastAPI 应用(临时 DB).""" + import tempfile + + from coding.proxy.config.schema import ProxyConfig + from coding.proxy.server.app import create_app + + tmpdir = tempfile.mkdtemp(prefix="e2e-antigravity-") + db_path = os.path.join(tmpdir, "usage.db") + compat_path = os.path.join(tmpdir, "compat.db") + + config = ProxyConfig( + vendors=[ + { + "vendor": "antigravity", + "enabled": True, + "client_id": e2e_credentials["client_id"], + "client_secret": e2e_credentials["client_secret"], + "refresh_token": e2e_credentials["refresh_token"], + "base_url": "https://cloudcode-pa.googleapis.com/v1internal", + "model_endpoint": e2e_credentials["model_endpoint"], + "timeout_ms": 60000, + }, + ], + tiers=["antigravity"], + database={"path": db_path, "compat_state_path": compat_path}, + ) + return create_app(config) + + +@pytest.fixture +async def e2e_client(e2e_app: Any) -> Any: + """构建异步 HTTP 客户端(支持 SSE 流式测试).""" + import httpx + + transport = httpx.ASGITransport(app=e2e_app) + async with httpx.AsyncClient( + transport=transport, base_url="http://test", timeout=60.0 + ) as client: + yield client diff --git a/tests/e2e/test_e2e_http.py b/tests/e2e/test_e2e_http.py new file mode 100644 index 0000000..fe84db5 --- /dev/null +++ b/tests/e2e/test_e2e_http.py @@ -0,0 +1,263 @@ +"""Level 3 E2E: 完整 HTTP 端到端 — 模拟 Claude Code 通过 coding-proxy 使用 Antigravity.""" + +from __future__ import annotations + +import json + +import pytest + +# Claude Code 发送的典型 headers +CLAUDE_CODE_HEADERS = { + "anthropic-version": "2023-06-01", + "content-type": "application/json", + "x-api-key": "sk-ant-placeholder", +} + + +def _is_quota_exhausted(response: object) -> bool: + """检查响应是否为配额耗尽 (429).""" + if response.status_code != 429: + return False + try: + body = response.json() + err = body.get("error", {}) + msg = err.get("message", "").lower() + return "resource" in msg or "quota" in msg or "exhausted" in msg + except Exception: + return False + + +def _is_scope_error(response: object) -> bool: + """检查响应是否为 scope 不足 (403).""" + if response.status_code != 403: + return False + try: + body = response.json() + err = body.get("error", {}) + return "scope" in json.dumps(err).lower() + except Exception: + return False + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_http_non_streaming( + e2e_client: object, + minimal_request_body: dict, +) -> None: + """POST /v1/messages 非流式 → 验证协议对接正确.""" + response = await e2e_client.post( + "/v1/messages", + json=minimal_request_body, + headers=CLAUDE_CODE_HEADERS, + ) + + if _is_scope_error(response): + pytest.skip("GLA 端点 scope 不足,需要 v1internal 模式") + if _is_quota_exhausted(response): + print("\n[E2E] HTTP non-streaming: 协议对接正确,但配额已耗尽 (429)") + return + + assert response.status_code == 200, ( + f"预期 200,实际 {response.status_code}: {response.text[:300]}" + ) + + body = response.json() + assert body["type"] == "message", f"预期 type=message,实际: {body.get('type')}" + assert body["role"] == "assistant" + assert len(body["content"]) > 0, "content 为空" + assert body["content"][0]["type"] == "text" + assert body["usage"]["input_tokens"] > 0, "input_tokens 应 > 0" + + print( + f"\n[E2E] HTTP non-streaming 成功: model={body.get('model')}, " + f"input={body['usage']['input_tokens']}, output={body['usage']['output_tokens']}" + ) + print(f" content: {body['content'][0].get('text', '')[:100]}") + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_http_streaming(e2e_client: object) -> None: + """POST /v1/messages (stream=true) → 验证 SSE 协议.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [{"role": "user", "content": "Say exactly: pong"}], + "max_tokens": 32, + "stream": True, + } + + events: list[str] = [] + content_chunks: list[str] = [] + + try: + async with e2e_client.stream( + "POST", "/v1/messages", json=body, headers=CLAUDE_CODE_HEADERS + ) as response: + if response.status_code == 429: + print("\n[E2E] HTTP streaming: 协议对接正确,但配额已耗尽 (429)") + return + + assert response.status_code == 200, f"预期 200,实际 {response.status_code}" + + async for line in response.aiter_lines(): + line = line.strip() + if not line: + continue + if line.startswith("event:"): + events.append(line[6:].strip()) + elif line.startswith("data:"): + payload = line[5:].strip() + if payload == "[DONE]": + continue + try: + data = json.loads(payload) + if data.get("type") == "content_block_delta": + delta = data.get("delta", {}) + if delta.get("type") == "text_delta": + content_chunks.append(delta.get("text", "")) + except json.JSONDecodeError: + pass + + assert "message_start" in events, f"缺少 message_start,实际: {events[:10]}" + assert "content_block_delta" in events, "缺少 content_block_delta" + assert "message_stop" in events, "缺少 message_stop" + + full_text = "".join(content_chunks) + print( + f"\n[E2E] HTTP streaming 成功: events={len(events)}, content='{full_text[:100]}'" + ) + except Exception as exc: + error_str = str(exc) + if "429" in error_str or "exhausted" in error_str.lower(): + print("\n[E2E] HTTP streaming: 协议对接正确,但配额已耗尽 (429)") + return + raise + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_http_with_tools(e2e_client: object) -> None: + """POST /v1/messages 带 tools 定义 → 请求正常往返.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [ + {"role": "user", "content": "What is 2+2? Reply with just the number."} + ], + "max_tokens": 128, + "tools": [ + { + "name": "calculator", + "description": "Performs arithmetic", + "input_schema": { + "type": "object", + "properties": {"expression": {"type": "string"}}, + "required": ["expression"], + }, + } + ], + } + response = await e2e_client.post( + "/v1/messages", json=body, headers=CLAUDE_CODE_HEADERS + ) + + if _is_scope_error(response): + pytest.skip("GLA 端点 scope 不足") + if _is_quota_exhausted(response): + print("\n[E2E] HTTP with tools: 协议对接正确,配额耗尽") + return + + assert response.status_code == 200, ( + f"预期 200,实际 {response.status_code}: {response.text[:300]}" + ) + + resp_body = response.json() + assert resp_body["type"] == "message" + assert len(resp_body["content"]) > 0 + content_types = [b["type"] for b in resp_body["content"]] + print(f"\n[E2E] HTTP with tools 成功: content_types={content_types}") + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_http_health_probe(e2e_client: object) -> None: + """HEAD / 和 GET /health → 200(Claude Code 连通性探测).""" + head_resp = await e2e_client.head("/") + assert head_resp.status_code == 200, ( + f"HEAD / 预期 200,实际 {head_resp.status_code}" + ) + + get_resp = await e2e_client.get("/") + assert get_resp.status_code == 200, f"GET / 预期 200,实际 {get_resp.status_code}" + + health_resp = await e2e_client.get("/health") + assert health_resp.status_code == 200 + assert health_resp.json() == {"status": "ok"} + + print("\n[E2E] HTTP health probe 成功: HEAD /=200, GET /=200, /health=ok") + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_http_status_diagnostics(e2e_client: object) -> None: + """GET /api/status → 包含 antigravity tier 诊断信息.""" + response = await e2e_client.get("/api/status") + assert response.status_code == 200 + + data = response.json() + assert "tiers" in data + antigravity_tiers = [t for t in data["tiers"] if t["name"] == "antigravity"] + assert len(antigravity_tiers) == 1, ( + f"预期 1 个 antigravity tier,实际: {len(antigravity_tiers)}" + ) + + tier = antigravity_tiers[0] + assert "diagnostics" in tier, "缺少 diagnostics" + + diag = tier["diagnostics"] + print("\n[E2E] status diagnostics:") + for k, v in diag.items(): + if isinstance(v, dict): + print(f" {k}: {json.dumps(v, ensure_ascii=False)[:200]}") + else: + print(f" {k}: {v}") + + # token_manager 诊断可能为空(若未发生错误),仅验证其存在性 + if "token_manager" in diag: + print(" token_manager diagnostics present") + else: + print(" (token_manager diagnostics empty — no token errors)") + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_http_claude_code_headers(e2e_client: object) -> None: + """带完整 Claude Code headers 的请求正常(验证 x-api-key 不干扰 Antigravity).""" + headers = { + "anthropic-version": "2023-06-01", + "content-type": "application/json", + "x-api-key": "sk-ant-api03-fake-key-for-testing", + "accept": "application/json", + } + body = { + "model": "claude-sonnet-4-20250514", + "messages": [{"role": "user", "content": "Say: ok"}], + "max_tokens": 16, + } + response = await e2e_client.post("/v1/messages", json=body, headers=headers) + + if _is_quota_exhausted(response): + print("\n[E2E] Claude Code headers: 协议对接正确,配额耗尽") + return + + assert response.status_code == 200, ( + f"预期 200,实际 {response.status_code}: {response.text[:300]}" + ) + + resp_body = response.json() + assert resp_body["type"] == "message" + assert len(resp_body["content"]) > 0 + + print( + f"\n[E2E] Claude Code headers 成功: content='{resp_body['content'][0].get('text', '')[:80]}'" + ) diff --git a/tests/e2e/test_e2e_token.py b/tests/e2e/test_e2e_token.py new file mode 100644 index 0000000..dd3bb7b --- /dev/null +++ b/tests/e2e/test_e2e_token.py @@ -0,0 +1,93 @@ +"""Level 1 E2E: Google OAuth2 Token 刷新 — 验证真实凭证链路.""" + +from __future__ import annotations + +import pytest + +from coding.proxy.vendors.antigravity import GoogleOAuthTokenManager +from coding.proxy.vendors.token_manager import TokenAcquireError, TokenErrorKind + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_real_token_refresh(e2e_credentials: dict[str, str]) -> None: + """真实 refresh_token 应返回有效的 access_token(ya29. 前缀).""" + tm = GoogleOAuthTokenManager( + e2e_credentials["client_id"], + e2e_credentials["client_secret"], + e2e_credentials["refresh_token"], + ) + try: + token = await tm.get_token() + assert token, "access_token 为空" + assert token.startswith("ya29."), f"access_token 前缀异常: {token[:10]}..." + print(f"[E2E DIAG] access_token={token[:10]}... (len={len(token)})") + finally: + await tm.close() + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_real_token_caching(e2e_credentials: dict[str, str]) -> None: + """连续调用 get_token() 应返回缓存的同一 token.""" + tm = GoogleOAuthTokenManager( + e2e_credentials["client_id"], + e2e_credentials["client_secret"], + e2e_credentials["refresh_token"], + ) + try: + token1 = await tm.get_token() + token2 = await tm.get_token() + assert token1 == token2, "缓存未生效,两次返回不同 token" + assert tm._expires_at > 0, "expires_at 未被设置" + print(f"[E2E DIAG] caching OK: expires_at={tm._expires_at}") + finally: + await tm.close() + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_invalid_refresh_token_raises(e2e_credentials: dict[str, str]) -> None: + """错误的 refresh_token 应抛出 TokenAcquireError(INVALID_CREDENTIALS).""" + tm = GoogleOAuthTokenManager( + e2e_credentials["client_id"], + e2e_credentials["client_secret"], + "1//invalid_token_for_e2e_test_00000000", + ) + try: + with pytest.raises(TokenAcquireError) as exc_info: + await tm.get_token() + assert exc_info.value.kind == TokenErrorKind.INVALID_CREDENTIALS, ( + f"预期 INVALID_CREDENTIALS,实际: {exc_info.value.kind}" + ) + assert exc_info.value.needs_reauth is True + print(f"[E2E DIAG] invalid_grant 正确捕获: {exc_info.value}") + finally: + await tm.close() + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_token_invalidation_triggers_refresh( + e2e_credentials: dict[str, str], +) -> None: + """invalidate() 后重新获取应成功.""" + tm = GoogleOAuthTokenManager( + e2e_credentials["client_id"], + e2e_credentials["client_secret"], + e2e_credentials["refresh_token"], + ) + try: + token1 = await tm.get_token() + assert token1, "首次获取失败" + + tm.invalidate() + assert tm._expires_at == 0.0, "invalidate 后 expires_at 应为 0" + + token2 = await tm.get_token() + assert token2, "invalidate 后重新获取失败" + print( + f"[E2E DIAG] invalidation OK: token1={token1[:10]}... token2={token2[:10]}..." + ) + finally: + await tm.close() diff --git a/tests/e2e/test_e2e_vendor.py b/tests/e2e/test_e2e_vendor.py new file mode 100644 index 0000000..1781235 --- /dev/null +++ b/tests/e2e/test_e2e_vendor.py @@ -0,0 +1,327 @@ +"""Level 2 E2E: AntigravityVendor 直接调用 — 验证 GLA 和 v1internal 协议端到端.""" + +from __future__ import annotations + +import json + +import pytest + + +def _print_diagnostics(vendor: object, label: str) -> None: + diag = vendor.get_diagnostics() + print(f"\n[E2E DIAG] {label}:") + for k, v in diag.items(): + if isinstance(v, dict): + print(f" {k}: {json.dumps(v, ensure_ascii=False)[:200]}") + else: + print(f" {k}: {v}") + + +def _is_quota_exhausted(resp: object) -> bool: + """检查响应是否为配额耗尽(429 RESOURCE_EXHAUSTED). + + 429 表示协议对接正确但配额已用完,测试应标记为预期行为。 + """ + if resp.status_code != 429: + return False + error_msg = (resp.error_message or "").lower() + return "resource" in error_msg or "quota" in error_msg or "exhausted" in error_msg + + +def _is_scope_error(resp: object) -> bool: + """检查响应是否为 scope 不足错误.""" + if resp.status_code != 403: + return False + return "scope" in (resp.error_message or "").lower() + + +# ── 标准 GLA 模式 ── + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_gla_non_streaming_text( + antigravity_vendor: object, + minimal_request_body: dict, +) -> None: + """GLA 模式非流式请求 — 验证协议对接正确.""" + resp = await antigravity_vendor.send_message(minimal_request_body, {}) + _print_diagnostics(antigravity_vendor, "GLA non-streaming") + + # 403 scope 不足说明 GLA 端点不适用于当前凭证(正常,需要 v1internal) + if _is_scope_error(resp): + pytest.skip("GLA 端点 scope 不足,需要 v1internal 模式") + + # 429 配额耗尽 = 协议对接正确,仅配额问题 + if _is_quota_exhausted(resp): + print("\n[E2E] GLA non-streaming: 协议对接正确,但配额已耗尽 (429)") + return + + assert resp.status_code == 200, ( + f"预期 200,实际 {resp.status_code}: {resp.error_message}" + ) + + body = json.loads(resp.raw_body) + assert body["type"] == "message", f"预期 type=message,实际: {body.get('type')}" + assert body["role"] == "assistant" + assert len(body["content"]) > 0, "content 为空" + assert body["content"][0]["type"] == "text" + assert body["stop_reason"] in ("end_turn", "max_tokens") + assert body["usage"]["input_tokens"] > 0, "input_tokens 应 > 0" + + print( + f"\n[E2E] GLA non-streaming 成功: model={body.get('model')}, " + f"input={body['usage']['input_tokens']}, output={body['usage']['output_tokens']}, " + f"stop_reason={body['stop_reason']}" + ) + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_gla_streaming_text( + antigravity_vendor: object, + minimal_request_body: dict, +) -> None: + """GLA 模式流式请求 — 验证 SSE 协议对接.""" + minimal_request_body["stream"] = True + + events: list[str] = [] + content_chunks: list[str] = [] + quota_exhausted = False + + try: + async for chunk in antigravity_vendor.send_message_stream( + minimal_request_body, {} + ): + text = chunk.decode("utf-8", errors="replace") + for line in text.split("\n"): + line = line.strip() + if line.startswith("event:"): + events.append(line[6:].strip()) + elif line.startswith("data:"): + try: + data = json.loads(line[5:].strip()) + if data.get("type") == "content_block_delta": + delta = data.get("delta", {}) + if delta.get("type") == "text_delta": + content_chunks.append(delta.get("text", "")) + except json.JSONDecodeError: + pass + except Exception as exc: + error_str = str(exc).lower() + if "403" in error_str and "scope" in error_str: + pytest.skip("GLA 端点 scope 不足,需要 v1internal 模式") + if "429" in error_str or "quota" in error_str or "exhausted" in error_str: + quota_exhausted = True + print("\n[E2E] GLA streaming: 协议对接正确,但配额已耗尽 (429)") + else: + raise + + if not quota_exhausted: + _print_diagnostics(antigravity_vendor, "GLA streaming") + assert "message_start" in events, ( + f"缺少 message_start 事件,实际事件: {events[:10]}" + ) + assert "content_block_delta" in events, "缺少 content_block_delta 事件" + assert "message_stop" in events, "缺少 message_stop 事件" + + full_text = "".join(content_chunks) + print( + f"\n[E2E] GLA streaming 成功: events={len(events)}, content='{full_text[:100]}'" + ) + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_gla_with_system_prompt( + antigravity_vendor: object, + minimal_request_body: dict, +) -> None: + """GLA 模式带 system prompt 的请求正常.""" + minimal_request_body["system"] = ( + "You are a test assistant. Always respond with exactly one word." + ) + resp = await antigravity_vendor.send_message(minimal_request_body, {}) + + if _is_scope_error(resp): + pytest.skip("GLA 端点 scope 不足") + if _is_quota_exhausted(resp): + print("\n[E2E] GLA with system prompt: 协议对接正确,配额耗尽") + return + + assert resp.status_code == 200, ( + f"预期 200,实际 {resp.status_code}: {resp.error_message}" + ) + body = json.loads(resp.raw_body) + assert body["type"] == "message" + assert len(body["content"]) > 0 + + print( + f"\n[E2E] GLA with system prompt 成功: content='{body['content'][0].get('text', '')[:80]}'" + ) + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_gla_with_tools( + antigravity_vendor: object, + minimal_request_body: dict, +) -> None: + """GLA 模式带 tools 定义的请求正常往返.""" + minimal_request_body["tools"] = [ + { + "name": "calculator", + "description": "Performs arithmetic", + "input_schema": { + "type": "object", + "properties": {"expression": {"type": "string"}}, + "required": ["expression"], + }, + } + ] + minimal_request_body["messages"] = [ + {"role": "user", "content": "What is 2+2? Reply with just the number."} + ] + resp = await antigravity_vendor.send_message(minimal_request_body, {}) + + if _is_scope_error(resp): + pytest.skip("GLA 端点 scope 不足") + if _is_quota_exhausted(resp): + print("\n[E2E] GLA with tools: 协议对接正确,配额耗尽") + return + + assert resp.status_code == 200, ( + f"预期 200,实际 {resp.status_code}: {resp.error_message}" + ) + body = json.loads(resp.raw_body) + assert body["type"] == "message" + assert len(body["content"]) > 0 + + _print_diagnostics(antigravity_vendor, "GLA with tools") + print( + f"\n[E2E] GLA with tools 成功: content_types={[b['type'] for b in body['content']]}" + ) + + +# ── v1internal 模式 ── + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_v1internal_non_streaming( + antigravity_vendor_v1internal: object, + minimal_request_body: dict, +) -> None: + """v1internal 模式非流式请求 — 验证协议对接.""" + resp = await antigravity_vendor_v1internal.send_message(minimal_request_body, {}) + + _print_diagnostics(antigravity_vendor_v1internal, "v1internal non-streaming") + + # 429 = 协议对接正确,仅配额问题 + if _is_quota_exhausted(resp): + diag = antigravity_vendor_v1internal.get_diagnostics() + print( + f"\n[E2E] v1internal non-streaming: 协议对接正确 (is_v1internal={diag.get('is_v1internal_mode')}),但配额已耗尽 (429)" + ) + return + + assert resp.status_code == 200, ( + f"预期 200,实际 {resp.status_code}: {resp.error_message}" + ) + body = json.loads(resp.raw_body) + assert body["type"] == "message" + assert body["role"] == "assistant" + assert len(body["content"]) > 0 + + diag = antigravity_vendor_v1internal.get_diagnostics() + print( + f"\n[E2E] v1internal non-streaming 成功: " + f"is_v1internal={diag.get('is_v1internal_mode')}, " + f"project_id_source={diag.get('project_id_source')}, " + f"input={body['usage']['input_tokens']}, output={body['usage']['output_tokens']}" + ) + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_v1internal_streaming( + antigravity_vendor_v1internal: object, + minimal_request_body: dict, +) -> None: + """v1internal 模式流式请求 — 验证 SSE 协议.""" + minimal_request_body["stream"] = True + + events: list[str] = [] + content_chunks: list[str] = [] + quota_exhausted = False + + try: + async for chunk in antigravity_vendor_v1internal.send_message_stream( + minimal_request_body, {} + ): + text = chunk.decode("utf-8", errors="replace") + for line in text.split("\n"): + line = line.strip() + if line.startswith("event:"): + events.append(line[6:].strip()) + elif line.startswith("data:"): + try: + data = json.loads(line[5:].strip()) + if data.get("type") == "content_block_delta": + delta = data.get("delta", {}) + if delta.get("type") == "text_delta": + content_chunks.append(delta.get("text", "")) + except json.JSONDecodeError: + pass + except Exception as exc: + error_str = str(exc) + if "429" in error_str: + quota_exhausted = True + print("\n[E2E] v1internal streaming: 协议对接正确,但配额已耗尽 (429)") + else: + raise + + if not quota_exhausted: + _print_diagnostics(antigravity_vendor_v1internal, "v1internal streaming") + assert "message_start" in events, "缺少 message_start" + assert "content_block_delta" in events, "缺少 content_block_delta" + assert "message_stop" in events, "缺少 message_stop" + + full_text = "".join(content_chunks) + print( + f"\n[E2E] v1internal streaming 成功: events={len(events)}, content='{full_text[:100]}'" + ) + + +@pytest.mark.e2e +@pytest.mark.asyncio +async def test_project_id_auto_discovery( + antigravity_vendor_v1internal: object, + minimal_request_body: dict, +) -> None: + """首次请求后 v1internal 模式状态和 project_id 发现结果.""" + resp = await antigravity_vendor_v1internal.send_message(minimal_request_body, {}) + + diag = antigravity_vendor_v1internal.get_diagnostics() + source = diag.get("project_id_source", "unknown") + is_v1 = diag.get("is_v1internal_mode", False) + + print(f"\n[E2E] project_id discovery: source={source}, is_v1internal={is_v1}") + + # v1internal 模式应已启用(由 base_url 配置驱动) + assert is_v1 is True, "v1internal 模式应已启用" + assert source in ("discovered", "none", "configured"), ( + f"未知的 project_id_source: {source}" + ) + + # 请求应到达了 API 端点(429 配额耗尽或 200 成功都说明协议对接正确) + assert resp.status_code in (200, 429), ( + f"预期 200/429,实际 {resp.status_code}: {resp.error_message[:200]}" + ) + + if resp.status_code == 429: + print(" 配额已耗尽 (429),但协议对接验证正确") + elif source == "discovered": + print(f" discovered_project_id={diag.get('discovered_project_id')}") + elif source == "none": + print(" 未发现 project_id,v1internal 无需 project_id") diff --git a/tests/test_antigravity.py b/tests/test_antigravity.py index 6256bfb..cc93127 100644 --- a/tests/test_antigravity.py +++ b/tests/test_antigravity.py @@ -384,12 +384,12 @@ def test_is_v1internal_mode_with_project_id_and_v1internal_url(): def test_is_v1internal_mode_without_project_id(): - """未配置 project_id 时即使 URL 含 v1internal 也不启用.""" + """v1internal 模式由 base_url 驱动,无需 project_id(与参考项目对齐).""" config = AntigravityConfig( base_url="https://cloudcode-pa.googleapis.com/v1internal", ) vendor = AntigravityVendor(config, FailoverConfig(), ModelMapper([])) - assert vendor._is_v1internal_mode() is False + assert vendor._is_v1internal_mode() is True def test_is_v1internal_mode_standard_gla_url(): @@ -527,7 +527,7 @@ async def test_discover_project_id_single_active_project(): assert result == "my-gcp-123" assert vendor._project_id_discovered == "my-gcp-123" - assert vendor._base_url == "https://cloudcode-pa.googleapis.com/v1internal" + assert vendor._base_url == "https://cloudcode-pa.googleapis.com" assert vendor._is_v1internal_mode() is True @@ -743,20 +743,19 @@ async def mock_discover(token): def test_is_v1internal_mode_uses_effective_project_id(): - """_is_v1internal_mode 应基于 _effective_project_id 判断.""" + """_is_v1internal_mode 应基于 base_url 判断(不再依赖 project_id).""" config = AntigravityConfig(base_url=_V1INTERNAL_BASE_URL) vendor = AntigravityVendor(config, FailoverConfig(), ModelMapper([])) - # 未配置、未发现 → False - assert vendor._is_v1internal_mode() is False + # base_url 含 v1internal → True(即使无 project_id) + assert vendor._is_v1internal_mode() is True - # 发现后 → True + # 发现 project_id 不影响 v1internal 模式判断 vendor._project_id_discovered = "found-it" assert vendor._is_v1internal_mode() is True - # 配置值覆盖发现值 + # 清除发现值也不影响 vendor._project_id_discovered = "" - vendor._project_id = "manual" assert vendor._is_v1internal_mode() is True From 71e913f1706c418ebc10604685eb6bd57668a5f2 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Mon, 11 May 2026 14:29:06 +0800 Subject: [PATCH 32/66] =?UTF-8?q?fix(routes):=20=E4=BF=AE=E5=A4=8D=20count?= =?UTF-8?q?=5Ftokens=20=E8=B7=AF=E7=94=B1=E5=AF=B9=20target=5Fvendor.name?= =?UTF-8?q?=20=E7=9A=84=E9=94=99=E8=AF=AF=E5=B1=9E=E6=80=A7=E8=AE=BF?= =?UTF-8?q?=E9=97=AE;=20(#235)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: BaseVendor 仅暴露抽象方法 get_name(), 所有 Vendor 子类均无 name 实例属性. routes.py:153/160 错误访问 target_vendor.name 导致 AttributeError 返回 500. 间歇性原因: 仅当 infer_source_vendor_from_body() 从请求体推断出非空 source (含 zhipu 私有产物 srvtoolu_* / server_tool_use) 时才走错误分支, 因此日志中 200/500 共存. 变更要点: - routes.py 两处 .name 改为 .get_name() 并提取局部变量 target_name 复用, 避免重复方法调用与日志/调用点不一致风险 - 新增回归测试 test_count_tokens_triggers_zhipu_to_target_channel: 注入 server_tool_use + srvtoolu_* 触发 zhipu→anthropic 通道, 断言 200 且 debug 日志含 channel adaptation, 弥补此前 6 个 count_tokens 测试均未触达该分支的盲区 - docs/issue.md 追加档案, 总结根因/防范/同类问题影响 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- docs/issue.md | 42 +++++++++++++++++++ src/coding/proxy/server/routes.py | 5 ++- tests/test_app_routes.py | 70 +++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 2 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index c8f9765..93023cf 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -45,3 +45,45 @@ if "usage" in data: # 仅判断 key 存在 - 本仓库内 `parse_usage_from_chunk` 的 Gemini `usageMetadata` 分支 (line ~219) 已经使用 `isinstance(um, dict)` 防御, 不受影响, 可作为参考实现。 - 检查其他解析器 (如 routing / vendor adapter 层) 是否还有 `if "key" in data: v = data["key"]; v.get(...)` 这种模式, 必要时同步加固。 + +--- + +## count_tokens 路由 `AttributeError: 'ZhipuVendor' object has no attribute 'name'` + +**问题描述** + +后台日志反复出现 `POST /v1/messages/count_tokens?beta=true 500 Internal Server Error`,并伴随: + +``` +File ".../coding/proxy/server/routes.py", line 153, in count_tokens + channel_fn = get_transition_channel(source, target_vendor.name) +AttributeError: 'ZhipuVendor' object has no attribute 'name' +``` + +同一时间窗口内大量请求 200 OK、少量请求 500,呈"间歇性"故障特征。 + +**表因** + +`src/coding/proxy/server/routes.py` 的 `count_tokens` 在 153 / 160 两处访问 `target_vendor.name`,触发 `AttributeError` 被 ASGI 中间件捕获返回 500。 + +**根因** + +`BaseVendor` 仅暴露**抽象方法** `get_name() -> str`(`src/coding/proxy/vendors/base.py:75-77`),所有派生类(`AnthropicVendor`、`ZhipuVendor`、`CopilotVendor`、`MinimaxVendor`、`DoubaoVendor`、`KimiVendor` 等)均通过 `_vendor_name` 类属性配合 `get_name()` 返回名称 —— **并无 `name` 实例属性**。该错误访问在 lint/类型检查阶段无告警(因 `BaseVendor` 未在类型系统中约束 `name` 字段),仅在运行时触发。 + +间歇性原因:第 152 行 `if source:` 是守卫;`source` 由 `infer_source_vendor_from_body(body)`(`src/coding/proxy/convert/vendor_channels.py:357-394`)从请求体启发式推断,仅当出现 zhipu 私有产物(`srvtoolu_*` 形式的 `tool_use.id` 或 `server_tool_use` / `server_tool_use_delta` 类型 content block)时返回 `"zhipu"`,否则 `None`。纯净的首轮 count_tokens 请求 `source is None` 自然绕过 153 行,因此 200/500 共存。 + +**处理方式** + +1. `routes.py:153,160` 将 `target_vendor.name` 改为 `target_vendor.get_name()`,并将结果提取到局部变量 `target_name` 复用,避免重复方法调用与日志/调用点不一致风险。 +2. `tests/test_app_routes.py` 新增 `test_count_tokens_triggers_zhipu_to_target_channel`:通过注入 `server_tool_use` + `srvtoolu_*` 让 `infer_source_vendor_from_body` 返回 `"zhipu"`,断言返回 200 且 debug 日志含 `"count_tokens channel zhipu → anthropic"`,证明通道被实际触发。此前 6 个 count_tokens 测试的请求体都是纯净的、未触达该分支,是 bug 长期漏过的根因。 + +**后续防范** + +- 跨模块引用 Vendor 实例字段时,**统一通过 `BaseVendor` 暴露的方法**(`get_name()`、`map_model()` 等),避免直接访问派生类未定义的"假属性"。 +- 长期演进可考虑在 `BaseVendor` 增加 `@property name` 指向 `get_name()`,将契约前移到类型系统由 mypy / pyright 拦截 —— 该重构属"演进式设计"范畴,不在本次最小干预范围内。 +- 测试覆盖原则:路由层涉及"内容感知"分支(如 `infer_source_vendor_from_body`)时,至少补一个让分支命中的最小用例,避免守卫掩盖代码缺陷。 + +**同类问题影响与处理注意事项** + +- 已 `grep -rn "vendor\.name\b" src/` 全仓扫描,确认 `target_vendor.name | vendor.name` 误用仅 routes.py 的这两处,已随本次修复一并消除。`/v1/messages` 主链路在 executor 中调用 `tier.name`(`Tier` 对象的合法 dataclass 属性),与 vendor 实例 `name` 无关,不受影响。 +- 若未来新增 Vendor 子类,仍只需实现 `get_name()` 抽象方法;外部调用方应遵循同一契约,本档案的修复模式可作为参考。 diff --git a/src/coding/proxy/server/routes.py b/src/coding/proxy/server/routes.py index 7f157f0..95c6554 100644 --- a/src/coding/proxy/server/routes.py +++ b/src/coding/proxy/server/routes.py @@ -150,14 +150,15 @@ async def count_tokens(request: Request) -> Response: source = infer_source_vendor_from_body(body) if source: - channel_fn = get_transition_channel(source, target_vendor.name) + target_name = target_vendor.get_name() + channel_fn = get_transition_channel(source, target_name) if channel_fn is not None: body, adaptations = channel_fn(body) if adaptations: logger.debug( "count_tokens channel %s → %s: %s", source, - target_vendor.name, + target_name, ", ".join(adaptations), ) diff --git a/tests/test_app_routes.py b/tests/test_app_routes.py index 8df0277..4c460e3 100644 --- a/tests/test_app_routes.py +++ b/tests/test_app_routes.py @@ -286,6 +286,76 @@ def test_count_tokens_falls_back_to_tiers0_on_cold_start(): assert resp.json()["input_tokens"] == 88 +def test_count_tokens_triggers_zhipu_to_target_channel(caplog): + """count_tokens 请求体含 zhipu 私有产物时,应触发跨供应商通道并返回 200. + + 回归测试:routes.py 历史上错误访问 target_vendor.name(BaseVendor 仅暴露 get_name() + 方法,并无 name 属性),当 infer_source_vendor_from_body() 推断出非空 source 时 + 会抛 AttributeError 返回 500。本用例通过注入 zhipu 私有产物(srvtoolu_* id 与 + server_tool_use 块)触发该路径,断言 200 且 adaptations 日志被打印。 + """ + config = ProxyConfig( + tiers=[ + {"vendor": "anthropic", "enabled": True, "api_key": "sk-ant-test"}, + ], + database={"path": "/tmp/test-count-tokens-zhipu-channel.db"}, + ) + app = create_app(config) + + mock_response = MagicMock() + mock_response.content = b'{"input_tokens": 99}' + mock_response.status_code = 200 + + body_with_zhipu_artifact = { + "model": "claude-sonnet-4-20250514", + "messages": [ + {"role": "user", "content": "Hello"}, + { + "role": "assistant", + "content": [ + { + "type": "server_tool_use", + "id": "srvtoolu_abc123", + "name": "web_search", + "input": {"query": "test"}, + }, + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "srvtoolu_abc123", + "content": "result", + }, + ], + }, + ], + } + + with TestClient(app) as client: + with patch.object( + httpx.AsyncClient, + "post", + new_callable=AsyncMock, + return_value=mock_response, + ): + with caplog.at_level(logging.DEBUG, logger="coding.proxy.server.routes"): + resp = client.post( + "/v1/messages/count_tokens?beta=true", + json=body_with_zhipu_artifact, + headers={"authorization": "Bearer sk-test"}, + ) + assert resp.status_code == 200 + assert resp.json()["input_tokens"] == 99 + # 通道被实际触发的证据:debug 日志含 "count_tokens channel zhipu → anthropic" + assert any( + "count_tokens channel zhipu" in record.message + for record in caplog.records + ), "expected zhipu→anthropic channel adaptation log" + + def test_status_exposes_vendor_diagnostics(): """状态接口暴露供应商诊断信息,便于排查凭证交换异常.""" config = ProxyConfig( From 4d295bb1e50e4fd6df4452ce517fc8ec97ade068 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Mon, 11 May 2026 14:50:24 +0800 Subject: [PATCH 33/66] =?UTF-8?q?fix(vendor-channels):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20zhipu=E2=86=92anthropic=20=E9=80=9A=E9=81=93=20tool?= =?UTF-8?q?=5Fuse/tool=5Fresult=20=E9=85=8D=E5=AF=B9=E6=BC=8F=E6=B4=9E;=20?= =?UTF-8?q?(#236)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 生产日志暴露 Anthropic 400 错误:channel transition 已应用 `rewritten_N_srvtoolu_ids` + `misplaced_tool_result_relocated` + `stripped_M_thinking_blocks` 但**未出现** `orphaned_tool_use_repaired` 标签,Anthropic 仍报 `messages.x: tool_use ids were found without tool_result blocks immediately after`。 根因: `_rewrite_srvtoolu_ids` 单遍循环中 Case A (assistant 端 `server_tool_use` → `tool_use` ID 改写) 与 Case B (任意 `tool_result.tool_use_id` 同步改写) 共用一遍 for 循环,Case B 依赖 `id_map` 已被 Case A 填入。GLM-5 偶发将 inline tool_result 块输出在对应 server_tool_use **之前** (同 assistant content 内乱序) 或在更早的 user 消息中, 单遍遍历到 tool_result 时 id_map 还是空 → 漏改; 后续 enforce 主循环 extracted_tool_results 以旧 ID 作 key、tool_use_ids 是新 ID, 错位致默默丢弃 → 对应 user 槽位实际仍然缺位。 修复: 1. `_rewrite_srvtoolu_ids` 改为两遍扫描: Pass 1 仅扫 assistant 收集 id_map (序号 分配次序与单遍一致, 保持已有断言), Pass 2 全量改写 tool_result.tool_use_id, 消 除时序耦合。 2. 新增独立 helper `_enforce_pairing_sanity_pass` 作为 enforce 主循环末尾的纵深防 御, 仅检测+合成 is_error 占位, 不剥离/不重定位; 命中追加 `pairing_sanity_repaired` adaptation 与 WARNING 日志, 便于运维定位。 3. 新增 11 个测试: 2 个两遍扫描乱序回归 + 8 个 sanity helper 单测覆盖各边界 + 1 个 prepare_zhipu_to_anthropic 端到端复现日志故障形态。 4. `docs/issue.md` 沉淀故障档案与历史教训 (commit 9061cd0 引入该修复曾被 2bac9a7 作为副产物连带回滚, 提醒后续 revert vendor_channels 时不要连带回滚 sanity helper 与两遍扫描)。 测试: tests/ 全量 1438 通过, 零回归。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- docs/issue.md | 45 +++ src/coding/proxy/convert/vendor_channels.py | 192 +++++++-- tests/test_vendor_channels.py | 418 ++++++++++++++++++++ 3 files changed, 624 insertions(+), 31 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index 93023cf..66fd61f 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -48,6 +48,51 @@ if "usage" in data: # 仅判断 key 存在 --- +## anthropic 400: `tool_use` ids were found without `tool_result` blocks immediately after + +**问题描述** + +zhipu → anthropic 通道流式请求偶发 400, 错误形如: + +``` +WARNING anthropic stream error: status=400 body=... + messages.3: `tool_use` ids were found without `tool_result` blocks immediately after: toolu_normalized_2. +INFO Failover: anthropic → zhipu (reason: HTTP 400) +INFO Tier zhipu stream succeeded (took over from failed tier: anthropic) +``` + +同一请求伴随 `Applied transition channel zhipu → anthropic: rewritten_N_srvtoolu_ids, misplaced_tool_result_relocated, stripped_M_thinking_blocks` 的 adaptations 但**没有 `orphaned_tool_use_repaired`**, 即转换层主观上认为已配对、但 Anthropic 仍判定结构不合规。Failover 至 zhipu 后请求成功, 证明上游消息体本身没有损坏, 问题出在 zhipu→anthropic 通道转换过程引入了不一致。 + +**表因** + +`src/coding/proxy/convert/vendor_channels.py::_rewrite_srvtoolu_ids` 在单遍循环中同时承担 Case A (assistant 端 `server_tool_use` → `tool_use` 与 `srvtoolu_*` ID 重写) 与 Case B (任意位置 `tool_result.tool_use_id` 同步重写)。Case B 依赖 `id_map` 已被 Case A 填入。 + +**根因** + +Zhipu GLM-5 流式响应偶发将 inline `tool_result` 块输出在**对应的 `server_tool_use` 块之前** (同 assistant content 内乱序), 或将 `tool_result` 放在更早的 user 消息中而对应 `tool_use` 在更晚的 assistant 消息。两种乱序下, 单遍扫描遍历到 `tool_result` 时 `id_map` 还是空 → `tool_result.tool_use_id` 不被改写, 停留在 `srvtoolu_X`; 随后 Case A 把对应 `tool_use.id` 改写为 `toolu_normalized_N`。 + +后续 `enforce_anthropic_tool_pairing` Step A 提取这条 misplaced tool_result 时使用**旧 ID** 作为 `extracted_tool_results` 字典 key, Step F 用新 ID 去查 → 不命中 → 走 `existing_result_ids` 分支, 因为相邻 user 的 tool_result 已经被改写到新 ID, 该 uid 命中 `existing_result_ids` 被 continue 跳过, 于是 enforce 错误地认为完成配对、不产生 `orphaned_tool_use_repaired` 标签, 而被默默丢弃的 misplaced tool_result 本应填补到的 user 槽位实际上**仍然缺位**。最终 body 中某条 assistant 的 tool_use 在下一条 user 中找不到对应 tool_result → Anthropic 400。 + +**处理方式** + +1. `_rewrite_srvtoolu_ids` 改为**两遍扫描**: Pass 1 仅遍历 assistant 消息收集 `id_map` (按 assistant 出现顺序分配, 保持序号兼容性); Pass 2 全量遍历改写任意 `tool_result.tool_use_id`。以"先建表、后改写"的次序消除时序耦合。 +2. 在 `enforce_anthropic_tool_pairing` 主循环末尾追加独立 helper `_enforce_pairing_sanity_pass`, 仅做检测+合成 `is_error=True` 占位 (不剥离、不重定位), 命中追加 `pairing_sanity_repaired` adaptation 并打 WARNING (含 message index 与 uid)。这层作为纵深防御, 在主循环未来重构时仍能稳定守住 Anthropic 配对约束。 +3. 新增回归测试覆盖三类场景: 同 assistant content 内乱序、跨消息边界 tool_result 早于 tool_use、端到端复现日志故障形态。新增 `TestEnforcePairingSanityPass` 独立测试套件确保兜底分支具备正向回归保护。 + +**后续防范** + +- 任何在多 content block 之间存在**前向引用** (后出现的块定义的标识符被前面的块引用) 的就地改写逻辑, 都必须采用两遍扫描或全局表先建后用, 不可依赖遍历位置上 "上一次循环已经写入" 的隐含次序。 +- 纵深防御层 (sanity helper) 必须**独立可单测**, 而不是把 sanity 内嵌在主路径内部 — 否则主路径的快速通道会让 sanity 分支永远走不到正向测试, 缺乏回归保护。 +- adaptations 标签 (`pairing_sanity_repaired`) 与主循环标签 (`orphaned_tool_use_repaired`) 分离, 便于运维聚合时按层归因。 + +**同类问题影响与处理注意事项** + +- 历史教训: commit `9061cd0` 曾经实现"两遍扫描 + sanity helper"修复了正是这类问题, 但 commit `2bac9a7` revert 至 v0.3.0 时**连带回滚**了它 — revert 的真实目标是去除 `f497077` / `fdd4a92` / `43488a1` 引入的"zhipu 自清理通道"和"tool_result.id 注入"副作用, 两遍扫描属无辜方。**后续若再次需要 revert `vendor_channels.py`**, 必须先 `grep _enforce_pairing_sanity_pass` 与 `Pass 1` / `Pass 2` 注释, 确认这两段是核心修复而非可以一起回滚的实验性代码。 +- 类似 "vendor 私有 ID 跨消息体改写" 场景 (如 doubao、minimax 未来若引入类似机制), 实现时同样应当遵循"先全局收集 id_map、后统一改写"的两阶段模式。 +- 单元测试覆盖"块顺序敏感"类 bug 时, 建议在用例命名中显式标注顺序条件 (如 `test_two_pass_handles_inline_tool_result_before_server_tool_use`), 让未来 reviewer 一眼看出测试的边界价值。 + +--- + ## count_tokens 路由 `AttributeError: 'ZhipuVendor' object has no attribute 'name'` **问题描述** diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index bec46f7..dadce2e 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -219,9 +219,114 @@ def enforce_anthropic_tool_pairing( ", ".join(synthesized_ids), ) + # 纵深防御: sanity 兜底,捕获主循环未覆盖的边角配对漏洞 + adaptations.extend(_enforce_pairing_sanity_pass(messages_list)) + return adaptations +def _enforce_pairing_sanity_pass( + messages_list: list[dict[str, Any]], +) -> list[str]: + """``enforce_anthropic_tool_pairing`` 主循环之后的纯检测兜底 helper. + + 职责正交于主循环(不剥离 tool_result、不插入新 user 消息),仅做两件事: + + 1. 遍历每个 ``role == "assistant"`` 且包含 ``tool_use`` 块的消息, + 检查 ``messages[i+1]`` 是否为 ``user`` 且包含所有 ``tool_use.id`` 对应 + ``tool_result.tool_use_id``。 + 2. 缺失项在该 user 消息末尾追加 ``is_error=True`` 占位块;如果 next 消息根本 + 不是 user(主循环未触达此分支的退化场景),同样不做插入,仅记录 WARNING + 供运维定位 —— 该路径正常情况下永不命中(主循环已保证 next user 存在)。 + + 本 helper 单独抽出的目的有两个: + + - 直接构造"绕过主循环"的输入做单元测试,确保 sanity 分支具备**正向回归保护** + (历史教训: ``9061cd0`` 引入两遍扫描+sanity 后被 ``2bac9a7`` 连带回滚, + 重要原因之一是缺乏对兜底路径的独立单测)。 + - 在主循环 A-F 步骤未来重构时,sanity 仍能稳定守住 Anthropic 配对约束。 + + Args: + messages_list: 消息列表(就地修改)。 + + Returns: + 新增的 adaptation 标签列表(命中则为 ``["pairing_sanity_repaired"]``,否则空列表)。 + """ + repaired: list[tuple[int, str]] = [] + + for i, msg in enumerate(messages_list): + if not isinstance(msg, dict) or msg.get("role") != "assistant": + continue + content = msg.get("content") + if not isinstance(content, list): + continue + tool_use_ids = [ + b["id"] + for b in content + if isinstance(b, dict) and b.get("type") == "tool_use" and b.get("id") + ] + if not tool_use_ids: + continue + + next_idx = i + 1 + if ( + next_idx >= len(messages_list) + or not isinstance(messages_list[next_idx], dict) + or messages_list[next_idx].get("role") != "user" + ): + # 主循环正常情况下已保证 next 为 user;此处仅日志告警,不做隐式插入 + # 以避免与主循环职责重叠。 + logger.warning( + "Sanity pass: assistant at messages[%d] has tool_use without " + "user next message (tool_use_ids=%s). Main enforce loop may have a regression.", + i, + ", ".join(tool_use_ids), + ) + continue + + user_msg = messages_list[next_idx] + user_content = user_msg.get("content") + if not isinstance(user_content, list): + # 主循环 D 步已将 string content 归一化为 list;这里防御性兜底 + user_msg["content"] = ( + [{"type": "text", "text": user_content}] + if isinstance(user_content, str) + else [] + ) + user_content = user_msg["content"] + + existing_result_ids = { + b["tool_use_id"] + for b in user_content + if isinstance(b, dict) + and b.get("type") == "tool_result" + and b.get("tool_use_id") + } + for uid in tool_use_ids: + if uid in existing_result_ids: + continue + user_content.append( + { + "type": "tool_result", + "tool_use_id": uid, + "content": "", + "is_error": True, + } + ) + repaired.append((i, uid)) + + if not repaired: + return [] + + logger.warning( + "Sanity pass repaired %d unpaired tool_use(s) missed by main enforce loop. " + "Affected: %s", + len(repaired), + ", ".join(f"messages[{idx}]:{uid}" for idx, uid in repaired), + ) + return ["pairing_sanity_repaired"] + + def _strip_cache_control(body: dict[str, Any]) -> int: """从 system/messages/tools 中移除 cache_control 字段(就地). @@ -294,8 +399,22 @@ def _rewrite_srvtoolu_ids(body: dict[str, Any]) -> tuple[int, dict[str, str]]: Anthropic API 要求 tool_use 类型与 ``toolu_*`` 格式的 ID。Zhipu 的 ``server_tool_use`` + ``srvtoolu_*`` 在上游 Anthropic 兼容端点可用,但无法 - 透传至其他供应商;同时还需重写紧随其后 user 消息中 ``tool_result.tool_use_id`` - 引用,保持配对关系。 + 透传至其他供应商;同时还需重写所有 ``tool_result.tool_use_id`` 引用,保持配对关系。 + + **两遍扫描(消除块顺序敏感性)**: + + - Pass 1: 仅遍历 ``role == "assistant"`` 的消息,按 assistant 出现顺序为每个 + 待改写的 tool_use 分配 ``toolu_normalized_N`` 新 ID,建立完整 ``id_map``。 + - Pass 2: 全量遍历消息,对任意 ``tool_result.tool_use_id ∈ id_map`` 的块 + 原地改写为新 ID(不分 user / assistant,覆盖 misplaced 与跨消息边界场景)。 + + 单遍方案在 GLM-5 偶发将 inline ``tool_result`` 输出在对应 ``server_tool_use`` + 之前的乱序场景下,会因 Case B 时 ``id_map`` 尚未填入而漏改 ``tool_use_id``, + 导致 ``enforce_anthropic_tool_pairing`` 后 ``extracted_tool_results`` 的 key + 与 ``tool_use_ids`` 不一致,进而把本应配对的 misplaced tool_result 默默丢弃, + 最终触发 Anthropic ``messages.x: tool_use ids were found without tool_result + blocks immediately after`` 400 错误。两遍扫描以"先建表、后改写"的次序消除该 + 时序耦合。 Returns: (rewritten_count, id_map) — 重写次数与 {原 ID: 新 ID} 映射。 @@ -308,45 +427,56 @@ def next_id() -> str: counter += 1 return f"toolu_normalized_{counter}" + # Pass 1: 扫描 assistant 消息,改写 tool_use / server_tool_use 的 id 与 type, + # 按出现顺序填充 id_map(保持与单遍版本相同的序号分配,避免破坏既有断言)。 for message in body.get("messages", []): - if not isinstance(message, dict): + if not isinstance(message, dict) or message.get("role") != "assistant": continue content = message.get("content") if not isinstance(content, list): continue - role = message.get("role") for block in content: if not isinstance(block, dict): continue block_type = block.get("type") + if block_type not in {"tool_use", "server_tool_use"}: + continue block_id = block.get("id") - - # Case A: assistant 消息里的 server_tool_use / srvtoolu_* → 改写 - if role == "assistant" and block_type in {"tool_use", "server_tool_use"}: - if isinstance(block_id, str) and _ANTHROPIC_SERVER_TOOL_USE_ID_RE.match( - block_id - ): - new_id = next_id() - id_map[block_id] = new_id - block["id"] = new_id - block["type"] = "tool_use" - elif ( - isinstance(block_id, str) - and block_id - and not _ANTHROPIC_TOOL_USE_ID_RE.match(block_id) - and block.get("name") - ): - # 非标准 ID(非 toolu_ / srvtoolu_),且具备 name 可改写 - new_id = next_id() - id_map[block_id] = new_id - block["id"] = new_id - block["type"] = "tool_use" - elif block_type == "server_tool_use" and isinstance(block_id, str): - # 兜底: 类型是 server_tool_use 但 ID 已是标准 toolu_ 形式,仅纠正类型 - block["type"] = "tool_use" - - # Case B: user 消息里的 tool_result.tool_use_id 同步重写 - if block_type == "tool_result": + if isinstance(block_id, str) and _ANTHROPIC_SERVER_TOOL_USE_ID_RE.match( + block_id + ): + new_id = next_id() + id_map[block_id] = new_id + block["id"] = new_id + block["type"] = "tool_use" + elif ( + isinstance(block_id, str) + and block_id + and not _ANTHROPIC_TOOL_USE_ID_RE.match(block_id) + and block.get("name") + ): + # 非标准 ID(非 toolu_ / srvtoolu_),且具备 name 可改写 + new_id = next_id() + id_map[block_id] = new_id + block["id"] = new_id + block["type"] = "tool_use" + elif block_type == "server_tool_use" and isinstance(block_id, str): + # 兜底: 类型是 server_tool_use 但 ID 已是标准 toolu_ 形式,仅纠正类型 + block["type"] = "tool_use" + + # Pass 2: 全量扫描,对任意 tool_result.tool_use_id 命中 id_map 的块同步改写。 + if id_map: + for message in body.get("messages", []): + if not isinstance(message, dict): + continue + content = message.get("content") + if not isinstance(content, list): + continue + for block in content: + if not isinstance(block, dict): + continue + if block.get("type") != "tool_result": + continue tool_use_id = block.get("tool_use_id") if isinstance(tool_use_id, str) and tool_use_id in id_map: block["tool_use_id"] = id_map[tool_use_id] diff --git a/tests/test_vendor_channels.py b/tests/test_vendor_channels.py index 774b85a..405fa30 100644 --- a/tests/test_vendor_channels.py +++ b/tests/test_vendor_channels.py @@ -15,6 +15,7 @@ from coding.proxy.convert.vendor_channels import ( VENDOR_TRANSITIONS, + _enforce_pairing_sanity_pass, _remove_vendor_blocks, _rewrite_srvtoolu_ids, _strip_cache_control, @@ -1008,6 +1009,91 @@ def test_skips_non_matching_user_tool_result(self): assert count == 0 assert body["messages"][0]["content"][0]["tool_use_id"] == "toolu_other" + def test_two_pass_handles_inline_tool_result_before_server_tool_use(self): + """乱序回归: 同一 assistant content 内 tool_result 出现在 server_tool_use 之前. + + Zhipu GLM-5 流式响应中已观察到的真实形态。若使用单遍扫描, + Case B 在 tool_result 块上执行时 ``id_map`` 尚未被 Case A 填入, + 会漏改 ``tool_result.tool_use_id``,留下旧的 ``srvtoolu_*`` 引用, + 最终触发 Anthropic API 的 ``messages.x: tool_use ids were found + without tool_result blocks immediately after`` 400 错误。 + + 修复后的两遍扫描必须保证 ``id_map`` 在 Pass 1 完整建立、 + Pass 2 再统一改写 tool_result.tool_use_id, 与块出现顺序无关。 + """ + body = { + "messages": [ + {"role": "user", "content": "ask"}, + { + "role": "assistant", + "content": [ + { + "type": "tool_result", + "tool_use_id": "srvtoolu_oof", + "content": "out", + }, + { + "type": "server_tool_use", + "id": "srvtoolu_oof", + "name": "bash", + "input": {}, + }, + ], + }, + ], + } + count, id_map = _rewrite_srvtoolu_ids(body) + assert count == 1 + new_id = id_map["srvtoolu_oof"] + assert new_id.startswith("toolu_normalized_") + + blocks = body["messages"][1]["content"] + tool_result_block = next(b for b in blocks if b.get("type") == "tool_result") + tool_use_block = next(b for b in blocks if b.get("type") == "tool_use") + assert tool_result_block["tool_use_id"] == new_id + assert tool_use_block["id"] == new_id + assert tool_use_block["type"] == "tool_use" + + def test_two_pass_handles_tool_result_in_earlier_user_message(self): + """跨消息边界乱序: tool_result 在更早的 user 消息中先出现. + + 旧单遍扫描遍历到 msg[1] 的 user tool_result 时 ``id_map`` 还未含 + ``srvtoolu_late``(对应 tool_use 在 msg[2]),导致漏改; + 两遍扫描必须保证此场景下 tool_result.tool_use_id 仍能正确改写. + """ + body = { + "messages": [ + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "srvtoolu_late", + "content": "prefetched", + }, + ], + }, + { + "role": "assistant", + "content": [ + { + "type": "server_tool_use", + "id": "srvtoolu_late", + "name": "bash", + "input": {}, + }, + ], + }, + ], + } + count, id_map = _rewrite_srvtoolu_ids(body) + assert count == 1 + new_id = id_map["srvtoolu_late"] + assert body["messages"][0]["content"][0]["tool_use_id"] == new_id, ( + "Pass 2 必须改写出现位置早于 tool_use 的 tool_result.tool_use_id" + ) + assert body["messages"][1]["content"][0]["id"] == new_id + # ── infer_source_vendor_from_body 单元测试 ───────────────────────── @@ -1582,6 +1668,209 @@ def test_next_message_is_assistant_inserts_user(self): assert messages[2]["role"] == "assistant" +# ── _enforce_pairing_sanity_pass 单元测试(纵深防御兜底层) ───────────── + + +class TestEnforcePairingSanityPass: + """``_enforce_pairing_sanity_pass`` 单元测试. + + 这层是 enforce 主循环结束后的纵深防御。直接以 helper 为被测单元, + 确保即使主循环未来重构出现遗漏,sanity 仍能稳定守住 Anthropic 配对约束。 + """ + + def test_noop_when_all_paired(self): + """所有 tool_use 都已正确配对时返回空列表,不修改输入.""" + messages = [ + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": "toolu_x", "name": "bash", "input": {}} + ], + }, + { + "role": "user", + "content": [ + {"type": "tool_result", "tool_use_id": "toolu_x", "content": "ok"} + ], + }, + ] + snapshot = copy.deepcopy(messages) + result = _enforce_pairing_sanity_pass(messages) + assert result == [] + assert messages == snapshot + + def test_appends_is_error_placeholder_when_user_lacks_tool_result(self): + """assistant tool_use 但 user 缺 tool_result 时追加 is_error 占位.""" + messages = [ + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": "toolu_x", "name": "bash", "input": {}} + ], + }, + {"role": "user", "content": [{"type": "text", "text": "ok"}]}, + ] + result = _enforce_pairing_sanity_pass(messages) + assert result == ["pairing_sanity_repaired"] + user_content = messages[1]["content"] + appended = next(b for b in user_content if b.get("type") == "tool_result") + assert appended == { + "type": "tool_result", + "tool_use_id": "toolu_x", + "content": "", + "is_error": True, + } + + def test_repairs_only_missing_ids_when_partially_paired(self): + """3 tool_use 但 user 只配 2 个 tool_result 时仅补缺失项.""" + messages = [ + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": "toolu_a", "name": "bash", "input": {}}, + {"type": "tool_use", "id": "toolu_b", "name": "read", "input": {}}, + {"type": "tool_use", "id": "toolu_c", "name": "write", "input": {}}, + ], + }, + { + "role": "user", + "content": [ + {"type": "tool_result", "tool_use_id": "toolu_a", "content": "a"}, + {"type": "tool_result", "tool_use_id": "toolu_c", "content": "c"}, + ], + }, + ] + result = _enforce_pairing_sanity_pass(messages) + assert result == ["pairing_sanity_repaired"] + result_ids = { + b["tool_use_id"] + for b in messages[1]["content"] + if b.get("type") == "tool_result" + } + assert result_ids == {"toolu_a", "toolu_b", "toolu_c"} + # 仅 toolu_b 是兜底合成的 is_error 占位 + b_block = next( + b for b in messages[1]["content"] if b.get("tool_use_id") == "toolu_b" + ) + assert b_block.get("is_error") is True + a_block = next( + b for b in messages[1]["content"] if b.get("tool_use_id") == "toolu_a" + ) + assert a_block.get("is_error") is not True + + def test_warns_when_next_message_not_user(self, caplog): + """next 非 user 时只发 WARNING、不修改、不返回 adaptation. + + 主循环正常情况下已保证 next 为 user;这是退化场景的可观测性兜底。 + """ + messages = [ + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": "toolu_x", "name": "bash", "input": {}} + ], + }, + { + "role": "assistant", + "content": [{"type": "text", "text": "weird"}], + }, + ] + snapshot = copy.deepcopy(messages) + import logging + + with caplog.at_level( + logging.WARNING, logger="coding.proxy.convert.vendor_channels" + ): + result = _enforce_pairing_sanity_pass(messages) + assert result == [] + assert messages == snapshot + assert any("Sanity pass" in rec.message for rec in caplog.records) + + def test_normalizes_user_string_content_before_repair(self): + """user content 为 string 时归一化为 list 再补占位.""" + messages = [ + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": "toolu_x", "name": "bash", "input": {}} + ], + }, + {"role": "user", "content": "ack"}, + ] + result = _enforce_pairing_sanity_pass(messages) + assert result == ["pairing_sanity_repaired"] + user_content = messages[1]["content"] + assert isinstance(user_content, list) + assert user_content[0] == {"type": "text", "text": "ack"} + assert user_content[1]["tool_use_id"] == "toolu_x" + assert user_content[1]["is_error"] is True + + def test_skips_non_assistant_messages(self): + """user / system / 异常消息一律跳过.""" + messages = [ + {"role": "user", "content": "hi"}, + {"role": "system", "content": "ctx"}, + "not a dict", # type: ignore[list-item] + ] + snapshot = copy.deepcopy(messages) + result = _enforce_pairing_sanity_pass(messages) + assert result == [] + assert messages == snapshot + + def test_skips_assistant_without_tool_use(self): + """assistant 纯文本(无 tool_use)短路,不影响下一条 user.""" + messages = [ + { + "role": "assistant", + "content": [{"type": "text", "text": "just chatting"}], + }, + {"role": "user", "content": "ok"}, + ] + snapshot = copy.deepcopy(messages) + result = _enforce_pairing_sanity_pass(messages) + assert result == [] + assert messages == snapshot + + def test_enforce_main_loop_chains_sanity_helper(self): + """主 enforce 流程末尾应当调用 sanity helper,标签会出现在 adaptations.""" + # 构造主循环无法剥离/合成的退化场景:直接放一个未配对 tool_use, + # 且 user 端事先放无关 tool_result,绕过主循环的 existing check + messages = [ + { + "role": "assistant", + "content": [ + { + "type": "tool_use", + "id": "toolu_main", + "name": "bash", + "input": {}, + } + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "toolu_unrelated", + "content": "x", + } + ], + }, + ] + fixes = enforce_anthropic_tool_pairing(messages) + # 主循环 F 步会先合成 orphaned_tool_use_repaired, sanity 不再触发 + assert "orphaned_tool_use_repaired" in fixes + assert "pairing_sanity_repaired" not in fixes + # 但 toolu_main 必须最终有对应 tool_result + result_ids = { + b["tool_use_id"] + for b in messages[1]["content"] + if b.get("type") == "tool_result" + } + assert "toolu_main" in result_ids + + # ── 通道层端到端集成(zhipu 产物全量清洗) ─────────────────────────── @@ -1687,6 +1976,135 @@ def test_full_zhipu_artifacts_combined(self): assert relocated[0]["tool_use_id"] == new_id assert any("misplaced_tool_result_relocated" in a for a in adaptations) + def test_handles_out_of_order_inline_tool_result_end_to_end(self): + """端到端复现日志故障场景: assistant content 内 tool_result 排在 server_tool_use 之前. + + 生产日志 `messages.3: tool_use ids were found without tool_result blocks + immediately after: toolu_normalized_2` 错误的等价最小复现. + + 旧单遍 ``_rewrite_srvtoolu_ids`` 会漏改这种 misplaced tool_result 的 + ``tool_use_id``,使 enforce 在 extracted_tool_results 字典中以旧 ID 作 key, + 而 tool_use_ids 已是新 ID,造成 pairing 错位; 修复后两遍扫描确保 + 每个 assistant.tool_use_id 与下一条 user.tool_result.tool_use_id + 一一匹配,且消息体内不再残留任何 ``srvtoolu_*`` / ``server_tool_use``。 + """ + body = { + "messages": [ + {"role": "user", "content": "begin"}, + # 第一轮: 普通配对,建立 toolu_normalized_1 + { + "role": "assistant", + "content": [ + { + "type": "thinking", + "thinking": "...", + "signature": "zhipu_sig_1", + }, + { + "type": "server_tool_use", + "id": "srvtoolu_first", + "name": "bash", + "input": {}, + }, + ], + }, + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": "srvtoolu_first", + "content": "first ok", + } + ], + }, + # 第二轮: 故障形态,tool_result 内联在 server_tool_use 之前 + { + "role": "assistant", + "content": [ + { + "type": "thinking", + "thinking": "...", + "signature": "zhipu_sig_2", + }, + { + "type": "tool_result", + "tool_use_id": "srvtoolu_second", + "content": "inline glm5", + }, + { + "type": "server_tool_use", + "id": "srvtoolu_second", + "name": "bash", + "input": {}, + }, + ], + }, + {"role": "user", "content": "continue"}, + ], + } + prepared, adaptations = prepare_zhipu_to_anthropic(body) + messages = prepared["messages"] + + # 所有 assistant 消息不得残留 server_tool_use / srvtoolu_* / tool_result + for msg in messages: + if msg.get("role") != "assistant": + continue + for b in msg.get("content", []): + assert isinstance(b, dict) + assert b.get("type") != "server_tool_use" + assert b.get("type") != "tool_result" + bid = b.get("id") + if isinstance(bid, str): + assert not bid.startswith("srvtoolu_"), ( + f"assistant content 残留 srvtoolu_* ID: {bid}" + ) + + # 任意 tool_result.tool_use_id 不得保留为 srvtoolu_* 形式 + for msg in messages: + for b in msg.get("content") or []: + if isinstance(b, dict) and b.get("type") == "tool_result": + tid = b.get("tool_use_id") + assert isinstance(tid, str) + assert not tid.startswith("srvtoolu_"), ( + f"tool_result 残留旧 srvtoolu_* 引用: {tid}" + ) + + # 每个 assistant 的 tool_use.id 都能在下一条 user 的 tool_result 中找到匹配 + for i, msg in enumerate(messages): + if msg.get("role") != "assistant": + continue + tool_use_ids = [ + b["id"] + for b in (msg.get("content") or []) + if isinstance(b, dict) and b.get("type") == "tool_use" and b.get("id") + ] + if not tool_use_ids: + continue + next_msg = messages[i + 1] + assert next_msg.get("role") == "user" + next_tool_result_ids = { + b["tool_use_id"] + for b in (next_msg.get("content") or []) + if isinstance(b, dict) + and b.get("type") == "tool_result" + and b.get("tool_use_id") + } + for uid in tool_use_ids: + assert uid in next_tool_result_ids, ( + f"messages[{i}].tool_use_id={uid} 在 messages[{i + 1}] 中" + f"找不到对应 tool_result(next ids = {next_tool_result_ids})" + ) + + # adaptations 覆盖关键变换 + assert any("srvtoolu_ids" in a for a in adaptations) + assert any("misplaced_tool_result_relocated" in a for a in adaptations) + assert any("thinking_blocks" in a for a in adaptations) + # sanity 不应触发: 两遍扫描 + 主 enforce 已经把所有配对补齐 + assert "pairing_sanity_repaired" not in adaptations + # 主 enforce 应当能正确把内联 tool_result 重定位、配对完整 + assert "orphaned_tool_use_repaired" not in adaptations + class TestZhipuToCopilotChannelFullCleanup: """验证 prepare_zhipu_to_copilot 对 zhipu 产物的完整清洗.""" From ec9e866ce1a1ec933f5edfe2de4c71b6810d2d82 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Tue, 12 May 2026 20:26:24 +0800 Subject: [PATCH 34/66] =?UTF-8?q?fix(native-api):=20=E4=BF=AE=E5=A4=8D=20G?= =?UTF-8?q?emini=20:verb=20=E8=B7=AF=E5=BE=84=E4=B8=AD=20%3A=20URL=20?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E5=AF=BC=E8=87=B4=E4=B8=8A=E6=B8=B8=20400=20?= =?UTF-8?q?=E7=9A=84=E5=85=BC=E5=AE=B9=E9=97=AE=E9=A2=98;=20(#237)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit litellm 等客户端会将 Gemini 路径中的冒号 URL 编码为 %3A, 导致上游 API 无法识别 :batchEmbedContents 等 verb 后缀。 修复内容: - handler: dispatch() 中对 rest_path 做防御性 unquote() 解码 - operation: Gemini 正则模式兼容字面 : 与 %3A 两种形态 - 新增 batchEmbedContents 端到端测试及 %3A 编码路径测试 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/native_api/handler.py | 13 ++++- src/coding/proxy/native_api/operation.py | 15 ++--- tests/test_native_api_handler.py | 71 ++++++++++++++++++++++++ tests/test_native_api_operation.py | 17 ++++++ 4 files changed, 107 insertions(+), 9 deletions(-) diff --git a/src/coding/proxy/native_api/handler.py b/src/coding/proxy/native_api/handler.py index 790c5f2..d468f3b 100644 --- a/src/coding/proxy/native_api/handler.py +++ b/src/coding/proxy/native_api/handler.py @@ -18,6 +18,7 @@ import time from collections.abc import AsyncIterator from typing import TYPE_CHECKING +from urllib.parse import unquote import httpx @@ -172,8 +173,16 @@ async def dispatch( ) method = request.method.upper() - operation = OperationClassifier.classify(provider, method, rest_path) - endpoint = rest_path if rest_path.startswith("/") else f"/{rest_path}" + # 防御性 URL 解码:确保 %3A → : 以兼容 Gemini :verb 路径语法。 + # ASGI 规范要求 scope["path"] 已解码,但部分服务器/反向代理对 + # 合法路径字符(如冒号)可能保留编码形态。 + decoded_rest_path = unquote(rest_path) + operation = OperationClassifier.classify(provider, method, decoded_rest_path) + endpoint = ( + decoded_rest_path + if decoded_rest_path.startswith("/") + else f"/{decoded_rest_path}" + ) upstream_headers = _filter_request_headers(dict(request.headers)) # 强制 identity —— 阻止上游压缩(httpx 默认会自动补 gzip,deflate; diff --git a/src/coding/proxy/native_api/operation.py b/src/coding/proxy/native_api/operation.py index 12f3307..1ff82bd 100644 --- a/src/coding/proxy/native_api/operation.py +++ b/src/coding/proxy/native_api/operation.py @@ -51,27 +51,27 @@ class _Rule: # Gemini 的方法动词作为路径后缀(``:generateContent``),通过正则提取 _GEMINI_RULES: tuple[_Rule, ...] = ( _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+:streamGenerateContent/?$"), + re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)streamGenerateContent/?$"), "generate_content", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+:generateContent/?$"), + re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)generateContent/?$"), "generate_content", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+:countTokens/?$"), + re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)countTokens/?$"), "count_tokens", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+:embedContent/?$"), + re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)embedContent/?$"), "embedding", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+:batchEmbedContents/?$"), + re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)batchEmbedContents/?$"), "embedding.batch", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+:predict/?$"), + re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)predict/?$"), "predict", ), _Rule( @@ -159,7 +159,8 @@ def is_stream_path(provider: str, path: str) -> bool: normalized = path if path.startswith("/") else f"/{path}" return bool( re.match( - r"^/?v1(?:beta)?/models/[^/]+:streamGenerateContent/?$", normalized + r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)streamGenerateContent/?$", + normalized, ) ) diff --git a/tests/test_native_api_handler.py b/tests/test_native_api_handler.py index d8db031..d00a054 100644 --- a/tests/test_native_api_handler.py +++ b/tests/test_native_api_handler.py @@ -372,3 +372,74 @@ def factory(make_transport): r = client.request(method, "/api/openai/v1/files/abc") assert r.status_code == 200 assert captured[0].method == method + + +# ── Gemini batchEmbedContents 端到端 ───────────────────────────── + + +def test_gemini_batch_embed_forwards_correctly() -> None: + """Gemini batchEmbedContents 端点(字面冒号)正确转发.""" + + def route(request: httpx.Request) -> httpx.Response: + return httpx.Response( + 200, + json={"embeddings": [{"values": [0.1, 0.2]}]}, + ) + + def factory(make_transport): + cfg = NativeApiConfig( + gemini=NativeProviderConfig( + enabled=True, base_url="https://generativelanguage.googleapis.com" + ), + ) + transport = make_transport(route) + return NativeProxyHandler(cfg, transport=transport), transport + + for client, captured in _make_app(factory): + r = client.post( + "/api/gemini/v1beta/models/gemini-embedding-001:batchEmbedContents?key=secret123", + json={ + "requests": [ + { + "model": "models/gemini-embedding-001", + "content": {"parts": [{"text": "hello"}]}, + } + ] + }, + ) + assert r.status_code == 200 + assert r.json()["embeddings"][0]["values"] == [0.1, 0.2] + upstream = captured[0] + # 上游 URL 必须含字面冒号,不含 %3A + upstream_str = str(upstream.url) + assert ":batchEmbedContents" in upstream_str + assert "%3A" not in upstream_str + assert upstream.url.params.get("key") == "secret123" + + +def test_gemini_url_encoded_colon_decoded_for_upstream() -> None: + """当 %3A 到达代理时,上游必须收到字面冒号.""" + + def route(request: httpx.Request) -> httpx.Response: + return httpx.Response(200, json={"ok": True}) + + def factory(make_transport): + cfg = NativeApiConfig( + gemini=NativeProviderConfig( + enabled=True, base_url="https://generativelanguage.googleapis.com" + ), + ) + transport = make_transport(route) + return NativeProxyHandler(cfg, transport=transport), transport + + for client, captured in _make_app(factory): + r = client.post( + "/api/gemini/v1beta/models/gemini-embedding-001%3AbatchEmbedContents?key=k", + json={"requests": []}, + ) + assert r.status_code == 200 + upstream = captured[0] + upstream_str = str(upstream.url) + # 上游 URL 必须含字面冒号,不含 %3A + assert "%3A" not in upstream_str + assert ":batchEmbedContents" in upstream_str diff --git a/tests/test_native_api_operation.py b/tests/test_native_api_operation.py index 64cd160..fc237bc 100644 --- a/tests/test_native_api_operation.py +++ b/tests/test_native_api_operation.py @@ -55,6 +55,12 @@ def test_classify_openai(path: str, expected: str) -> None: ("/v1beta/models/text-embedding-004:embedContent", "embedding"), ("/v1beta/models/text-embedding-004:batchEmbedContents", "embedding.batch"), ("/v1beta/models/imagegeneration@006:predict", "predict"), + # %3A (URL 编码冒号) 兼容性 + ("/v1beta/models/gemini-embedding-001%3AbatchEmbedContents", "embedding.batch"), + ("/v1beta/models/text-embedding-004%3AembedContent", "embedding"), + ("/v1beta/models/gemini-2.0-flash%3AgenerateContent", "generate_content"), + ("/v1beta/models/gemini-2.0-flash%3AstreamGenerateContent", "generate_content"), + ("/v1beta/models/gemini-1.5-pro%3AcountTokens", "count_tokens"), ("/v1beta/cachedContents", "cache"), ("/v1beta/cachedContents/cachedContents-xyz", "cache"), ("/v1beta/files", "file"), @@ -128,3 +134,14 @@ def test_is_stream_path() -> None: # OpenAI / Anthropic 不走路径判定(以响应 content-type 为准) assert not OperationClassifier.is_stream_path("openai", "/v1/chat/completions") assert not OperationClassifier.is_stream_path("anthropic", "/v1/messages") + + +def test_is_stream_path_with_encoded_colon() -> None: + """%3A (URL 编码冒号) 也应被 is_stream_path 识别.""" + assert OperationClassifier.is_stream_path( + "gemini", "/v1beta/models/gemini-2.0-flash%3AstreamGenerateContent" + ) + # %3A + 非流式路径仍应返回 False + assert not OperationClassifier.is_stream_path( + "gemini", "/v1beta/models/gemini-2.0-flash%3AgenerateContent" + ) From cb967f498ffc2e5368e90ecd395502718ae5cdb4 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Tue, 12 May 2026 21:27:23 +0800 Subject: [PATCH 35/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E8=87=B3=200.4.1a1;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f6f0da5..283dc9f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.0" +version = "0.4.1a1" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 79995a3..51fbba1 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.0" +version = "0.4.1a1" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From f481fe64d58427fd174e78227b1345a5550be95d Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Wed, 13 May 2026 01:20:19 +0800 Subject: [PATCH 36/66] =?UTF-8?q?fix(native-api):=20=E4=BF=AE=E5=A4=8D=20G?= =?UTF-8?q?emini=20embedding=20=E9=80=8F=E4=BC=A0=E8=87=B3=20Vertex=20AI?= =?UTF-8?q?=20=E9=A3=8E=E6=A0=BC=E4=B8=8A=E6=B8=B8=E7=9A=84=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E9=80=82=E9=85=8D=E9=97=AE=E9=A2=98=20(#238)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(native-api): 修复 Gemini embedding 透传至 Vertex AI 风格上游的协议适配问题; - 在非官方上游场景下,将 Google AI Studio 格式(v1beta/models/{model}:batchEmbedContents) 自动转换为 Vertex AI 格式(v1beta1/publishers/google/models/{model}:embedContent) - batchEmbedContents 拆分为并发 embedContent 调用,聚合响应为 {"embeddings": [...]} - 放宽 OperationClassifier 路径正则,兼容 litellm _check_custom_proxy 丢失 v1beta 前缀的 bug - 官方 generativelanguage.googleapis.com 仍走字节级透传,无回归影响 - 补充 3 个回归测试 + docs/issue.md 复盘条目 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(native-api): 修复批量嵌入子请求网络异常未捕获导致 500 的问题; 在 _vertex_batch_embed._single 中为 client.send() 添加与 _vertex_single_embed 一致的 httpx 网络异常处理(TimeoutException/ConnectError/ReadError/RemoteProtocolError), 确保子请求超时或连接失败时返回 502 而非触发未处理异常。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- docs/issue.md | 54 ++++ src/coding/proxy/native_api/handler.py | 331 +++++++++++++++++++++++ src/coding/proxy/native_api/operation.py | 18 +- tests/test_native_api_handler.py | 118 ++++++++ 4 files changed, 514 insertions(+), 7 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index 66fd61f..6da58f6 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -132,3 +132,57 @@ AttributeError: 'ZhipuVendor' object has no attribute 'name' - 已 `grep -rn "vendor\.name\b" src/` 全仓扫描,确认 `target_vendor.name | vendor.name` 误用仅 routes.py 的这两处,已随本次修复一并消除。`/v1/messages` 主链路在 executor 中调用 `tier.name`(`Tier` 对象的合法 dataclass 属性),与 vendor 实例 `name` 无关,不受影响。 - 若未来新增 Vendor 子类,仍只需实现 `get_name()` 抽象方法;外部调用方应遵循同一契约,本档案的修复模式可作为参考。 + +--- + +## Gemini embedding 透传至 Vertex AI 上游返回 `request body doesn't contain valid prompts` + +**问题描述** + +通过本代理调用 Gemini embedding 模型时,上游返回 400: + +``` +litellm.BadRequestError: GeminiException BadRequestError - +{"error":{"message":"request body doesn't contain valid prompts"}} +POST /api/gemini/v1beta/models/gemini-embedding-001%3AbatchEmbedContents 400 +``` + +litellm 报错日志中 URL 路径是 `:batchEmbedContents`,调用端疑似格式不兼容。 + +**表因** + +litellm 按 Google AI Studio 格式构造请求: +- 路径:`POST {api_base}/v1beta/models/{model}:batchEmbedContents` +- Body:`{"requests": [{"model": "models/...", "content": {"parts": [{"text": "..."}]}}]}` + +但实际上游(如 `llms.as-in.io` 这类 Vertex AI 风格网关)只接受 Vertex AI 格式: +- 路径:`POST {api_base}/v1beta1/publishers/google/models/{model}:embedContent` +- Body:`{"content": {"parts": [{"text": "..."}]}}` + +且无 `batchEmbedContents` 端点。 + +**根因** + +1. 代理 `NativeProxyHandler.dispatch()` 是字节级透传,对 embedding 端点未做协议适配,直接把 Google AI Studio 格式的 URL/Body 转给 Vertex AI 上游,路由不匹配。 +2. litellm `_check_custom_proxy()` 在自定义 `api_base` 场景下会丢失 `v1beta/` 版本前缀,发送 `{api_base}/models/{model}:verb`,使代理原有的 `OperationClassifier` 正则(要求 `v1beta/` 前缀)失配,进而走原始透传分支再次失败。 + +**处理方式** + +1. `src/coding/proxy/native_api/operation.py`:放宽 Gemini 路径正则中的 `v1(?:beta1?)?/` 段为可选,兼容 litellm 丢失版本前缀的异常路径。 +2. `src/coding/proxy/native_api/handler.py`:在 `dispatch()` 中新增 Gemini embedding Vertex AI 适配分支: + - 仅当 `provider == "gemini"`、`operation in {"embedding", "embedding.batch"}`、且 `base_url` 非官方 `generativelanguage.googleapis.com` 时启用; + - `embedContent` → 重写路径为 `v1beta1/publishers/google/models/{model}:embedContent`,剥离 body 中的 `model` 字段; + - `batchEmbedContents` → 拆分为多次并发 `embedContent` 调用(`asyncio.gather`),聚合响应为 `{"embeddings": [...]}` 返回; + - 用量抽取累加各子请求的 `usageMetadata`。 +3. `tests/test_native_api_handler.py`:新增 3 个回归测试覆盖单次 / 批量 / 官方上游透传不变三类场景。 + +**后续防范** + +- 协议适配层只对**非官方上游**生效,官方 `generativelanguage.googleapis.com` 仍走字节级透传,避免引入不必要的转换开销与协议偏差。 +- 上游路径分支的判定优先用 base_url 域名而非依赖网关行为特征,便于后续扩展(如 Vertex Express、其他 LLM gateway)时的精确匹配。 +- 真实链路验证:使用 litellm `embedding(api_base=..., api_key=...)` 单输入 / 多输入分别调用,确认返回 3072 维向量及正确批量计数。 + +**同类问题影响与处理注意事项** + +- litellm 在 Gemini 其他端点(`generateContent` / `countTokens`)同样存在 `_check_custom_proxy` 丢失 `v1beta/` 前缀的 bug;本次仅放宽了 `operation.py` 中的路径正则(让分类器能识别此类异常路径),未对这些端点做格式转换,因为非 embedding 端点的 Google AI Studio / Vertex AI 请求体差异较小,多数上游兼容。如未来出现类似失配再做针对性适配。 +- 若上游网关同时支持 OpenAI `/v1/embeddings` 与 Vertex AI 路径,建议优先在客户端配置 OpenAI 兼容路径,减少协议转换链路。 diff --git a/src/coding/proxy/native_api/handler.py b/src/coding/proxy/native_api/handler.py index d468f3b..ab7b344 100644 --- a/src/coding/proxy/native_api/handler.py +++ b/src/coding/proxy/native_api/handler.py @@ -13,8 +13,10 @@ from __future__ import annotations +import asyncio import json import logging +import re import time from collections.abc import AsyncIterator from typing import TYPE_CHECKING @@ -194,6 +196,28 @@ async def dispatch( start_ts = time.perf_counter() client = self._get_client(provider) + # ── Gemini embedding Vertex AI 格式转换 ────────────────── + # 当上游非官方 Google AI Studio(generativelanguage.googleapis.com)时, + # litellm 发送的 Google AI Studio 格式(v1beta/models/{model}:batchEmbedContents) + # 需转换为 Vertex AI 格式(v1beta1/publishers/google/models/{model}:embedContent)。 + vertex_rewrite = ( + provider == "gemini" + and operation in ("embedding", "embedding.batch") + and cfg.base_url + and "generativelanguage.googleapis.com" not in cfg.base_url + ) + if vertex_rewrite: + return await self._dispatch_gemini_vertex_embedding( + client=client, + operation=operation, + endpoint=endpoint, + body_bytes=body_bytes, + upstream_headers=upstream_headers, + query_string=query_string, + provider=provider, + start_ts=start_ts, + ) + # 构造上游 URL(保留 query) upstream_url = endpoint if query_string: @@ -295,6 +319,313 @@ async def dispatch( media_type=content_type or None, ) + # ── Gemini embedding → Vertex AI 格式转换 ────────────────── + + # Google AI Studio 路径正则:[v1beta/]models/{model}:{verb} + # 版本段允许缺失以兼容 litellm `_check_custom_proxy` 丢失 v1beta 前缀的 bug。 + _GEMINI_EMBED_PATH_RE = re.compile( + r"^/?(?:v1(?:beta1?)?/)?models/(?P[^/:]+)(?::|%3A)(?PembedContent|batchEmbedContents)/?$" + ) + + async def _dispatch_gemini_vertex_embedding( + self, + *, + client: httpx.AsyncClient, + operation: str, + endpoint: str, + body_bytes: bytes, + upstream_headers: dict[str, str], + query_string: str, + provider: str, + start_ts: float, + ) -> StarletteResponse: + """将 Google AI Studio 格式的 embedding 请求转换为 Vertex AI 格式. + + Google AI Studio: + POST v1beta/models/{model}:batchEmbedContents + Body: {"requests": [{"model": "models/{model}", "content": {...}}]} + + Vertex AI: + POST v1beta1/publishers/google/models/{model}:embedContent + Body: {"content": {...}} + """ + from fastapi.responses import Response as FastAPIResponse + + match = self._GEMINI_EMBED_PATH_RE.match(endpoint) + if not match: + return FastAPIResponse( + content=json.dumps( + { + "error": { + "message": f"unrecognized gemini embedding path: {endpoint}" + } + } + ).encode(), + status_code=400, + media_type="application/json", + ) + + model_name = match.group("model") + verb = match.group("verb") + + # 解析原始请求体 + try: + body = json.loads(body_bytes) if body_bytes else {} + except (json.JSONDecodeError, UnicodeDecodeError): + return FastAPIResponse( + content=json.dumps( + {"error": {"message": "invalid JSON body for embedding request"}} + ).encode(), + status_code=400, + media_type="application/json", + ) + + if verb == "batchEmbedContents": + return await self._vertex_batch_embed( + client=client, + model_name=model_name, + body=body, + upstream_headers=upstream_headers, + query_string=query_string, + provider=provider, + operation=operation, + endpoint=endpoint, + start_ts=start_ts, + ) + + # 单次 embedContent:直接转换 + content = body.get("content", body) + return await self._vertex_single_embed( + client=client, + model_name=model_name, + content=content, + upstream_headers=upstream_headers, + query_string=query_string, + provider=provider, + operation=operation, + endpoint=endpoint, + start_ts=start_ts, + ) + + async def _vertex_single_embed( + self, + *, + client: httpx.AsyncClient, + model_name: str, + content: dict, + upstream_headers: dict[str, str], + query_string: str, + provider: str, + operation: str, + endpoint: str, + start_ts: float, + ) -> StarletteResponse: + """发送单次 Vertex AI embedContent 请求.""" + from fastapi.responses import Response as FastAPIResponse + + vertex_path = f"/v1beta1/publishers/google/models/{model_name}:embedContent" + vertex_url = vertex_path + if query_string: + vertex_url = f"{vertex_path}?{query_string}" + + vertex_body = json.dumps({"content": content}).encode() + + req = client.build_request( + method="POST", + url=vertex_url, + content=vertex_body, + headers=upstream_headers, + ) + + try: + upstream_resp = await client.send(req, stream=True) + except ( + httpx.TimeoutException, + httpx.ConnectError, + httpx.ReadError, + httpx.RemoteProtocolError, + ) as exc: + duration_ms = int((time.perf_counter() - start_ts) * 1000) + await self._record_failure( + provider=provider, + operation=operation, + endpoint=endpoint, + duration_ms=duration_ms, + reason=str(exc), + ) + return FastAPIResponse( + content=json.dumps( + { + "error": { + "message": f"upstream unreachable: {exc}", + "type": "api_error", + } + } + ).encode(), + status_code=502, + media_type="application/json", + ) + + try: + raw_body = await upstream_resp.aread() + finally: + await upstream_resp.aclose() + + duration_ms = int((time.perf_counter() - start_ts) * 1000) + status = upstream_resp.status_code + content_type = upstream_resp.headers.get("content-type", "").lower() + resp_headers = _filter_response_headers(dict(upstream_resp.headers)) + + # 用量抽取 + extraction = ExtractionResult() + if "application/json" in content_type and raw_body: + try: + parsed = json.loads(raw_body.decode("utf-8", errors="replace")) + if isinstance(parsed, dict): + extraction = extract_usage( + provider, operation, parsed, status, dict(upstream_resp.headers) + ) + except (json.JSONDecodeError, UnicodeDecodeError): + pass + + vendor_label = _VENDOR_LABEL[provider] + await self._record_usage( + provider=provider, + operation=operation, + endpoint=endpoint, + duration_ms=duration_ms, + status=status, + extraction=extraction, + evidence_records=_build_nonstream_evidence( + vendor=vendor_label, extraction=extraction + ), + ) + + return FastAPIResponse( + content=raw_body, + status_code=status, + headers=resp_headers, + media_type=content_type or None, + ) + + async def _vertex_batch_embed( + self, + *, + client: httpx.AsyncClient, + model_name: str, + body: dict, + upstream_headers: dict[str, str], + query_string: str, + provider: str, + operation: str, + endpoint: str, + start_ts: float, + ) -> StarletteResponse: + """将 batchEmbedContents 拆分为多次 embedContent 调用并聚合响应.""" + from fastapi.responses import Response as FastAPIResponse + + requests_list = body.get("requests", []) + if not requests_list: + return FastAPIResponse( + content=json.dumps( + { + "error": { + "message": "batchEmbedContents requires non-empty 'requests' field" + } + } + ).encode(), + status_code=400, + media_type="application/json", + ) + + vertex_path = f"/v1beta1/publishers/google/models/{model_name}:embedContent" + vertex_url = vertex_path + if query_string: + vertex_url = f"{vertex_path}?{query_string}" + + # 并发发送所有 embedContent 请求 + async def _single(req_body: dict) -> tuple[dict, int]: + content = req_body.get("content", req_body) + vertex_body = json.dumps({"content": content}).encode() + req = client.build_request( + method="POST", + url=vertex_url, + content=vertex_body, + headers=upstream_headers, + ) + try: + resp = await client.send(req, stream=False) + except ( + httpx.TimeoutException, + httpx.ConnectError, + httpx.ReadError, + httpx.RemoteProtocolError, + ) as exc: + return {"error": {"message": f"upstream unreachable: {exc}"}}, 502 + try: + return resp.json(), resp.status_code + except Exception: + return {"error": {"message": resp.text[:200]}}, resp.status_code + + results = await asyncio.gather(*[_single(r) for r in requests_list]) + + # 检查是否有失败的请求 + embeddings = [] + for resp_json, resp_status in results: + if resp_status != 200: + # 返回第一个错误 + return FastAPIResponse( + content=json.dumps(resp_json).encode(), + status_code=resp_status, + media_type="application/json", + ) + embedding_data = resp_json.get("embedding", {}) + embeddings.append(embedding_data) + + # 聚合为 batchEmbedContents 响应格式 + batch_response = {"embeddings": embeddings} + duration_ms = int((time.perf_counter() - start_ts) * 1000) + + # 用量抽取 + extraction = ExtractionResult() + for resp_json, _ in results: + if isinstance(resp_json, dict): + ext = extract_usage(provider, operation, resp_json, 200, {}) + extraction = ExtractionResult( + input_tokens=extraction.input_tokens + ext.input_tokens, + output_tokens=extraction.output_tokens + ext.output_tokens, + cache_creation_tokens=extraction.cache_creation_tokens + + ext.cache_creation_tokens, + cache_read_tokens=extraction.cache_read_tokens + + ext.cache_read_tokens, + request_id=ext.request_id or extraction.request_id, + model_served=ext.model_served or extraction.model_served, + raw_usage=ext.raw_usage or extraction.raw_usage, + source_field_map=ext.source_field_map + or extraction.source_field_map, + evidence_kind=ext.evidence_kind or extraction.evidence_kind, + extra_usage=ext.extra_usage or extraction.extra_usage, + ) + + vendor_label = _VENDOR_LABEL[provider] + await self._record_usage( + provider=provider, + operation=operation, + endpoint=endpoint, + duration_ms=duration_ms, + status=200, + extraction=extraction, + evidence_records=_build_nonstream_evidence( + vendor=vendor_label, extraction=extraction + ), + ) + + return FastAPIResponse( + content=json.dumps(batch_response).encode(), + status_code=200, + media_type="application/json", + ) + # ── SSE 流式转发(同时累加 usage) ───────────────────────── async def _stream_and_accumulate( diff --git a/src/coding/proxy/native_api/operation.py b/src/coding/proxy/native_api/operation.py index 1ff82bd..2080b6c 100644 --- a/src/coding/proxy/native_api/operation.py +++ b/src/coding/proxy/native_api/operation.py @@ -48,30 +48,34 @@ class _Rule: ) # ── Gemini ──────────────────────────────────────────────────────── -# Gemini 的方法动词作为路径后缀(``:generateContent``),通过正则提取 +# Gemini 的方法动词作为路径后缀(``:generateContent``),通过正则提取。 +# ``v1(?:beta1?)?/`` 前缀允许缺失,以兼容 litellm `_check_custom_proxy` 在 +# 自定义 ``api_base`` 场景下丢失版本段的 bug(参考 litellm issue #17759)。 _GEMINI_RULES: tuple[_Rule, ...] = ( _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)streamGenerateContent/?$"), + re.compile( + r"^/?(?:v1(?:beta1?)?/)?models/[^/]+(?:%3A|:)streamGenerateContent/?$" + ), "generate_content", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)generateContent/?$"), + re.compile(r"^/?(?:v1(?:beta1?)?/)?models/[^/]+(?:%3A|:)generateContent/?$"), "generate_content", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)countTokens/?$"), + re.compile(r"^/?(?:v1(?:beta1?)?/)?models/[^/]+(?:%3A|:)countTokens/?$"), "count_tokens", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)embedContent/?$"), + re.compile(r"^/?(?:v1(?:beta1?)?/)?models/[^/]+(?:%3A|:)embedContent/?$"), "embedding", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)batchEmbedContents/?$"), + re.compile(r"^/?(?:v1(?:beta1?)?/)?models/[^/]+(?:%3A|:)batchEmbedContents/?$"), "embedding.batch", ), _Rule( - re.compile(r"^/?v1(?:beta)?/models/[^/]+(?:%3A|:)predict/?$"), + re.compile(r"^/?(?:v1(?:beta1?)?/)?models/[^/]+(?:%3A|:)predict/?$"), "predict", ), _Rule( diff --git a/tests/test_native_api_handler.py b/tests/test_native_api_handler.py index d00a054..14be66c 100644 --- a/tests/test_native_api_handler.py +++ b/tests/test_native_api_handler.py @@ -14,6 +14,7 @@ from __future__ import annotations +import json from collections.abc import Iterator import httpx @@ -443,3 +444,120 @@ def factory(make_transport): # 上游 URL 必须含字面冒号,不含 %3A assert "%3A" not in upstream_str assert ":batchEmbedContents" in upstream_str + + +# ── Gemini embedding Vertex AI 格式转换 ───────────────────────── + + +def test_gemini_vertex_embed_content_single() -> None: + """非官方上游时,embedContent 转为 Vertex AI 格式.""" + + def route(request: httpx.Request) -> httpx.Response: + body = json.loads(request.content) + assert "content" in body + assert "model" not in body + assert "requests" not in body + assert ":embedContent" in str(request.url) + assert "v1beta1/publishers/google/models" in str(request.url) + return httpx.Response(200, json={"embedding": {"values": [0.1, 0.2]}}) + + def factory(make_transport): + cfg = NativeApiConfig( + gemini=NativeProviderConfig(enabled=True, base_url="http://llms.as-in.io"), + ) + transport = make_transport(route) + return NativeProxyHandler(cfg, transport=transport), transport + + for client, captured in _make_app(factory): + r = client.post( + "/api/gemini/v1beta/models/gemini-embedding-2-preview:embedContent", + json={ + "model": "models/gemini-embedding-2-preview", + "content": {"parts": [{"text": "hello"}]}, + }, + ) + assert r.status_code == 200 + assert "embedding" in r.json() + + +def test_gemini_vertex_batch_embed_contents() -> None: + """非官方上游时,batchEmbedContents 拆分为多次 embedContent 并聚合.""" + + call_count = 0 + + def route(request: httpx.Request) -> httpx.Response: + nonlocal call_count + call_count += 1 + body = json.loads(request.content) + assert "content" in body + assert ":embedContent" in str(request.url) + assert "v1beta1/publishers/google/models" in str(request.url) + return httpx.Response( + 200, + json={"embedding": {"values": [float(call_count), 0.5]}}, + ) + + def factory(make_transport): + cfg = NativeApiConfig( + gemini=NativeProviderConfig(enabled=True, base_url="http://llms.as-in.io"), + ) + transport = make_transport(route) + return NativeProxyHandler(cfg, transport=transport), transport + + for client, captured in _make_app(factory): + r = client.post( + "/api/gemini/v1beta/models/gemini-embedding-2-preview:batchEmbedContents", + json={ + "requests": [ + { + "model": "models/gemini-embedding-2-preview", + "content": {"parts": [{"text": "hello"}]}, + }, + { + "model": "models/gemini-embedding-2-preview", + "content": {"parts": [{"text": "world"}]}, + }, + ] + }, + ) + assert r.status_code == 200 + data = r.json() + assert "embeddings" in data + assert len(data["embeddings"]) == 2 + assert data["embeddings"][0]["values"] == [1.0, 0.5] + assert data["embeddings"][1]["values"] == [2.0, 0.5] + assert call_count == 2 + + +def test_gemini_vertex_embed_official_upstream_unchanged() -> None: + """官方上游时,batchEmbedContents 走原始透传路径,不做格式转换.""" + + def route(request: httpx.Request) -> httpx.Response: + return httpx.Response(200, json={"embeddings": [{"values": [0.1, 0.2]}]}) + + def factory(make_transport): + cfg = NativeApiConfig( + gemini=NativeProviderConfig( + enabled=True, base_url="https://generativelanguage.googleapis.com" + ), + ) + transport = make_transport(route) + return NativeProxyHandler(cfg, transport=transport), transport + + for client, captured in _make_app(factory): + r = client.post( + "/api/gemini/v1beta/models/gemini-embedding-001:batchEmbedContents?key=k", + json={ + "requests": [ + { + "model": "models/gemini-embedding-001", + "content": {"parts": [{"text": "hello"}]}, + } + ] + }, + ) + assert r.status_code == 200 + # 官方上游走原始路径,URL 保持 v1beta/models/ 格式 + upstream = captured[0] + assert "v1beta/models" in str(upstream.url) + assert "v1beta1/publishers" not in str(upstream.url) From e2e02c76862b15674c894a1e3528ccefbfec52d0 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 13 May 2026 09:26:56 +0800 Subject: [PATCH 37/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E8=87=B3=200.4.1a2;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 283dc9f..f50db07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a1" +version = "0.4.1a2" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 51fbba1..0127434 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a1" +version = "0.4.1a2" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 52be11c8c931f55d5402a56209ed0b1fb51370ae Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Fri, 15 May 2026 22:55:06 +0800 Subject: [PATCH 38/66] =?UTF-8?q?docs(AGENTS):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E8=A1=8C=E4=B8=BA=E5=87=86=E5=88=99=E5=B9=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=9F=A5=E8=AF=86=E7=B4=A2=E5=BC=95=E6=96=87?= =?UTF-8?q?=E4=BB=B6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 道层:增强循证工程与系统完整性的描述深度,新增「知识结晶」与「主动导航」原则,将反馈闭环、演进式设计、二阶思维上提至对应原则内; 法层:修正「Plan Node Default」为「Plan-First Default」,将复用驱动的术语从 Composition over Construction 修正为 Compose over Reinvent,移除已上提至道层的冗余条目; 术层:将「Vibe Coding Pipeline」修正为「Structured AI-Pair Pipeline」,合并 Git 相关规范为统一的「Git Discipline」,新增「Testing」独立条目,新增「Browser Validation Protocol」与「Knowledge Map」引用规范; 移除底部独立的 Knowledge Map (WIP) 段落,改为独立文件 docs/agents/knowledge-map.md。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- AGENTS.md | 40 +++++++++++++++--------------------- docs/agents/knowledge-map.md | 3 +++ 2 files changed, 19 insertions(+), 24 deletions(-) create mode 100644 docs/agents/knowledge-map.md diff --git a/AGENTS.md b/AGENTS.md index 30d9d7a..f6f17f0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,15 +2,11 @@ ## Collaboration Protocol (协作协议) -本文件旨在规范 AI Agent(Claude Code、Antigravity 等)在本项目中的代码与文档协作行为。 +本文件旨在规范 AI Agent(Claude Code、Antigravity 等)在本项目中的代码与文档协作行为。项目定位详见 [README.md](./README.md)。 - **Core Language**: Output MUST be in **Chinese (Simplified)** unless serving code/technical constraints. - **Tone**: Professional, precise, and evidence-based. -## Project Positioning (项目定位) - -参考 README.md - ## Engineering Code of Conduct (工程行为准则) **Core Philosophy**: **Entropy Reduction (熵减)**. 通过上下文锚定、复用驱动与标准化流水线,对抗软件系统的无序熵增。 @@ -19,40 +15,40 @@ - **Context-Driven (上下文驱动)**: 上下文是第一性要素 (Context Quality First)。任何变更需建立在深度理解之上(CDD),拒绝基于关键字匹配的机械式修改。 - **Minimal Intervention (最小干预)**: 遵循奥卡姆剃刀与 YAGNI 原则,仅实施必要的变更,推崇演进式设计 (Evolutionary Design) 而非过度设计。 -- **Evidence-Based (循证工程)**: 杜绝主观臆断,核心决策需以权威文献(IEEE 格式)为佐证,构建 Feedback Loops 以验证假设。 -- **Systemic Integrity (系统完整性)**: 具备全局视角与二阶思维 (Second-Order Thinking),评估变更对上下游依赖及整个生态(Engine, Adapter, Agent, UI)的“涟漪效应”,优先保障整体稳定性与逻辑自洽。 +- **Evidence-Based (循证工程)**: 杜绝主观臆断,核心决策需以权威文献(IEEE 格式)为佐证,构建“设计-实现-验证”的完整反馈闭环,确保每一项工程行动都能产生可观测的反馈信号(测试、日志、监控),以验证假设并指导迭代。 +- **Systemic Integrity (系统完整性)**: 具备全局视角与二阶思维 (Second-Order Thinking),评估变更对上下游依赖及整个生态(Engine, Adapter, Agent, UI)的“涟漪效应”,不只关注变更的直接结果,更要预测“结果的结果”(如引入缓存导致的陈旧数据、重试机制引发的雪崩),优先保障整体稳定性与逻辑自洽。 +- **Knowledge Crystallization (知识结晶)**: 将系统视为有机体,通过将工程错误与 AI 失败案例转化为经验约束 (Negative Prompts) 和持久化知识,驱动系统的自我进化与持续熵减。 +- **Proactive Navigation (主动导航)**: 智能体不应止步于被动响应,需即时转化为“领航者”。在交付任务结果的同时,**必须**基于上下文预判并提出**下一步最佳行动建议 (Next Best Action)**,不仅交付“答案”,更要交付“路径”,消除用户决策的认知摩擦。 ### 法 (Strategy - 架构原则) -- **Plan Node Default (默认规划模式)**: 面对任何非琐碎任务(预估步骤 > 3 或涉及架构级决策),**必须**率先进入 Plan 模式。规划产物需明确界定:功能边界、边缘 Case 应对策略、与现有逻辑的交互锚点以及预计改动的爆炸半径。 +- **Plan-First Default (规划先行)**: 面对任何非琐碎任务(预估步骤 > 3 或涉及架构级决策),**必须**率先进入 Plan 模式。规划产物需明确界定:功能边界、边缘 Case 应对策略、与现有逻辑的交互锚点以及预计改动的爆炸半径。 - **Subagent Strategy (子代理并发策略)**: 面对高复杂度命题,严禁主 Agent 单点统揽。应贯彻“算力换空间”思路,果断编排 Subagent 进行任务拆解与并行攻坚,主 Agent 的职责需严格收敛于上下文协同与最终成果的组装整合。 - **Verification Before Done (交付前验证定式)**: 严禁在缺乏确凿运行证据的情况下标记任务为“已完成”。交付阶段**强制要求**提供客观自证材料:Diff 变更分析、测试用例覆盖、实施日志截图及核心链路边缘 Case 验证结果,并时刻以“方案是否能通过 Staff Engineer 严格审查”的视角自检。 -- **Reuse-Driven (复用驱动)**: Composition over Construction。系统变更**必须**主动参考业界经典设计模式与最佳实践。在进入实质性编码前,需率先对相关领域的成熟范式进行深度调研,并结合当前项目上下文输出充分的关联分析与方案梳理。坚决贯彻“拿来主义”,优先通过组合与集成来构建系统,防范闭门造车与重复造轮子。 +- **Reuse-Driven (复用驱动)**: Compose over Reinvent。系统变更**必须**主动参考业界经典设计模式与最佳实践。在进入实质性编码前,需率先对相关领域的成熟范式进行深度调研,并结合当前项目上下文输出充分的关联分析与方案梳理。坚决贯彻“拿来主义”,优先通过组合与集成来构建系统,防范闭门造车与重复造轮子。 - **Boundary Management (边界管理)**: 严控模块/Agent 间的职责边界与契约,确保高内聚低耦合,防范隐式依赖穿透。 - **Orthogonal Decomposition (正交分解)**: 坚持“正交地提取概念主体”。识别系统中独立变化的维度并进行解耦(如机制与策略分离),确保单一概念主体的变更具备局部性,避免逻辑纠缠。 -- **Feedback Loops (反馈闭环)**:构建“设计-实现-验证”的完整闭环,确保每一项工程行动都能产生可观测的反馈信号(测试、日志、监控),以验证假设并指导迭代。 -- **Evolutionary Design (演进式设计)**: 将系统视为有机体,通过将 AI 错误转化为经验约束 (Negative Prompts) 和持久化知识,实现系统的自我进化与熵减。 -- **Second-Order Thinking (二阶思维)**:不只关注变更的直接结果,更要预测“结果的结果”(如引入缓存导致的陈旧数据、重试机制引发的雪崩),未雨绸缪防范隐性风险。 - **Single Source of Truth (单一事实源)**:严格维护唯一的权威定义源。引用时**必须**使用轻量级指针 (Link/ID) 而非数据副本 (Copy-Paste),从根源消除断裂 (Split-Brain) 风险。 -- **Proactive Navigation (主动导航)**: 智能体不应止步于被动响应,需即时转化为“领航者”。在交付任务结果的同时,**必须**基于上下文预判并提出**下一步最佳行动建议 (Next Best Action)**。不仅交付“答案”,更要交付“路径”,消除用户决策的认知摩擦,确保持续的熵减动量。 ### 术 (Tactics - 执行规范) -- **Vibe Coding Pipeline**: 遵循 **Specification-Driven (规划驱动)** + **Context-Anchored (上下文锚定)** + **AI-Pair (AI 结对)** 模式,将开发固化为可审计的流水线,避免代码腐化为无法维护的“大泥球 (Big Ball of Mud)”。 +- **Structured AI-Pair Pipeline (规范化 AI 结对流水线)**: 遵循 **Specification-Driven (规约驱动)** + **Context-Anchored (上下文锚定)** + **AI-Pair (AI 结对)** 模式,将开发固化为可审计的流水线,避免代码腐化为无法维护的“大泥球 (Big Ball of Mud)”。 - **Visual Documentation (图文并茂)**: 对于复杂逻辑,优先使用 Mermaid 图表(Sequence/Flowchart/Class)辅助说明,构建“图文并茂”的直观文档。 - **Direct Hyperlinking (直接跳转)**: 在文档中提及 Repo 内其他资源(文档/代码)时,**必须**构建可跳转的相对路径链接(如 `[Doc Name](./path.md)`),严禁使用“死文本”引用,以降低信息检索熵。 - **Operational Excellence (卓越运营)**: - 1. **Git Hygiene**: 如非显性要求,严禁调用 git commit; + 1. **Git Discipline**: 默认严禁调用 git commit;当用户显式要求提交时,一律使用 Claude Code 的自定义 Slash Command: `/commit-no-push` 进行操作(若非 Claude Code 运行环境,则读取 /commit-no-push 命令中的规则执行)。严禁执行 Rebase; 2. **Temp Management**: 临时产物(执行计划等)一律收敛至 `.temp/` 并及时清理; 3. **Link Validity**: 确保所有引用的 URL 可访问且具备明确的上下文价值; - 4. **Git Commit**: 在需要提交变更到 Git 时,一律使用 Shell 调用 Claude Code 的自定义 Slash Command: `/commit` 进行 git commit 操作(若环境中未安装 Claude Code,则直接读取 `~/.claude/commands/commit.md`,按照其中的规则进行 git commit 操作)。不要执行 Rebase。 - 5. **Pre-commit Hooks**: 克隆仓库后执行 `uv run pre-commit install` 激活本地 Git hooks,使 Ruff lint(含 auto-fix)、Ruff format 及通用代码卫生检查在每次 commit 前自动运行。若 hooks 自动修复了问题,提交会被中断,执行 `git add -p` 审阅修复内容后重新提交即可。 - 6. **Issue**: 在 docs/issue.md 中维护你处理过的 Issue 摘要(问题描述、表因根因、处理方式、后续防范、同类问题影响与处理注意实现等),便于同类问题的跨上下文处理;注意识别相同 Issue,不要同 Issue 多处维护。 + 4. **Testing**: 统一在 tests/ 下维护测试用例,区分单元测试(unit)和集成测试(integration),所有测试的本地运行总时间控制在 3 min 以内; + 5. **Pre-commit Hooks**: 首次克隆仓库使用 `uv run pre-commit install` 激活本地 Git hooks,使 Ruff lint(含 auto-fix)、Ruff format 及通用代码卫生检查在每次 commit 前自动运行。若 hooks 自动修复了问题,提交会被中断,执行 `git add -p` 审阅修复内容后重新提交即可; + 6. **Issue**: 在 docs/issue.md 中维护你处理过的 Issue 摘要(问题描述、表因根因、处理方式、后续防范、同类问题影响与处理注意事项等),便于同类问题的跨上下文处理;注意识别相同 Issue,不要同 Issue 多处维护。 - **Package Management Standardization (包管理规范)**: 1. **Python**: 严禁使用 pip/poetry,**必须**统一使用 `uv` 进行包管理与脚本执行(如 `uv run`); - 2. **JavaScript/TypeScript**: 严禁使用 npm/yarn,**必须**统一使用 `pnpm` 进行包管理与脚本执行。 + 2. **JavaScript/TypeScript**: 严禁使用 npm/yarn,**必须**统一使用 `pnpm` 进行包管理与脚本执行; - **Database Management**: 谨慎操作,数据迁移、测试等操作严禁将现有数据删除,谨慎操作数据迁移的回滚,防止数据被清理。 -- **In-depth and close to the facts**:系统且全面地进行问题的分析,深入贴近事实,如有疑问,需先发问,不要乱做决定。 +- **Browser Validation Protocol (浏览器验证准则)**:Agent 不得自行完成、绕过或模拟任何 OAuth / SSO 认证流程,所有登录态均来源于用户已认证的 Chrome 主 profile(真实用户登录态)。完整协议(连通性自检、凭证管理、E2E 集成、实机回归等)详见 [浏览器验证协议](./docs/agents/browser-validation.md); + 1. **安全红线**:禁止在 Sandbox 浏览器中跳转 Google 同意屏;禁止以模拟用户或第三方账号替代真实登录态;禁止要求用户在 chat 中粘贴密码、Cookie 或验证码; +- **Knowledge Map (知识索引)**:项目所有文档索引统一维护在 [知识索引](./docs/agents/knowledge-map.md),并在文档目录变更时即时同步跟新; ## Documentation Standards (文档规范) @@ -79,7 +75,3 @@ ```latex [1] A. Vaswani et al., "Attention is all you need," Adv. Neural Inf. Process. Syst., vol. 30, pp. 5998–6008, 2017. ``` - -## Knowledge Map (知识索引) - -(WIP) diff --git a/docs/agents/knowledge-map.md b/docs/agents/knowledge-map.md new file mode 100644 index 0000000..70e90bf --- /dev/null +++ b/docs/agents/knowledge-map.md @@ -0,0 +1,3 @@ +# Knowledge Map(知识索引) + +(WIP) From 209f06579aee6431f3136b307b3162f4b70d9206 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Fri, 15 May 2026 23:01:43 +0800 Subject: [PATCH 39/66] =?UTF-8?q?docs(AGENTS):=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E8=A7=84=E8=8C=83=E4=B8=BA=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=B9=B6=E4=BC=98=E5=8C=96=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E7=BB=93=E6=9E=84;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Documentation Standards (Mermaid) 与 Reference Specifications (IEEE) 从 AGENTS.md 独立为术层内联引用,分别指向独立文件维护; 新增 docs/agents/reference-specifications.md 承载 IEEE 引用格式规范; 循证工程原则补充「最新」限定词,强调文献时效性。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- AGENTS.md | 34 +++++-------------------- docs/agents/reference-specifications.md | 16 ++++++++++++ 2 files changed, 22 insertions(+), 28 deletions(-) create mode 100644 docs/agents/reference-specifications.md diff --git a/AGENTS.md b/AGENTS.md index f6f17f0..a296a4f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,7 +15,7 @@ - **Context-Driven (上下文驱动)**: 上下文是第一性要素 (Context Quality First)。任何变更需建立在深度理解之上(CDD),拒绝基于关键字匹配的机械式修改。 - **Minimal Intervention (最小干预)**: 遵循奥卡姆剃刀与 YAGNI 原则,仅实施必要的变更,推崇演进式设计 (Evolutionary Design) 而非过度设计。 -- **Evidence-Based (循证工程)**: 杜绝主观臆断,核心决策需以权威文献(IEEE 格式)为佐证,构建“设计-实现-验证”的完整反馈闭环,确保每一项工程行动都能产生可观测的反馈信号(测试、日志、监控),以验证假设并指导迭代。 +- **Evidence-Based (循证工程)**: 杜绝主观臆断,核心决策需以**最新**且**权威**的文献(IEEE 格式)为佐证,构建“设计-实现-验证”的完整反馈闭环,确保每一项工程行动都能产生可观测的反馈信号(测试、日志、监控),以验证假设并指导迭代。 - **Systemic Integrity (系统完整性)**: 具备全局视角与二阶思维 (Second-Order Thinking),评估变更对上下游依赖及整个生态(Engine, Adapter, Agent, UI)的“涟漪效应”,不只关注变更的直接结果,更要预测“结果的结果”(如引入缓存导致的陈旧数据、重试机制引发的雪崩),优先保障整体稳定性与逻辑自洽。 - **Knowledge Crystallization (知识结晶)**: 将系统视为有机体,通过将工程错误与 AI 失败案例转化为经验约束 (Negative Prompts) 和持久化知识,驱动系统的自我进化与持续熵减。 - **Proactive Navigation (主动导航)**: 智能体不应止步于被动响应,需即时转化为“领航者”。在交付任务结果的同时,**必须**基于上下文预判并提出**下一步最佳行动建议 (Next Best Action)**,不仅交付“答案”,更要交付“路径”,消除用户决策的认知摩擦。 @@ -41,7 +41,7 @@ 3. **Link Validity**: 确保所有引用的 URL 可访问且具备明确的上下文价值; 4. **Testing**: 统一在 tests/ 下维护测试用例,区分单元测试(unit)和集成测试(integration),所有测试的本地运行总时间控制在 3 min 以内; 5. **Pre-commit Hooks**: 首次克隆仓库使用 `uv run pre-commit install` 激活本地 Git hooks,使 Ruff lint(含 auto-fix)、Ruff format 及通用代码卫生检查在每次 commit 前自动运行。若 hooks 自动修复了问题,提交会被中断,执行 `git add -p` 审阅修复内容后重新提交即可; - 6. **Issue**: 在 docs/issue.md 中维护你处理过的 Issue 摘要(问题描述、表因根因、处理方式、后续防范、同类问题影响与处理注意事项等),便于同类问题的跨上下文处理;注意识别相同 Issue,不要同 Issue 多处维护。 + 6. **Issue**: 在 docs/issue.md 中维护你处理过的 Issue 摘要(问题描述、表因根因、处理方式、后续防范、同类问题影响与处理注意事项等),便于同类问题的跨上下文处理;注意识别相同 Issue,不要同 Issue 多处维护; - **Package Management Standardization (包管理规范)**: 1. **Python**: 严禁使用 pip/poetry,**必须**统一使用 `uv` 进行包管理与脚本执行(如 `uv run`); 2. **JavaScript/TypeScript**: 严禁使用 npm/yarn,**必须**统一使用 `pnpm` 进行包管理与脚本执行; @@ -49,29 +49,7 @@ - **Browser Validation Protocol (浏览器验证准则)**:Agent 不得自行完成、绕过或模拟任何 OAuth / SSO 认证流程,所有登录态均来源于用户已认证的 Chrome 主 profile(真实用户登录态)。完整协议(连通性自检、凭证管理、E2E 集成、实机回归等)详见 [浏览器验证协议](./docs/agents/browser-validation.md); 1. **安全红线**:禁止在 Sandbox 浏览器中跳转 Google 同意屏;禁止以模拟用户或第三方账号替代真实登录态;禁止要求用户在 chat 中粘贴密码、Cookie 或验证码; - **Knowledge Map (知识索引)**:项目所有文档索引统一维护在 [知识索引](./docs/agents/knowledge-map.md),并在文档目录变更时即时同步跟新; - -## Documentation Standards (文档规范) - -### Mermaid Visualization Norms (Mermaid 可视化规范) - -- **色彩语义与兼容性**:为图表节点配置具备语义辨识度的色彩,并确保在深色模式(Dark Mode)下具有极高的对比度与清晰度。 -- **逻辑模块化解构**:针对业务跨度较大的架构流程,强制采用 `subgraph` 容器进行层级解构与边界划分,以增强图表的自解说(Self-explaining)能力。 - -### Reference Specifications (IEEE) - -为保障工程决策的可追溯性与学术严谨性,核心引用需遵循 **IEEE 标准引用格式**。 - -> **模版准则**:[编号] 作者缩写. 姓, "文章标题," _刊名/会议名缩写 (斜体)_, 卷号, 期数, 页码, 年份. - -```latex -[1] A. Author, B. Author, and C. Author, "Title of paper," *Abbrev. Title of Journal*, vol. X, no. Y, pp. XX–XX, Year. -``` - -**引用实践** - -- **文内锚定**:采用标准上标链接形式:`描述内容[[1]](#ref1)`。 -- **文献索引**:底层采用 HTML 锚点 `id` 实现跳转稳定性。 - -```latex -[1] A. Vaswani et al., "Attention is all you need," Adv. Neural Inf. Process. Syst., vol. 30, pp. 5998–6008, 2017. -``` +- **Documentation Standards (文档规范)**:采用**Mermaid Visualization Norms (Mermaid 可视化规范)**; + 1. **色彩语义与兼容性**:为图表节点配置具备语义辨识度的色彩,并确保在深色模式(Dark Mode)下具有极高的对比度与清晰度; + 2. **逻辑模块化解构**:针对业务跨度较大的架构流程,强制采用 `subgraph` 容器进行层级解构与边界划分,以增强图表的自解说(Self-explaining)能力; +- **Reference Specifications (IEEE)**:为保障工程决策的可追溯性与学术严谨性,核心引用需遵循 [reference-specifications.md](docs/agents/reference-specifications.md)IEEE 标准引用格式; diff --git a/docs/agents/reference-specifications.md b/docs/agents/reference-specifications.md new file mode 100644 index 0000000..896b866 --- /dev/null +++ b/docs/agents/reference-specifications.md @@ -0,0 +1,16 @@ +# Reference Specifications (IEEE) + +> **模版准则**:[编号] 作者缩写. 姓, "文章标题," _刊名/会议名缩写 (斜体)_, 卷号, 期数, 页码, 年份. + +```latex +[1] A. Author, B. Author, and C. Author, "Title of paper," *Abbrev. Title of Journal*, vol. X, no. Y, pp. XX–XX, Year. +``` + +**引用实践** + +- **文内锚定**:采用标准上标链接形式:`描述内容[[1]](#ref1)`。 +- **文献索引**:底层采用 HTML 锚点 `id` 实现跳转稳定性。 + +```latex +[1] A. Vaswani et al., "Attention is all you need," Adv. Neural Inf. Process. Syst., vol. 30, pp. 5998–6008, 2017. +``` From 0a97ed5527c93a01cf96b7c9e2dbad8d7ee92d2c Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Fri, 15 May 2026 23:27:53 +0800 Subject: [PATCH 40/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E8=87=B3=200.4.1a3;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f50db07..4f37ee0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a2" +version = "0.4.1a3" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 0127434..8255f1b 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a2" +version = "0.4.1a3" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 2574d39a24426ef02199e63f13375c09c2862a82 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Fri, 15 May 2026 23:29:09 +0800 Subject: [PATCH 41/66] =?UTF-8?q?chore(logging):=20=E5=B0=86=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E4=BB=8E=E9=A1=B9=E7=9B=AE=E6=A0=B9=E7=9B=AE=E5=BD=95=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=87=B3=20.logs/=20=E5=AD=90=E7=9B=AE=E5=BD=95=20(#2?= =?UTF-8?q?39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(logging): 将默认日志文件路径从项目根目录迁移至 .logs/ 子目录; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * docs(logging): 同步文档中的默认日志路径至 .logs/coding-proxy.log; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- .gitignore | 2 +- docs/guide/monitoring.md | 2 +- docs/user-guide.md | 2 +- src/coding/proxy/cli/__init__.py | 2 +- src/coding/proxy/config/config.default.yaml | 2 +- src/coding/proxy/config/server.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 475b250..593147e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,4 @@ config.yaml .playwright-mcp/ # Log files (dual-write logging) -coding-proxy.log* +.logs/ diff --git a/docs/guide/monitoring.md b/docs/guide/monitoring.md index 7e89341..e11e648 100644 --- a/docs/guide/monitoring.md +++ b/docs/guide/monitoring.md @@ -31,7 +31,7 @@ ```yaml logging: level: "DEBUG" # 查看详细的模型映射和路由决策 - file: "coding-proxy.log" # 输出到文件 + file: ".logs/coding-proxy.log" # 输出到文件 max_bytes: 5242880 # 单文件 5 MB,触发轮转 backup_count: 5 # 保留 5 个 gzip 压缩备份 ``` diff --git a/docs/user-guide.md b/docs/user-guide.md index 81bbba1..f9ecad8 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -202,7 +202,7 @@ database: logging: level: "INFO" # DEBUG / INFO / WARNING / ERROR - # file: "coding-proxy.log" # 输出到文件 + # file: ".logs/coding-proxy.log" # 输出到文件 # max_bytes: 5242880 # 单文件 5 MB # backup_count: 5 # 保留 5 个备份 ``` diff --git a/src/coding/proxy/cli/__init__.py b/src/coding/proxy/cli/__init__.py index 3b479fb..b51f089 100644 --- a/src/coding/proxy/cli/__init__.py +++ b/src/coding/proxy/cli/__init__.py @@ -109,7 +109,7 @@ def start( print_banner(console, host=cfg.server.host, port=cfg.server.port) # 解析文件日志路径:未显式配置时使用默认值 - _file_path: str | None = cfg.logging.file or "coding-proxy.log" + _file_path: str | None = cfg.logging.file or ".logs/coding-proxy.log" uvicorn.run( fastapi_app, host=cfg.server.host, diff --git a/src/coding/proxy/config/config.default.yaml b/src/coding/proxy/config/config.default.yaml index 40808fd..b6987fa 100644 --- a/src/coding/proxy/config/config.default.yaml +++ b/src/coding/proxy/config/config.default.yaml @@ -8,7 +8,7 @@ server: logging: level: "INFO" - # file: "coding-proxy.log" # 文件日志路径;设为 null 或空字符串禁用 + # file: ".logs/coding-proxy.log" # 文件日志路径;设为 null 或空字符串禁用 # max_bytes: 5242880 # 单文件上限(5 MB),触发轮转 # backup_count: 5 # 保留 gzip 压缩备份文件数 diff --git a/src/coding/proxy/config/server.py b/src/coding/proxy/config/server.py index 7d67207..6fa3e8f 100644 --- a/src/coding/proxy/config/server.py +++ b/src/coding/proxy/config/server.py @@ -21,7 +21,7 @@ class LoggingConfig(BaseModel): Attributes: level: 控制台日志级别(INFO / WARNING / DEBUG 等)。 - file: 文件日志路径。为 ``None`` 时使用默认值 ``coding-proxy.log``; + file: 文件日志路径。为 ``None`` 时使用默认值 ``.logs/coding-proxy.log``; 设为空字符串可禁用文件日志。 max_bytes: 单个日志文件最大字节数(触发轮转)。默认 5 MB。 backup_count: 保留的已压缩备份文件数。默认 5。 From abc41366e8741b582ea84a158659bebf352797cc Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Sat, 16 May 2026 09:09:35 +0800 Subject: [PATCH 42/66] =?UTF-8?q?fix(dashboard):=20=E4=BF=AE=E6=AD=A3=20Se?= =?UTF-8?q?ssions=20=E9=A1=B5=20total=5Ftokens=20=E6=BC=8F=E7=AE=97?= =?UTF-8?q?=E7=BC=93=E5=AD=98=20token=20=E7=9A=84=E8=81=9A=E5=90=88?= =?UTF-8?q?=E5=8F=A3=E5=BE=84;=20(#240)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/coding/proxy/logging/db.py: query_recent_sessions / query_session_profile 两条按 session_key 分组的聚合 SQL 中, 将 total_tokens 由 SUM(input + output) 修正为 SUM(input + output + cache_creation + cache_read), 与同文件 query_total_tokens_by_vendor / query_usage 已使用的全口径对齐, 消除 Sessions 页与 Overview 页之间的统计口径分裂; - tests/test_session_aware.py: test_query_recent_sessions_basic / test_query_session_profile_found 中追加 cache_creation_tokens 与 cache_read_tokens 入参及完整口径断言, 锁定回归; - docs/issue.md: 追加 Issue 档案, 记录 SQL 聚合层 SSOT 缺失导致的口径漂移, 沉淀向 usage_log 增列后必须审计所有 SUM 表达式的防范经验. 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- docs/issue.md | 44 ++++++++++++++++++++++++++++++++++ src/coding/proxy/logging/db.py | 6 +++-- tests/test_session_aware.py | 17 ++++++++++--- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/docs/issue.md b/docs/issue.md index 6da58f6..8583087 100644 --- a/docs/issue.md +++ b/docs/issue.md @@ -186,3 +186,47 @@ litellm 按 Google AI Studio 格式构造请求: - litellm 在 Gemini 其他端点(`generateContent` / `countTokens`)同样存在 `_check_custom_proxy` 丢失 `v1beta/` 前缀的 bug;本次仅放宽了 `operation.py` 中的路径正则(让分类器能识别此类异常路径),未对这些端点做格式转换,因为非 embedding 端点的 Google AI Studio / Vertex AI 请求体差异较小,多数上游兼容。如未来出现类似失配再做针对性适配。 - 若上游网关同时支持 OpenAI `/v1/embeddings` 与 Vertex AI 路径,建议优先在客户端配置 OpenAI 兼容路径,减少协议转换链路。 + +--- + +## Dashboard Sessions 页 `Tokens` 列漏算缓存 Token + +**问题描述** + +Dashboard 的 **Sessions** 标签页中,每条会话的 `Tokens` 列与展开详情卡的 `Tokens` 值,仅统计 `input + output`,遗漏了 `cache_creation`(写缓存)与 `cache_read`(读缓存)。在长链路 Anthropic Prompt Cache 场景下,读取命中常常是 input/output 的数倍,导致 Sessions 页总量被显著低估,与 Overview 标签页(卡片、Token 时序图)跨页口径分裂。 + +**表因** + +前端 `dashboard.py:1597 / 1614` 直接渲染 `s.total_tokens`,该值由 `/api/dashboard/sessions` 透传自 `token_logger.query_recent_sessions()` 的聚合结果。 + +**根因** + +`src/coding/proxy/logging/db.py` 中两条按 `session_key` 分组的聚合 SQL 使用了不完整的求和口径: + +```sql +SUM(input_tokens + output_tokens) AS total_tokens -- 第 607 行(query_recent_sessions) +SUM(input_tokens + output_tokens) AS total_tokens -- 第 634 行(query_session_profile) +``` + +而同文件内 `query_usage()`(第 465–466 行分别 `SUM(...)` 四列)与 `query_total_tokens_by_vendor()`(第 584 行 `SUM(input + output + cache_creation + cache_read)`)已采用完整四项口径,构成了同文件内的口径双标。 + +**处理方式** + +复用 `query_total_tokens_by_vendor` 的四项求和表达式,将两处 `total_tokens` 改写为: + +```sql +SUM(input_tokens + output_tokens + + cache_creation_tokens + cache_read_tokens) AS total_tokens +``` + +不改动 API 返回结构、不新增字段、不改前端 detail-card——前端 `fmtTokens(s.total_tokens)` 调用无须变更。同时在 `tests/test_session_aware.py` 的 `test_query_recent_sessions_basic` / `test_query_session_profile_found` 中追加 `cache_creation_tokens` / `cache_read_tokens` 入参与完整口径断言,覆盖回归。 + +**后续防范** + +- SQL 聚合层涉及"总 Tokens"概念时,必须保持**单一权威定义**(Single Source of Truth):要么所有视图共用同一求和表达式,要么抽取为常量片段集中引用,杜绝多处独立维护造成的语义漂移。 +- 未来若引入新的 token 维度(如 reasoning_tokens、tool_tokens 等),需要全文检索 `SUM(input_tokens + output_tokens` 这一历史模式并同步补齐,避免出现新的口径分裂点。 + +**同类问题影响与处理注意事项** + +- 历次 PR 中 cache token 字段的引入是渐进式的(schema 已有四列、`log()` 入参齐全、Overview 已全口径消费),但部分聚合视图的口径升级被遗漏;任何向 `usage_log` 增列后,**必须**审计所有 `SUM(input_tokens` / `SUM(output_tokens` 出现处的聚合表达式是否需要同步更新。 +- 跨标签页同一指标(如"总 Tokens")的口径一致性,建议在添加新视图时主动与 Overview 现有口径做交叉核对,必要时在 SQL 注释中标注口径来源,便于后续 review。 diff --git a/src/coding/proxy/logging/db.py b/src/coding/proxy/logging/db.py index ffe9b2c..9e87853 100644 --- a/src/coding/proxy/logging/db.py +++ b/src/coding/proxy/logging/db.py @@ -604,7 +604,8 @@ async def query_recent_sessions( MIN(ts) AS first_seen_ts, MAX(ts) AS last_active_ts, COUNT(*) AS total_requests, - SUM(input_tokens + output_tokens) AS total_tokens, + SUM(input_tokens + output_tokens + + cache_creation_tokens + cache_read_tokens) AS total_tokens, SUM(input_tokens) AS total_input, SUM(output_tokens) AS total_output, GROUP_CONCAT(DISTINCT model_served) AS models, @@ -631,7 +632,8 @@ async def query_session_profile(self, session_key: str) -> dict | None: MIN(ts) AS first_seen_ts, MAX(ts) AS last_active_ts, COUNT(*) AS total_requests, - SUM(input_tokens + output_tokens) AS total_tokens, + SUM(input_tokens + output_tokens + + cache_creation_tokens + cache_read_tokens) AS total_tokens, SUM(input_tokens) AS total_input, SUM(output_tokens) AS total_output, GROUP_CONCAT(DISTINCT model_served) AS models, diff --git a/tests/test_session_aware.py b/tests/test_session_aware.py index 0c08449..29518e5 100644 --- a/tests/test_session_aware.py +++ b/tests/test_session_aware.py @@ -160,6 +160,8 @@ async def test_query_recent_sessions_basic(logger): model_served="claude-sonnet", input_tokens=100 * (i + 1), output_tokens=50 * (i + 1), + cache_creation_tokens=10 * (i + 1), + cache_read_tokens=1000 * (i + 1), session_key="session-alpha", duration_ms=100 + i * 50, ) @@ -186,9 +188,15 @@ async def test_query_recent_sessions_basic(logger): alpha = next(s for s in sessions if s["session_key"] == "session-alpha") assert alpha["total_requests"] == 3 - assert alpha["total_tokens"] == (100 + 200 + 300) + (50 + 100 + 150) - assert alpha["total_input"] == 100 + 200 + 300 - assert alpha["total_output"] == 50 + 100 + 150 + expected_input = 100 + 200 + 300 + expected_output = 50 + 100 + 150 + expected_cache_creation = 10 + 20 + 30 + expected_cache_read = 1000 + 2000 + 3000 + assert alpha["total_tokens"] == ( + expected_input + expected_output + expected_cache_creation + expected_cache_read + ) + assert alpha["total_input"] == expected_input + assert alpha["total_output"] == expected_output assert "claude-sonnet" in alpha["models"] assert "anthropic" in alpha["vendors"] assert alpha["success_rate"] == 100.0 @@ -269,12 +277,15 @@ async def test_query_session_profile_found(logger): model_served="m", input_tokens=100, output_tokens=50, + cache_creation_tokens=20, + cache_read_tokens=400, session_key="profile-test", ) profile = await logger.query_session_profile("profile-test") assert profile is not None assert profile["session_key"] == "profile-test" assert profile["total_requests"] == 1 + assert profile["total_tokens"] == 100 + 50 + 20 + 400 @pytest.mark.asyncio From 631a2d4ad10eb035680b9fe8d1580b9f5cbe1d34 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Sat, 16 May 2026 09:11:11 +0800 Subject: [PATCH 43/66] =?UTF-8?q?build(version):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E8=87=B3=200.4.1a4;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4f37ee0..fb64bae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a3" +version = "0.4.1a4" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 8255f1b..156c6c8 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a3" +version = "0.4.1a4" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From e1c3abac766e3a25dd1f3be9158d2a9408b8ea7c Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Sun, 17 May 2026 23:19:36 +0800 Subject: [PATCH 44/66] =?UTF-8?q?docs(structure):=20=E6=A2=B3=E7=90=86?= =?UTF-8?q?=E6=B8=85=E5=87=8F=20docs/=20=E7=BB=93=E6=9E=84=E5=B9=B6?= =?UTF-8?q?=E5=85=91=E7=8E=B0=20AGENTS.md=20=E5=BC=95=E7=94=A8=E6=89=BF?= =?UTF-8?q?=E8=AF=BA=20(#241)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(structure): 梳理清减 docs/ 结构并兑现 AGENTS.md 引用承诺; - 修复 docs/arch/vendors.md 第 4 行的 framework.md 断链路径(./ → ../) - 补全 docs/agents/knowledge-map.md 占位为真正的项目文档索引(兑现 AGENTS.md L51 承诺) - 新建 docs/agents/browser-validation.md 完整浏览器验证协议(兑现 AGENTS.md L49 承诺) - 迁移 docs/ci-cd.md 至 docs/ops/ 子目录,建立运维向正交分类 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(docs): 移除不可导航的 #L<行号> 锚点链接; GitHub Markdown 渲染视图不为列表项生成行号锚点,#L49/#L51 等后缀无法定位到目标位置。 统一改为 §名称 前缀 + 纯文件链接,保留人眼可读性。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- docs/agents/browser-validation.md | 172 ++++++++++++++++++++++++++++++ docs/agents/knowledge-map.md | 94 +++++++++++++++- docs/arch/vendors.md | 2 +- docs/{ => ops}/ci-cd.md | 12 +-- 4 files changed, 272 insertions(+), 8 deletions(-) create mode 100644 docs/agents/browser-validation.md rename docs/{ => ops}/ci-cd.md (98%) diff --git a/docs/agents/browser-validation.md b/docs/agents/browser-validation.md new file mode 100644 index 0000000..ee4b705 --- /dev/null +++ b/docs/agents/browser-validation.md @@ -0,0 +1,172 @@ +# Browser Validation Protocol(浏览器验证协议) + +> 由 [AGENTS.md §Browser Validation Protocol](../../AGENTS.md) 锚定的浏览器自动化与认证态使用协议。本协议是工程行为准则的子集,**任何 AI Agent 在执行浏览器自动化任务前必须完整遵循**。 +> +> **协议版本**:v1.0 | **生效范围**:所有面向本仓库的 AI Agent 协作场景 +> +> **关联工具**:`chrome-devtools` MCP、`claude-in-chrome` MCP、`playwright` MCP + +[TOC] + +--- + +## 1. 协议目的 + +为 AI Agent 在浏览器自动化场景下提供**统一、可审计、不可绕过**的认证态使用规范,解决以下问题: + +- AI Agent 不应也不可代用户决策"我是谁"——所有登录态归属问题必须由用户本人主导 +- 浏览器自动化能力一旦失控,可能在用户毫不知情时产生不可撤销的副作用(消息发送、订单提交、权限变更等) +- OAuth / SSO 同意屏在自动化上下文中存在被绕过的潜在风险,违反平台 ToS 与基本伦理 + +本协议通过"原则—红线—操作流程—验证"四层结构,将上述问题约束在工程可控范围内。 + +--- + +## 2. 核心原则 + +| 原则 | 具体含义 | +| -------------------------- | ----------------------------------------------------------------------------------------------------- | +| **登录态归属于用户** | Agent 不得自行完成、绕过或模拟任何 OAuth / SSO 认证流程;所有登录态来源于用户已认证的 Chrome 主 profile | +| **真实主 profile 优先** | 浏览器自动化默认接入用户日常使用的 Chrome 主 profile,复用其 Cookie / Session / SSO 状态 | +| **可审计、可回放** | 浏览器路径关键操作(点击、表单填写、跳转)应留下可被 GIF 回放或日志追溯的痕迹 | +| **最小副作用** | 优先以只读方式(查看、提取、断言)完成任务;写操作(提交、发送)需在协议第 5 节框架下显式确认 | + +--- + +## 3. 安全红线 + +> 以下条款**不可协商**,违反任一条款即视为协议违反。 + +1. **禁止跳转 Google 同意屏**:在 Sandbox / 自动化浏览器环境内**严禁**触发 Google OAuth 同意屏跳转。同意屏只能在用户主 profile 的真实浏览会话中由用户本人完成。 +2. **禁止模拟身份**:禁止以模拟用户身份、虚构 Cookie、第三方账号或测试账号替代真实登录态完成任务。 +3. **禁止凭证泄露**:禁止要求用户在 chat 中粘贴密码、Cookie、Session Token、二维码扫描结果或任何形式的验证码(含 6 位数字、短信、TOTP)。 +4. **禁止跨账号操作**:在多用户环境下,Agent 不得在未经显式确认的情况下切换 profile 或账号身份。 +5. **禁止规避 ToS**:不得通过 Headless 模式、UA 伪装、Captcha 自动求解等方式规避目标站点的服务条款。 +6. **禁止下载执行**:浏览器路径触发的任何文件下载需在主对话中显式确认;下载文件不得自动执行或注入到项目目录。 + +--- + +## 4. 连通性自检(Connectivity Probe) + +执行浏览器自动化任务前,Agent **必须**完成以下自检序列: + +| 步骤 | 操作 | 通过判据 | +| --------------------- | ----------------------------------------------------------------- | --------------------------------------------------------- | +| 4.1 工具可用性 | 列出当前会话可用的 MCP 工具 | 至少存在 `chrome-devtools` / `claude-in-chrome` 之一 | +| 4.2 主 profile 加载 | 通过工具调用获取当前 Tab 列表或 Page 列表 | 返回非空,且 Tab 标题来自用户真实浏览历史而非空白会话 | +| 4.3 目标域名可达 | 通过 `navigate_page` 或 `browser_navigate` 访问目标域名首页 | HTTP 200 / 已登录态正常加载 | +| 4.4 登录态识别 | 在目标域名首页定位"已登录"标识(头像、用户名、退出按钮) | 能在 Snapshot / AOM 中找到一致标识 | +| 4.5 异常路径分类 | 若 4.4 失败,按"未登录 vs 会话过期 vs 拒绝服务"分类,**不**自动重登 | 输出明确分类,转入第 5 节的用户接力流程 | + +> **失败处置**:自检任一步骤失败,Agent **必须**停止任务、向用户输出诊断结论,**不得**尝试 OAuth / 凭证补救。 + +--- + +## 5. 凭证管理(Credential Lifecycle) + +### 5.1 发现路径 + +凭证通过以下路径**被动**发现,Agent **不**主动读取、导出或日志化: + +- 浏览器 Cookie / LocalStorage(仅由浏览器引擎内部使用) +- 浏览器扩展(如 Claude in Chrome)持有的 Session +- 用户在 chat 中以"我刚登录了 X"形式给出的事实陈述(非凭证本身) + +### 5.2 过期检测信号 + +| 信号 | 处置 | +| ---------------------------------------- | ----------------------------------------------- | +| HTTP 401 / 403 | 转 5.3 接力流程 | +| 重定向到登录页(含 `/login`、`/signin`) | 转 5.3 接力流程 | +| 同意屏触发(OAuth scope 变更) | **立即停止**,由用户在主 profile 完成同意 | +| Captcha 出现 | **立即停止**,输出"需用户介入" | + +### 5.3 用户接力流程(Re-authentication Handoff) + +``` +1. Agent 检测到登录态失效 +2. Agent 向用户输出:(a)失效域名 (b)建议在用户主 profile 完成登录的指引 +3. Agent 暂停浏览器任务,**不**触发任何登录流程 +4. 用户在真实浏览器完成登录后,回到 chat 通知 Agent +5. Agent 重新执行第 4 节连通性自检 +6. 自检通过后恢复任务 +``` + +### 5.4 凭证刷新约束 + +- Agent **不**调用任何 refresh_token / device_code 接口 +- Agent **不**触发邮箱链接、短信验证码、TOTP 输入 +- 凭证刷新由用户在原始登录路径自主完成 + +--- + +## 6. E2E 集成(End-to-End Integration) + +### 6.1 与项目 OAuth 模块的边界 + +本项目内置 GitHub Device Flow 与 Google OAuth 模块(`src/coding/proxy/auth/`)。浏览器协议与之的边界如下: + +- **项目 OAuth 模块**:服务端运行时凭证管理,由 `coding-proxy auth login/reauth` CLI 触发,目标是给 **proxy 自身**获取上游 API 凭证 +- **本协议**:客户端浏览器自动化场景,目标是让 **Agent 协助用户**完成日常任务(如查文档、填表单) + +二者**互不调用**:Agent 不调用 `coding-proxy auth` 替用户完成项目 OAuth;项目 OAuth 流程也不依赖本协议第 4 节自检。 + +### 6.2 与 CLI 命令的协同 + +| 场景 | 由谁触发 | +| ------------------------------- | ------------------------- | +| 给 proxy 注入 GitHub PAT | 用户运行 `auth login` | +| 给 proxy 注入 Google OAuth | 用户运行 `auth login` | +| 凭证过期重认证 | 用户运行 `auth reauth` | +| 浏览器查看 GitHub Token 状态 | Agent 通过本协议浏览器访问 | + +### 6.3 测试用例的浏览器隔离 + +- 单元测试(`tests/unit/`)**不**触发任何浏览器路径 +- 集成测试(`tests/integration/`)**不**触发任何浏览器路径 +- 浏览器路径仅在交互式 Agent 会话中触发,不进入 CI 自动化测试链路 + +--- + +## 7. 实机回归(Real-Device Regression) + +### 7.1 提交前的浏览器路径自检清单 + +涉及浏览器路径的改动在提交前需手工核验: + +- [ ] 第 4 节连通性自检在用户主 profile 通过 +- [ ] 第 3 节安全红线未被触碰(特别是同意屏、密码粘贴) +- [ ] 浏览器路径的关键操作有 GIF / Snapshot 留痕 +- [ ] 失败路径输出明确的用户接力指引 + +### 7.2 与 CI 的边界 + +CI 流水线(详见 [ops/ci-cd.md](../ops/ci-cd.md))**不**触发浏览器自动化路径。所有浏览器侧验证均在本地实机完成。 + +### 7.3 回归失败上报 + +若实机回归失败: + +1. 在 [docs/issue.md](../issue.md) 记录现象、根因、防范 +2. 若涉及协议本身缺陷,提交 PR 修订本文件并同步 [AGENTS.md](../../AGENTS.md) 锚点 +3. 不通过的 Agent 行为应在 [knowledge-map.md](./knowledge-map.md) 标注为已知问题 + +--- + +## 8. 引用规范 + +- 本协议章节可被 [AGENTS.md](../../AGENTS.md) / [CLAUDE.md](../../CLAUDE.md) 通过标题锚点形式引用 +- 修订本协议**必须**在 [docs/issue.md](../issue.md) 留存背景与决策记录 +- 协议条款发生变更时,需同步检查 [AGENTS.md §Browser Validation Protocol](../../AGENTS.md) 的兜底原则与本协议是否一致 + +--- + +## 附录 A:术语对照 + +| 术语 | 说明 | +| ------------------- | ----------------------------------------------------------------- | +| 主 profile | 用户日常使用的 Chrome / Edge 浏览器档案,含真实登录态 | +| Sandbox 浏览器 | 自动化工具启动的临时/隔离浏览器,无真实用户态 | +| 同意屏(Consent) | OAuth 流程中用户授予权限范围的页面 | +| 接力流程 | Agent 停止 → 用户介入完成 → Agent 恢复 的三段式协作 | +| 实机回归 | 在用户真实终端(非 CI)完成的端到端验证 | diff --git a/docs/agents/knowledge-map.md b/docs/agents/knowledge-map.md index 70e90bf..08bd983 100644 --- a/docs/agents/knowledge-map.md +++ b/docs/agents/knowledge-map.md @@ -1,3 +1,95 @@ # Knowledge Map(知识索引) -(WIP) +> 项目所有文档的统一入口与权威索引。由 [AGENTS.md §Knowledge Map](../../AGENTS.md) 锚定,文档目录变更时**必须**即时同步更新本文件。 +> +> **使用方式**:按"受众 × 目的"二维定位所需文档;不确定起点时,从「入口导航」开始。 + +[TOC] + +--- + +## 1. 入口导航 + +| 文档 | 角色 | 受众 | +| --------------------------------------------- | ----------------------------------------------- | --------------- | +| [README.md](../../README.md) | 项目首页(英文版门面) | 公开访客 | +| [docs/zh-CN/README.md](../zh-CN/README.md) | 项目首页中文镜像(与英文版功能对等) | 中文公开访客 | +| [docs/user-guide.md](../user-guide.md) | 用户操作上位导航 + 配置概览速查 | 终端用户 | +| [docs/framework.md](../framework.md) | 架构枢纽(项目动机、设计目标、模块清单) | 架构师/贡献者 | + +--- + +## 2. 用户向([docs/guide/](../guide/)) + +> 面向最终用户的操作手册,按"安装 → 配置 → 运行 → 观测 → 排障"线性铺陈。 + +| 文档 | 主旨 | +| ------------------------------------------------- | --------------------------------------------------- | +| [guide/quickstart.md](../guide/quickstart.md) | 环境要求、安装、最小配置、启动、Claude Code 集成 | +| [guide/vendors.md](../guide/vendors.md) | 全部 9 种供应商配置详情、模型映射、定价表 | +| [guide/cli-reference.md](../guide/cli-reference.md) | start / status / usage / reset / auth 全部命令 | +| [guide/api-reference.md](../guide/api-reference.md) | /v1/messages、health、status、reset、dashboard 等 | +| [guide/dashboard.md](../guide/dashboard.md) | Web 可视化看板功能与交互 | +| [guide/monitoring.md](../guide/monitoring.md) | 日志、用量统计、性能调优、常见场景、故障排查 | + +--- + +## 3. 架构向([docs/arch/](../arch/)) + +> 面向贡献者与维护者的架构与实现细节,从 [framework.md](../framework.md) 正交分解而来。 + +| 文档 | 主旨 | +| ----------------------------------------------------- | ----------------------------------------------------- | +| [arch/config-reference.md](../arch/config-reference.md) | 配置参数权威定义(Single Source of Truth) | +| [arch/design-patterns.md](../arch/design-patterns.md) | 13 种设计模式详解(熔断器、状态机、Composite 等) | +| [arch/routing.md](../arch/routing.md) | 路由引擎 12 个子模块职责 | +| [arch/vendors.md](../arch/vendors.md) | Vendor 类层次结构与 9 种实现 | +| [arch/convert.md](../arch/convert.md) | Anthropic ↔ Gemini ↔ OpenAI 三向格式转换 | +| [arch/testing.md](../arch/testing.md) | 测试覆盖矩阵与工具链 | + +--- + +## 4. 运维向([docs/ops/](../ops/)) + +> 面向运维与发布工程的流程文档。 + +| 文档 | 主旨 | +| ----------------------------------- | ------------------------------------------------- | +| [ops/ci-cd.md](../ops/ci-cd.md) | 发布流程、热修复、回滚、CI/CD 故障排查 | + +--- + +## 5. Agent 协作([docs/agents/](./)) + +> AGENTS.md 工程行为准则的卫星文件,定义 AI Agent 协作过程中的规范与协议。 + +| 文档 | 主旨 | +| --------------------------------------------------------------- | --------------------------------------------- | +| [agents/knowledge-map.md](./knowledge-map.md) | 本文件——项目文档统一索引 | +| [agents/reference-specifications.md](./reference-specifications.md) | IEEE 文献引用格式模板与实践指南 | +| [agents/browser-validation.md](./browser-validation.md) | 浏览器验证协议(连通性自检、凭证管理、E2E) | + +--- + +## 6. 问题档案 + +| 文档 | 主旨 | +| --------------------------------- | ----------------------------------------------------- | +| [docs/issue.md](../issue.md) | 已处理 Issue 摘要档案(表因、根因、防范) | + +--- + +## 7. 工程规范(顶层) + +| 文档 | 主旨 | +| --------------------------------- | ----------------------------------------------------- | +| [AGENTS.md](../../AGENTS.md) | 工程行为准则与 AI Agent 协作协议(与 CLAUDE.md 同源) | +| [CHANGELOG.md](../../CHANGELOG.md)| 版本历史与变更日志 | + +--- + +## 维护约束 + +1. **同步原则**:新增/删除/重命名 `docs/` 下任意 .md 文件时,**必须**同步本索引。 +2. **路径基准**:本文件位于 `docs/agents/`,所有相对路径以此为基准(向上一级 `../` 访问 `docs/`,向上两级 `../../` 访问仓库根)。 +3. **链接验证**:维护者修改本文件后应通过 grep 自检:所有 `[...](path)` 中的 `path` 文件存在。 diff --git a/docs/arch/vendors.md b/docs/arch/vendors.md index 2ec79ad..0e0d862 100644 --- a/docs/arch/vendors.md +++ b/docs/arch/vendors.md @@ -1,7 +1,7 @@ # 供应商模块(vendors/) > 路径约定:相对于 `src/coding/proxy/` -> 定位:从 [framework.md](./framework.md) 提取,详述供应商分类体系与各供应商实现。 +> 定位:从 [framework.md](../framework.md) 提取,详述供应商分类体系与各供应商实现。 [TOC] diff --git a/docs/ci-cd.md b/docs/ops/ci-cd.md similarity index 98% rename from docs/ci-cd.md rename to docs/ops/ci-cd.md index 6b35b38..65d0464 100644 --- a/docs/ci-cd.md +++ b/docs/ops/ci-cd.md @@ -211,7 +211,7 @@ CI 流水线中使用的工具及其版本均与项目实际配置严格对齐 | 工具 | 版本 / 引用 | 来源 (Action) | 与项目配置的对齐关系 | | -------------- | ----------------------------------- | ---------------------------------------- | -------------------------------------------------------------------------- | -| Python | `["3.12", "3.13", "3.14"]` (matrix) | `actions/setup-python@v5` | 对齐 [`pyproject.toml`](../pyproject.toml) 中 `requires-python = ">=3.12"` | +| Python | `["3.12", "3.13", "3.14"]` (matrix) | `actions/setup-python@v5` | 对齐 [`pyproject.toml`](../../pyproject.toml) 中 `requires-python = ">=3.12"` | | uv | latest (v4) | `astral-sh/setup-uv@v4` | 项目强制包管理器(见 AGENTS.md 包管理规范) | | build | latest | `uv pip install --system build` | PEP 517 构建前端,后端为 hatchling | | twine | latest | `uv pip install --system twine` | 包元数据校验与上传工具 | @@ -435,7 +435,7 @@ flowchart TD ### 4.1 promote.yml 工作流架构 -[`promote.yml`](../.github/workflows/promote.yml) 由两个 Job 组成,形成 **Validate → Promote** 的串行管线: +[`promote.yml`](../../.github/workflows/promote.yml) 由两个 Job 组成,形成 **Validate → Promote** 的串行管线: #### Job 1:validate(验证门控) @@ -629,7 +629,7 @@ flowchart TD | 问题现象 | 可能原因 | 排查步骤 | 解决方案 | | ------------------------------- | ------------------------------------------------------ | ----------------------------------------------------- | --------------------------------------------------------- | | `release.yml` 未触发 | Release 创建时未触发 `published` 事件(如 Draft 状态) | 检查 Actions 页面是否有该 workflow run | 确保 Release 为非 Draft 状态;或重新发布 | -| `build` Job 失败 | `twine check` 报错(包元数据不合规) | 查看 build Job 日志中的 twine 输出 | 修复 [`pyproject.toml`](../pyproject.toml) 中的元数据字段 | +| `build` Job 失败 | `twine check` 报错(包元数据不合规) | 查看 build Job 日志中的 twine 输出 | 修复 [`pyproject.toml`](../../pyproject.toml) 中的元数据字段 | | publish 失败 (HTTP 400) | 包名或版本号冲突(目标仓库已有同版本) | 查看 verbose 日志中的响应体(已启用 `verbose: true`) | 检查 TestPyPI/PyPI 是否已有同版本;使用递增版本号 | | publish 失败 (HTTP 403) | 认证失败(Token 无效或缺失) | 检查 Job 日志中的认证错误详情 | 验证 Secret 配置或 Trusted Publisher 设置(参见 §7.2) | | `promote.yml` validate 失败 | Target release 不是 prerelease(已是 stable) | 查看 validate Job 错误信息 | 确认输入的 `tag_name` 对应的是 prerelease release | @@ -701,7 +701,7 @@ CI 流水线中的工具版本选择并非随意,每一项都与项目配置 | CI 配置 | 项目配置 | 对齐关系 | | ------------------------------------------------ | --------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| `python-version: "${{ matrix.python-version }}"` | `requires-python = ">=3.12"` in [`pyproject.toml`](../pyproject.toml) | CI 构建环境必须满足项目的最低 Python 版本要求(matrix: 3.12 / 3.13 / 3.14) | +| `python-version: "${{ matrix.python-version }}"` | `requires-python = ">=3.12"` in [`pyproject.toml`](../../pyproject.toml) | CI 构建环境必须满足项目的最低 Python 版本要求(matrix: 3.12 / 3.13 / 3.14) | | `hatchling.build` (build-backend) | `[build-system] requires = ["hatchling"]` | 构建后端声明必须一致 | | `uv pip install --system` | AGENTS.md 强制使用 `uv` | GitHub Actions Runner 默认无激活的 virtualenv,需 `--system` 标志 | | `retention-days: 14` | — | Artifact 保留两周,覆盖正常的验证窗口期(通常 1-3 天) | @@ -714,7 +714,7 @@ CI 流水线中的工具版本选择并非随意,每一项都与项目配置 ### 8.1 release.yml 结构索引 -[`.github/workflows/release.yml`](../.github/workflows/release.yml) 文件结构一览: +[`.github/workflows/release.yml`](../../.github/workflows/release.yml) 文件结构一览: | 行范围 | 区块 | 内容摘要 | | ------- | ----------------------- | ---------------------------------------------------------------------------------------------------- | @@ -729,7 +729,7 @@ CI 流水线中的工具版本选择并非随意,每一项都与项目配置 ### 8.2 promote.yml 结构索引 -[`.github/workflows/promote.yml`](../.github/workflows/promote.yml) 文件结构一览: +[`.github/workflows/promote.yml`](../../.github/workflows/promote.yml) 文件结构一览: | 行范围 | 区块 | 内容摘要 | | ------ | --------------- | -------------------------------------------------------------- | From 03f772dc056a24d4f8dde9abaa15c744aa442a5e Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 20 May 2026 16:30:38 +0800 Subject: [PATCH 45/66] =?UTF-8?q?docs(agents):=20=E9=87=8D=E7=BB=84=20Docu?= =?UTF-8?q?mentation=20Standards=20=E7=BB=93=E6=9E=84=E5=B9=B6=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=96=87=E6=A1=A3=E8=A7=84=E8=8C=83=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- AGENTS.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index a296a4f..435a965 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,15 +33,13 @@ ### 术 (Tactics - 执行规范) - **Structured AI-Pair Pipeline (规范化 AI 结对流水线)**: 遵循 **Specification-Driven (规约驱动)** + **Context-Anchored (上下文锚定)** + **AI-Pair (AI 结对)** 模式,将开发固化为可审计的流水线,避免代码腐化为无法维护的“大泥球 (Big Ball of Mud)”。 -- **Visual Documentation (图文并茂)**: 对于复杂逻辑,优先使用 Mermaid 图表(Sequence/Flowchart/Class)辅助说明,构建“图文并茂”的直观文档。 -- **Direct Hyperlinking (直接跳转)**: 在文档中提及 Repo 内其他资源(文档/代码)时,**必须**构建可跳转的相对路径链接(如 `[Doc Name](./path.md)`),严禁使用“死文本”引用,以降低信息检索熵。 - **Operational Excellence (卓越运营)**: 1. **Git Discipline**: 默认严禁调用 git commit;当用户显式要求提交时,一律使用 Claude Code 的自定义 Slash Command: `/commit-no-push` 进行操作(若非 Claude Code 运行环境,则读取 /commit-no-push 命令中的规则执行)。严禁执行 Rebase; 2. **Temp Management**: 临时产物(执行计划等)一律收敛至 `.temp/` 并及时清理; 3. **Link Validity**: 确保所有引用的 URL 可访问且具备明确的上下文价值; 4. **Testing**: 统一在 tests/ 下维护测试用例,区分单元测试(unit)和集成测试(integration),所有测试的本地运行总时间控制在 3 min 以内; 5. **Pre-commit Hooks**: 首次克隆仓库使用 `uv run pre-commit install` 激活本地 Git hooks,使 Ruff lint(含 auto-fix)、Ruff format 及通用代码卫生检查在每次 commit 前自动运行。若 hooks 自动修复了问题,提交会被中断,执行 `git add -p` 审阅修复内容后重新提交即可; - 6. **Issue**: 在 docs/issue.md 中维护你处理过的 Issue 摘要(问题描述、表因根因、处理方式、后续防范、同类问题影响与处理注意事项等),便于同类问题的跨上下文处理;注意识别相同 Issue,不要同 Issue 多处维护; + 6. **Issue**: 在 [issue.md](docs/agents/issue.md) 中维护你处理过的 Issue 摘要(问题描述、表因根因、处理方式、后续防范、同类问题影响与处理注意事项等),便于同类问题的跨上下文处理;注意识别相同 Issue,不要同 Issue 多处维护; - **Package Management Standardization (包管理规范)**: 1. **Python**: 严禁使用 pip/poetry,**必须**统一使用 `uv` 进行包管理与脚本执行(如 `uv run`); 2. **JavaScript/TypeScript**: 严禁使用 npm/yarn,**必须**统一使用 `pnpm` 进行包管理与脚本执行; @@ -49,7 +47,11 @@ - **Browser Validation Protocol (浏览器验证准则)**:Agent 不得自行完成、绕过或模拟任何 OAuth / SSO 认证流程,所有登录态均来源于用户已认证的 Chrome 主 profile(真实用户登录态)。完整协议(连通性自检、凭证管理、E2E 集成、实机回归等)详见 [浏览器验证协议](./docs/agents/browser-validation.md); 1. **安全红线**:禁止在 Sandbox 浏览器中跳转 Google 同意屏;禁止以模拟用户或第三方账号替代真实登录态;禁止要求用户在 chat 中粘贴密码、Cookie 或验证码; - **Knowledge Map (知识索引)**:项目所有文档索引统一维护在 [知识索引](./docs/agents/knowledge-map.md),并在文档目录变更时即时同步跟新; -- **Documentation Standards (文档规范)**:采用**Mermaid Visualization Norms (Mermaid 可视化规范)**; - 1. **色彩语义与兼容性**:为图表节点配置具备语义辨识度的色彩,并确保在深色模式(Dark Mode)下具有极高的对比度与清晰度; - 2. **逻辑模块化解构**:针对业务跨度较大的架构流程,强制采用 `subgraph` 容器进行层级解构与边界划分,以增强图表的自解说(Self-explaining)能力; +- **Documentation Standards (文档规范)**: + 1. **Visual Documentation (图文并茂)**: 对于复杂逻辑,优先 **Mermaid Visualization Norms (Mermaid 可视化规范)**,构建“图文并茂”的直观文档; + - **色彩语义与兼容性**:为图表节点配置具备语义辨识度的色彩,并确保在深色模式(Dark Mode)下具有极高的对比度与清晰度; + - **逻辑模块化解构**:针对业务跨度较大的架构流程,强制采用 `subgraph` 容器进行层级解构与边界划分,以增强图表的自解说(Self-explaining)能力; + 2. **语言叙事**:用语精准,叙事完备,行文专业,聚焦核心,篇幅精炼,形象具体,体现真实作用与用户吸引性,字数恰当; + 3. **Direct Hyperlinking (直接跳转)**: 在文档中提及 Repo 内其他资源(文档/代码)时,**必须**构建可跳转的相对路径链接(如 `[Doc Name](./path.md)`),严禁使用“死文本”引用,以降低信息检索熵; + 4. **实操截图**:文档需要引入必要的浏览器实操截图时,需自行通过默认浏览器打开相关页面,通过实操现场截图并保留到文档路径进行文档引用; - **Reference Specifications (IEEE)**:为保障工程决策的可追溯性与学术严谨性,核心引用需遵循 [reference-specifications.md](docs/agents/reference-specifications.md)IEEE 标准引用格式; From e326bf63e9f2b7402409a64e1448302000d24e62 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 20 May 2026 16:36:07 +0800 Subject: [PATCH 46/66] =?UTF-8?q?docs(agents):=20=E8=BF=81=E7=A7=BB=20issu?= =?UTF-8?q?e.md=20=E8=87=B3=20docs/agents/=20=E7=9B=AE=E5=BD=95;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- docs/{ => agents}/issue.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{ => agents}/issue.md (100%) diff --git a/docs/issue.md b/docs/agents/issue.md similarity index 100% rename from docs/issue.md rename to docs/agents/issue.md From 668858b1332c9f96acf6dd4116b248489aad9d80 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Sat, 23 May 2026 17:59:14 +0800 Subject: [PATCH 47/66] =?UTF-8?q?feat(zhipu):=20=E4=B8=BA=20429=20Rate=20L?= =?UTF-8?q?imit=20=E6=B7=BB=E5=8A=A0=E6=8C=87=E6=95=B0=E9=80=80=E9=81=BF?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E6=8C=BD=E5=9B=9E=E6=9C=BA=E5=88=B6=20(#242)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(zhipu): 为 429 Rate Limit 添加指数退避重试挽回机制; ZhipuVendor 遇到 HTTP 429 时自动重试最多 5 次(1 初始 + 4 重试), 采用指数退避 + Full Jitter 策略(1s → 2s → 4s → 8s), 优先尊重 server retry-after header 提供的恢复时间建议。 重试对 executor 完全透明,仅在全部重试耗尽后才触发 failover。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(zhipu): 修复 send_message_stream yield-in-try-except 及测试死代码; - 将 send_message_stream 中 yield 移至 try/except 外部,避免 async generator 意外捕获外部 athrow 抛入的 HTTPStatusError; - 删除 test_stream_429_retries_and_succeeds 中未生效的首段 mock 代码。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/vendors/zhipu.py | 148 ++++++++++++- tests/test_zhipu.py | 344 +++++++++++++++++++++++++++++- 2 files changed, 488 insertions(+), 4 deletions(-) diff --git a/src/coding/proxy/vendors/zhipu.py b/src/coding/proxy/vendors/zhipu.py index 528cabf..e6b4680 100644 --- a/src/coding/proxy/vendors/zhipu.py +++ b/src/coding/proxy/vendors/zhipu.py @@ -4,20 +4,51 @@ Anthropic Messages API 协议,本模块仅做两项最小适配: 1. 模型名映射(Claude -> GLM) 2. 认证头替换(x-api-key) + +额外提供 429 Rate Limit 专用重试挽回机制: + - max_attempt = 5(1 初始 + 4 重试) + - 指数退避 + Full Jitter(1s → 2s → 4s → 8s) + - 优先尊重 server retry-after header """ from __future__ import annotations +import asyncio +import logging +from collections.abc import AsyncIterator +from typing import Any + +import httpx + from ..config.schema import FailoverConfig, ZhipuConfig from ..routing.model_mapper import ModelMapper +from ..routing.rate_limit import ( + compute_effective_retry_seconds, + parse_rate_limit_headers, +) +from ..routing.retry import RetryConfig, calculate_delay +from .base import VendorResponse from .native_anthropic import NativeAnthropicVendor +logger = logging.getLogger(__name__) + +# 429 Rate Limit 重试默认配置 +_RATE_LIMIT_RETRY = RetryConfig( + max_retries=4, # 4 次重试 + 1 次初始 = 5 总尝试 + initial_delay_ms=1000, + max_delay_ms=30000, + backoff_multiplier=2.0, + jitter=True, +) + class ZhipuVendor(NativeAnthropicVendor): - """智谱 GLM 原生 Anthropic 兼容端点供应商(薄透传). + """智谱 GLM 原生 Anthropic 兼容端点供应商(薄透传 + 429 重试挽回). 通过官方 /api/anthropic 端点转发请求, 仅替换模型名和认证头,其余原样透传。 + + 429 Rate Limit 时自动重试(指数退避),降低 failover 频率。 """ _vendor_name = "zhipu" @@ -30,6 +61,121 @@ def __init__( failover_config: FailoverConfig | None = None, ) -> None: super().__init__(config, model_mapper, failover_config) + self._rl_retry = _RATE_LIMIT_RETRY + + # ── 非流式:429 重试 ──────────────────────────────────── + + async def send_message( + self, + request_body: dict[str, Any], + headers: dict[str, str], + ) -> VendorResponse: + """非流式请求,429 时自动重试.""" + max_attempts = self._rl_retry.max_attempts + + for attempt in range(max_attempts): + resp = await super().send_message(request_body, headers) + if resp.status_code != 429: + return resp + + if attempt == max_attempts - 1: + logger.warning( + "Zhipu 429 rate limit exhausted after %d attempts", + max_attempts, + ) + return resp + + delay = self._compute_retry_delay_from_headers( + resp.response_headers, attempt + ) + logger.info( + "Zhipu 429 rate limit, retry %d/%d in %.1fms", + attempt + 1, + max_attempts - 1, + delay, + ) + await asyncio.sleep(delay / 1000.0) + + return resp # pragma: no cover + + # ── 流式:429 重试 ────────────────────────────────────── + + async def send_message_stream( + self, + request_body: dict[str, Any], + headers: dict[str, str], + ) -> AsyncIterator[bytes]: + """流式请求,429 时自动重试. + + 安全性:429 在 BaseVendor.send_message_stream 中于 + status code 检查阶段即 raise(在任何 chunk yield 之前), + 因此重试不会导致已发出数据不一致。 + """ + max_attempts = self._rl_retry.max_attempts + + for attempt in range(max_attempts): + try: + # 429 在 status code 检查阶段即 raise(在任何 chunk 之前), + # 因此 __anext__ 安全:要么拿到首个 chunk,要么抛异常。 + ait = super().send_message_stream(request_body, headers) + head = await ait.__anext__() + except StopAsyncIteration: + return + except httpx.HTTPStatusError as exc: + if exc.response is None or exc.response.status_code != 429: + raise + if attempt == max_attempts - 1: + logger.warning( + "Zhipu 429 stream rate limit exhausted after %d attempts", + max_attempts, + ) + raise + + delay = self._compute_retry_delay_from_response(exc.response, attempt) + logger.info( + "Zhipu 429 stream rate limit, retry %d/%d in %.1fms", + attempt + 1, + max_attempts - 1, + delay, + ) + await asyncio.sleep(delay / 1000.0) + continue + + # yield 在 try/except 之外,避免捕获外部 athrow 的异常 + yield head + async for chunk in ait: + yield chunk + return + + # ── 延迟计算 ──────────────────────────────────────────── + + def _compute_retry_delay_from_headers( + self, + headers: dict[str, str] | None, + attempt: int, + ) -> float: + """计算重试延迟(毫秒),优先使用 server retry-after.""" + rl_info = parse_rate_limit_headers(headers, 429, None) + server_delay_s = compute_effective_retry_seconds(rl_info) + if server_delay_s is not None: + return min(server_delay_s * 1000, self._rl_retry.max_delay_ms) + return calculate_delay(attempt, self._rl_retry) + + def _compute_retry_delay_from_response( + self, + response: httpx.Response, + attempt: int, + ) -> float: + """计算重试延迟(毫秒),从 httpx.Response 提取 header.""" + rl_info = parse_rate_limit_headers( + response.headers, + response.status_code, + response.text[:500] if response.text else None, + ) + server_delay_s = compute_effective_retry_seconds(rl_info) + if server_delay_s is not None: + return min(server_delay_s * 1000, self._rl_retry.max_delay_ms) + return calculate_delay(attempt, self._rl_retry) # 向后兼容别名 diff --git a/tests/test_zhipu.py b/tests/test_zhipu.py index 2eceb41..8d010b3 100644 --- a/tests/test_zhipu.py +++ b/tests/test_zhipu.py @@ -5,20 +5,23 @@ - 其余请求体/响应原样透传 - 401 错误归一化 - 能力声明全部为 NATIVE + - 429 Rate Limit 重试挽回 """ import json +from unittest.mock import AsyncMock, patch +import httpx import pytest from coding.proxy.compat.canonical import CompatibilityStatus from coding.proxy.config.schema import ModelMappingRule, ZhipuConfig from coding.proxy.routing.model_mapper import ModelMapper +from coding.proxy.vendors.native_anthropic import NativeAnthropicVendor from coding.proxy.vendors.zhipu import ZhipuVendor -@pytest.fixture -def zhipu_vendor(): +def _make_zhipu_vendor(api_key: str = "test-zhipu-key") -> ZhipuVendor: """创建使用默认配置的 ZhipuVendor 实例.""" mapper = ModelMapper( [ @@ -42,7 +45,13 @@ def zhipu_vendor(): ), ] ) - return ZhipuVendor(ZhipuConfig(api_key="test-zhipu-key"), mapper) + return ZhipuVendor(ZhipuConfig(api_key=api_key), mapper) + + +@pytest.fixture +def zhipu_vendor(): + """创建使用默认配置的 ZhipuVendor 实例.""" + return _make_zhipu_vendor() # ── 模型映射 ────────────────────────────────────────────── @@ -292,3 +301,332 @@ def test_never_triggers_failover(self, zhipu_vendor): async def test_health_check_always_true(self, zhipu_vendor): result = await zhipu_vendor.check_health() assert result is True + + +# ── 429 Rate Limit 重试挽回 ───────────────────────────────── + + +def _make_429_response( + headers: dict[str, str] | None = None, +) -> httpx.Response: + """构造 429 HTTP 响应.""" + return httpx.Response( + status_code=429, + content=b'{"error":{"type":"rate_limit_error","message":"Too many requests"}}', + headers=headers or {}, + request=httpx.Request( + "POST", "https://open.bigmodel.cn/api/anthropic/v1/messages" + ), + ) + + +def _make_200_response() -> httpx.Response: + """构造 200 HTTP 响应.""" + body = json.dumps( + { + "id": "msg_test", + "type": "message", + "role": "assistant", + "content": [{"type": "text", "text": "hello"}], + "model": "glm-5.1", + "usage": {"input_tokens": 10, "output_tokens": 5}, + } + ).encode() + return httpx.Response( + status_code=200, + content=body, + headers={"content-type": "application/json"}, + request=httpx.Request( + "POST", "https://open.bigmodel.cn/api/anthropic/v1/messages" + ), + ) + + +class TestRateLimitRetry: + """429 Rate Limit 重试挽回机制.""" + + # ── 非流式 ───────────────────────────────────────────── + + @pytest.mark.asyncio + async def test_nonstream_429_retries_and_succeeds(self): + """429 两次后 200,重试成功.""" + vendor = _make_zhipu_vendor() + call_count = 0 + + async def mock_post(*args, **kwargs): + nonlocal call_count + call_count += 1 + if call_count <= 2: + return _make_429_response() + return _make_200_response() + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + resp = await vendor.send_message( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ) + + assert resp.status_code == 200 + assert call_count == 3 + + @pytest.mark.asyncio + async def test_nonstream_429_exhausted_retries(self): + """连续 5 次 429,耗尽重试后返回 429.""" + vendor = _make_zhipu_vendor() + call_count = 0 + + async def mock_post(*args, **kwargs): + nonlocal call_count + call_count += 1 + return _make_429_response() + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + with patch("asyncio.sleep", new_callable=AsyncMock): + resp = await vendor.send_message( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ) + + assert resp.status_code == 429 + assert call_count == 5 + + @pytest.mark.asyncio + async def test_nonstream_non_429_no_retry(self): + """500 不触发重试.""" + vendor = _make_zhipu_vendor() + call_count = 0 + + async def mock_post(*args, **kwargs): + nonlocal call_count + call_count += 1 + return httpx.Response( + status_code=500, + content=b'{"error":{"type":"api_error","message":"Internal error"}}', + request=httpx.Request("POST", "https://example.com"), + ) + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + resp = await vendor.send_message( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ) + + assert resp.status_code == 500 + assert call_count == 1 + + # ── 流式 ─────────────────────────────────────────────── + + @pytest.mark.asyncio + async def test_stream_429_retries_and_succeeds(self): + """流式 429 两次后成功.""" + call_count = 0 + + async def fake_stream(self, body, headers): + nonlocal call_count + call_count += 1 + if call_count <= 2: + resp = _make_429_response() + raise httpx.HTTPStatusError( + "429", + request=resp.request, + response=resp, + ) + yield b'data: {"type":"content_block_start"}\n\n' + yield b'data: {"type":"content_block_delta"}\n\n' + + vendor = _make_zhipu_vendor() + chunks = [] + with ( + patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream), + patch("asyncio.sleep", new_callable=AsyncMock), + ): + async for chunk in vendor.send_message_stream( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ): + chunks.append(chunk) + + assert len(chunks) == 2 + assert call_count == 3 + + @pytest.mark.asyncio + async def test_stream_429_exhausted_retries_raises(self): + """流式连续 429,耗尽重试后 raise.""" + call_count = 0 + + async def fake_stream(self, body, headers): + nonlocal call_count + call_count += 1 + resp = _make_429_response() + raise httpx.HTTPStatusError( + "429", + request=resp.request, + response=resp, + ) + yield # 使函数成为 async generator(不可达,仅影响类型) + + vendor = _make_zhipu_vendor() + with ( + patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream), + patch("asyncio.sleep", new_callable=AsyncMock), + pytest.raises(httpx.HTTPStatusError) as exc_info, + ): + async for _ in vendor.send_message_stream( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ): + pass + + assert exc_info.value.response.status_code == 429 + assert call_count == 5 + + @pytest.mark.asyncio + async def test_stream_500_no_retry_raises(self): + """流式 500 不触发重试,直接 raise.""" + call_count = 0 + + async def fake_stream(self, body, headers): + nonlocal call_count + call_count += 1 + resp = httpx.Response( + status_code=500, + content=b'{"error":{"type":"api_error"}}', + request=httpx.Request("POST", "https://example.com"), + ) + raise httpx.HTTPStatusError( + "500", + request=resp.request, + response=resp, + ) + yield # 使函数成为 async generator + + vendor = _make_zhipu_vendor() + with ( + patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream), + pytest.raises(httpx.HTTPStatusError) as exc_info, + ): + async for _ in vendor.send_message_stream( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ): + pass + + assert exc_info.value.response.status_code == 500 + assert call_count == 1 + + # ── retry-after header ───────────────────────────────── + + @pytest.mark.asyncio + async def test_respects_retry_after_header(self): + """响应含 retry-after 时使用 server 建议延迟.""" + vendor = _make_zhipu_vendor() + call_count = 0 + sleep_delays = [] + + async def mock_post(*args, **kwargs): + nonlocal call_count + call_count += 1 + if call_count == 1: + return _make_429_response(headers={"retry-after": "2"}) + return _make_200_response() + + async def mock_sleep(delay): + sleep_delays.append(delay) + + with ( + patch.object(vendor, "_get_client") as mock_client, + patch("asyncio.sleep", side_effect=mock_sleep), + ): + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + resp = await vendor.send_message( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ) + + assert resp.status_code == 200 + assert len(sleep_delays) == 1 + # retry-after=2 → 2 * 1.1 = 2.2s → 2200ms → sleep(2.2) + assert 2.0 <= sleep_delays[0] <= 2.2 + + # ── 退避延迟增长 ─────────────────────────────────────── + + @pytest.mark.asyncio + async def test_backoff_delays_increase(self): + """无 retry-after 时延迟按指数增长.""" + vendor = _make_zhipu_vendor() + sleep_delays = [] + + async def mock_sleep(delay): + sleep_delays.append(delay) + + # 禁用 jitter 以精确验证延迟 + import dataclasses + + original_jitter = vendor._rl_retry.jitter + vendor._rl_retry = dataclasses.replace(vendor._rl_retry, jitter=False) + + call_count = 0 + + async def mock_post(*args, **kwargs): + nonlocal call_count + call_count += 1 + if call_count <= 4: + return _make_429_response() + return _make_200_response() + + try: + with ( + patch.object(vendor, "_get_client") as mock_client, + patch("asyncio.sleep", side_effect=mock_sleep), + ): + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + resp = await vendor.send_message( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ) + + assert resp.status_code == 200 + assert len(sleep_delays) == 4 + # initial=1000ms, multiplier=2.0 + # attempt 0: 1000 * 2^0 = 1000ms → sleep(1.0) + # attempt 1: 1000 * 2^1 = 2000ms → sleep(2.0) + # attempt 2: 1000 * 2^2 = 4000ms → sleep(4.0) + # attempt 3: 1000 * 2^3 = 8000ms → sleep(8.0) + assert sleep_delays[0] == pytest.approx(1.0) + assert sleep_delays[1] == pytest.approx(2.0) + assert sleep_delays[2] == pytest.approx(4.0) + assert sleep_delays[3] == pytest.approx(8.0) + finally: + vendor._rl_retry = dataclasses.replace( + vendor._rl_retry, jitter=original_jitter + ) + + # ── API key 缺失 ────────────────────────────────────── + + @pytest.mark.asyncio + async def test_missing_api_key_skips_retry(self): + """API key 缺失时 401 快速失败,不触发 429 重试.""" + vendor = _make_zhipu_vendor(api_key="") + resp = await vendor.send_message( + {"model": "claude-sonnet-4-20250514", "messages": []}, + {}, + ) + assert resp.status_code == 401 From bf51e9000032455ec2f1e07c57b6a3b17a8010a3 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Sat, 23 May 2026 18:06:41 +0800 Subject: [PATCH 48/66] =?UTF-8?q?fix(zhipu):=20=E8=AF=8A=E6=96=AD=E9=A6=96?= =?UTF-8?q?=E9=80=89=20tier=20=E8=AF=AD=E4=B9=89=E6=8B=92=E7=BB=9D?= =?UTF-8?q?=E9=99=8D=E7=BA=A7=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=8F=AF=E8=A7=82=E6=B5=8B=E6=80=A7=E5=B9=B6=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E8=B7=A8=E4=BE=9B=E5=BA=94=E5=95=86=E6=B8=85=E6=B4=97=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E5=87=BD=E6=95=B0=20(#243)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(zhipu): 修复首选 tier 语义拒绝降级问题,剥离 GLM 不支持的 Anthropic 扩展参数; 根因:zhipu 作为首选 tier 时 source_vendor=None,不触发跨供应商转换通道, 原始请求体含 cache_control/thinking/reasoning_effort 等 GLM 不支持的参数, 导致 400 invalid_request_error 降级到 copilot 浪费 token。 改动: - 新增 normalize_for_zhipu() 共享清洗函数作为 zhipu 兼容性单一事实源 - ZhipuVendor._prepare_request() 覆写应用 GLM 兼容性清洗 - 重构 prepare_copilot_to_zhipu() 委托给 normalize_for_zhipu() 消除重复 - 增强 execute_message 语义拒绝日志输出 error_message 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * revert(zhipu): 回退错误的 _prepare_request 参数清洗,实测验证 GLM 原生支持 thinking 并静默忽略 cache_control/reasoning_effort; 通过 curl 实证测试确认 zhipu Anthropic 兼容端点对以下参数的处理: - thinking 参数:200 OK,GLM 原生支持并返回 thinking content block - cache_control 字段:200 OK,被静默忽略(GLM 使用隐式自动缓存) - reasoning_effort 参数:200 OK,被静默忽略 - extended_thinking 参数:200 OK,被静默忽略 - redacted_thinking block:200 OK,被静默忽略 - 空 messages:400 invalid_request_error [1214][输入不能为空] 根因需进一步诊断:保留 normalize_for_zhipu 共享函数和 executor 日志增强, 待收集到 zhipu 返回的完整错误响应体后定位真正的 400 原因。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](${S}) Co-Authored-By: Aurelius Huang * docs(vendor-channels): 修正 normalize_for_zhipu 注释与 docstring,消除与 zhipu.py 实测结论的矛盾; _ZHIPU_UNSUPPORTED_PARAMS 注释错误声称参数会导致 400 错误,实际 GLM 原生支持 thinking 并静默忽略其余参数; docstring 声称服务于"首选 tier 场景"但无此类调用方,已更正为仅描述跨供应商转换通道的实际用途。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/convert/vendor_channels.py | 71 ++++++++++++++----- src/coding/proxy/routing/executor.py | 4 +- src/coding/proxy/vendors/zhipu.py | 6 ++ tests/test_vendor_channels.py | 78 +++++++++++++++++++++ tests/test_vendors.py | 4 +- tests/test_zhipu.py | 7 +- 6 files changed, 145 insertions(+), 25 deletions(-) diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index dadce2e..52b7f44 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -367,6 +367,57 @@ def _strip_cache_control(body: dict[str, Any]) -> int: return removed +# ── zhipu 共享清洗函数 ────────────────────────────────────────── + +# 跨供应商转换时主动剥离的顶层参数(首选 tier 场景由 _prepare_request 原样透传, +# GLM 原生支持 thinking / 静默忽略 cache_control 和 reasoning_effort,不会触发 400)。 +_ZHIPU_UNSUPPORTED_PARAMS: frozenset[str] = frozenset( + {"thinking", "extended_thinking", "reasoning_effort"} +) + + +def normalize_for_zhipu(body: dict[str, Any]) -> tuple[dict[str, Any], list[str]]: + """为 zhipu GLM 的 Anthropic 兼容端点清洗请求体(就地,不 deep copy). + + 为跨供应商转换通道 ``prepare_copilot_to_zhipu`` 提供请求体清洗。 + + 清洗内容: + 1. 剥离 cache_control 字段(GLM 静默忽略,主动剥离以减少噪音) + 2. 移除顶层 thinking/extended_thinking/reasoning_effort 参数(GLM 原生支持 + thinking、静默忽略 reasoning_effort,但跨供应商场景下这些参数来自原供应商 + 的协议语义,主动剥离以确保请求语义一致性) + 3. 强制 tool_use/tool_result 配对约束 + + 不包含 thinking blocks 剥离:跨供应商场景下 history 中的 thinking blocks + 来自原供应商(签名失效),由调用方在调用本函数之前通过 + ``strip_thinking_blocks`` 单独处理。 + + 所有操作均为幂等,安全地在已清洗的请求体上重复调用。 + + Returns: + (body, adaptations) — body 为就地修改后的同一引用,adaptations 为变换描述列表。 + """ + adaptations: list[str] = [] + + # Step 1: 剥离 cache_control + removed_cc = _strip_cache_control(body) + if removed_cc: + adaptations.append(f"removed_{removed_cc}_cache_control_fields") + + # Step 2: 移除不支持的顶层参数 + for param in _ZHIPU_UNSUPPORTED_PARAMS: + if param in body: + del body[param] + adaptations.append(f"removed_{param}_param") + + # Step 3: 强制 tool_use/tool_result 配对 + pairing_fixes = enforce_anthropic_tool_pairing(body.get("messages", [])) + if pairing_fixes: + adaptations.extend(pairing_fixes) + + return body, adaptations + + def _remove_vendor_blocks(body: dict[str, Any], block_types: set[str]) -> int: """从 messages[].content[] 中就地移除指定 type 的内容块. @@ -544,26 +595,14 @@ def prepare_copilot_to_zhipu( prepared = copy.deepcopy(body) adaptations: list[str] = [] - # Step 1: 剥离 thinking/redacted_thinking 块 + # Step 1: 剥离 thinking/redacted_thinking 块(跨供应商签名失效) stripped = strip_thinking_blocks(prepared) if stripped: adaptations.append(f"stripped_{stripped}_thinking_blocks") - # Step 2: 移除 cache_control 字段 - removed_cc = _strip_cache_control(prepared) - if removed_cc: - adaptations.append(f"removed_{removed_cc}_cache_control_fields") - - # Step 3: 移除顶层 thinking/extended_thinking 参数(GLM-5 不支持) - for param in ("thinking", "extended_thinking"): - if param in prepared: - del prepared[param] - adaptations.append(f"removed_{param}_param") - - # Step 4: 强制 tool_use/tool_result 配对 - pairing_fixes = enforce_anthropic_tool_pairing(prepared.get("messages", [])) - if pairing_fixes: - adaptations.extend(pairing_fixes) + # Step 2: 共享清洗(cache_control、不支持的顶层参数、tool pairing) + _, norm_adaptations = normalize_for_zhipu(prepared) + adaptations.extend(norm_adaptations) return prepared, adaptations diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 9d33ca9..7eac6c3 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -602,9 +602,11 @@ async def execute_message( if not is_last and is_semantic: logger.warning( - "Tier %s semantic rejection (%s), trying next tier without recording failure", + "Tier %s semantic rejection (type=%s, msg=%s), " + "trying next tier without recording failure", tier.name, resp.error_type or resp.status_code, + (resp.error_message or "N/A")[:200], ) failed_tier_name = tier.name continue diff --git a/src/coding/proxy/vendors/zhipu.py b/src/coding/proxy/vendors/zhipu.py index e6b4680..e7ed8c7 100644 --- a/src/coding/proxy/vendors/zhipu.py +++ b/src/coding/proxy/vendors/zhipu.py @@ -5,6 +5,12 @@ 1. 模型名映射(Claude -> GLM) 2. 认证头替换(x-api-key) +注意:实测验证 GLM 的 Anthropic 兼容端点对以下参数的处理方式: +- thinking 参数:原生支持(GLM 有自己的 thinking 机制) +- cache_control 字段:静默忽略(GLM 使用隐式自动缓存) +- reasoning_effort 参数:静默忽略 +以上参数均不会导致 400 错误,因此不需要在 _prepare_request 中剥离。 + 额外提供 429 Rate Limit 专用重试挽回机制: - max_attempt = 5(1 初始 + 4 重试) - 指数退避 + Full Jitter(1s → 2s → 4s → 8s) diff --git a/tests/test_vendor_channels.py b/tests/test_vendor_channels.py index 405fa30..f9c9bb5 100644 --- a/tests/test_vendor_channels.py +++ b/tests/test_vendor_channels.py @@ -22,6 +22,7 @@ enforce_anthropic_tool_pairing, get_transition_channel, infer_source_vendor_from_body, + normalize_for_zhipu, prepare_copilot_to_zhipu, prepare_zhipu_to_anthropic, prepare_zhipu_to_copilot, @@ -2147,3 +2148,80 @@ def test_rewrites_srvtoolu_and_strips_vendor_delta(self): assert prepared["messages"][1]["content"][0]["tool_use_id"] == new_id assert any("zhipu_vendor_blocks" in a for a in adaptations) assert any("srvtoolu_ids" in a for a in adaptations) + + +# ── normalize_for_zhipu 共享清洗函数 ──────────────────────── + + +class TestNormalizeForZhipu: + """normalize_for_zhipu 共享清洗函数测试.""" + + def test_strips_cache_control_and_params(self): + body = { + "model": "claude-sonnet-4-20250514", + "messages": [], + "thinking": {"type": "enabled", "budget_tokens": 5000}, + "extended_thinking": {"type": "enabled"}, + "reasoning_effort": "high", + "system": [ + { + "type": "text", + "text": "sys", + "cache_control": {"type": "ephemeral"}, + }, + ], + "tools": [ + { + "name": "Bash", + "input_schema": {"type": "object"}, + "cache_control": {"type": "ephemeral"}, + }, + ], + } + result, adaptations = normalize_for_zhipu(body) + + assert "thinking" not in result + assert "extended_thinking" not in result + assert "reasoning_effort" not in result + assert "cache_control" not in result["system"][0] + assert "cache_control" not in result["tools"][0] + assert any("cache_control" in a for a in adaptations) + assert any("thinking" in a for a in adaptations) + assert any("reasoning_effort" in a for a in adaptations) + + def test_operates_in_place(self): + body = {"model": "x", "messages": []} + result, _ = normalize_for_zhipu(body) + assert result is body + + def test_idempotent(self): + body = { + "model": "x", + "messages": [], + "thinking": {"type": "enabled"}, + } + normalize_for_zhipu(body) + _, adaptations = normalize_for_zhipu(body) + assert adaptations == [] + + def test_no_deep_copy(self): + messages = [{"role": "user", "content": "hi"}] + body = {"model": "x", "messages": messages} + result, _ = normalize_for_zhipu(body) + assert result["messages"] is messages + + def test_preserves_supported_params(self): + body = { + "model": "x", + "messages": [{"role": "user", "content": "hello"}], + "max_tokens": 1024, + "temperature": 0.7, + "stream": True, + "metadata": {"user_id": "test"}, + } + result, adaptations = normalize_for_zhipu(body) + assert result["max_tokens"] == 1024 + assert result["temperature"] == 0.7 + assert result["stream"] is True + assert result["metadata"] == {"user_id": "test"} + assert adaptations == [] diff --git a/tests/test_vendors.py b/tests/test_vendors.py index f771e9b..3ac0477 100644 --- a/tests/test_vendors.py +++ b/tests/test_vendors.py @@ -396,7 +396,7 @@ async def test_zhipu_prepare_request_preserves_metadata(): @pytest.mark.asyncio async def test_zhipu_prepare_request_preserves_thinking(): - """ZhipuVendor._prepare_request 应原样保留 thinking 字段(原生端点支持).""" + """ZhipuVendor._prepare_request 应原样保留 thinking 字段(GLM 原生支持).""" mapper = ModelMapper([]) zhipu_vendor = ZhipuVendor(ZhipuConfig(api_key="sk-test"), mapper) body = { @@ -405,7 +405,7 @@ async def test_zhipu_prepare_request_preserves_thinking(): "thinking": {"type": "enabled", "budget_tokens": 10000}, } prepared_body, _ = await zhipu_vendor._prepare_request(body, {}) - # thinking 原样透传,不再剥离任何字段 + # thinking 原样透传(GLM 原生支持 thinking) assert prepared_body["thinking"] == {"type": "enabled", "budget_tokens": 10000} # 原始 body 不应被修改 assert body["thinking"]["budget_tokens"] == 10000 diff --git a/tests/test_zhipu.py b/tests/test_zhipu.py index 8d010b3..aef567a 100644 --- a/tests/test_zhipu.py +++ b/tests/test_zhipu.py @@ -103,20 +103,15 @@ async def test_body_passthrough_except_model(self, zhipu_vendor): # 仅 model 被映射 assert prepared_body["model"] == "glm-5.1" - # 其余字段原样保留 + # 其余字段原样保留(GLM 原生支持 thinking,静默忽略 cache_control) assert prepared_body["max_tokens"] == 1024 assert prepared_body["temperature"] == 0.7 assert prepared_body["top_p"] == 0.9 assert prepared_body["stream"] is True - # thinking 不再被剥离 assert prepared_body["thinking"] == {"type": "enabled", "budget_tokens": 5000} - # metadata 不再被剥离 assert prepared_body["metadata"] == {"user_id": "test-user"} - # system 不被删除 assert prepared_body["system"] == "You are a helpful assistant." - # tools 不被截断或过滤 assert len(prepared_body["tools"]) == 3 - # tool_choice 不被修改 assert prepared_body["tool_choice"] == {"type": "auto"} # 原始 body 未被修改(deep copy) assert body["model"] == "claude-sonnet-4-20250514" From 5e1a51d559f6318eb06e788f26baa2e4e05ebe5a Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Sat, 23 May 2026 18:10:12 +0800 Subject: [PATCH 49/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a5;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index fb64bae..6437035 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a4" +version = "0.4.1a5" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 156c6c8..68360a8 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a4" +version = "0.4.1a5" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 35dee3647012b593a0d4e35e427d4c6b5016b08c Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Sat, 23 May 2026 23:31:05 +0800 Subject: [PATCH 50/66] =?UTF-8?q?diag(executor):=20=E4=B8=BA=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=E6=8B=92=E7=BB=9D=E8=B7=AF=E5=BE=84=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E4=BD=93=E5=8F=AF=E7=96=91=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=AF=8A=E6=96=AD=E6=97=A5=E5=BF=97;=20(#244)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 execute_message 和 execute_stream 的 semantic rejection 日志中 附加请求体参数快照(thinking/extended_thinking/reasoning_effort 顶层参数、 会话历史中 thinking blocks 数量、cache_control 存在情况、模型名、消息数), 用于定位 zhipu glm-4.7 [1210] 参数校验拒绝的具体祸根参数。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/routing/executor.py | 68 +++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 7eac6c3..74273af 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -48,6 +48,58 @@ logger = logging.getLogger(__name__) +def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str: + """构建语义拒绝的请求体诊断上下文. + + 在 semantic rejection 日志中附加请求体的可疑参数快照, + 用于定位供应商参数校验失败的具体祸根参数。 + """ + parts: list[str] = [] + # 顶层不兼容参数 + for key in ("thinking", "extended_thinking", "reasoning_effort"): + if key in body: + val = body[key] + parts.append(f"{key}={val!r:.80}") + # 会话历史中的 thinking blocks + thinking_count = 0 + for msg in body.get("messages", []): + content = msg.get("content") + if not isinstance(content, list): + continue + for block in content: + if isinstance(block, dict) and block.get("type") in ( + "thinking", + "redacted_thinking", + ): + thinking_count += 1 + if thinking_count: + parts.append(f"thinking_blocks_in_history={thinking_count}") + # cache_control 存在检测 + has_cc = False + for section in ( + body.get("system", []) if isinstance(body.get("system"), list) else [], + *( + m.get("content", []) + for m in body.get("messages", []) + if isinstance(m.get("content"), list) + ), + body.get("tools", []), + ): + if isinstance(section, list): + for item in section: + if isinstance(item, dict) and "cache_control" in item: + has_cc = True + break + if has_cc: + break + if has_cc: + parts.append("cache_control_fields=present") + # 模型 + 消息数 + parts.append(f"model={body.get('model', 'N/A')}") + parts.append(f"messages={len(body.get('messages', []))}") + return f" [{', '.join(parts)}]" if parts else "" + + def _log_http_error_detail( tier_name: str, exc: Exception, @@ -601,12 +653,14 @@ async def execute_message( ) if not is_last and is_semantic: + diagnostic = _build_semantic_rejection_diagnostic(body) logger.warning( - "Tier %s semantic rejection (type=%s, msg=%s), " + "Tier %s semantic rejection (type=%s, msg=%s)%s, " "trying next tier without recording failure", tier.name, resp.error_type or resp.status_code, (resp.error_message or "N/A")[:200], + diagnostic, ) failed_tier_name = tier.name continue @@ -838,6 +892,18 @@ async def _handle_http_error( ) if semantic_rejection and not is_last: + if request_body is not None: + diagnostic = _build_semantic_rejection_diagnostic(request_body) + logger.warning( + "Tier %s stream semantic rejection (type=%s, msg=%s)%s, " + "trying next tier without recording failure", + tier.name, + error.get("type") if isinstance(error, dict) else None, + (error.get("message") if isinstance(error, dict) else "N/A")[ + :200 + ], + diagnostic, + ) return True, tier.name, exc rl_info = parse_rate_limit_headers( From 478cc7126e668cc5572e2d9b6b8810a13cacee36 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Sat, 23 May 2026 23:33:16 +0800 Subject: [PATCH 51/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6437035..d09469f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a5" +version = "0.4.1a6" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 68360a8..bbf5556 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a5" +version = "0.4.1a6" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 83684fe3f25874a9fcf4abc58afa658a0f7407ef Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Mon, 25 May 2026 11:24:48 +0800 Subject: [PATCH 52/66] =?UTF-8?q?feat(session):=20=E4=BB=8E=E9=A6=96?= =?UTF-8?q?=E4=B8=AA=E7=94=A8=E6=88=B7=E6=B6=88=E6=81=AF=E6=8F=90=E5=8F=96?= =?UTF-8?q?=20Session=20=E6=A0=87=E9=A2=98=E5=B9=B6=E5=9C=A8=20Dashboard?= =?UTF-8?q?=20=E5=B1=95=E7=A4=BA=20(#245)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(session): 从首个用户消息提取 Session 标题并在 Dashboard 展示 - 新增 session_meta 表持久化 session 级标题元数据 - 检测新 session 时从首个 user 消息提取文本截取前 30 字作为标题 - get_or_create_record() 返回 is_new 标志标识首次会话 - Dashboard Sessions 列表新增 Title 列,展开详情同步展示 - 更新相关测试适配返回值变更 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(test): 补全 get_or_create_record 返回类型变更遗漏的测试调用点; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- src/coding/proxy/logging/db.py | 39 ++++++++++++++++++++- src/coding/proxy/routing/executor.py | 37 +++++++++++++++++-- src/coding/proxy/routing/session_manager.py | 13 ++++--- src/coding/proxy/routing/usage_recorder.py | 5 +++ src/coding/proxy/server/dashboard.py | 28 +++++++++------ tests/test_router_executor.py | 11 +++--- 6 files changed, 109 insertions(+), 24 deletions(-) diff --git a/src/coding/proxy/logging/db.py b/src/coding/proxy/logging/db.py index 9e87853..8470966 100644 --- a/src/coding/proxy/logging/db.py +++ b/src/coding/proxy/logging/db.py @@ -190,6 +190,14 @@ def _local_month_udf(ts_str: str) -> str: ); """ +_CREATE_SESSION_META = """ +CREATE TABLE IF NOT EXISTS session_meta ( + session_key TEXT PRIMARY KEY, + title TEXT NOT NULL DEFAULT '', + created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) +); +""" + _CREATE_INDEXES = """ CREATE INDEX IF NOT EXISTS idx_usage_ts ON usage_log(ts); CREATE INDEX IF NOT EXISTS idx_usage_vendor ON usage_log(vendor); @@ -245,6 +253,7 @@ async def init(self) -> None: self._db.row_factory = aiosqlite.Row await self._db.execute("PRAGMA journal_mode=WAL") await self._db.executescript(_CREATE_TABLES) + await self._db.executescript(_CREATE_SESSION_META) # 迁移必须在建索引之前执行,确保 vendor 列已存在 await self._migrate_rename_backend_to_vendor() await self._migrate_add_failover_from() @@ -316,6 +325,28 @@ async def _migrate_rename_backend_to_vendor(self) -> None: "Migration: renamed 'backend' column to 'vendor' in %s", table ) + async def set_session_title(self, session_key: str, title: str) -> None: + """为新 session 设置标题(幂等,仅首次写入).""" + if not self._db or not title or not session_key: + return + await self._db.execute( + "INSERT OR IGNORE INTO session_meta (session_key, title) VALUES (?, ?)", + (session_key, title), + ) + await self._db.commit() + + async def get_session_titles(self, session_keys: list[str]) -> dict[str, str]: + """批量查询 session 标题.""" + if not self._db or not session_keys: + return {} + placeholders = ",".join("?" for _ in session_keys) + cursor = await self._db.execute( + f"SELECT session_key, title FROM session_meta WHERE session_key IN ({placeholders})", + session_keys, + ) + rows = await cursor.fetchall() + return {row["session_key"]: row["title"] for row in rows} + async def log( self, vendor: str, @@ -621,7 +652,13 @@ async def query_recent_sessions( (cutoff_iso, limit), ) rows = await cursor.fetchall() - return [dict(row) for row in rows] + sessions = [dict(row) for row in rows] + if sessions: + keys = [s["session_key"] for s in sessions] + titles = await self.get_session_titles(keys) + for s in sessions: + s["title"] = titles.get(s["session_key"], "") + return sessions async def query_session_profile(self, session_key: str) -> dict | None: """查询单个会话的完整聚合数据.""" diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 74273af..537b2b0 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -43,10 +43,29 @@ # 向后兼容别名 BackendResponse = VendorResponse NoCompatibleBackendError = NoCompatibleVendorError -from ..compat.canonical import CompatibilityStatus, build_canonical_request +from ..compat.canonical import ( + CanonicalPartType, + CompatibilityStatus, + build_canonical_request, +) +from ..model.compat import CanonicalRequest logger = logging.getLogger(__name__) +_SESSION_TITLE_MAX_LEN = 30 + + +def _extract_session_title(request: CanonicalRequest) -> str: + """从规范化请求中提取首个用户消息文本作为 session 标题.""" + for part in request.messages: + if ( + part.role == "user" + and part.type == CanonicalPartType.TEXT + and part.text.strip() + ): + return part.text.strip()[:_SESSION_TITLE_MAX_LEN] + return "" + def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str: """构建语义拒绝的请求体诊断上下文. @@ -393,10 +412,16 @@ async def execute_stream( failed_tier_name: str | None = None request_caps = build_request_capabilities(body) canonical_request = build_canonical_request(body, headers) - session_record = await self._session_mgr.get_or_create_record( + session_record, is_new_session = await self._session_mgr.get_or_create_record( canonical_request.session_key, canonical_request.trace_id, ) + if is_new_session: + title = _extract_session_title(canonical_request) + if title: + await self._recorder.set_session_title( + canonical_request.session_key, title + ) incompatible_reasons: list[str] = [] effective_tiers = self._resolve_effective_tiers(canonical_request.session_key) last_idx = len(effective_tiers) - 1 @@ -564,10 +589,16 @@ async def execute_message( failed_tier_name: str | None = None request_caps = build_request_capabilities(body) canonical_request = build_canonical_request(body, headers) - session_record = await self._session_mgr.get_or_create_record( + session_record, is_new_session = await self._session_mgr.get_or_create_record( canonical_request.session_key, canonical_request.trace_id, ) + if is_new_session: + title = _extract_session_title(canonical_request) + if title: + await self._recorder.set_session_title( + canonical_request.session_key, title + ) incompatible_reasons: list[str] = [] effective_tiers = self._resolve_effective_tiers(canonical_request.session_key) last_idx = len(effective_tiers) - 1 diff --git a/src/coding/proxy/routing/session_manager.py b/src/coding/proxy/routing/session_manager.py index 845ac87..aaef0ba 100644 --- a/src/coding/proxy/routing/session_manager.py +++ b/src/coding/proxy/routing/session_manager.py @@ -19,13 +19,18 @@ def __init__(self, compat_session_store: CompatSessionStore | None = None) -> No async def get_or_create_record( self, session_key: str, trace_id: str - ) -> CompatSessionRecord | None: + ) -> tuple[CompatSessionRecord | None, bool]: + """获取或创建兼容性会话记录. + + Returns: + (record, is_new) — is_new 为 True 表示本次创建的新会话。 + """ if self._store is None: - return None + return None, False record = await self._store.get(session_key) if record is not None: - return record - return CompatSessionRecord(session_key=session_key, trace_id=trace_id) + return record, False + return CompatSessionRecord(session_key=session_key, trace_id=trace_id), True def apply_compat_context( self, diff --git a/src/coding/proxy/routing/usage_recorder.py b/src/coding/proxy/routing/usage_recorder.py index 525a6c1..8887c09 100644 --- a/src/coding/proxy/routing/usage_recorder.py +++ b/src/coding/proxy/routing/usage_recorder.py @@ -28,6 +28,11 @@ def __init__( def set_pricing_table(self, table: PricingTable) -> None: self._pricing_table = table + async def set_session_title(self, session_key: str, title: str) -> None: + """为新 session 设置标题(委托给 TokenLogger).""" + if self._token_logger: + await self._token_logger.set_session_title(session_key, title) + # ── 用量信息构建 ────────────────────────────────────── @staticmethod diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 07bd6a3..54533e6 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -411,6 +411,7 @@ def _build_favicon() -> bytes: .session-table td.cell-tags { white-space: normal; overflow: visible; text-overflow: clip; line-height: 1.8; vertical-align: middle; } .session-table tr:hover td { background: var(--bg-card-hover); } .session-table .session-key { font-family: 'JetBrains Mono', monospace; font-size: 12px; color: var(--accent-blue); cursor: default; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + .session-table .session-title { font-size: 12px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 0; } .session-id { display: flex; align-items: center; gap: 4px; } .session-id-text { overflow: hidden; text-overflow: ellipsis; } .copy-btn { background: none; border: none; color: var(--text-tertiary); cursor: pointer; padding: 2px; border-radius: 4px; font-size: 12px; line-height: 1; opacity: .5; flex-shrink: 0; } @@ -676,20 +677,22 @@ def _build_favicon() -> bytes:

- - + + + + + + - - - - - - + + + + @@ -702,7 +705,7 @@ def _build_favicon() -> bytes: - +
Session IDTitle Last Active Requests Tokens
Loading...
Loading...
@@ -1573,7 +1576,7 @@ def _build_favicon() -> bytes: var tbody = document.getElementById('sessions-tbody'); if (!total) { - tbody.innerHTML = '
📭
No session data'; + tbody.innerHTML = '
📭
No session data'; } else { tbody.innerHTML = page.map(function(s) { var parsed = parseSessionKey(s.session_key); @@ -1582,6 +1585,7 @@ def _build_favicon() -> bytes: var modelsFull = (s.models || '').split(',').map(function(c){return c.trim();}); var vendorsFull = (s.vendors || '').split(',').map(function(v){return formatVendorLabel(v.trim());}); var sr = s.success_rate != null ? Math.round(s.success_rate) : null; + var sessionTitle = s.title || ''; return '' + '' + '
' + @@ -1592,6 +1596,7 @@ def _build_favicon() -> bytes: 'dev:' + escapeHtml(shortId(parsed.device_id, 8)) + ' · acct:' + escapeHtml(shortId(parsed.account_uuid, 8)) + '
' + '' + + '' + (sessionTitle ? escapeHtml(sessionTitle) : '–') + '' + '' + relativeTime(s.last_active_ts) + '' + '' + fmtNum(s.total_requests) + '' + '' + fmtTokens(s.total_tokens) + '' + @@ -1602,9 +1607,10 @@ def _build_favicon() -> bytes: '' + selectHtml + '' + '' + formatCategories(s.client_categories) + '' + '' + - '
' + + '
' + '
' + '
Session ID
' + escapeHtml(parsed.session_id || s.session_key) + '
' + + '
Title
' + (sessionTitle ? escapeHtml(sessionTitle) : '–') + '
' + '
Device
' + (parsed.device_id ? escapeHtml(parsed.device_id) : '–') + '
' + '
Account
' + (parsed.account_uuid ? escapeHtml(parsed.account_uuid) : '–') + '
' + '
' + diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index 1e40ea6..dc37939 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -222,7 +222,7 @@ async def test_eligible_when_all_checks_pass(self): headers = {} caps = RequestCapabilities() req = build_canonical_request(body, headers) - session_record = await exec_inst._session_mgr.get_or_create_record( + session_record, _is_new = await exec_inst._session_mgr.get_or_create_record( req.session_key, req.trace_id ) reasons: list[str] = [] @@ -246,7 +246,7 @@ async def test_skip_when_capability_unsupported(self): body = {"model": "test"} headers = {} req = build_canonical_request(body, headers) - session_record = await exec_inst._session_mgr.get_or_create_record( + session_record, _is_new = await exec_inst._session_mgr.get_or_create_record( req.session_key, req.trace_id ) reasons: list[str] = [] @@ -275,7 +275,7 @@ async def test_skip_when_unsafe_compatibility(self): body = {"model": "test", "thinking": {"type": "enabled"}} headers = {} req = build_canonical_request(body, headers) - session_record = await exec_inst._session_mgr.get_or_create_record( + session_record, _is_new = await exec_inst._session_mgr.get_or_create_record( req.session_key, req.trace_id ) reasons: list[str] = [] @@ -651,9 +651,10 @@ class TestRouteSessionManagerIntegration: @pytest.mark.asyncio async def test_get_or_create_without_store(self): mgr = RouteSessionManager(compat_session_store=None) - record = await mgr.get_or_create_record("sk_test", "trace_1") - # 无 store 时返回 None(由 executor 层面处理空 record 场景) + record, is_new = await mgr.get_or_create_record("sk_test", "trace_1") + # 无 store 时返回 (None, False) assert record is None + assert is_new is False @pytest.mark.asyncio async def test_persist_session_without_store_is_noop(self): From 5a7450e584f4e09379cddb2fc0bef187d4828871 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 25 May 2026 11:47:30 +0800 Subject: [PATCH 53/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a7;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d09469f..52a648b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a6" +version = "0.4.1a7" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index bbf5556..4602d4a 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a6" +version = "0.4.1a7" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 799f5f9f3f01241ef1792e14d62b3446621b0b60 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Mon, 25 May 2026 13:43:07 +0800 Subject: [PATCH 54/66] =?UTF-8?q?fix(session):=20=E5=89=94=E9=99=A4=20Sess?= =?UTF-8?q?ion=20=E6=A0=87=E9=A2=98=E4=B8=AD=E7=9A=84=20System=20Instructi?= =?UTF-8?q?on=20=E5=99=AA=E5=A3=B0;=20(#246)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude Code 会在首条 user 消息 content 中拼接多个 / 等系统注入块,导致原 _extract_session_title 抽取出的 标题在不同会话间高度同质,丧失辨识度。 - 新增 _sanitize_user_text,基于白名单剥离 system-reminder、user-preferences、 local-command-stdout/stderr、bash-input/stdout/stderr、ide_selection、 stdin、system_instruction 等 CC 注入标签,折叠空白后返回真实用户输入; - 优先识别 slash command (/),合成"命令 + 参数" 式标题,避免命令式会话标题为空; - 重写 _extract_session_title,跳过清洗后为空的 user 文本 part,自动 fallback 到下一个有真实内容的 part; - 补充 20 个单元测试覆盖噪声剥离、slash command、空白折叠、截断、边界场景。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/routing/executor.py | 70 ++++++++++-- tests/test_router_executor.py | 162 +++++++++++++++++++++++++++ 2 files changed, 225 insertions(+), 7 deletions(-) diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 537b2b0..7ed3c1c 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -7,6 +7,7 @@ from __future__ import annotations import logging +import re import time from collections.abc import AsyncIterator from typing import Any @@ -54,16 +55,71 @@ _SESSION_TITLE_MAX_LEN = 30 +# Claude Code 注入的"噪声"标签 — 系统级上下文,不应进入 Session 标题。 +# 这些标签由 CC harness 在首个 user 消息 content 中拼接,高度同质, +# 直接用作标题会导致跨会话标题无差异化,丧失辨识度。 +_NOISE_TAG_PATTERN = re.compile( + r"<(?Psystem-reminder|user-preferences|" + r"local-command-stdout|local-command-stderr|" + r"bash-input|bash-stdout|bash-stderr|" + r"ide_selection|stdin|system_instruction)\b[^>]*>" + r".*?", + flags=re.DOTALL | re.IGNORECASE, +) + +# Slash command 子标签:用于识别 /commit、/review 等命令式调用, +# 合成"命令 + 参数"式标题。 +_CMD_NAME_PATTERN = re.compile(r"(.*?)", flags=re.DOTALL) +_CMD_ARGS_PATTERN = re.compile(r"(.*?)", flags=re.DOTALL) +# 残留 command-* 包裹标签清除(command-message/command-stdout 等次要标签)。 +_CMD_WRAPPER_PATTERN = re.compile( + r".*?", flags=re.DOTALL +) + + +def _sanitize_user_text(raw: str) -> str: + """剔除 Claude Code 注入的系统级 XML 块,还原真实用户输入。 + + 处理顺序: + 1. Slash command 优先识别 — 若检测到 ,合成"命令 + 参数" + 式标题(因为残留文本通常为空,直接取标签内容更有意义)。 + 2. 通用噪声剥离 — 移除已知白名单内的 system-reminder 等标签。 + 3. 残留 command-* 包裹清除 — 兜底去除 command-message 等次要标签。 + 4. 前后空白归一化 — 折叠连续空白为单空格,便于 30 字截断。 + """ + if not raw: + return "" + + # 阶段一: slash command 短路 + cmd = _CMD_NAME_PATTERN.search(raw) + if cmd: + name = cmd.group(1).strip() + args_match = _CMD_ARGS_PATTERN.search(raw) + args = args_match.group(1).strip() if args_match else "" + composed = f"{name} {args}".strip() if args else name + if composed: + return composed + + # 阶段二: 通用噪声剥离 + cleaned = _NOISE_TAG_PATTERN.sub("", raw) + cleaned = _CMD_WRAPPER_PATTERN.sub("", cleaned) + + # 阶段三: 空白折叠 + return re.sub(r"\s+", " ", cleaned).strip() + def _extract_session_title(request: CanonicalRequest) -> str: - """从规范化请求中提取首个用户消息文本作为 session 标题.""" + """从规范化请求中提取首个用户消息文本作为 session 标题。 + + 跳过 Claude Code 注入的系统级 XML 块(system-reminder、user-preferences 等), + 确保标题反映用户真实输入而非高同质化的系统模板。 + """ for part in request.messages: - if ( - part.role == "user" - and part.type == CanonicalPartType.TEXT - and part.text.strip() - ): - return part.text.strip()[:_SESSION_TITLE_MAX_LEN] + if part.role != "user" or part.type != CanonicalPartType.TEXT: + continue + cleaned = _sanitize_user_text(part.text) + if cleaned: + return cleaned[:_SESSION_TITLE_MAX_LEN] return "" diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index dc37939..6dd630e 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -20,11 +20,14 @@ build_canonical_request, ) from coding.proxy.routing.executor import ( + _SESSION_TITLE_MAX_LEN, _VENDOR_PROTOCOL_LABEL_MAP, + _extract_session_title, _has_tool_results, _is_likely_request_format_error, _log_vendor_response_error, _RouteExecutor, + _sanitize_user_text, ) from coding.proxy.routing.session_manager import RouteSessionManager from coding.proxy.routing.tier import VendorTier @@ -1949,3 +1952,162 @@ def test_returns_body_for_unknown_tier(self): result = exec_inst._prepare_body_for_tier(body, tier, source_vendor="zhipu") assert result is body + + +# ── Session 标题清洗与抽取测试 ───────────────────────────────── + + +class TestSanitizeUserText: + """``_sanitize_user_text`` — 剥离 CC 注入的系统级 XML 块. + + 覆盖典型 system-reminder/user-preferences 噪声、slash command + 短路、空白折叠与边界场景。 + """ + + def test_strips_system_reminder(self): + raw = "MCP 指令这是用户真实输入" + assert _sanitize_user_text(raw) == "这是用户真实输入" + + def test_strips_user_preferences(self): + raw = "用户问题遵循 AGENTS.md" + assert _sanitize_user_text(raw) == "用户问题" + + def test_strips_multiple_noise_blocks(self): + raw = ( + "A" + "B" + "C" + "D" + "真实输入文本" + "P" + ) + assert _sanitize_user_text(raw) == "真实输入文本" + + def test_strips_multiline_system_reminder(self): + """多行 system-reminder 块需被 DOTALL 完整匹配剥离.""" + raw = ( + "\n" + "# MCP Server Instructions\n" + "Use this server to fetch ...\n" + "\n" + "TITLE 中的 Session 标题应当取自用户输入" + ) + assert _sanitize_user_text(raw) == "TITLE 中的 Session 标题应当取自用户输入" + + def test_strips_tag_with_attributes(self): + """容忍标签携带属性(如 ).""" + raw = 'noise真实' + assert _sanitize_user_text(raw) == "真实" + + def test_slash_command_with_args(self): + raw = ( + "commit (user)" + "/commit" + "修复标题" + ) + assert _sanitize_user_text(raw) == "/commit 修复标题" + + def test_slash_command_no_args(self): + raw = "/review" + assert _sanitize_user_text(raw) == "/review" + + def test_collapses_whitespace(self): + raw = "X\n\n 多余 空白\t\t折叠 " + assert _sanitize_user_text(raw) == "多余 空白 折叠" + + def test_empty_after_strip(self): + raw = "仅噪声" + assert _sanitize_user_text(raw) == "" + + def test_empty_input(self): + assert _sanitize_user_text("") == "" + + def test_preserves_user_xml_like_content(self): + """用户输入中合法的 XML/HTML 片段(非白名单标签)需完整保留.""" + raw = "请帮我审查这段代码:
hello
是否符合规范?" + assert _sanitize_user_text(raw) == raw + + def test_strips_local_command_output(self): + raw = "build ok构建后的下一步问题" + assert _sanitize_user_text(raw) == "构建后的下一步问题" + + +class TestExtractSessionTitle: + """``_extract_session_title`` — 端到端从 CanonicalRequest 抽取标题.""" + + @staticmethod + def _build_request(messages: list[dict]): + return build_canonical_request({"model": "test", "messages": messages}, {}) + + def test_truncates_to_max_len(self): + long_text = "用户输入文本" * 20 + req = self._build_request([{"role": "user", "content": long_text}]) + title = _extract_session_title(req) + assert len(title) == _SESSION_TITLE_MAX_LEN + assert title == long_text[:_SESSION_TITLE_MAX_LEN] + + def test_strips_noise_from_first_user_message(self): + raw = ( + "MCP 指令" + "偏好" + "测试标题 ABC" + ) + req = self._build_request([{"role": "user", "content": raw}]) + assert _extract_session_title(req) == "测试标题 ABC" + + def test_handles_real_cc_first_message_shape(self): + """模拟 CC 真实首条消息(多个连续 system-reminder + 用户文本).""" + raw = ( + "\n# MCP Server Instructions\n..." + "\nThe following skills...\n" + "\nPlan mode is active...\n" + "\n\nTITLE 中的 Session 标题应当取自用户输入的信息前 30 个字\n\n" + "始终遵循 AGENTS.md" + ) + req = self._build_request([{"role": "user", "content": raw}]) + title = _extract_session_title(req) + assert title.startswith("TITLE 中的 Session") + assert len(title) <= _SESSION_TITLE_MAX_LEN + + def test_extracts_slash_command(self): + raw = ( + "/commit" + "feat: 新增标题清洗" + ) + req = self._build_request([{"role": "user", "content": raw}]) + assert _extract_session_title(req) == "/commit feat: 新增标题清洗" + + def test_returns_empty_when_only_noise(self): + raw = "纯噪声" + req = self._build_request([{"role": "user", "content": raw}]) + assert _extract_session_title(req) == "" + + def test_returns_empty_for_no_user_messages(self): + req = self._build_request([{"role": "assistant", "content": "你好"}]) + assert _extract_session_title(req) == "" + + def test_skips_noise_only_part_to_find_real_input(self): + """首个 user text part 全噪声时,fallback 到下一个非空 user part.""" + messages = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "noise", + }, + {"type": "text", "text": "真实问题"}, + ], + } + ] + req = self._build_request(messages) + assert _extract_session_title(req) == "真实问题" + + def test_skips_assistant_role(self): + """assistant 角色的文本不应被作为标题候选.""" + messages = [ + {"role": "assistant", "content": "上一轮回答"}, + {"role": "user", "content": "新的用户问题"}, + ] + req = self._build_request(messages) + assert _extract_session_title(req) == "新的用户问题" From b0d688e930d77d02067d5cc774aafec13f228206 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 25 May 2026 16:48:38 +0800 Subject: [PATCH 55/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a8;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 52a648b..60a631f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a7" +version = "0.4.1a8" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 4602d4a..85ef15c 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a7" +version = "0.4.1a8" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 2af7221b5f85fde8eba5baf35254b0a5fea0ae9e Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Mon, 25 May 2026 18:14:55 +0800 Subject: [PATCH 56/66] =?UTF-8?q?diag(executor):=20=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E6=8B=92=E7=BB=9D=E8=AF=8A=E6=96=AD=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=A6=86=E7=9B=96=E8=8C=83=E5=9B=B4=EF=BC=8C=E8=BF=9B?= =?UTF-8?q?=E4=B8=80=E6=AD=A5=E5=AE=9A=E4=BD=8D=20zhipu=20[1210]=20?= =?UTF-8?q?=E7=9C=9F=E5=9B=A0=20(#247)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * diag(executor): 为语义拒绝路径增加请求体可疑参数诊断日志; 在 execute_message 和 execute_stream 的 semantic rejection 日志中 附加请求体参数快照(thinking/extended_thinking/reasoning_effort 顶层参数、 会话历史中 thinking blocks 数量、cache_control 存在情况、模型名、消息数), 用于定位 zhipu glm-4.7 [1210] 参数校验拒绝的具体祸根参数。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * diag(executor): 扩展语义拒绝诊断日志覆盖范围至 system/tools/sampling/metadata/content_types 等维度 PR #244 部署后的诊断日志反转了原推断:失败请求均不含 thinking/cache_control, 说明祸根在更细粒度的参数。扩展 _build_semantic_rejection_diagnostic 函数: 新增维度(仅存在时输出): - system 形态(string/blocks + cache_control 计数) - tools 数量 + tool_choice 形态 - 采样参数(max_tokens/temperature/top_p/top_k/stop_sequences) - stream / metadata_keys - messages.content 类型分布(含 string content) - 请求体字节数估算(json.dumps) 新增 14 个单元测试(TestBuildSemanticRejectionDiagnostic)覆盖各字段组合 与真实失败请求形态。所有测试通过(1478 passed)。 * docs(agents): 记录 zhipu [1210] 诊断阶段进展(证据反转 + Step 1 v2) * build(version): 版本号升级至 0.4.1a6; --- docs/agents/issue.md | 44 ++++++ src/coding/proxy/routing/executor.py | 119 +++++++++++++++ tests/test_router_executor.py | 213 +++++++++++++++++++++++++++ 3 files changed, 376 insertions(+) diff --git a/docs/agents/issue.md b/docs/agents/issue.md index 8583087..af58832 100644 --- a/docs/agents/issue.md +++ b/docs/agents/issue.md @@ -230,3 +230,47 @@ SUM(input_tokens + output_tokens - 历次 PR 中 cache token 字段的引入是渐进式的(schema 已有四列、`log()` 入参齐全、Overview 已全口径消费),但部分聚合视图的口径升级被遗漏;任何向 `usage_log` 增列后,**必须**审计所有 `SUM(input_tokens` / `SUM(output_tokens` 出现处的聚合表达式是否需要同步更新。 - 跨标签页同一指标(如"总 Tokens")的口径一致性,建议在添加新视图时主动与 Overview 现有口径做交叉核对,必要时在 SQL 注释中标注口径来源,便于后续 review。 + +--- + +## Zhipu vendor 间歇性 `[1210][API 调用参数有误]` 拒绝(诊断阶段) + +**问题描述** + +Zhipu vendor 作为首选 tier 时,处理 `claude-haiku-* → glm-5-turbo` 的部分请求被上游直接拒绝: + +``` +WARNING Tier zhipu semantic rejection + (type=invalid_request_error, + msg=[1210][API 调用参数有误,请检查文档。][...]) + [model=claude-haiku-4-5-20251001, messages=1], trying next tier without recording failure +INFO Tier anthropic message succeeded (took over from failed tier: zhipu) +``` + +失败请求统一表现为 `duration<1s + tokens=[0 0 0 0]`,被 zhipu 在入口校验阶段直接拒绝、未消耗任何 token。两次观察窗口失败率分别为 4%(2026-05-23 22:24,glm-4.7 旧映射)与 27%(2026-05-25 17:26+,glm-5-turbo 当前映射),均触发降级至 anthropic / copilot。 + +**表因** + +`is_semantic_rejection` 检测到 zhipu 返回 `invalid_request_error + 1210` 含「API 调用参数有误」中文标记,判定为语义拒绝,跳过下一层 tier。1210 是智谱官方错误码,[官方文档](https://docs.bigmodel.cn/cn/api/api-code) 定义为「参数格式/类型不符规范」(区别于 1213「必需字段缺失」、1214「字段参数非法」)。 + +**根因(仍在收集证据)** + +PR #244 的初版诊断字段仅覆盖 `thinking / thinking_blocks / cache_control / model / messages`,但 2026-05-25 17:26 后的诊断日志显示失败请求**均不含**上述任何字段。说明真正祸根在更细粒度的参数(system / tools / max_tokens / sampling / metadata / content_types / body_size 等)。 + +**处理方式(分阶段)** + +- **Step 1(PR #244,已合并)**:在 `executor.py::_build_semantic_rejection_diagnostic` 中输出 thinking / cache_control 相关字段 — 但证据反转,覆盖不足以定位真因。 +- **Step 1 v2(本次)**:扩展诊断函数覆盖 `system_kind|blocks(+cc)` / `tools` / `tool_choice` / 采样参数 / `stream` / `metadata_keys` / `content_types` / `body_bytes` 等维度。所有项「仅存在时输出」以控制日志噪声。配套 14 个单元测试(`TestBuildSemanticRejectionDiagnostic`)覆盖各字段组合。 +- **Step 2(待定)**:依据扩展诊断日志的新证据,定位具体祸根参数后再施修复(候选路径:`ZhipuVendor._prepare_request` 参数剥离 / 调用现有 `normalize_for_zhipu` / pre-validation 警告)。 + +**后续防范** + +- **「无证据,不下结论」**:当初版诊断字段无法覆盖根因时,禁止反复猜测,应优先扩展诊断维度抓取更多线索。本次先扩展再修复的迭代节奏可作为同类「黑盒 API 报错」问题的范式。 +- **诊断字段设计原则**:所有诊断项应「仅存在时输出」,避免常态化噪声;输出格式紧凑(`key=val`)便于日志检索;参数值用 `!r:.N` 截断防止巨型对象灌入日志。 +- **错误码差异化**:智谱 12xx 系列错误码语义并不等价(1210 ≠ 1213 ≠ 1214),未来面对类似 `[code][message]` 形式的供应商错误时,应优先查阅其官方错误码字典,避免基于错误消息字面意思的误判。 + +**同类问题影响与处理注意事项** + +- 其他薄透传 vendor(minimax / kimi / doubao / alibaba / xiaomi)共用 `NativeAnthropicVendor._prepare_request`,若它们也开始报「参数错误」类语义拒绝,可复用本次扩展的诊断函数定位差异。 +- 若证据指向 `tools` 字段(如工具 schema 不兼容)、`metadata` 字段(如自定义键被 zhipu 拒收)等具体路径,修复时应优先复用 `convert/vendor_channels.py` 中已有的 `normalize_for_zhipu` / `strip_thinking_blocks` 工具,避免在 vendor 内部重复实现剥离逻辑。 +- 部署 Step 1 v2 后,建议观察至少 48 小时收集足够样本(>20 次失败),通过失败/成功请求形态对比统计找出**唯一差异维度**,再进入 Step 2。 diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index 7ed3c1c..c418fc5 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -6,6 +6,7 @@ from __future__ import annotations +import json import logging import re import time @@ -175,6 +176,124 @@ def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str: return f" [{', '.join(parts)}]" if parts else "" +def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str: + """构建语义拒绝的请求体诊断上下文. + + 在 semantic rejection 日志中附加请求体的可疑参数快照, + 用于定位供应商参数校验失败的具体祸根参数。 + + 覆盖范围: + * 模型 / messages 数(baseline) + * thinking 系列顶层参数 + history thinking_blocks 数 + * system 形态(string / blocks,含 cache_control 计数) + * tools 数量 + tool_choice 形态 + * 采样参数(max_tokens / temperature / top_p / top_k / stop_sequences) + * stream / metadata 形态 + * cache_control 存在性 + * messages.content 类型分布 + * 请求体大小估算(json.dumps 字节数) + """ + parts: list[str] = [] + + # ── 模型 + 消息数(baseline,始终输出)── + parts.append(f"model={body.get('model', 'N/A')}") + parts.append(f"messages={len(body.get('messages', []))}") + + # ── 顶层 thinking 系列参数 ── + for key in ("thinking", "extended_thinking", "reasoning_effort"): + if key in body: + val = body[key] + parts.append(f"{key}={val!r:.80}") + + # ── system 形态 ── + system = body.get("system") + if isinstance(system, str): + parts.append(f"system_kind=string(len={len(system)})") + elif isinstance(system, list): + cc_count = sum( + 1 for item in system if isinstance(item, dict) and "cache_control" in item + ) + if cc_count: + parts.append(f"system_blocks={len(system)},cc={cc_count}") + else: + parts.append(f"system_blocks={len(system)}") + + # ── tools 与 tool_choice ── + tools = body.get("tools") + if isinstance(tools, list): + parts.append(f"tools={len(tools)}") + tool_choice = body.get("tool_choice") + if tool_choice is not None: + parts.append(f"tool_choice={tool_choice!r:.60}") + + # ── 采样参数(仅存在时输出)── + for key in ("max_tokens", "temperature", "top_p", "top_k"): + if key in body: + parts.append(f"{key}={body[key]!r:.40}") + stop_sequences = body.get("stop_sequences") + if isinstance(stop_sequences, list) and stop_sequences: + parts.append(f"stop_sequences={len(stop_sequences)}") + + # ── stream / metadata ── + if "stream" in body: + parts.append(f"stream={body['stream']}") + metadata = body.get("metadata") + if isinstance(metadata, dict) and metadata: + parts.append(f"metadata_keys={len(metadata)}") + + # ── 会话历史中的 thinking blocks 与 content_types 分布 ── + thinking_count = 0 + content_type_counts: dict[str, int] = {} + for msg in body.get("messages", []): + content = msg.get("content") + if isinstance(content, str): + content_type_counts["string"] = content_type_counts.get("string", 0) + 1 + continue + if not isinstance(content, list): + continue + for block in content: + if not isinstance(block, dict): + continue + btype = block.get("type") + if isinstance(btype, str): + content_type_counts[btype] = content_type_counts.get(btype, 0) + 1 + if btype in ("thinking", "redacted_thinking"): + thinking_count += 1 + if thinking_count: + parts.append(f"thinking_blocks_in_history={thinking_count}") + if content_type_counts: + type_repr = ",".join(f"{k}:{v}" for k, v in sorted(content_type_counts.items())) + parts.append(f"content_types={{{type_repr}}}") + + # ── cache_control 存在检测(messages / tools,不含 system 因已单独统计)── + has_cc = False + sections: list[Any] = [] + for m in body.get("messages", []): + if isinstance(m.get("content"), list): + sections.append(m["content"]) + if isinstance(body.get("tools"), list): + sections.append(body["tools"]) + for section in sections: + for item in section: + if isinstance(item, dict) and "cache_control" in item: + has_cc = True + break + if has_cc: + break + if has_cc: + parts.append("cache_control_fields=present") + + # ── 请求体大小估算 ── + try: + body_bytes = len(json.dumps(body, ensure_ascii=False).encode("utf-8")) + parts.append(f"body_bytes={body_bytes}") + except (TypeError, ValueError): + # 极少数情况下 body 含非可序列化对象,跳过 + pass + + return f" [{', '.join(parts)}]" if parts else "" + + def _log_http_error_detail( tier_name: str, exc: Exception, diff --git a/tests/test_router_executor.py b/tests/test_router_executor.py index 6dd630e..9506e67 100644 --- a/tests/test_router_executor.py +++ b/tests/test_router_executor.py @@ -22,6 +22,7 @@ from coding.proxy.routing.executor import ( _SESSION_TITLE_MAX_LEN, _VENDOR_PROTOCOL_LABEL_MAP, + _build_semantic_rejection_diagnostic, _extract_session_title, _has_tool_results, _is_likely_request_format_error, @@ -1954,6 +1955,218 @@ def test_returns_body_for_unknown_tier(self): assert result is body +class TestBuildSemanticRejectionDiagnostic: + """覆盖 _build_semantic_rejection_diagnostic 函数 — 用于诊断 [1210] 等供应商语义拒绝. + + 重点验证: + - baseline 字段(model / messages)始终输出 + - 仅当参数存在时才输出相关项(避免日志噪声) + - 各字段输出格式稳定 + """ + + def test_baseline_minimal_body(self): + """最小请求体:仅输出 model + messages.""" + body = {"model": "glm-5-turbo", "messages": [{"role": "user", "content": "hi"}]} + result = _build_semantic_rejection_diagnostic(body) + assert "model=glm-5-turbo" in result + assert "messages=1" in result + # 不应输出未使用的字段 + assert "thinking" not in result + assert "tools" not in result + assert "cache_control" not in result + + def test_includes_thinking_param(self): + body = { + "model": "glm-5-turbo", + "messages": [], + "thinking": {"type": "enabled", "budget_tokens": 1024}, + } + result = _build_semantic_rejection_diagnostic(body) + assert "thinking=" in result + assert "budget_tokens" in result + + def test_includes_system_string(self): + body = { + "model": "glm-5-turbo", + "messages": [], + "system": "You are helpful." * 5, + } + result = _build_semantic_rejection_diagnostic(body) + assert "system_kind=string(len=" in result + + def test_includes_system_blocks_with_cache_control(self): + body = { + "model": "glm-5-turbo", + "messages": [], + "system": [ + { + "type": "text", + "text": "rule1", + "cache_control": {"type": "ephemeral"}, + }, + {"type": "text", "text": "rule2"}, + ], + } + result = _build_semantic_rejection_diagnostic(body) + assert "system_blocks=2,cc=1" in result + + def test_includes_tools_and_tool_choice(self): + body = { + "model": "glm-5-turbo", + "messages": [], + "tools": [{"name": "a"}, {"name": "b"}, {"name": "c"}], + "tool_choice": {"type": "auto"}, + } + result = _build_semantic_rejection_diagnostic(body) + assert "tools=3" in result + assert "tool_choice=" in result + + def test_includes_sampling_params(self): + body = { + "model": "glm-5-turbo", + "messages": [], + "max_tokens": 8192, + "temperature": 0.7, + "top_p": 0.9, + "top_k": 40, + "stop_sequences": ["\n\n", "END"], + } + result = _build_semantic_rejection_diagnostic(body) + assert "max_tokens=8192" in result + assert "temperature=0.7" in result + assert "top_p=0.9" in result + assert "top_k=40" in result + assert "stop_sequences=2" in result + + def test_includes_stream_and_metadata(self): + body = { + "model": "glm-5-turbo", + "messages": [], + "stream": True, + "metadata": {"user_id": "x", "session_id": "y"}, + } + result = _build_semantic_rejection_diagnostic(body) + assert "stream=True" in result + assert "metadata_keys=2" in result + + def test_content_type_distribution(self): + body = { + "model": "glm-5-turbo", + "messages": [ + { + "role": "user", + "content": [ + {"type": "text", "text": "hi"}, + {"type": "text", "text": "bye"}, + {"type": "image", "source": {}}, + ], + }, + { + "role": "assistant", + "content": [ + {"type": "tool_use", "id": "t1", "name": "x", "input": {}}, + ], + }, + ], + } + result = _build_semantic_rejection_diagnostic(body) + # 排序为字母序 + assert "content_types={image:1,text:2,tool_use:1}" in result + + def test_content_type_string_messages(self): + """messages.content 为 string 时计入 string:N.""" + body = { + "model": "glm-5-turbo", + "messages": [ + {"role": "user", "content": "hello"}, + {"role": "assistant", "content": "hi"}, + ], + } + result = _build_semantic_rejection_diagnostic(body) + assert "content_types={string:2}" in result + + def test_thinking_blocks_in_history(self): + body = { + "model": "glm-5-turbo", + "messages": [ + { + "role": "assistant", + "content": [ + {"type": "thinking", "thinking": "..."}, + {"type": "redacted_thinking", "data": "..."}, + {"type": "text", "text": "result"}, + ], + } + ], + } + result = _build_semantic_rejection_diagnostic(body) + assert "thinking_blocks_in_history=2" in result + + def test_cache_control_in_messages_or_tools(self): + body = { + "model": "glm-5-turbo", + "messages": [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "x", + "cache_control": {"type": "ephemeral"}, + }, + ], + } + ], + } + result = _build_semantic_rejection_diagnostic(body) + assert "cache_control_fields=present" in result + + def test_body_bytes_estimated(self): + body = {"model": "glm-5-turbo", "messages": [{"role": "user", "content": "ok"}]} + result = _build_semantic_rejection_diagnostic(body) + assert "body_bytes=" in result + + def test_body_bytes_skipped_when_unserializable(self): + """请求体含非可序列化对象时不抛异常.""" + + class NonSerializable: + pass + + body = { + "model": "glm-5-turbo", + "messages": [], + "metadata": {"obj": NonSerializable()}, + } + # 不应抛异常 + result = _build_semantic_rejection_diagnostic(body) + assert "model=glm-5-turbo" in result + + def test_combined_real_world_failure_case(self): + """模拟真实失败请求形态(messages=1,无 thinking/cache_control,含 system + tools).""" + body = { + "model": "glm-5-turbo", + "messages": [{"role": "user", "content": "需要修复一个 bug"}], + "system": [{"type": "text", "text": "You are Claude Code."}], + "tools": [{"name": "Read"}, {"name": "Edit"}], + "max_tokens": 8192, + "temperature": 1.0, + "metadata": {"user_id": "x"}, + "stream": True, + } + result = _build_semantic_rejection_diagnostic(body) + assert "model=glm-5-turbo" in result + assert "messages=1" in result + assert "system_blocks=1" in result + assert "tools=2" in result + assert "max_tokens=8192" in result + assert "temperature=1.0" in result + assert "metadata_keys=1" in result + assert "stream=True" in result + # 不应包含未出现的项 + assert "thinking_blocks_in_history" not in result + assert "cache_control_fields" not in result + + # ── Session 标题清洗与抽取测试 ───────────────────────────────── From f4dfc7d0a8950b3c0a3d8274c0f32269b68e7786 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 25 May 2026 18:17:03 +0800 Subject: [PATCH 57/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 60a631f..d9e849b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a8" +version = "0.4.1a9" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 85ef15c..a734b2e 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a8" +version = "0.4.1a9" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From f46c21a6a3d5b19484cf2f83915b14eca573866f Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Tue, 26 May 2026 00:18:49 +0800 Subject: [PATCH 58/66] =?UTF-8?q?feat(zhipu):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=AF=8F=E6=A8=A1=E5=9E=8B=E5=B9=B6=E5=8F=91=E9=99=90=E5=88=B6?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=203=20=E4=B8=AA=E5=B9=B6=E8=A1=8C?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=20FIFO=20=E6=8E=92=E9=98=9F=20(#248)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(zhipu): 新增每模型并发限制,默认 3 个并行请求 FIFO 排队; - 新增 ZhipuConcurrencyConfig 与 ModelConcurrencyLimiter,按映射后模型名(如 glm-5v-turbo / glm-5.1 / glm-4.5-air)维护独立 asyncio.Semaphore,槽位满时新请求 FIFO 排队等待; - ZhipuVendor 流式与非流式入口共用同一信号量,并与既有 429 重试机制兼容(重试期间持续占用槽位); - VendorConfig 新增 concurrency 字段,由工厂转发至 ZhipuConfig,未配置时回退默认 default=3,concurrency=None 完全禁用限流; - 同步更新 docs/arch/config-reference.md 与 CHANGELOG.md,新增 18 项专项测试(含配置层、限制器单元、流式/非流式集成与异常释放)。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(zhipu): 将 concurrency 注册到 _ZHIPU_FIELDS 独占字段集合,确保非 zhipu 供应商误配时触发 warning; 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- CHANGELOG.md | 2 + docs/arch/config-reference.md | 40 +- src/coding/proxy/config/config.default.yaml | 8 + src/coding/proxy/config/routing.py | 13 +- src/coding/proxy/config/schema.py | 2 + src/coding/proxy/config/vendors.py | 18 +- src/coding/proxy/server/factory.py | 16 +- src/coding/proxy/vendors/concurrency.py | 78 +++ src/coding/proxy/vendors/zhipu.py | 119 +++-- tests/test_schema.py | 3 +- tests/test_zhipu_concurrency.py | 557 ++++++++++++++++++++ 11 files changed, 806 insertions(+), 50 deletions(-) create mode 100644 src/coding/proxy/vendors/concurrency.py create mode 100644 tests/test_zhipu_concurrency.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fb0f1d..8eb7a1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ## [Unreleased] +- feat(zhipu): 新增每模型并发限制(默认 3,可通过 `vendors[zhipu].concurrency` 配置),基于 `asyncio.Semaphore` 实现 FIFO 公平排队,流式与非流式共用同一槽位,与 429 重试机制兼容。 + ## [v0.4.0](https://github.com/ThreeFish-AI/coding-proxy/releases/tag/v0.4.0) — 2026-05-01 > [!IMPORTANT] diff --git a/docs/arch/config-reference.md b/docs/arch/config-reference.md index 24e11e5..1f4460f 100644 --- a/docs/arch/config-reference.md +++ b/docs/arch/config-reference.md @@ -89,12 +89,13 @@ flowchart TD ## 5. VendorConfig 弹性字段 -| 字段 | 类型 | 默认值 | 说明 | -| -------------------- | -------------- | -------------------- | --------------------------- | -| `circuit_breaker` | config \| None | `None` | 熔断器配置(None = 终端层) | -| `retry` | config | `RetryConfig()` | 重试策略配置 | -| `quota_guard` | config | `QuotaGuardConfig()` | 日度配额守卫配置 | -| `weekly_quota_guard` | config | `QuotaGuardConfig()` | 周度配额守卫配置 | +| 字段 | 类型 | 默认值 | 说明 | +| -------------------- | -------------- | -------------------- | ----------------------------------- | +| `circuit_breaker` | config \| None | `None` | 熔断器配置(None = 终端层) | +| `retry` | config | `RetryConfig()` | 重试策略配置 | +| `quota_guard` | config | `QuotaGuardConfig()` | 日度配额守卫配置 | +| `weekly_quota_guard` | config | `QuotaGuardConfig()` | 周度配额守卫配置 | +| `concurrency` | config \| None | `None` | `[zhipu]` 每模型并发限制(详见 5.5) | @@ -143,6 +144,33 @@ flowchart TD | `error_types` | list[str] | `["rate_limit_error", "overloaded_error", "api_error"]` | | `error_message_patterns` | list[str] | `["quota", "limit exceeded", "usage cap", "capacity", "internal network failure"]` | +### 5.5 ZhipuConcurrencyConfig — Zhipu 每模型并发参数 + +仅对 `vendor: zhipu` 生效,基于 `asyncio.Semaphore` 实现 FIFO 公平排队。 + +| 字段 | 类型 | 默认值 | 说明 | +| --------- | -------------- | ------ | -------------------------------------------------------------------------------- | +| `default` | int | `3` | 全局默认并行度(适用于所有未在 `models` 中显式覆盖的模型);取值范围 `[1, 20]` | +| `models` | map[str → int] | `{}` | 按映射后模型名(如 `glm-5v-turbo` / `glm-5.1` / `glm-4.5-air`)自定义并行度上限 | + +YAML 示例: + +```yaml +- vendor: zhipu + concurrency: + default: 3 + models: + glm-5v-turbo: 5 + glm-5.1: 2 +``` + +行为语义: + +- 信号量按**映射后模型名**键控,与上游真实承载模型对齐;流式与非流式请求共用同一槽位。 +- 槽位满时新请求按 FIFO 顺序排队,直到任一在途请求释放槽位才被唤醒。 +- 429 重试期间持续占用槽位(重试视为同一请求的延续)。 +- 顶层 `concurrency` 字段缺省为 `None` → 转发至 `ZhipuConfig` 时回退默认值 `default=3`;如需完全关闭限流,可在 `ZhipuConfig` 构造层显式置 `null`(一般无需操作)。 + --- ## 6. 供应商专属字段 diff --git a/src/coding/proxy/config/config.default.yaml b/src/coding/proxy/config/config.default.yaml index b6987fa..d945125 100644 --- a/src/coding/proxy/config/config.default.yaml +++ b/src/coding/proxy/config/config.default.yaml @@ -119,6 +119,14 @@ vendors: window_hours: 24.0 threshold_percent: 95.0 probe_interval_seconds: 300 + # 每模型并发限制:默认 3 个并行请求;超出则按 FIFO 排队等待 + # 可通过 models 字段覆盖单个模型的限制(如 glm-5.1: 5) + concurrency: + default: 3 + # models: + # glm-5v-turbo: 3 + # glm-5.1: 3 + # glm-4.5-air: 3 # Vendor 4: MiniMax(默认禁用,需手动启用并添加到 tiers) - vendor: minimax diff --git a/src/coding/proxy/config/routing.py b/src/coding/proxy/config/routing.py index 3326a0b..2c29363 100644 --- a/src/coding/proxy/config/routing.py +++ b/src/coding/proxy/config/routing.py @@ -9,6 +9,7 @@ from pydantic import BaseModel, BeforeValidator, Field, PrivateAttr, model_validator from .resiliency import CircuitBreakerConfig, QuotaGuardConfig, RetryConfig +from .vendors import ZhipuConcurrencyConfig # ── 价格字段解析($ / ¥ 前缀支持) ────────────────────────── @@ -64,13 +65,13 @@ def _detect_currency(v: Any) -> str | None: "api_key", } ) -# 向后兼容别名 -_ZHIPU_FIELDS = _NATIVE_ANTHROPIC_FIELDS +# Zhipu 独占字段:在通用 api_key 基础上增加每模型并发限制 +_ZHIPU_FIELDS: frozenset[str] = _NATIVE_ANTHROPIC_FIELDS | frozenset({"concurrency"}) _VENDOR_EXCLUSIVE_FIELDS: dict[str, frozenset[str]] = { "copilot": _COPILOT_FIELDS, "antigravity": _ANTIGRAVITY_FIELDS, - "zhipu": _NATIVE_ANTHROPIC_FIELDS, + "zhipu": _ZHIPU_FIELDS, "minimax": _NATIVE_ANTHROPIC_FIELDS, "kimi": _NATIVE_ANTHROPIC_FIELDS, "doubao": _NATIVE_ANTHROPIC_FIELDS, @@ -285,6 +286,12 @@ class VendorConfig(BaseModel): quota_guard: QuotaGuardConfig = Field(default_factory=QuotaGuardConfig) weekly_quota_guard: QuotaGuardConfig = Field(default_factory=QuotaGuardConfig) + # ── Zhipu 专属:每模型并发限制 ─────────────────────────── + concurrency: ZhipuConcurrencyConfig | None = Field( + default=None, + description="[zhipu] 每模型并发限制;None 表示不限并发", + ) + @model_validator(mode="after") def _warn_irrelevant_fields(self) -> VendorConfig: """对非当前 vendor 类型的非空专属字段发出 warning.""" diff --git a/src/coding/proxy/config/schema.py b/src/coding/proxy/config/schema.py index ee21ee7..40e5428 100644 --- a/src/coding/proxy/config/schema.py +++ b/src/coding/proxy/config/schema.py @@ -54,6 +54,7 @@ KimiConfig, MinimaxConfig, XiaomiConfig, + ZhipuConcurrencyConfig, ZhipuConfig, ) @@ -318,6 +319,7 @@ def compat_state_path(self) -> Path: "CopilotConfig", "AntigravityConfig", "ZhipuConfig", + "ZhipuConcurrencyConfig", # resiliency "CircuitBreakerConfig", "RetryConfig", diff --git a/src/coding/proxy/config/vendors.py b/src/coding/proxy/config/vendors.py index 4f15531..a1c0280 100644 --- a/src/coding/proxy/config/vendors.py +++ b/src/coding/proxy/config/vendors.py @@ -2,7 +2,21 @@ from __future__ import annotations -from pydantic import BaseModel +from pydantic import BaseModel, Field + + +class ZhipuConcurrencyConfig(BaseModel): + """Zhipu 每模型并发限制配置.""" + + default: int = Field(default=3, ge=1, le=20, description="全局默认并行度") + models: dict[str, int] = Field( + default_factory=dict, + description="按映射后模型名自定义并行度(覆盖 default)", + ) + + def get_limit(self, model: str) -> int: + """获取指定模型的并行度限制.""" + return self.models.get(model, self.default) class AnthropicConfig(BaseModel): @@ -48,6 +62,7 @@ class ZhipuConfig(BaseModel): base_url: str = "https://open.bigmodel.cn/api/anthropic" api_key: str = "" timeout_ms: int = 3000000 + concurrency: ZhipuConcurrencyConfig = Field(default_factory=ZhipuConcurrencyConfig) class MinimaxConfig(BaseModel): @@ -100,6 +115,7 @@ class AlibabaConfig(BaseModel): "CopilotConfig", "AntigravityConfig", "ZhipuConfig", + "ZhipuConcurrencyConfig", "MinimaxConfig", "KimiConfig", "DoubaoConfig", diff --git a/src/coding/proxy/server/factory.py b/src/coding/proxy/server/factory.py index a1f64a3..4e7632d 100644 --- a/src/coding/proxy/server/factory.py +++ b/src/coding/proxy/server/factory.py @@ -156,13 +156,17 @@ def _create_vendor_from_config( cfg = _resolve_antigravity_credentials(cfg, token_store) return AntigravityVendor(cfg, failover_cfg, mapper) case "zhipu": - cfg = ZhipuConfig( - enabled=vendor_cfg.enabled, - base_url=vendor_cfg.base_url + zhipu_kwargs: dict[str, Any] = { + "enabled": vendor_cfg.enabled, + "base_url": vendor_cfg.base_url or "https://open.bigmodel.cn/api/anthropic", - api_key=vendor_cfg.api_key, - timeout_ms=vendor_cfg.timeout_ms, - ) + "api_key": vendor_cfg.api_key, + "timeout_ms": vendor_cfg.timeout_ms, + } + # 仅当显式配置了 concurrency 时转发,否则使用 ZhipuConfig 默认值 + if vendor_cfg.concurrency is not None: + zhipu_kwargs["concurrency"] = vendor_cfg.concurrency + cfg = ZhipuConfig(**zhipu_kwargs) return ZhipuVendor(cfg, mapper, failover_cfg) case "minimax": cfg = MinimaxConfig( diff --git a/src/coding/proxy/vendors/concurrency.py b/src/coding/proxy/vendors/concurrency.py new file mode 100644 index 0000000..b4f4df7 --- /dev/null +++ b/src/coding/proxy/vendors/concurrency.py @@ -0,0 +1,78 @@ +"""每模型并发限制器 — 基于 asyncio.Semaphore 的公平排队. + +为每个映射后的模型(如 ``glm-5v-turbo``)独立维护一个 ``asyncio.Semaphore``, +确保同一时间点该模型的并行请求数不超过配置的上限。当所有槽位被占满时, +新请求按 FIFO 顺序排队等待,直到有槽位释放。 + +设计要点: + - **惰性创建**:仅在首次请求到达时才为该模型创建 Semaphore,避免冷启动开销 + - **FIFO 公平**:``asyncio.Semaphore`` 内部使用 FIFO 队列,天然满足排队语义 + - **按映射后模型名键控**:与上游真实承载能力对齐,而非按客户端请求名(如 ``claude-sonnet-*``) +""" + +from __future__ import annotations + +import asyncio +import logging + +from ..config.vendors import ZhipuConcurrencyConfig + +logger = logging.getLogger(__name__) + + +class ModelConcurrencyLimiter: + """按模型名提供独立并发槽位的限制器. + + 用法:: + + limiter = ModelConcurrencyLimiter(config) + sem = await limiter.acquire("glm-5v-turbo") + try: + ... # 执行请求 + finally: + sem.release() + """ + + def __init__(self, config: ZhipuConcurrencyConfig) -> None: + self._config = config + self._semaphores: dict[str, asyncio.Semaphore] = {} + + def _get_semaphore(self, model: str) -> asyncio.Semaphore: + """获取(或惰性创建)指定模型的信号量.""" + sem = self._semaphores.get(model) + if sem is None: + limit = self._config.get_limit(model) + sem = asyncio.Semaphore(limit) + self._semaphores[model] = sem + logger.debug( + "ModelConcurrencyLimiter: created semaphore model=%s limit=%d", + model, + limit, + ) + return sem + + async def acquire(self, model: str) -> asyncio.Semaphore: + """获取指定模型的并发槽位,必要时阻塞排队. + + 返回已获取的 Semaphore 实例,调用方负责在请求完成后调用 ``release()``。 + """ + sem = self._get_semaphore(model) + await sem.acquire() + return sem + + def get_diagnostics(self) -> dict[str, dict[str, int]]: + """返回每个模型的并发状态快照(用于可观测性).""" + snapshot: dict[str, dict[str, int]] = {} + for model, sem in self._semaphores.items(): + limit = self._config.get_limit(model) + # asyncio.Semaphore 内部 _value 表示剩余可用槽位 + available = sem._value # noqa: SLF001 — 公开 API 未暴露 + snapshot[model] = { + "limit": limit, + "in_use": max(limit - available, 0), + "available": max(available, 0), + } + return snapshot + + +__all__ = ["ModelConcurrencyLimiter"] diff --git a/src/coding/proxy/vendors/zhipu.py b/src/coding/proxy/vendors/zhipu.py index e7ed8c7..ff186cd 100644 --- a/src/coding/proxy/vendors/zhipu.py +++ b/src/coding/proxy/vendors/zhipu.py @@ -34,6 +34,7 @@ ) from ..routing.retry import RetryConfig, calculate_delay from .base import VendorResponse +from .concurrency import ModelConcurrencyLimiter from .native_anthropic import NativeAnthropicVendor logger = logging.getLogger(__name__) @@ -68,6 +69,12 @@ def __init__( ) -> None: super().__init__(config, model_mapper, failover_config) self._rl_retry = _RATE_LIMIT_RETRY + # 每模型并发限制器(config.concurrency 为 None 时禁用) + self._concurrency_limiter: ModelConcurrencyLimiter | None = ( + ModelConcurrencyLimiter(config.concurrency) + if config.concurrency is not None + else None + ) # ── 非流式:429 重试 ──────────────────────────────────── @@ -76,7 +83,24 @@ async def send_message( request_body: dict[str, Any], headers: dict[str, str], ) -> VendorResponse: - """非流式请求,429 时自动重试.""" + """非流式请求,429 时自动重试. + + 在 429 重试循环外层套上每模型并发槽位获取,确保同一时间点同一模型的 + 在途请求数不超过配置上限;超过时新请求 FIFO 排队等待。 + """ + sem = await self._maybe_acquire_concurrency_slot(request_body) + try: + return await self._send_message_with_retry(request_body, headers) + finally: + if sem is not None: + sem.release() + + async def _send_message_with_retry( + self, + request_body: dict[str, Any], + headers: dict[str, str], + ) -> VendorResponse: + """原 send_message 主体逻辑(不含并发控制).""" max_attempts = self._rl_retry.max_attempts for attempt in range(max_attempts): @@ -116,42 +140,71 @@ async def send_message_stream( 安全性:429 在 BaseVendor.send_message_stream 中于 status code 检查阶段即 raise(在任何 chunk yield 之前), 因此重试不会导致已发出数据不一致。 + + 在 429 重试循环外层套上每模型并发槽位获取,确保流式请求与非流式请求 + 共用同一信号量,统一限制同一模型的总在途并发数。 """ + sem = await self._maybe_acquire_concurrency_slot(request_body) max_attempts = self._rl_retry.max_attempts - for attempt in range(max_attempts): - try: - # 429 在 status code 检查阶段即 raise(在任何 chunk 之前), - # 因此 __anext__ 安全:要么拿到首个 chunk,要么抛异常。 - ait = super().send_message_stream(request_body, headers) - head = await ait.__anext__() - except StopAsyncIteration: - return - except httpx.HTTPStatusError as exc: - if exc.response is None or exc.response.status_code != 429: - raise - if attempt == max_attempts - 1: - logger.warning( - "Zhipu 429 stream rate limit exhausted after %d attempts", - max_attempts, + try: + for attempt in range(max_attempts): + try: + # 429 在 status code 检查阶段即 raise(在任何 chunk 之前), + # 因此 __anext__ 安全:要么拿到首个 chunk,要么抛异常。 + ait = super().send_message_stream(request_body, headers) + head = await ait.__anext__() + except StopAsyncIteration: + return + except httpx.HTTPStatusError as exc: + if exc.response is None or exc.response.status_code != 429: + raise + if attempt == max_attempts - 1: + logger.warning( + "Zhipu 429 stream rate limit exhausted after %d attempts", + max_attempts, + ) + raise + + delay = self._compute_retry_delay_from_response( + exc.response, attempt ) - raise - - delay = self._compute_retry_delay_from_response(exc.response, attempt) - logger.info( - "Zhipu 429 stream rate limit, retry %d/%d in %.1fms", - attempt + 1, - max_attempts - 1, - delay, - ) - await asyncio.sleep(delay / 1000.0) - continue - - # yield 在 try/except 之外,避免捕获外部 athrow 的异常 - yield head - async for chunk in ait: - yield chunk - return + logger.info( + "Zhipu 429 stream rate limit, retry %d/%d in %.1fms", + attempt + 1, + max_attempts - 1, + delay, + ) + await asyncio.sleep(delay / 1000.0) + continue + + # yield 在 try/except 之外,避免捕获外部 athrow 的异常 + yield head + async for chunk in ait: + yield chunk + return + finally: + if sem is not None: + sem.release() + + # ── 并发控制 ──────────────────────────────────────────── + + async def _maybe_acquire_concurrency_slot( + self, + request_body: dict[str, Any], + ) -> asyncio.Semaphore | None: + """按映射后模型名获取并发槽位;未配置 concurrency 时返回 None. + + ``map_model()`` 是纯同步字典查找,在 Semaphore 等待前调用是安全的, + 且能确保排队键与上游真实承载模型对齐。 + """ + if self._concurrency_limiter is None: + return None + raw_model = request_body.get("model", "") if request_body else "" + mapped_model = self.map_model(raw_model) if raw_model else "" + if not mapped_model: + return None + return await self._concurrency_limiter.acquire(mapped_model) # ── 延迟计算 ──────────────────────────────────────────── diff --git a/tests/test_schema.py b/tests/test_schema.py index ae7120e..30d691c 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -31,7 +31,8 @@ def test_antigravity_fields_set(): def test_zhipu_fields_set(): assert "api_key" in _ZHIPU_FIELDS - assert len(_ZHIPU_FIELDS) == 1 + assert "concurrency" in _ZHIPU_FIELDS + assert len(_ZHIPU_FIELDS) == 2 def test_vendor_exclusive_fields_mapping_complete(): diff --git a/tests/test_zhipu_concurrency.py b/tests/test_zhipu_concurrency.py new file mode 100644 index 0000000..3c8a97d --- /dev/null +++ b/tests/test_zhipu_concurrency.py @@ -0,0 +1,557 @@ +"""Zhipu 每模型并发限制专项测试. + +验证 ``ModelConcurrencyLimiter`` 与 ``ZhipuVendor`` 集成后的并发控制行为: + - 默认 ``concurrency.default=3`` 时同一模型最多 3 个并发 + - 超出上限时按 FIFO 排队,槽位释放后才唤醒 + - 不同模型彼此独立,互不阻塞 + - 异常路径下 Semaphore 仍能释放,避免泄漏 + - 流式请求与非流式请求共享同一信号量 + - 与 429 重试机制兼容(重试期间持续占用槽位) + - ``concurrency=None`` 时禁用限制(向后兼容) +""" + +from __future__ import annotations + +import asyncio +import json +from unittest.mock import AsyncMock, patch + +import httpx +import pytest + +from coding.proxy.config.schema import ( + ModelMappingRule, + ZhipuConcurrencyConfig, + ZhipuConfig, +) +from coding.proxy.routing.model_mapper import ModelMapper +from coding.proxy.vendors.concurrency import ModelConcurrencyLimiter +from coding.proxy.vendors.native_anthropic import NativeAnthropicVendor +from coding.proxy.vendors.zhipu import ZhipuVendor + +# ─── 测试工具 ─────────────────────────────────────────────── + + +def _make_mapper() -> ModelMapper: + """构造标准三模型映射的 ModelMapper.""" + return ModelMapper( + [ + ModelMappingRule( + pattern="claude-sonnet-.*", + target="glm-5v-turbo", + is_regex=True, + vendors=["zhipu"], + ), + ModelMappingRule( + pattern="claude-opus-.*", + target="glm-5.1", + is_regex=True, + vendors=["zhipu"], + ), + ModelMappingRule( + pattern="claude-haiku-.*", + target="glm-4.5-air", + is_regex=True, + vendors=["zhipu"], + ), + ] + ) + + +def _make_vendor( + concurrency: ZhipuConcurrencyConfig | None = None, + api_key: str = "test-zhipu-key", +) -> ZhipuVendor: + """构造一个 ZhipuVendor,默认启用并发限制(default=3).""" + cfg_kwargs: dict = {"api_key": api_key} + if concurrency is not None: + cfg_kwargs["concurrency"] = concurrency + return ZhipuVendor(ZhipuConfig(**cfg_kwargs), _make_mapper()) + + +def _make_200_response() -> httpx.Response: + body = json.dumps( + { + "id": "msg_test", + "type": "message", + "role": "assistant", + "content": [{"type": "text", "text": "ok"}], + "model": "glm-5.1", + "usage": {"input_tokens": 1, "output_tokens": 1}, + } + ).encode() + return httpx.Response( + status_code=200, + content=body, + headers={"content-type": "application/json"}, + request=httpx.Request( + "POST", "https://open.bigmodel.cn/api/anthropic/v1/messages" + ), + ) + + +def _make_429_response() -> httpx.Response: + return httpx.Response( + status_code=429, + content=b'{"error":{"type":"rate_limit_error","message":"slow down"}}', + headers={}, + request=httpx.Request( + "POST", "https://open.bigmodel.cn/api/anthropic/v1/messages" + ), + ) + + +# ─── 配置层测试 ───────────────────────────────────────────── + + +class TestZhipuConcurrencyConfig: + """ZhipuConcurrencyConfig 配置模型行为.""" + + def test_defaults(self) -> None: + cfg = ZhipuConcurrencyConfig() + assert cfg.default == 3 + assert cfg.models == {} + + def test_get_limit_falls_back_to_default(self) -> None: + cfg = ZhipuConcurrencyConfig(default=5) + assert cfg.get_limit("glm-5.1") == 5 + assert cfg.get_limit("any-unknown-model") == 5 + + def test_get_limit_uses_per_model_override(self) -> None: + cfg = ZhipuConcurrencyConfig(default=3, models={"glm-5v-turbo": 1}) + assert cfg.get_limit("glm-5v-turbo") == 1 + assert cfg.get_limit("glm-5.1") == 3 # 未覆盖时回退 default + + def test_default_must_be_positive(self) -> None: + with pytest.raises(ValueError): + ZhipuConcurrencyConfig(default=0) + + def test_zhipu_config_default_concurrency(self) -> None: + cfg = ZhipuConfig() + assert cfg.concurrency is not None + assert cfg.concurrency.default == 3 + + +# ─── ModelConcurrencyLimiter 单元测试 ────────────────────── + + +class TestModelConcurrencyLimiter: + """ModelConcurrencyLimiter 基础行为.""" + + @pytest.mark.asyncio + async def test_lazy_semaphore_creation(self) -> None: + limiter = ModelConcurrencyLimiter(ZhipuConcurrencyConfig(default=2)) + sem_a = limiter._get_semaphore("model-a") + sem_b = limiter._get_semaphore("model-b") + # 不同模型独立 semaphore + assert sem_a is not sem_b + # 相同模型复用 semaphore + assert limiter._get_semaphore("model-a") is sem_a + + @pytest.mark.asyncio + async def test_acquire_blocks_when_full(self) -> None: + limiter = ModelConcurrencyLimiter(ZhipuConcurrencyConfig(default=2)) + + # 占满 2 个槽位 + sem1 = await limiter.acquire("glm-5.1") + sem2 = await limiter.acquire("glm-5.1") + assert sem1 is sem2 # 同一 semaphore + + # 第 3 次 acquire 必须阻塞 + task = asyncio.create_task(limiter.acquire("glm-5.1")) + await asyncio.sleep(0.05) + assert not task.done(), "第三个请求应在排队等待" + + # 释放一个槽位后,等待者被唤醒 + sem1.release() + await asyncio.sleep(0.05) + assert task.done() + (await task).release() + sem2.release() + + @pytest.mark.asyncio + async def test_per_model_independent(self) -> None: + limiter = ModelConcurrencyLimiter( + ZhipuConcurrencyConfig(default=1, models={"glm-5.1": 1}) + ) + # 占满 glm-5.1 + sem_51 = await limiter.acquire("glm-5.1") + # glm-5v-turbo 仍可立即获取 + sem_5v = await asyncio.wait_for(limiter.acquire("glm-5v-turbo"), timeout=0.5) + assert sem_51 is not sem_5v + sem_51.release() + sem_5v.release() + + def test_diagnostics_snapshot(self) -> None: + limiter = ModelConcurrencyLimiter(ZhipuConcurrencyConfig(default=3)) + # 触发 semaphore 创建 + limiter._get_semaphore("glm-5.1") + snap = limiter.get_diagnostics() + assert "glm-5.1" in snap + assert snap["glm-5.1"]["limit"] == 3 + assert snap["glm-5.1"]["available"] == 3 + assert snap["glm-5.1"]["in_use"] == 0 + + +# ─── ZhipuVendor 集成测试:非流式 ──────────────────────────── + + +class TestZhipuVendorNonStreamConcurrency: + """非流式 send_message 的并发限制行为.""" + + @pytest.mark.asyncio + async def test_limits_parallel_requests(self) -> None: + """concurrency.default=2 时,3 个并发请求中只有 2 个同时执行.""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=2)) + active = 0 + peak = 0 + gate = asyncio.Event() + + async def mock_post(*_, **__) -> httpx.Response: + nonlocal active, peak + active += 1 + peak = max(peak, active) + # 等待外部释放,保证并发观测窗口 + await gate.wait() + active -= 1 + return _make_200_response() + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + tasks = [ + asyncio.create_task( + vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ) + ) + for _ in range(3) + ] + # 等待两个请求进入 active 状态 + for _ in range(40): + if active >= 2: + break + await asyncio.sleep(0.01) + + assert active == 2, "应有恰好 2 个请求在执行(第 3 个排队)" + gate.set() + results = await asyncio.gather(*tasks) + assert all(r.status_code == 200 for r in results) + assert peak == 2, "并发峰值不应超过 2" + + @pytest.mark.asyncio + async def test_per_model_independent(self) -> None: + """不同模型的槽位互不影响.""" + cfg = ZhipuConcurrencyConfig( + default=3, + models={"glm-5v-turbo": 1, "glm-5.1": 1}, + ) + vendor = _make_vendor(cfg) + gate = asyncio.Event() + seen_models: list[str] = [] + + async def mock_post(*_args, **kwargs) -> httpx.Response: + body = kwargs.get("json", {}) + seen_models.append(body.get("model", "")) + await gate.wait() + return _make_200_response() + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + # claude-opus → glm-5.1, claude-sonnet → glm-5v-turbo, + # 分属两个独立信号量,应同时执行 + task_opus = asyncio.create_task( + vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ) + ) + task_sonnet = asyncio.create_task( + vendor.send_message( + {"model": "claude-sonnet-4-6", "messages": []}, + {}, + ) + ) + for _ in range(40): + if len(seen_models) >= 2: + break + await asyncio.sleep(0.01) + + assert len(seen_models) == 2, "两个不同模型应并发执行" + assert set(seen_models) == {"glm-5.1", "glm-5v-turbo"} + gate.set() + await asyncio.gather(task_opus, task_sonnet) + + @pytest.mark.asyncio + async def test_semaphore_released_on_exception(self) -> None: + """上游抛异常时 Semaphore 仍应释放,后续请求不阻塞.""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=1)) + call_count = 0 + + async def mock_post(*_, **__) -> httpx.Response: + nonlocal call_count + call_count += 1 + if call_count == 1: + raise RuntimeError("upstream boom") + return _make_200_response() + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + with pytest.raises(RuntimeError): + await vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ) + + # 槽位应已释放,第二次请求可正常完成 + resp = await asyncio.wait_for( + vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ), + timeout=1.0, + ) + assert resp.status_code == 200 + + @pytest.mark.asyncio + async def test_429_retry_holds_slot(self) -> None: + """429 重试期间持续占用槽位,重试结束后释放.""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=1)) + call_count = 0 + + async def mock_post(*_, **__) -> httpx.Response: + nonlocal call_count + call_count += 1 + if call_count <= 2: + return _make_429_response() + return _make_200_response() + + with ( + patch.object(vendor, "_get_client") as mock_client, + patch("asyncio.sleep", new_callable=AsyncMock), + ): + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + resp = await vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ) + assert resp.status_code == 200 + assert call_count == 3 # 两次 429 + 一次成功,且共用同一槽位 + + @pytest.mark.asyncio + async def test_no_concurrency_when_config_is_none(self) -> None: + """concurrency=None 时禁用并发限制,行为与旧版完全一致.""" + # 强制构造一个 concurrency=None 的 ZhipuConfig(绕过默认工厂) + cfg = ZhipuConfig(api_key="key") + cfg = cfg.model_copy(update={"concurrency": None}) + vendor = ZhipuVendor(cfg, _make_mapper()) + assert vendor._concurrency_limiter is None + + gate = asyncio.Event() + active = 0 + peak = 0 + + async def mock_post(*_, **__) -> httpx.Response: + nonlocal active, peak + active += 1 + peak = max(peak, active) + await gate.wait() + active -= 1 + return _make_200_response() + + with patch.object(vendor, "_get_client") as mock_client: + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + tasks = [ + asyncio.create_task( + vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ) + ) + for _ in range(5) + ] + for _ in range(40): + if active >= 5: + break + await asyncio.sleep(0.01) + + assert peak == 5, "无并发限制时应全部并行" + gate.set() + await asyncio.gather(*tasks) + + +# ─── ZhipuVendor 集成测试:流式 ────────────────────────────── + + +class TestZhipuVendorStreamConcurrency: + """流式 send_message_stream 的并发限制行为.""" + + @pytest.mark.asyncio + async def test_stream_limits_parallel_requests(self) -> None: + """流式请求遵循并发限制,超出排队等待.""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=1)) + active = 0 + peak = 0 + gate = asyncio.Event() + + async def fake_stream(self, _body, _headers): # noqa: ARG001 + nonlocal active, peak + active += 1 + peak = max(peak, active) + try: + await gate.wait() + yield b'data: {"type":"message_start"}\n\n' + finally: + active -= 1 + + async def consume(model: str) -> int: + chunks: list[bytes] = [] + async for chunk in vendor.send_message_stream( + {"model": model, "messages": []}, {} + ): + chunks.append(chunk) + return len(chunks) + + with patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream): + tasks = [asyncio.create_task(consume("claude-opus-4-6")) for _ in range(3)] + for _ in range(40): + if active >= 1: + break + await asyncio.sleep(0.01) + + assert active == 1, "concurrency=1 时只允许 1 个流式请求并发" + gate.set() + results = await asyncio.gather(*tasks) + assert all(c >= 1 for c in results) + assert peak == 1 + + @pytest.mark.asyncio + async def test_stream_releases_slot_on_completion(self) -> None: + """流式生成器正常耗尽后槽位释放.""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=1)) + + async def fake_stream(self, _body, _headers): # noqa: ARG001 + yield b'data: {"type":"message_start"}\n\n' + yield b'data: {"type":"message_stop"}\n\n' + + with patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream): + # 连续两次流式请求都能完成(说明槽位被释放) + for _ in range(2): + chunks = [] + async for chunk in vendor.send_message_stream( + {"model": "claude-opus-4-6", "messages": []}, {} + ): + chunks.append(chunk) + assert len(chunks) == 2 + + # 确认 semaphore 当前完全可用 + assert vendor._concurrency_limiter is not None + sem = vendor._concurrency_limiter._get_semaphore("glm-5.1") + assert sem._value == 1 # noqa: SLF001 + + @pytest.mark.asyncio + async def test_stream_releases_slot_on_error(self) -> None: + """流式请求异常退出时槽位仍释放,后续请求不被阻塞.""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=1)) + call_count = 0 + + async def fake_stream(self, _body, _headers): # noqa: ARG001 + nonlocal call_count + call_count += 1 + if call_count == 1: + resp = httpx.Response( + status_code=500, + content=b'{"error":{"type":"api_error"}}', + request=httpx.Request("POST", "https://example.com"), + ) + raise httpx.HTTPStatusError("500", request=resp.request, response=resp) + yield b"" # 让函数成为 async generator(不可达) + yield b'data: {"type":"message_start"}\n\n' + + with patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream): + with pytest.raises(httpx.HTTPStatusError): + async for _ in vendor.send_message_stream( + {"model": "claude-opus-4-6", "messages": []}, {} + ): + pass + + # 槽位应已释放,第二次请求可正常推进 + chunks = [] + async for chunk in vendor.send_message_stream( + {"model": "claude-opus-4-6", "messages": []}, {} + ): + chunks.append(chunk) + assert chunks == [b'data: {"type":"message_start"}\n\n'] + + @pytest.mark.asyncio + async def test_stream_and_nonstream_share_semaphore(self) -> None: + """流式与非流式请求共用同一信号量(按映射后模型分组).""" + vendor = _make_vendor(ZhipuConcurrencyConfig(default=1)) + gate = asyncio.Event() + active = 0 + + async def fake_stream(self, _body, _headers): # noqa: ARG001 + nonlocal active + active += 1 + try: + await gate.wait() + yield b'data: {"type":"message_start"}\n\n' + finally: + active -= 1 + + async def mock_post(*_, **__) -> httpx.Response: + nonlocal active + active += 1 + active -= 1 + return _make_200_response() + + with ( + patch.object(NativeAnthropicVendor, "send_message_stream", fake_stream), + patch.object(vendor, "_get_client") as mock_client, + ): + client = AsyncMock() + client.post = mock_post + mock_client.return_value = client + + # 启动流式请求并等待它占用槽位 + async def consume_stream() -> None: + async for _ in vendor.send_message_stream( + {"model": "claude-opus-4-6", "messages": []}, {} + ): + pass + + stream_task = asyncio.create_task(consume_stream()) + for _ in range(40): + if active >= 1: + break + await asyncio.sleep(0.01) + assert active == 1 + + # 非流式请求应被同一信号量阻塞 + nonstream_task = asyncio.create_task( + vendor.send_message( + {"model": "claude-opus-4-6", "messages": []}, + {}, + ) + ) + await asyncio.sleep(0.05) + assert not nonstream_task.done(), "非流式请求应等待流式释放槽位" + + # 释放后两者都能完成 + gate.set() + await asyncio.gather(stream_task, nonstream_task) From 6e0e83681c411f04d590c2e940c0ece9c70bdd78 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Tue, 26 May 2026 10:10:28 +0800 Subject: [PATCH 59/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a10;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d9e849b..f715039 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a9" +version = "0.4.1a10" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index a734b2e..aa12d90 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a9" +version = "0.4.1a10" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From 9579b85477111a66e97152b701ecde43d4f37eb1 Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Tue, 26 May 2026 17:24:04 +0800 Subject: [PATCH 60/66] =?UTF-8?q?fix(zhipu):=20=E5=85=BC=E5=AE=B9=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=20thinking.type=3Dadaptive=20=E4=BF=AE=E5=A4=8D=20[12?= =?UTF-8?q?10]=20=E8=AF=AD=E4=B9=89=E6=8B=92=E7=BB=9D=20(#249)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * diag(executor): 为语义拒绝路径增加请求体可疑参数诊断日志; 在 execute_message 和 execute_stream 的 semantic rejection 日志中 附加请求体参数快照(thinking/extended_thinking/reasoning_effort 顶层参数、 会话历史中 thinking blocks 数量、cache_control 存在情况、模型名、消息数), 用于定位 zhipu glm-4.7 [1210] 参数校验拒绝的具体祸根参数。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * diag(executor): 扩展语义拒绝诊断日志覆盖范围至 system/tools/sampling/metadata/content_types 等维度 PR #244 部署后的诊断日志反转了原推断:失败请求均不含 thinking/cache_control, 说明祸根在更细粒度的参数。扩展 _build_semantic_rejection_diagnostic 函数: 新增维度(仅存在时输出): - system 形态(string/blocks + cache_control 计数) - tools 数量 + tool_choice 形态 - 采样参数(max_tokens/temperature/top_p/top_k/stop_sequences) - stream / metadata_keys - messages.content 类型分布(含 string content) - 请求体字节数估算(json.dumps) 新增 14 个单元测试(TestBuildSemanticRejectionDiagnostic)覆盖各字段组合 与真实失败请求形态。所有测试通过(1478 passed)。 * docs(agents): 记录 zhipu [1210] 诊断阶段进展(证据反转 + Step 1 v2) * build(version): 版本号升级至 0.4.1a6; * fix(zhipu): 兼容转换 thinking.type=adaptive 为 GLM 支持的 enabled 格式,修复 [1210] 语义拒绝 基于 2026-05-26 16:30–16:31 日志证据(8 次连续拒绝均含 thinking.type=adaptive), 在 ZhipuVendor._prepare_request 中实现兼容转换: - adaptive → enabled(budget=16000):保留 thinking 能力,使用 GLM 原生确认支持的格式 - 新增 _build_zhipu_request_snapshot 诊断快照(成功/失败统一格式,可 diff 对比) - 扩展语义拒绝日志错误体截断(200→500 字符),保留完整字段级诊断 - metadata 暂不处理,待进一步诊断确认兼容性 Co-Authored-By: Claude Opus 4.7 (1M context) * fix(executor): 删除旧版重复定义的 _build_semantic_rejection_diagnostic 函数 Step 1 v2 扩展版本与 Step 1 旧版本同名重复定义,Python 运行时后者覆盖前者 不报错但旧版成为死代码。删除旧版仅保留扩展版本。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --------- Co-authored-by: Claude Opus 4.7 (1M context) --- docs/agents/issue.md | 12 +- src/coding/proxy/convert/vendor_channels.py | 6 +- src/coding/proxy/routing/executor.py | 127 +++++++++++++++----- src/coding/proxy/vendors/zhipu.py | 94 ++++++++++++++- tests/test_vendors.py | 27 ++++- tests/test_zhipu.py | 47 +++++++- 6 files changed, 268 insertions(+), 45 deletions(-) diff --git a/docs/agents/issue.md b/docs/agents/issue.md index af58832..c202b8a 100644 --- a/docs/agents/issue.md +++ b/docs/agents/issue.md @@ -253,15 +253,19 @@ INFO Tier anthropic message succeeded (took over from failed tier: zhipu) `is_semantic_rejection` 检测到 zhipu 返回 `invalid_request_error + 1210` 含「API 调用参数有误」中文标记,判定为语义拒绝,跳过下一层 tier。1210 是智谱官方错误码,[官方文档](https://docs.bigmodel.cn/cn/api/api-code) 定义为「参数格式/类型不符规范」(区别于 1213「必需字段缺失」、1214「字段参数非法」)。 -**根因(仍在收集证据)** +**根因(已定位,修复中)** -PR #244 的初版诊断字段仅覆盖 `thinking / thinking_blocks / cache_control / model / messages`,但 2026-05-25 17:26 后的诊断日志显示失败请求**均不含**上述任何字段。说明真正祸根在更细粒度的参数(system / tools / max_tokens / sampling / metadata / content_types / body_size 等)。 +PR #247 (Step 1 v2) 部署后,2026-05-26 16:30–16:31 的诊断日志显示 8 次连续拒绝**全部携带 `thinking={"type": "adaptive"}`**(Anthropic Claude 4.x 新增的参数类型),而同一时段其他会话的请求持续成功。之前 curl 测试仅验证了 `{"type": "enabled"}`,未覆盖 `adaptive` 类型。GLM 可能不支持此特定类型值,导致 [1210] 参数校验失败。 **处理方式(分阶段)** - **Step 1(PR #244,已合并)**:在 `executor.py::_build_semantic_rejection_diagnostic` 中输出 thinking / cache_control 相关字段 — 但证据反转,覆盖不足以定位真因。 -- **Step 1 v2(本次)**:扩展诊断函数覆盖 `system_kind|blocks(+cc)` / `tools` / `tool_choice` / 采样参数 / `stream` / `metadata_keys` / `content_types` / `body_bytes` 等维度。所有项「仅存在时输出」以控制日志噪声。配套 14 个单元测试(`TestBuildSemanticRejectionDiagnostic`)覆盖各字段组合。 -- **Step 2(待定)**:依据扩展诊断日志的新证据,定位具体祸根参数后再施修复(候选路径:`ZhipuVendor._prepare_request` 参数剥离 / 调用现有 `normalize_for_zhipu` / pre-validation 警告)。 +- **Step 1 v2(PR #247,已合并)**:扩展诊断函数覆盖 `system_kind|blocks(+cc)` / `tools` / `tool_choice` / 采样参数 / `stream` / `metadata_keys` / `content_types` / `body_bytes` 等维度。所有项「仅存在时输出」以控制日志噪声。配套 14 个单元测试(`TestBuildSemanticRejectionDiagnostic`)覆盖各字段组合。 +- **Step 2(进行中)**:基于 Step 1 v2 的日志证据,在 `ZhipuVendor._prepare_request` 中实现 **兼容转换**(而非移除): + - `thinking.type="adaptive"` → `{"type": "enabled", "budget_tokens": 16000}`(保留 thinking 能力) + - 新增 `_build_zhipu_request_snapshot` 诊断快照,同时覆盖成功/失败请求,建立可对比证据链 + - 扩展语义拒绝日志的错误体截断限制(200 → 500 字符),保留完整字段级诊断 + - `metadata` 暂不处理(待进一步诊断确认兼容性) **后续防范** diff --git a/src/coding/proxy/convert/vendor_channels.py b/src/coding/proxy/convert/vendor_channels.py index 52b7f44..456a9b3 100644 --- a/src/coding/proxy/convert/vendor_channels.py +++ b/src/coding/proxy/convert/vendor_channels.py @@ -369,8 +369,10 @@ def _strip_cache_control(body: dict[str, Any]) -> int: # ── zhipu 共享清洗函数 ────────────────────────────────────────── -# 跨供应商转换时主动剥离的顶层参数(首选 tier 场景由 _prepare_request 原样透传, -# GLM 原生支持 thinking / 静默忽略 cache_control 和 reasoning_effort,不会触发 400)。 +# 跨供应商转换时主动剥离的顶层参数。 +# 首选 tier 场景的 thinking.type=adaptive 兼容转换由 +# ZhipuVendor._prepare_request 处理(转换为 enabled + budget,保留功能), +# 此处仅负责 failover 路径的全量剥离(跨供应商 thinking signature 失效)。 _ZHIPU_UNSUPPORTED_PARAMS: frozenset[str] = frozenset( {"thinking", "extended_thinking", "reasoning_effort"} ) diff --git a/src/coding/proxy/routing/executor.py b/src/coding/proxy/routing/executor.py index c418fc5..4c37f02 100644 --- a/src/coding/proxy/routing/executor.py +++ b/src/coding/proxy/routing/executor.py @@ -129,50 +129,116 @@ def _build_semantic_rejection_diagnostic(body: dict[str, Any]) -> str: 在 semantic rejection 日志中附加请求体的可疑参数快照, 用于定位供应商参数校验失败的具体祸根参数。 + + 覆盖范围: + * 模型 / messages 数(baseline) + * thinking 系列顶层参数 + history thinking_blocks 数 + * system 形态(string / blocks,含 cache_control 计数) + * tools 数量 + tool_choice 形态 + * 采样参数(max_tokens / temperature / top_p / top_k / stop_sequences) + * stream / metadata 形态 + * cache_control 存在性 + * messages.content 类型分布 + * 请求体大小估算(json.dumps 字节数) """ parts: list[str] = [] - # 顶层不兼容参数 + + # ── 模型 + 消息数(baseline,始终输出)── + parts.append(f"model={body.get('model', 'N/A')}") + parts.append(f"messages={len(body.get('messages', []))}") + + # ── 顶层 thinking 系列参数 ── for key in ("thinking", "extended_thinking", "reasoning_effort"): if key in body: val = body[key] parts.append(f"{key}={val!r:.80}") - # 会话历史中的 thinking blocks + + # ── system 形态 ── + system = body.get("system") + if isinstance(system, str): + parts.append(f"system_kind=string(len={len(system)})") + elif isinstance(system, list): + cc_count = sum( + 1 for item in system if isinstance(item, dict) and "cache_control" in item + ) + if cc_count: + parts.append(f"system_blocks={len(system)},cc={cc_count}") + else: + parts.append(f"system_blocks={len(system)}") + + # ── tools 与 tool_choice ── + tools = body.get("tools") + if isinstance(tools, list): + parts.append(f"tools={len(tools)}") + tool_choice = body.get("tool_choice") + if tool_choice is not None: + parts.append(f"tool_choice={tool_choice!r:.60}") + + # ── 采样参数(仅存在时输出)── + for key in ("max_tokens", "temperature", "top_p", "top_k"): + if key in body: + parts.append(f"{key}={body[key]!r:.40}") + stop_sequences = body.get("stop_sequences") + if isinstance(stop_sequences, list) and stop_sequences: + parts.append(f"stop_sequences={len(stop_sequences)}") + + # ── stream / metadata ── + if "stream" in body: + parts.append(f"stream={body['stream']}") + metadata = body.get("metadata") + if isinstance(metadata, dict) and metadata: + parts.append(f"metadata_keys={len(metadata)}") + + # ── 会话历史中的 thinking blocks 与 content_types 分布 ── thinking_count = 0 + content_type_counts: dict[str, int] = {} for msg in body.get("messages", []): content = msg.get("content") + if isinstance(content, str): + content_type_counts["string"] = content_type_counts.get("string", 0) + 1 + continue if not isinstance(content, list): continue for block in content: - if isinstance(block, dict) and block.get("type") in ( - "thinking", - "redacted_thinking", - ): + if not isinstance(block, dict): + continue + btype = block.get("type") + if isinstance(btype, str): + content_type_counts[btype] = content_type_counts.get(btype, 0) + 1 + if btype in ("thinking", "redacted_thinking"): thinking_count += 1 if thinking_count: parts.append(f"thinking_blocks_in_history={thinking_count}") - # cache_control 存在检测 + if content_type_counts: + type_repr = ",".join(f"{k}:{v}" for k, v in sorted(content_type_counts.items())) + parts.append(f"content_types={{{type_repr}}}") + + # ── cache_control 存在检测(messages / tools,不含 system 因已单独统计)── has_cc = False - for section in ( - body.get("system", []) if isinstance(body.get("system"), list) else [], - *( - m.get("content", []) - for m in body.get("messages", []) - if isinstance(m.get("content"), list) - ), - body.get("tools", []), - ): - if isinstance(section, list): - for item in section: - if isinstance(item, dict) and "cache_control" in item: - has_cc = True - break + sections: list[Any] = [] + for m in body.get("messages", []): + if isinstance(m.get("content"), list): + sections.append(m["content"]) + if isinstance(body.get("tools"), list): + sections.append(body["tools"]) + for section in sections: + for item in section: + if isinstance(item, dict) and "cache_control" in item: + has_cc = True + break if has_cc: break if has_cc: parts.append("cache_control_fields=present") - # 模型 + 消息数 - parts.append(f"model={body.get('model', 'N/A')}") - parts.append(f"messages={len(body.get('messages', []))}") + + # ── 请求体大小估算 ── + try: + body_bytes = len(json.dumps(body, ensure_ascii=False).encode("utf-8")) + parts.append(f"body_bytes={body_bytes}") + except (TypeError, ValueError): + # 极少数情况下 body 含非可序列化对象,跳过 + pass + return f" [{', '.join(parts)}]" if parts else "" @@ -860,12 +926,15 @@ async def execute_message( if not is_last and is_semantic: diagnostic = _build_semantic_rejection_diagnostic(body) + # zhipu 等供应商的错误体含字段级诊断(如 [1210] 错误码 + request_id), + # 500 字符足以覆盖完整错误体,避免截断丢失关键细节 + err_msg = (resp.error_message or "N/A")[:500] logger.warning( "Tier %s semantic rejection (type=%s, msg=%s)%s, " "trying next tier without recording failure", tier.name, resp.error_type or resp.status_code, - (resp.error_message or "N/A")[:200], + err_msg, diagnostic, ) failed_tier_name = tier.name @@ -1100,14 +1169,16 @@ async def _handle_http_error( if semantic_rejection and not is_last: if request_body is not None: diagnostic = _build_semantic_rejection_diagnostic(request_body) + stream_err_msg = ( + error.get("message") if isinstance(error, dict) else "N/A" + ) + # 扩展至 500 字符以保留完整字段级诊断信息 logger.warning( "Tier %s stream semantic rejection (type=%s, msg=%s)%s, " "trying next tier without recording failure", tier.name, error.get("type") if isinstance(error, dict) else None, - (error.get("message") if isinstance(error, dict) else "N/A")[ - :200 - ], + stream_err_msg[:500], diagnostic, ) return True, tier.name, exc diff --git a/src/coding/proxy/vendors/zhipu.py b/src/coding/proxy/vendors/zhipu.py index ff186cd..d64a257 100644 --- a/src/coding/proxy/vendors/zhipu.py +++ b/src/coding/proxy/vendors/zhipu.py @@ -1,15 +1,17 @@ -"""智谱 GLM 供应商 — 原生 Anthropic 兼容端点薄透传代理. +"""智谱 GLM 供应商 — 原生 Anthropic 兼容端点代理(兼容转换 + 429 重试). -官方端点 (https://open.bigmodel.cn/api/anthropic) 已完整支持 -Anthropic Messages API 协议,本模块仅做两项最小适配: +官方端点 (https://open.bigmodel.cn/api/anthropic) 支持大部分 +Anthropic Messages API 协议,本模块做以下适配: 1. 模型名映射(Claude -> GLM) 2. 认证头替换(x-api-key) + 3. 首选 tier 参数兼容转换(_prepare_request) -注意:实测验证 GLM 的 Anthropic 兼容端点对以下参数的处理方式: -- thinking 参数:原生支持(GLM 有自己的 thinking 机制) +实测验证 GLM 对 Anthropic 扩展参数的处理方式: +- thinking.type="enabled":原生支持(GLM 有自己的 thinking 机制) +- thinking.type="adaptive":不支持,触发 [1210] 参数错误 → 转换为 enabled + budget - cache_control 字段:静默忽略(GLM 使用隐式自动缓存) - reasoning_effort 参数:静默忽略 -以上参数均不会导致 400 错误,因此不需要在 _prepare_request 中剥离。 +- metadata 字段:暂不处理(待进一步诊断确认兼容性) 额外提供 429 Rate Limit 专用重试挽回机制: - max_attempt = 5(1 初始 + 4 重试) @@ -20,6 +22,7 @@ from __future__ import annotations import asyncio +import json import logging from collections.abc import AsyncIterator from typing import Any @@ -76,6 +79,49 @@ def __init__( else None ) + # ── 首选 tier 参数兼容转换 ──────────────────────────────── + + # adaptive thinking → enabled 的默认预算(Anthropic 推荐的 adaptive 等价值) + _ADAPTIVE_THINKING_BUDGET = 16000 + + async def _prepare_request( + self, + request_body: dict[str, Any], + headers: dict[str, Any], + ) -> tuple[dict[str, Any], dict[str, str]]: + """深拷贝 + 模型映射 + 认证头替换 + GLM 兼容转换. + + 当 zhipu 作为首选 tier 时(source_vendor=None),请求体来自原始客户端, + 不经过跨供应商转换通道。此处对已知的 GLM 不兼容参数做兼容转换(而非移除), + 保留完整的 CC (Claude Code) 功能特性。 + """ + body, new_headers = await super()._prepare_request(request_body, headers) + + adaptations: list[str] = [] + + # thinking.type="adaptive" 是 Anthropic Claude 4.x 新增的类型, + # GLM 不支持此类型值,会触发 [1210] 参数错误。 + # 转换为 enabled + budget 保留 thinking 能力。 + thinking = body.get("thinking") + if isinstance(thinking, dict) and thinking.get("type") == "adaptive": + body["thinking"] = { + "type": "enabled", + "budget_tokens": self._ADAPTIVE_THINKING_BUDGET, + } + adaptations.append( + f"converted_thinking_adaptive→enabled" + f"(budget={self._ADAPTIVE_THINKING_BUDGET})" + ) + + if adaptations: + logger.debug( + "ZhipuVendor first-tier compat: %s%s", + ", ".join(adaptations), + _build_zhipu_request_snapshot(body), + ) + + return body, new_headers + # ── 非流式:429 重试 ──────────────────────────────────── async def send_message( @@ -239,3 +285,39 @@ def _compute_retry_delay_from_response( # 向后兼容别名 ZhipuBackend = ZhipuVendor + + +def _build_zhipu_request_snapshot(body: dict[str, Any]) -> str: + """构建发往 zhipu 请求的轻量参数快照,用于诊断日志. + + 输出格式与 executor._build_semantic_rejection_diagnostic 一致, + 使成功请求和失败请求的日志可直接 diff 对比,定位差异维度。 + + 仅在转换发生时输出(DEBUG 级别),避免常态化日志噪声。 + """ + parts: list[str] = [] + parts.append(f"messages={len(body.get('messages', []))}") + + thinking = body.get("thinking") + if isinstance(thinking, dict): + parts.append(f"thinking_type={thinking.get('type', 'unknown')}") + + metadata = body.get("metadata") + if isinstance(metadata, dict) and metadata: + parts.append(f"metadata_keys={len(metadata)}") + + tools = body.get("tools") + if isinstance(tools, list): + parts.append(f"tools={len(tools)}") + + system = body.get("system") + if isinstance(system, list): + parts.append(f"system_blocks={len(system)}") + + try: + body_bytes = len(json.dumps(body, ensure_ascii=False).encode("utf-8")) + parts.append(f"body_bytes={body_bytes}") + except (TypeError, ValueError): + pass + + return f" [{', '.join(parts)}]" if parts else "" diff --git a/tests/test_vendors.py b/tests/test_vendors.py index 3ac0477..bc72602 100644 --- a/tests/test_vendors.py +++ b/tests/test_vendors.py @@ -396,7 +396,7 @@ async def test_zhipu_prepare_request_preserves_metadata(): @pytest.mark.asyncio async def test_zhipu_prepare_request_preserves_thinking(): - """ZhipuVendor._prepare_request 应原样保留 thinking 字段(GLM 原生支持).""" + """ZhipuVendor._prepare_request 应原样保留 thinking.type=enabled(GLM 原生支持).""" mapper = ModelMapper([]) zhipu_vendor = ZhipuVendor(ZhipuConfig(api_key="sk-test"), mapper) body = { @@ -405,12 +405,35 @@ async def test_zhipu_prepare_request_preserves_thinking(): "thinking": {"type": "enabled", "budget_tokens": 10000}, } prepared_body, _ = await zhipu_vendor._prepare_request(body, {}) - # thinking 原样透传(GLM 原生支持 thinking) + # thinking.type=enabled 原样透传(GLM 原生支持) assert prepared_body["thinking"] == {"type": "enabled", "budget_tokens": 10000} # 原始 body 不应被修改 assert body["thinking"]["budget_tokens"] == 10000 +@pytest.mark.asyncio +async def test_zhipu_prepare_request_converts_thinking_adaptive(): + """ZhipuVendor._prepare_request 应将 thinking.type=adaptive 转换为 enabled+budget. + + GLM 不支持 adaptive 类型,转换为已确认安全的 enabled + budget_tokens 格式, + 保留 thinking 能力不被阉割。 + """ + mapper = ModelMapper([]) + zhipu_vendor = ZhipuVendor(ZhipuConfig(api_key="sk-test"), mapper) + body = { + "model": "claude-opus-4-7", + "messages": [], + "thinking": {"type": "adaptive"}, + } + prepared_body, _ = await zhipu_vendor._prepare_request(body, {}) + + # adaptive 应被转换为 enabled + budget + assert prepared_body["thinking"]["type"] == "enabled" + assert prepared_body["thinking"]["budget_tokens"] == 16000 + # 原始 body 不应被修改 + assert body["thinking"] == {"type": "adaptive"} + + @pytest.mark.asyncio async def test_zhipu_prepare_request_preserves_anthropic_beta_header(): zhipu_vendor = ZhipuVendor(ZhipuConfig(api_key="sk-test"), ModelMapper([])) diff --git a/tests/test_zhipu.py b/tests/test_zhipu.py index aef567a..aa05b21 100644 --- a/tests/test_zhipu.py +++ b/tests/test_zhipu.py @@ -78,7 +78,7 @@ def test_unknown_model_falls_back_to_default(self, zhipu_vendor): class TestRequestPassthrough: - """验证 _prepare_request 仅修改 model 和 headers.""" + """验证 _prepare_request 的模型映射、headers 替换和兼容转换.""" @pytest.mark.asyncio async def test_body_passthrough_except_model(self, zhipu_vendor): @@ -103,12 +103,13 @@ async def test_body_passthrough_except_model(self, zhipu_vendor): # 仅 model 被映射 assert prepared_body["model"] == "glm-5.1" - # 其余字段原样保留(GLM 原生支持 thinking,静默忽略 cache_control) + # thinking.type=enabled 原样保留(GLM 原生支持) + assert prepared_body["thinking"] == {"type": "enabled", "budget_tokens": 5000} + # 其余字段原样保留 assert prepared_body["max_tokens"] == 1024 assert prepared_body["temperature"] == 0.7 assert prepared_body["top_p"] == 0.9 assert prepared_body["stream"] is True - assert prepared_body["thinking"] == {"type": "enabled", "budget_tokens": 5000} assert prepared_body["metadata"] == {"user_id": "test-user"} assert prepared_body["system"] == "You are a helpful assistant." assert len(prepared_body["tools"]) == 3 @@ -116,6 +117,46 @@ async def test_body_passthrough_except_model(self, zhipu_vendor): # 原始 body 未被修改(deep copy) assert body["model"] == "claude-sonnet-4-20250514" + @pytest.mark.asyncio + async def test_thinking_adaptive_converted_to_enabled(self, zhipu_vendor): + """thinking.type=adaptive 应被转换为 enabled+budget(GLM 不支持 adaptive).""" + body = { + "model": "claude-opus-4-7", + "messages": [], + "thinking": {"type": "adaptive"}, + } + prepared_body, _ = await zhipu_vendor._prepare_request(body, {}) + + assert prepared_body["thinking"]["type"] == "enabled" + assert prepared_body["thinking"]["budget_tokens"] == 16000 + # 原始 body 未被修改 + assert body["thinking"] == {"type": "adaptive"} + + @pytest.mark.asyncio + async def test_thinking_enabled_preserved_unchanged(self, zhipu_vendor): + """thinking.type=enabled 应原样保留(GLM 原生支持).""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [], + "thinking": {"type": "enabled", "budget_tokens": 8000}, + } + prepared_body, _ = await zhipu_vendor._prepare_request(body, {}) + + assert prepared_body["thinking"] == {"type": "enabled", "budget_tokens": 8000} + assert body["thinking"]["budget_tokens"] == 8000 + + @pytest.mark.asyncio + async def test_no_thinking_param_unchanged(self, zhipu_vendor): + """无 thinking 参数时不触发任何转换.""" + body = { + "model": "claude-sonnet-4-20250514", + "messages": [{"role": "user", "content": "hi"}], + } + prepared_body, _ = await zhipu_vendor._prepare_request(body, {}) + + assert "thinking" not in prepared_body + assert prepared_body["model"] == "glm-5.1" + @pytest.mark.asyncio async def test_headers_replaces_auth(self, zhipu_vendor): """验证 x-api-key 被正确设置,authorization 被剥离.""" From 8e8d37f1c4ac71e0ea7b1acaabbf25a4c7fc566b Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Tue, 26 May 2026 17:32:39 +0800 Subject: [PATCH 61/66] =?UTF-8?q?feat(dashboard):=20=E6=96=B0=E5=A2=9E=20M?= =?UTF-8?q?odel=20Calling=20=E5=AE=9E=E6=97=B6=E7=8A=B6=E6=80=81=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=8C=E5=8F=AF=E8=A7=86=E5=8C=96=E6=AF=8F=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=B9=B6=E5=8F=91=E4=B8=8E=E6=8E=92=E9=98=9F=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=20(#250)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) --- src/coding/proxy/server/dashboard.py | 163 ++++++++++++++++++++++++ src/coding/proxy/vendors/concurrency.py | 7 +- src/coding/proxy/vendors/zhipu.py | 9 ++ 3 files changed, 178 insertions(+), 1 deletion(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index 54533e6..c81b72c 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -557,6 +557,89 @@ def _build_favicon() -> bytes: .tab-btn:focus-visible { outline: 2px solid var(--accent-blue); outline-offset: 2px; } .tab-pane { display: none; } .tab-pane.active { display: block; } + + /* ── Model Calling 实时状态 ────────────────────────── */ + .model-calling-card { + margin-bottom: 5px; + } + .mc-empty { + text-align: center; + color: var(--text-muted); + padding: 16px 0; + font-size: 13px; + } + .mc-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 8px; + } + .mc-model-row { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; + background: var(--bg-secondary); + border-radius: var(--radius-sm); + border: 1px solid var(--border-subtle); + } + .mc-model-name { + font-family: 'JetBrains Mono', monospace; + font-size: 12px; + color: var(--text-primary); + min-width: 140px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .mc-bar-wrap { + flex: 1; + min-width: 60px; + height: 6px; + background: rgba(255,255,255,.06); + border-radius: 3px; + overflow: hidden; + } + .mc-bar-fill { + height: 100%; + border-radius: 3px; + transition: width .3s ease, background .3s ease; + } + .mc-bar-fill.mc-low { background: var(--accent-green); } + .mc-bar-fill.mc-mid { background: var(--accent-yellow); } + .mc-bar-fill.mc-high { background: var(--accent-red); } + .mc-stats { + display: flex; + align-items: center; + gap: 6px; + font-size: 11px; + font-family: 'JetBrains Mono', monospace; + color: var(--text-muted); + white-space: nowrap; + } + .mc-badge { + display: inline-flex; + align-items: center; + padding: 1px 6px; + border-radius: 4px; + font-size: 10px; + font-weight: 600; + font-family: 'JetBrains Mono', monospace; + } + .mc-badge-pending { + background: rgba(251,146,60,.15); + color: #fb923c; + } + .mc-badge-active { + background: rgba(74,222,128,.12); + color: #4ade80; + } + .mc-vendor-tag { + font-size: 10px; + color: var(--text-muted); + background: rgba(255,255,255,.06); + padding: 1px 6px; + border-radius: 3px; + } @@ -626,6 +709,14 @@ def _build_favicon() -> bytes:
+ +
+
📡 Model Calling 实时状态
+
+
加载中…
+
+
+
@@ -1134,6 +1225,74 @@ def _build_favicon() -> bytes: }).join(''); } +// ── Model Calling 实时状态 ──────────────────────────────── +function updateModelCalling(status) { + var wrap = document.getElementById('model-calling-wrap'); + if (!wrap) return; + var tiers = status.tiers || []; + + // 收集所有带 concurrency 诊断的模型 + var models = []; + for (var i = 0; i < tiers.length; i++) { + var tier = tiers[i]; + var diag = tier.diagnostics || {}; + var conc = diag.concurrency; + if (!conc) continue; + var names = Object.keys(conc); + for (var j = 0; j < names.length; j++) { + var model = names[j]; + var d = conc[model]; + models.push({ + vendor: tier.name, + model: model, + limit: d.limit || 0, + in_use: d.in_use || 0, + available: d.available || 0, + pending: d.pending || 0, + }); + } + } + + if (!models.length) { + wrap.innerHTML = '
无活跃模型调用
'; + return; + } + + var html = '
'; + for (var k = 0; k < models.length; k++) { + var m = models[k]; + var pct = m.limit > 0 ? Math.round((m.in_use / m.limit) * 100) : 0; + var barClass = pct <= 50 ? 'mc-low' : (pct <= 80 ? 'mc-mid' : 'mc-high'); + + html += '
' + + '' + escapeHtml(m.vendor + '/' + m.model) + '' + + '
' + + '
' + + '' + m.in_use + '/' + m.limit + '' + + (m.pending > 0 ? '⏳ ' + m.pending + '' : '') + + '
' + + '
'; + } + html += '
'; + wrap.innerHTML = html; +} + +// Model Calling 独立短间隔轮询 +var _mcTimer = null; +function startModelCallingPoll() { + stopModelCallingPoll(); + function tick() { + fetchJSON('/api/status').then(function(status) { + updateModelCalling(status); + }).catch(function() {}); + } + tick(); + _mcTimer = setInterval(tick, 5000); +} +function stopModelCallingPoll() { + if (_mcTimer) { clearInterval(_mcTimer); _mcTimer = null; } +} + // ── 按 tiers 顺序排序 vendor 列表 ───────────────────────── function sortByTierOrder(vendors, tierOrder) { if (!tierOrder || !tierOrder.length) return vendors.sort(); @@ -1713,6 +1872,7 @@ def _build_favicon() -> bytes: updateKPI(summary); updateVendorStatus(status); + updateModelCalling(status); updateChartTitles(days); const rows = timeline.rows || []; @@ -1788,6 +1948,8 @@ def _build_favicon() -> bytes: currentTab = name; applyTabState(name); syncTabUrl(name); + // Model Calling 轮询随页签切换启停 + if (name === 'overview') { startModelCallingPoll(); } else { stopModelCallingPoll(); } refresh(); } @@ -1807,6 +1969,7 @@ def _build_favicon() -> bytes: }).catch(function(){}); refresh(); // 仅加载初始页签的数据 setInterval(refresh, 600000); // 每 10 分钟刷新当前页签 + if (initial === 'overview') startModelCallingPoll(); })(); diff --git a/src/coding/proxy/vendors/concurrency.py b/src/coding/proxy/vendors/concurrency.py index b4f4df7..148bb53 100644 --- a/src/coding/proxy/vendors/concurrency.py +++ b/src/coding/proxy/vendors/concurrency.py @@ -67,10 +67,15 @@ def get_diagnostics(self) -> dict[str, dict[str, int]]: limit = self._config.get_limit(model) # asyncio.Semaphore 内部 _value 表示剩余可用槽位 available = sem._value # noqa: SLF001 — 公开 API 未暴露 + in_use = max(limit - available, 0) + # _waiters 为正在排队等待的协程集合,无等待者时为 None + waiters = getattr(sem, "_waiters", None) # noqa: SLF001 + pending = len(waiters) if waiters else 0 snapshot[model] = { "limit": limit, - "in_use": max(limit - available, 0), + "in_use": in_use, "available": max(available, 0), + "pending": pending, } return snapshot diff --git a/src/coding/proxy/vendors/zhipu.py b/src/coding/proxy/vendors/zhipu.py index d64a257..cc6ef87 100644 --- a/src/coding/proxy/vendors/zhipu.py +++ b/src/coding/proxy/vendors/zhipu.py @@ -252,6 +252,15 @@ async def _maybe_acquire_concurrency_slot( return None return await self._concurrency_limiter.acquire(mapped_model) + # ── 诊断信息 ───────────────────────────────────────────── + + def get_diagnostics(self) -> dict[str, Any]: + """返回供应商运行时诊断信息,包含每模型并发状态.""" + diagnostics = super().get_diagnostics() + if self._concurrency_limiter is not None: + diagnostics["concurrency"] = self._concurrency_limiter.get_diagnostics() + return diagnostics + # ── 延迟计算 ──────────────────────────────────────────── def _compute_retry_delay_from_headers( From 0a0fc0bac633c678e655ee730ecfebbd56ade615 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Tue, 26 May 2026 17:56:06 +0800 Subject: [PATCH 62/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a11;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f715039..c6f319c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a10" +version = "0.4.1a11" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index aa12d90..e3f808f 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a10" +version = "0.4.1a11" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From b2c30237c1e3af08ec8e0323cdfbfeb440896b4c Mon Sep 17 00:00:00 2001 From: Aurelius Huang Date: Tue, 26 May 2026 20:47:32 +0800 Subject: [PATCH 63/66] =?UTF-8?q?feat(concurrency):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=97=B6=E5=8A=A8=E6=80=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=AF=8F=E6=A8=A1=E5=9E=8B=E5=B9=B6=E8=A1=8C=E5=BA=A6=20(#251)?= =?UTF-8?q?=20(#251)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(concurrency): 支持运行时动态修改每模型并行度 (#251) 重构 ModelConcurrencyLimiter,以自定义 _ConcurrencySlot 替代 asyncio.Semaphore, 支持 set_limit() 动态调整上限。新增 PUT /api/concurrency 端点,Dashboard Model Calling 模块中 limit 数字可直接点击编辑(1-20),无需重启进程。 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang * fix(dashboard): 修复 Escape 取消编辑后仍提交并行度的问题 Escape 取消时 restore() 移除 input 元素会触发浏览器 blur 事件, 导致 blur handler 通过 setTimeout 在 50ms 后调用 submit() 将已取消 的值发送到服务端。引入 _cancelled 标志在 Escape 时置位,submit 入口 及 blur 回调中双重守卫,确保取消操作不被忽略。 Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- src/coding/proxy/server/dashboard.py | 113 +++++++++++++++++- src/coding/proxy/server/routes.py | 56 +++++++++ src/coding/proxy/vendors/concurrency.py | 145 ++++++++++++++++++------ src/coding/proxy/vendors/zhipu.py | 7 ++ tests/test_zhipu_concurrency.py | 22 ++-- 5 files changed, 298 insertions(+), 45 deletions(-) diff --git a/src/coding/proxy/server/dashboard.py b/src/coding/proxy/server/dashboard.py index c81b72c..75dd812 100644 --- a/src/coding/proxy/server/dashboard.py +++ b/src/coding/proxy/server/dashboard.py @@ -640,6 +640,43 @@ def _build_favicon() -> bytes: padding: 1px 6px; border-radius: 3px; } + .mc-limit-editable { + cursor: pointer; + border-bottom: 1px dashed rgba(74,222,128,.4); + transition: border-color .2s, color .2s; + } + .mc-limit-editable:hover { + border-bottom-color: #4ade80; + color: #4ade80; + } + .mc-limit-input { + width: 36px; + background: var(--bg-primary); + border: 1px solid var(--accent-blue); + border-radius: 3px; + color: var(--text-primary); + font-size: 10px; + font-family: 'JetBrains Mono', monospace; + text-align: center; + padding: 0 2px; + outline: none; + -moz-appearance: textfield; + } + .mc-limit-input::-webkit-outer-spin-button, + .mc-limit-input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + .mc-limit-flash-ok { animation: mc-flash-ok .6s ease; } + .mc-limit-flash-err { animation: mc-flash-err .6s ease; } + @keyframes mc-flash-ok { + 0%,100% { color: inherit; } + 40% { color: #4ade80; } + } + @keyframes mc-flash-err { + 0%,100% { color: inherit; } + 40% { color: #f87171; } + } @@ -1268,7 +1305,8 @@ def _build_favicon() -> bytes: + '' + escapeHtml(m.vendor + '/' + m.model) + '' + '
' + '
' - + '' + m.in_use + '/' + m.limit + '' + + '' + m.in_use + + '/' + m.limit + '' + (m.pending > 0 ? '⏳ ' + m.pending + '' : '') + '
' + '
'; @@ -1293,6 +1331,79 @@ def _build_favicon() -> bytes: if (_mcTimer) { clearInterval(_mcTimer); _mcTimer = null; } } +// ── 并行度运行时编辑 ────────────────────────────────────── +var _mcEditing = false; +document.addEventListener('click', function(e) { + if (_mcEditing) return; + var el = e.target.closest('.mc-limit-editable'); + if (!el) return; + e.preventDefault(); + _mcEditing = true; + var oldVal = el.getAttribute('data-limit'); + var tier = el.getAttribute('data-tier'); + var model = el.getAttribute('data-model'); + var input = document.createElement('input'); + input.type = 'number'; + input.className = 'mc-limit-input'; + input.min = '1'; + input.max = '20'; + input.value = oldVal; + el.style.display = 'none'; + el.parentNode.insertBefore(input, el.nextSibling); + input.focus(); + input.select(); + + var _cancelled = false; + + function restore() { + _mcEditing = false; + if (input.parentNode) input.parentNode.removeChild(input); + el.style.display = ''; + } + + function flash(cls) { + el.classList.add(cls); + setTimeout(function() { el.classList.remove(cls); }, 600); + } + + input.addEventListener('keydown', function(ev) { + if (ev.key === 'Escape') { _cancelled = true; restore(); return; } + if (ev.key !== 'Enter') return; + ev.preventDefault(); + submit(); + }); + + input.addEventListener('blur', function() { + setTimeout(function() { if (!_cancelled) submit(); }, 50); + }); + + function submit() { + if (_cancelled) return; + var v = parseInt(input.value, 10); + if (isNaN(v) || v < 1 || v > 20) { restore(); flash('mc-limit-flash-err'); return; } + if (String(v) === oldVal) { restore(); return; } + fetch('/api/concurrency', { + method: 'PUT', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({tier: tier, model: model, limit: v}) + }).then(function(res) { + if (res.ok) { + return res.json().then(function() { + el.textContent = v; + el.setAttribute('data-limit', v); + flash('mc-limit-flash-ok'); + }); + } else { + flash('mc-limit-flash-err'); + } + }).catch(function() { + flash('mc-limit-flash-err'); + }).finally(function() { + restore(); + }); + } +}); + // ── 按 tiers 顺序排序 vendor 列表 ───────────────────────── function sortByTierOrder(vendors, tierOrder) { if (!tierOrder || !tierOrder.length) return vendors.sort(); diff --git a/src/coding/proxy/server/routes.py b/src/coding/proxy/server/routes.py index 95c6554..7c13d2f 100644 --- a/src/coding/proxy/server/routes.py +++ b/src/coding/proxy/server/routes.py @@ -225,6 +225,61 @@ async def status() -> dict: return result +def register_concurrency_route(app: Any, router: Any) -> None: + """注册运行时并发限制调整路由.""" + + @app.put("/api/concurrency") + async def update_concurrency(request: Request) -> Response: + try: + body = await request.json() + except Exception: + return json_error_response( + 400, error_type="invalid_request_error", message="body must be JSON" + ) + tier_name = body.get("tier") + model = body.get("model") + limit = body.get("limit") + if not tier_name or not model or limit is None: + return json_error_response( + 400, + error_type="invalid_request_error", + message="requires tier, model, limit", + ) + if not isinstance(limit, int) or limit < 1 or limit > 20: + return json_error_response( + 400, + error_type="invalid_request_error", + message="limit must be an integer between 1 and 20", + ) + for tier in router.tiers: + if tier.name == tier_name: + vendor = tier.vendor + update_fn = getattr(vendor, "update_concurrency", None) + if update_fn is None: + return json_error_response( + 400, + error_type="invalid_request_error", + message=f"vendor '{tier_name}' does not support concurrency", + ) + try: + update_fn(model, limit) + except (ValueError, AttributeError) as exc: + return json_error_response( + 400, error_type="invalid_request_error", message=str(exc) + ) + return Response( + content=json.dumps( + {"ok": True, "tier": tier_name, "model": model, "limit": limit}, + ensure_ascii=False, + ).encode(), + status_code=200, + media_type="application/json", + ) + return json_error_response( + 404, error_type="not_found", message=f"tier '{tier_name}' not found" + ) + + def register_copilot_routes(app: Any, router: Any) -> None: """注册 Copilot 诊断与模型探测路由.""" from .factory import _find_copilot_vendor @@ -457,6 +512,7 @@ def register_all_routes( register_core_routes(app, router) register_health_routes(app) register_status_route(app, router) + register_concurrency_route(app, router) register_copilot_routes(app, router) register_admin_routes(app, router) register_session_vendor_routes(app, router) diff --git a/src/coding/proxy/vendors/concurrency.py b/src/coding/proxy/vendors/concurrency.py index 148bb53..7944bdd 100644 --- a/src/coding/proxy/vendors/concurrency.py +++ b/src/coding/proxy/vendors/concurrency.py @@ -1,13 +1,14 @@ -"""每模型并发限制器 — 基于 asyncio.Semaphore 的公平排队. +"""每模型并发限制器 — 支持运行时动态调整的公平排队. -为每个映射后的模型(如 ``glm-5v-turbo``)独立维护一个 ``asyncio.Semaphore``, +为每个映射后的模型(如 ``glm-5v-turbo``)独立维护一个 ``_ConcurrencySlot`, 确保同一时间点该模型的并行请求数不超过配置的上限。当所有槽位被占满时, 新请求按 FIFO 顺序排队等待,直到有槽位释放。 设计要点: - - **惰性创建**:仅在首次请求到达时才为该模型创建 Semaphore,避免冷启动开销 - - **FIFO 公平**:``asyncio.Semaphore`` 内部使用 FIFO 队列,天然满足排队语义 - - **按映射后模型名键控**:与上游真实承载能力对齐,而非按客户端请求名(如 ``claude-sonnet-*``) + - **惰性创建**:仅在首次请求到达时才为该模型创建 Slot,避免冷启动开销 + - **FIFO 公平**:``asyncio.Event`` + while 循环天然满足 FIFO 排队语义 + - **动态调整**:支持运行时修改 per-model limit,无需重启进程 + - **按映射后模型名键控**:与上游真实承载能力对齐,而非按客户端请求名 """ from __future__ import annotations @@ -20,62 +21,140 @@ logger = logging.getLogger(__name__) +class _ConcurrencySlot: + """支持动态 limit 的并发槽位. + + 使用 ``asyncio.Event`` 作为等待/通知原语,在 ``acquire`` 中 await 等待, + 在 ``release`` / ``set_limit`` 中唤醒。``set_limit`` 修改上限后立即唤醒 + 所有等待者,由它们重新判断是否可获得槽位。 + """ + + def __init__(self, limit: int) -> None: + self._limit = limit + self._in_use: int = 0 + self._pending: int = 0 + self._wake = asyncio.Event() + self._wake.set() + + async def acquire(self) -> _ConcurrencySlot: + """获取一个并发槽位,必要时阻塞排队. + + 返回 ``self``,调用方在请求完成后调用 ``release()``。 + """ + # Fast path + if self._in_use < self._limit: + self._in_use += 1 + return self + # Slow path — 等待槽位释放 + self._pending += 1 + try: + while True: + self._wake.clear() + await self._wake.wait() + if self._in_use < self._limit: + self._in_use += 1 + return self + finally: + self._pending -= 1 + + def release(self) -> None: + """释放一个并发槽位.""" + self._in_use = max(0, self._in_use - 1) + self._wake.set() + + def set_limit(self, new_limit: int) -> None: + """动态调整并发上限. + + 增大 limit 时立即唤醒等待者;缩小时已持有的槽位不受影响, + 新 limit 在后续 acquire 中自然生效。 + """ + self._limit = new_limit + self._wake.set() + + @property + def limit(self) -> int: + return self._limit + + @property + def in_use(self) -> int: + return self._in_use + + @property + def available(self) -> int: + return max(0, self._limit - self._in_use) + + @property + def pending(self) -> int: + return self._pending + + class ModelConcurrencyLimiter: """按模型名提供独立并发槽位的限制器. 用法:: limiter = ModelConcurrencyLimiter(config) - sem = await limiter.acquire("glm-5v-turbo") + slot = await limiter.acquire("glm-5v-turbo") try: ... # 执行请求 finally: - sem.release() + slot.release() """ def __init__(self, config: ZhipuConcurrencyConfig) -> None: self._config = config - self._semaphores: dict[str, asyncio.Semaphore] = {} + self._slots: dict[str, _ConcurrencySlot] = {} - def _get_semaphore(self, model: str) -> asyncio.Semaphore: - """获取(或惰性创建)指定模型的信号量.""" - sem = self._semaphores.get(model) - if sem is None: + def _get_or_create_slot(self, model: str) -> _ConcurrencySlot: + """获取(或惰性创建)指定模型的并发槽位.""" + slot = self._slots.get(model) + if slot is None: limit = self._config.get_limit(model) - sem = asyncio.Semaphore(limit) - self._semaphores[model] = sem + slot = _ConcurrencySlot(limit) + self._slots[model] = slot logger.debug( - "ModelConcurrencyLimiter: created semaphore model=%s limit=%d", + "ModelConcurrencyLimiter: created slot model=%s limit=%d", model, limit, ) - return sem + return slot - async def acquire(self, model: str) -> asyncio.Semaphore: + async def acquire(self, model: str) -> _ConcurrencySlot: """获取指定模型的并发槽位,必要时阻塞排队. - 返回已获取的 Semaphore 实例,调用方负责在请求完成后调用 ``release()``。 + 返回已获取的 Slot 实例,调用方负责在请求完成后调用 ``release()``。 """ - sem = self._get_semaphore(model) - await sem.acquire() - return sem + slot = self._get_or_create_slot(model) + await slot.acquire() + return slot + + def set_limit(self, model: str, new_limit: int) -> None: + """运行时修改指定模型的并发上限. + + 同时更新 config.models 以确保后续惰性创建使用新值。 + """ + slot = self._slots.get(model) + if slot is None: + slot = _ConcurrencySlot(new_limit) + self._slots[model] = slot + else: + slot.set_limit(new_limit) + self._config.models[model] = new_limit + logger.info( + "ModelConcurrencyLimiter: updated limit model=%s new_limit=%d", + model, + new_limit, + ) def get_diagnostics(self) -> dict[str, dict[str, int]]: """返回每个模型的并发状态快照(用于可观测性).""" snapshot: dict[str, dict[str, int]] = {} - for model, sem in self._semaphores.items(): - limit = self._config.get_limit(model) - # asyncio.Semaphore 内部 _value 表示剩余可用槽位 - available = sem._value # noqa: SLF001 — 公开 API 未暴露 - in_use = max(limit - available, 0) - # _waiters 为正在排队等待的协程集合,无等待者时为 None - waiters = getattr(sem, "_waiters", None) # noqa: SLF001 - pending = len(waiters) if waiters else 0 + for model, slot in self._slots.items(): snapshot[model] = { - "limit": limit, - "in_use": in_use, - "available": max(available, 0), - "pending": pending, + "limit": slot.limit, + "in_use": slot.in_use, + "available": slot.available, + "pending": slot.pending, } return snapshot diff --git a/src/coding/proxy/vendors/zhipu.py b/src/coding/proxy/vendors/zhipu.py index cc6ef87..64407ba 100644 --- a/src/coding/proxy/vendors/zhipu.py +++ b/src/coding/proxy/vendors/zhipu.py @@ -261,6 +261,13 @@ def get_diagnostics(self) -> dict[str, Any]: diagnostics["concurrency"] = self._concurrency_limiter.get_diagnostics() return diagnostics + def update_concurrency(self, model: str, limit: int) -> None: + """运行时更新指定模型的并发限制.""" + if self._concurrency_limiter is None: + msg = "Concurrency limiter is not enabled for this vendor" + raise ValueError(msg) + self._concurrency_limiter.set_limit(model, limit) + # ── 延迟计算 ──────────────────────────────────────────── def _compute_retry_delay_from_headers( diff --git a/tests/test_zhipu_concurrency.py b/tests/test_zhipu_concurrency.py index 3c8a97d..7566b24 100644 --- a/tests/test_zhipu_concurrency.py +++ b/tests/test_zhipu_concurrency.py @@ -141,12 +141,12 @@ class TestModelConcurrencyLimiter: @pytest.mark.asyncio async def test_lazy_semaphore_creation(self) -> None: limiter = ModelConcurrencyLimiter(ZhipuConcurrencyConfig(default=2)) - sem_a = limiter._get_semaphore("model-a") - sem_b = limiter._get_semaphore("model-b") - # 不同模型独立 semaphore - assert sem_a is not sem_b - # 相同模型复用 semaphore - assert limiter._get_semaphore("model-a") is sem_a + slot_a = limiter._get_or_create_slot("model-a") + slot_b = limiter._get_or_create_slot("model-b") + # 不同模型独立 slot + assert slot_a is not slot_b + # 相同模型复用 slot + assert limiter._get_or_create_slot("model-a") is slot_a @pytest.mark.asyncio async def test_acquire_blocks_when_full(self) -> None: @@ -184,8 +184,8 @@ async def test_per_model_independent(self) -> None: def test_diagnostics_snapshot(self) -> None: limiter = ModelConcurrencyLimiter(ZhipuConcurrencyConfig(default=3)) - # 触发 semaphore 创建 - limiter._get_semaphore("glm-5.1") + # 触发 slot 创建 + limiter._get_or_create_slot("glm-5.1") snap = limiter.get_diagnostics() assert "glm-5.1" in snap assert snap["glm-5.1"]["limit"] == 3 @@ -459,10 +459,10 @@ async def fake_stream(self, _body, _headers): # noqa: ARG001 chunks.append(chunk) assert len(chunks) == 2 - # 确认 semaphore 当前完全可用 + # 确认 slot 当前完全可用 assert vendor._concurrency_limiter is not None - sem = vendor._concurrency_limiter._get_semaphore("glm-5.1") - assert sem._value == 1 # noqa: SLF001 + slot = vendor._concurrency_limiter._get_or_create_slot("glm-5.1") + assert slot.available == 1 @pytest.mark.asyncio async def test_stream_releases_slot_on_error(self) -> None: From c6665da71c521b0d89db2b4a50de77340444b169 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Tue, 26 May 2026 20:52:51 +0800 Subject: [PATCH 64/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.4.1a12;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c6f319c..3bff88c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a11" +version = "0.4.1a12" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index e3f808f..ca7da4a 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a11" +version = "0.4.1a12" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, From dfee892cc34eff67b70e2a500d009a3d461f590b Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Wed, 27 May 2026 11:08:10 +0800 Subject: [PATCH 65/66] =?UTF-8?q?docs(changelog):=20=E6=96=B0=E5=A2=9E=20v?= =?UTF-8?q?0.5.0=20=E7=89=88=E6=9C=AC=E6=97=A5=E5=BF=97=E4=B8=8E=20Model?= =?UTF-8?q?=20Calling=20=E5=8A=9F=E8=83=BD=E6=88=AA=E5=9B=BE;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- CHANGELOG.md | 24 +++++++++++++++++++++++- assets/model-calling-v0.5.0.png | Bin 0 -> 22399 bytes 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 assets/model-calling-v0.5.0.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb7a1f..f745ec1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,29 @@ ## [Unreleased] -- feat(zhipu): 新增每模型并发限制(默认 3,可通过 `vendors[zhipu].concurrency` 配置),基于 `asyncio.Semaphore` 实现 FIFO 公平排队,流式与非流式共用同一槽位,与 429 重试机制兼容。 +## [v0.5.0](https://github.com/ThreeFish-AI/coding-proxy/releases/tag/v0.5.0) - 2026-05-27 + +> [!IMPORTANT] +> +> **🚀 Model Calling 实时状态!** +> +> 模型并发与排队深度一目了然,运行时动态调整每个模型并行度,预防 vendor 侧的 429 幺蛾子。 + +![model-calling](assets/model-calling-v0.5.0.png) + +### ✨ 核心亮点 + +- feat(concurrency): 新增 Model Calling 实时状态模块,可视化每模型并发与排队深度,支持运行时动态修改每模型并行度 (#250) (#251) +- feat(zhipu): 新增每模型并发限制,默认 3 个并行请求 FIFO 排队 (#248) +- feat(zhipu): 为 429 Rate Limit 添加指数退避重试挽回机制 (#242) + +### 🔧 更多特性 + +- fix(antigravity): 修复 v1internal 模式检测逻辑并新增 E2E 测试; (#234) +- fix(routes): 修复 count_tokens 路由对 target_vendor.name 的错误属性访问; (#235) +- fix(vendor-channels): 修复 zhipu→anthropic 通道 tool_use/tool_result 配对漏洞; (#236) +- fix(native-api): 修复 Gemini :verb 路径中 %3A URL 编码导致上游 400 的兼容问题; (#237) +- fix(zhipu): 诊断首选 tier 语义拒绝降级问题,增强可观测性并提取跨供应商清洗共享函数 (#243) ## [v0.4.0](https://github.com/ThreeFish-AI/coding-proxy/releases/tag/v0.4.0) — 2026-05-01 diff --git a/assets/model-calling-v0.5.0.png b/assets/model-calling-v0.5.0.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1e31bca74224ab916fb43ce47e9fb6bc782667 GIT binary patch literal 22399 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 z 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 Date: Wed, 27 May 2026 11:09:59 +0800 Subject: [PATCH 66/66] =?UTF-8?q?build(version):=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E5=8D=87=E7=BA=A7=E8=87=B3=200.5.0;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist) Co-Authored-By: Aurelius Huang --- pyproject.toml | 2 +- uv.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3bff88c..14dcba1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "coding-proxy" -version = "0.4.1a12" +version = "0.5.0" description = "A High-Availability, Transparent, and Smart Multi-Vendor Proxy for Claude Code. Support Claude Plans, GitHub Copilot, Google Antigravity, ZAI/GLM, MiniMax, Qwen, Xiaomi, Kimi, Doubao..." readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index ca7da4a..d04ad46 100644 --- a/uv.lock +++ b/uv.lock @@ -74,7 +74,7 @@ wheels = [ [[package]] name = "coding-proxy" -version = "0.4.1a12" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "aiosqlite" },