workbuddy2api 2.0.5__tar.gz → 2.0.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/PKG-INFO +1 -1
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/pyproject.toml +1 -1
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/__main__.py +24 -1
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/PKG-INFO +1 -1
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/LICENSE +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/README.md +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/setup.cfg +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/anthropic_adapter.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/backend_profile.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/codebuddy_client_demo.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/desensitize.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/dsml_parser.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/models_config.domestic.json +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/models_config.global.json +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/projection_metadata.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/responses_adapter.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/responses_projection.py +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/SOURCES.txt +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/dependency_links.txt +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/entry_points.txt +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/requires.txt +0 -0
- {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/top_level.txt +0 -0
|
@@ -14,6 +14,7 @@ Usage with uv:
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import argparse
|
|
17
|
+
import asyncio
|
|
17
18
|
import base64
|
|
18
19
|
import hashlib
|
|
19
20
|
import io
|
|
@@ -1748,12 +1749,34 @@ def convert_nonstream(data: dict[str, Any], protocol: str, original: dict[str, A
|
|
|
1748
1749
|
# 启动
|
|
1749
1750
|
# ============================================================================
|
|
1750
1751
|
|
|
1752
|
+
def run_http_server(*, host: str, port: int, windows_loop: str = "selector") -> None:
|
|
1753
|
+
"""Avoid Windows Proactor's noisy WinError 64 accept failures.
|
|
1754
|
+
|
|
1755
|
+
Newer Uvicorn versions choose a Proactor loop explicitly, ignoring the
|
|
1756
|
+
asyncio event-loop policy. Older versions use that policy instead. Use
|
|
1757
|
+
the corresponding selector mechanism without affecting non-Windows hosts.
|
|
1758
|
+
"""
|
|
1759
|
+
options: dict[str, Any] = {"host": host, "port": port, "log_level": "warning"}
|
|
1760
|
+
if sys.platform == "win32" and windows_loop == "selector":
|
|
1761
|
+
if hasattr(uvicorn.Config, "get_loop_factory"):
|
|
1762
|
+
options["loop"] = asyncio.SelectorEventLoop
|
|
1763
|
+
else:
|
|
1764
|
+
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
|
1765
|
+
uvicorn.run(app, **options)
|
|
1766
|
+
|
|
1767
|
+
|
|
1751
1768
|
def build_parser() -> argparse.ArgumentParser:
|
|
1752
1769
|
parser = argparse.ArgumentParser(description="CodeBuddy local API proxy")
|
|
1753
1770
|
parser.add_argument("--host", default=os.getenv("CODEBUDDY_PROXY_HOST", "127.0.0.1"),
|
|
1754
1771
|
help="监听地址")
|
|
1755
1772
|
parser.add_argument("--port", type=int, default=int(os.getenv("CODEBUDDY_PROXY_PORT", "8787")),
|
|
1756
1773
|
help="监听端口")
|
|
1774
|
+
parser.add_argument(
|
|
1775
|
+
"--windows-loop",
|
|
1776
|
+
choices=("selector", "proactor"),
|
|
1777
|
+
default="selector",
|
|
1778
|
+
help="仅 Windows 生效:默认 selector 避免 WinError 64;可选 proactor 保留原行为",
|
|
1779
|
+
)
|
|
1757
1780
|
parser.add_argument(
|
|
1758
1781
|
"--global",
|
|
1759
1782
|
dest="global_mode",
|
|
@@ -1888,7 +1911,7 @@ def main():
|
|
|
1888
1911
|
logger.info("Endpoints: /v1/models /v1/chat/completions /v1/responses /v1/messages /health")
|
|
1889
1912
|
|
|
1890
1913
|
# 启动 uvicorn
|
|
1891
|
-
|
|
1914
|
+
run_http_server(host=args.host, port=args.port, windows_loop=args.windows_loop)
|
|
1892
1915
|
|
|
1893
1916
|
if __name__ == "__main__":
|
|
1894
1917
|
raise SystemExit(main())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|