From e4d28871e9bee3888de7af2e22f943ba378a0816 Mon Sep 17 00:00:00 2001 From: touale <136764239@qq.com> Date: Sun, 4 Jan 2026 15:08:36 +0800 Subject: [PATCH 1/3] fix: enhance plugin version formatting in API registration --- src/framex/plugin/on.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/framex/plugin/on.py b/src/framex/plugin/on.py index f0ce108..09df20c 100644 --- a/src/framex/plugin/on.py +++ b/src/framex/plugin/on.py @@ -36,6 +36,8 @@ def decorator(cls: type) -> type: path = f"{API_STR}{path}" if path.startswith("/") else f"{API_STR}/{path}" params = extract_method_params(func) + version: str = plugin.module.__plugin_meta__.version + version = f"v{version}" if version.startswith("v") else version plugin_apis.append( PluginApi( api=path, @@ -44,7 +46,7 @@ def decorator(cls: type) -> type: methods=func.__expose_methods_, params=params, call_type=call_type, - tags=[plugin.name + "(v" + plugin.module.__plugin_meta__.version + ")"], + tags=[plugin.name + f"({version})"], stream=func.__expose_stream, ) ) From 0ba17da004fe56af8468116e055a9f4e5723d2c0 Mon Sep 17 00:00:00 2001 From: touale <136764239@qq.com> Date: Sun, 4 Jan 2026 15:10:08 +0800 Subject: [PATCH 2/3] fix: add proxy function registration and on_proxy hook --- src/framex/__init__.py | 4 ++++ src/framex/plugin/__init__.py | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/framex/__init__.py b/src/framex/__init__.py index 5342660..e3e3c23 100644 --- a/src/framex/__init__.py +++ b/src/framex/__init__.py @@ -168,8 +168,10 @@ def run( get_plugin_config, load_builtin_plugins, load_plugins, + on_proxy, on_register, on_request, + register_proxy_func, remote, ) @@ -182,7 +184,9 @@ def run( "load_builtin_plugins", "load_plugins", "logger", + "on_proxy", "on_register", "on_request", + "register_proxy_func", "remote", ] diff --git a/src/framex/plugin/__init__.py b/src/framex/plugin/__init__.py index 399afc8..03e762e 100644 --- a/src/framex/plugin/__init__.py +++ b/src/framex/plugin/__init__.py @@ -138,9 +138,9 @@ def get_http_plugin_apis() -> list["PluginApi"]: from .base import BasePlugin -from .load import load_builtin_plugins, load_plugins +from .load import load_builtin_plugins, load_plugins, register_proxy_func from .model import ApiType, PluginMetadata -from .on import on_register, on_request, remote +from .on import on_proxy, on_register, on_request, remote __all__ = [ "ApiType", @@ -148,7 +148,9 @@ def get_http_plugin_apis() -> list["PluginApi"]: "PluginMetadata", "load_builtin_plugins", "load_plugins", + "on_proxy", "on_register", "on_request", + "register_proxy_func", "remote", ] From 292120840bb78c8fe624bd6553a462a1cf88fd53 Mon Sep 17 00:00:00 2001 From: touale <136764239@qq.com> Date: Sun, 4 Jan 2026 15:40:28 +0800 Subject: [PATCH 3/3] feat: tenacity dependency and retry mechanism --- pyproject.toml | 1 - src/framex/plugins/proxy/__init__.py | 16 ---------------- uv.lock | 11 ----------- 3 files changed, 28 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7d5ab24..e6cd2cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,6 @@ dependencies = [ "pytz>=2025.2", "ray[serve]==2.53.0", "sentry-sdk[fastapi]>=2.33.0", - "tenacity>=9.1.2", "tomli>=2.2.1", ] diff --git a/src/framex/plugins/proxy/__init__.py b/src/framex/plugins/proxy/__init__.py index 900a28d..b63b6f0 100644 --- a/src/framex/plugins/proxy/__init__.py +++ b/src/framex/plugins/proxy/__init__.py @@ -6,7 +6,6 @@ import httpx from pydantic import BaseModel, create_model from starlette import status -from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential from typing_extensions import override from framex.adapter import get_adapter @@ -64,21 +63,6 @@ async def on_start(self) -> None: async def check_is_gen_api(self, path: str) -> bool: return path in settings.force_stream_apis - @retry( - stop=stop_after_attempt(3), - wait=wait_exponential(multiplier=0.5, min=0.5, max=5), - retry=retry_if_exception_type( - ( - httpx.ConnectError, - httpx.ConnectTimeout, - httpx.ReadTimeout, - httpx.WriteTimeout, - httpx.PoolTimeout, - httpx.TransportError, - ) - ), - reraise=True, - ) async def _get_openai_docs(self, url: str, docs_path: str = "/api/v1/openapi.json") -> dict[str, Any]: if auth_api_key := settings.auth.get_auth_keys(docs_path): headers = {"Authorization": auth_api_key[0]} # Use the first auth key set diff --git a/uv.lock b/uv.lock index c262c0b..5977223 100644 --- a/uv.lock +++ b/uv.lock @@ -503,7 +503,6 @@ dependencies = [ { name = "pytz" }, { name = "ray", extra = ["serve"] }, { name = "sentry-sdk", extra = ["fastapi"] }, - { name = "tenacity" }, { name = "tomli" }, ] @@ -545,7 +544,6 @@ requires-dist = [ { name = "pytz", specifier = ">=2025.2" }, { name = "ray", extras = ["serve"], specifier = "==2.53.0" }, { name = "sentry-sdk", extras = ["fastapi"], specifier = ">=2.33.0" }, - { name = "tenacity", specifier = ">=9.1.2" }, { name = "tomli", specifier = ">=2.2.1" }, ] provides-extras = ["release"] @@ -2277,15 +2275,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/e0/021c772d6a662f43b63044ab481dc6ac7592447605b5b35a957785363122/starlette-0.49.3-py3-none-any.whl", hash = "sha256:b579b99715fdc2980cf88c8ec96d3bf1ce16f5a8051a7c2b84ef9b1cdecaea2f", size = 74340 }, ] -[[package]] -name = "tenacity" -version = "9.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, -] - [[package]] name = "tomli" version = "2.3.0"