Spaces:
Paused
Paused
| """Capability timeout/retry ๊ธฐ๋ณธ๊ฐ ๋ชจ๋. | |
| Issue #163: capability๋ณ timeout๊ณผ retry ๊ธฐ๋ณธ๊ฐ์ ์ค์ ์ง์ค ๊ด๋ฆฌ. | |
| ํ๊ฒฝ๋ณ์ GOVON_TOOL_TIMEOUT_{CAPABILITY_NAME} ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ. | |
| ์: GOVON_TOOL_TIMEOUT_API_LOOKUP=20 -> api_lookup timeout์ 20์ด๋ก ๋ณ๊ฒฝ | |
| """ | |
| from __future__ import annotations | |
| import os | |
| from dataclasses import dataclass | |
| from typing import Dict | |
| from loguru import logger | |
| class CapabilityDefaults: | |
| """capability๋ณ timeout/retry ๊ธฐ๋ณธ๊ฐ.""" | |
| timeout_sec: float | |
| max_retries: int | |
| # ----------------------------------------------------------------------- | |
| # ๊ธฐ๋ณธ๊ฐ ์ ์ (์ฝ๋๋ฒ ์ด์ค capability metadata์์ ์ถ์ถ) | |
| # ----------------------------------------------------------------------- | |
| _DEFAULTS: Dict[str, CapabilityDefaults] = { | |
| "api_lookup": CapabilityDefaults(timeout_sec=10.0, max_retries=1), | |
| "issue_detector": CapabilityDefaults(timeout_sec=15.0, max_retries=0), | |
| "stats_lookup": CapabilityDefaults(timeout_sec=15.0, max_retries=0), | |
| "keyword_analyzer": CapabilityDefaults(timeout_sec=10.0, max_retries=0), | |
| "demographics_lookup": CapabilityDefaults(timeout_sec=15.0, max_retries=0), | |
| } | |
| def get_timeout(capability_name: str) -> float: | |
| """capability์ timeout(์ด)์ ๋ฐํํ๋ค. | |
| ํ๊ฒฝ๋ณ์ ``GOVON_TOOL_TIMEOUT_{CAPABILITY_NAME_UPPER}`` ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด | |
| ํด๋น ๊ฐ์ ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค. | |
| Parameters | |
| ---------- | |
| capability_name : str | |
| capability ์ด๋ฆ (์: "api_lookup"). | |
| Returns | |
| ------- | |
| float | |
| timeout ์ด. ์ ์ ์๋ capability๋ 10.0์ด. | |
| """ | |
| env_key = f"GOVON_TOOL_TIMEOUT_{capability_name.upper()}" | |
| env_val = os.environ.get(env_key) | |
| if env_val is not None: | |
| try: | |
| val = float(env_val) | |
| if val > 0: | |
| return val | |
| logger.warning( | |
| f"GOVON_TOOL_TIMEOUT_{capability_name.upper()} ๊ฐ์ด ์์๊ฐ ์๋๋๋ค: {env_val}" | |
| ) | |
| except ValueError: | |
| logger.warning(f"{env_key} ๊ฐ์ ์ซ์๋ก ํ์ฑํ ์ ์์ต๋๋ค: {env_val!r}") | |
| defaults = _DEFAULTS.get(capability_name) | |
| return defaults.timeout_sec if defaults else 10.0 | |
| def get_max_retries(capability_name: str) -> int: | |
| """capability์ ์ต๋ ์ฌ์๋ ํ์๋ฅผ ๋ฐํํ๋ค. | |
| Parameters | |
| ---------- | |
| capability_name : str | |
| capability ์ด๋ฆ. | |
| Returns | |
| ------- | |
| int | |
| ์ต๋ ์ฌ์๋ ํ์. ์ ์ ์๋ capability๋ 0. | |
| """ | |
| defaults = _DEFAULTS.get(capability_name) | |
| return defaults.max_retries if defaults else 0 | |
| def get_all_defaults() -> Dict[str, CapabilityDefaults]: | |
| """๋ฑ๋ก๋ ๋ชจ๋ capability ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค.""" | |
| return dict(_DEFAULTS) | |