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.
Files changed (22) hide show
  1. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/PKG-INFO +1 -1
  2. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/pyproject.toml +1 -1
  3. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/__main__.py +24 -1
  4. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/PKG-INFO +1 -1
  5. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/LICENSE +0 -0
  6. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/README.md +0 -0
  7. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/setup.cfg +0 -0
  8. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/anthropic_adapter.py +0 -0
  9. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/backend_profile.py +0 -0
  10. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/codebuddy_client_demo.py +0 -0
  11. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/desensitize.py +0 -0
  12. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/dsml_parser.py +0 -0
  13. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/models_config.domestic.json +0 -0
  14. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/models_config.global.json +0 -0
  15. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/projection_metadata.py +0 -0
  16. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/responses_adapter.py +0 -0
  17. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/codebuddy_proxy/responses_projection.py +0 -0
  18. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/SOURCES.txt +0 -0
  19. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/dependency_links.txt +0 -0
  20. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/entry_points.txt +0 -0
  21. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/requires.txt +0 -0
  22. {workbuddy2api-2.0.5 → workbuddy2api-2.0.6}/src/workbuddy2api.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workbuddy2api
3
- Version: 2.0.5
3
+ Version: 2.0.6
4
4
  Summary: Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "workbuddy2api"
3
- version = "2.0.5"
3
+ version = "2.0.6"
4
4
  description = "Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -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
- uvicorn.run(app, host=args.host, port=args.port, log_level="warning")
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())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workbuddy2api
3
- Version: 2.0.5
3
+ Version: 2.0.6
4
4
  Summary: Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
File without changes
File without changes
File without changes