From 14dd16ad66495607908ec9664e745755d40dfb2a Mon Sep 17 00:00:00 2001 From: hpiclaranet Date: Sat, 13 Jun 2026 21:01:50 +0100 Subject: [PATCH] improvement: cache Daytona client and improve error handling build_client() previously created a new Daytona instance on every tool invocation. Since the plugin daemon is a long-running process, cache the client by credentials hash to avoid redundant connection setup. Also catch DaytonaError (parent class) in get_sandbox() to provide clear ValueError messages for SDK errors beyond not-found (auth failures, rate limits, server errors). --- _client.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/_client.py b/_client.py index 4db2526..65fe5c6 100644 --- a/_client.py +++ b/_client.py @@ -1,13 +1,27 @@ +import hashlib +import logging from typing import Any -from daytona import Daytona, DaytonaConfig, DaytonaNotFoundError, Sandbox +from daytona import Daytona, DaytonaConfig, DaytonaError, DaytonaNotFoundError, Sandbox + +logger = logging.getLogger(__name__) + +_client_cache: dict[str, Daytona] = {} + + +def _cache_key(credentials: dict[str, Any]) -> str: + raw = f"{credentials.get('api_key', '')}:{credentials.get('api_url', '')}" + return hashlib.sha256(raw.encode()).hexdigest() def build_client(credentials: dict[str, Any]) -> Daytona: - config = DaytonaConfig(api_key=credentials["api_key"]) - if api_url := credentials.get("api_url"): - config.api_url = api_url - return Daytona(config) + key = _cache_key(credentials) + if key not in _client_cache: + config = DaytonaConfig(api_key=credentials["api_key"]) + if api_url := credentials.get("api_url"): + config.api_url = api_url + _client_cache[key] = Daytona(config) + return _client_cache[key] def get_sandbox(client: Daytona, sandbox_id: str) -> Sandbox: @@ -17,6 +31,8 @@ def get_sandbox(client: Daytona, sandbox_id: str) -> Sandbox: sandbox = client.get(sandbox_id) except DaytonaNotFoundError as e: raise ValueError(f"Sandbox '{sandbox_id}' not found") from e + except DaytonaError as e: + raise ValueError(f"Failed to retrieve sandbox '{sandbox_id}': {e}") from e if sandbox is None: raise ValueError(f"Sandbox '{sandbox_id}' not found") return sandbox