diff --git a/src/tetra_rp/core/api/runpod.py b/src/tetra_rp/core/api/runpod.py index af1754d0..ecf0d795 100644 --- a/src/tetra_rp/core/api/runpod.py +++ b/src/tetra_rp/core/api/runpod.py @@ -10,6 +10,8 @@ import aiohttp +from ..utils.user_agent import get_tetra_user_agent + log = logging.getLogger(__name__) RUNPOD_API_BASE_URL = os.environ.get("RUNPOD_API_BASE_URL", "https://api.runpod.io") @@ -40,6 +42,7 @@ async def _get_session(self) -> aiohttp.ClientSession: headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json", + "User-Agent": get_tetra_user_agent(), }, ) return self.session diff --git a/src/tetra_rp/core/resources/template.py b/src/tetra_rp/core/resources/template.py index a4c0a254..e3ae2a3e 100644 --- a/src/tetra_rp/core/resources/template.py +++ b/src/tetra_rp/core/resources/template.py @@ -2,6 +2,7 @@ from typing import Dict, List, Optional, Any from pydantic import BaseModel, model_validator from .base import BaseResource +from ..utils.user_agent import get_tetra_user_agent class KeyValuePair(BaseModel): @@ -83,7 +84,11 @@ def update_system_dependencies( "volumeMountPath": "/workspace", } - headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} + headers = { + "Authorization": f"Bearer {token}", + "Content-Type": "application/json", + "User-Agent": get_tetra_user_agent(), + } url = f"https://rest.runpod.io/v1/templates/{template_id}/update" response = requests.post(url, json=payload, headers=headers) diff --git a/src/tetra_rp/core/utils/user_agent.py b/src/tetra_rp/core/utils/user_agent.py new file mode 100644 index 00000000..1081f15c --- /dev/null +++ b/src/tetra_rp/core/utils/user_agent.py @@ -0,0 +1,31 @@ +"""User-Agent utilities for Tetra HTTP clients.""" + +import platform +from importlib import metadata + + +def get_tetra_user_agent() -> str: + """ + Generate Tetra User-Agent string for HTTP requests. + + Format: Runpod-Tetra/ ( ; ) Language/Python + Example: Runpod-Tetra/0.4.2 (Linux 6.8.0-49-generic; x86_64) Language/Python 3.10.12 + + Returns: + str: Formatted User-Agent string + """ + try: + tetra_version = metadata.version("tetra_rp") + except metadata.PackageNotFoundError: + tetra_version = "unknown" + + # Get system information + system = platform.system() + release = platform.release() + machine = platform.machine() + python_version = platform.python_version() + + # Format User-Agent string + user_agent = f"Runpod-Tetra/{tetra_version} ({system} {release}; {machine}) Language/Python {python_version}" + + return user_agent