From 26e52deb33bca9c309d060f00aec1501b08c02a7 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 7 Feb 2026 18:36:21 +0000 Subject: [PATCH] v7 --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 20138 bytes ai/local_ai_api.py | 23 ++---- core/__pycache__/utils.cpython-311.pyc | Bin 5055 -> 7359 bytes core/utils.py | 86 +++++++++++++++----- 5 files changed, 76 insertions(+), 33 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9beeae7341d797e2eac5af07416a24e9ee781f92 GIT binary patch literal 404 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 literal 0 HcmV?d00001 diff --git a/ai/local_ai_api.py b/ai/local_ai_api.py index bcff732..2f4d939 100644 --- a/ai/local_ai_api.py +++ b/ai/local_ai_api.py @@ -111,7 +111,6 @@ def create_response(params: Dict[str, Any], options: Optional[Dict[str, Any]] = return initial - def request(path: Optional[str], payload: Dict[str, Any], options: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """Perform a raw request to the AI proxy.""" cfg = _config() @@ -144,7 +143,7 @@ def request(path: Optional[str], payload: Dict[str, Any], options: Optional[Dict headers: Dict[str, str] = { "Content-Type": "application/json", "Accept": "application/json", - cfg["project_header"]: project_uuid, + cfg["project_header"].strip(): project_uuid, } extra_headers = options.get("headers") if isinstance(extra_headers, Iterable): @@ -156,7 +155,6 @@ def request(path: Optional[str], payload: Dict[str, Any], options: Optional[Dict body = json.dumps(payload, ensure_ascii=False).encode("utf-8") return _http_request(url, "POST", body, headers, timeout, verify_tls) - def fetch_status(ai_request_id: Any, options: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """Fetch status for a queued AI request.""" cfg = _config() @@ -179,7 +177,7 @@ def fetch_status(ai_request_id: Any, options: Optional[Dict[str, Any]] = None) - headers: Dict[str, str] = { "Accept": "application/json", - cfg["project_header"]: project_uuid, + cfg["project_header"].strip(): project_uuid, } extra_headers = options.get("headers") if isinstance(extra_headers, Iterable): @@ -190,7 +188,6 @@ def fetch_status(ai_request_id: Any, options: Optional[Dict[str, Any]] = None) - return _http_request(url, "GET", None, headers, timeout, verify_tls) - def await_response(ai_request_id: Any, options: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """Poll status endpoint until the request is complete or timed out.""" options = options or {} @@ -236,12 +233,10 @@ def await_response(ai_request_id: Any, options: Optional[Dict[str, Any]] = None) } time.sleep(interval) - def extract_text(response: Dict[str, Any]) -> str: """Public helper to extract plain text from a Responses payload.""" return _extract_text(response) - def decode_json_from_response(response: Dict[str, Any]) -> Optional[Dict[str, Any]]: """Attempt to decode JSON emitted by the model (handles markdown fences).""" text = _extract_text(response) @@ -294,7 +289,6 @@ def _extract_text(response: Dict[str, Any]) -> str: return payload return "" - def _config() -> Dict[str, Any]: global _CONFIG_CACHE # noqa: PLW0603 if _CONFIG_CACHE is not None: @@ -320,7 +314,6 @@ def _config() -> Dict[str, Any]: } return _CONFIG_CACHE - def _build_url(path: str, base_url: str) -> str: trimmed = path.strip() if trimmed.startswith("http://") or trimmed.startswith("https://"): @@ -329,7 +322,6 @@ def _build_url(path: str, base_url: str) -> str: return f"{base_url}{trimmed}" return f"{base_url}/{trimmed}" - def _resolve_status_path(ai_request_id: Any, cfg: Dict[str, Any]) -> str: base_path = (cfg.get("responses_path") or "").rstrip("/") if not base_path: @@ -338,13 +330,17 @@ def _resolve_status_path(ai_request_id: Any, cfg: Dict[str, Any]) -> str: base_path = f"{base_path}/ai-request" return f"{base_path}/{ai_request_id}/status" - def _http_request(url: str, method: str, body: Optional[bytes], headers: Dict[str, str], timeout: int, verify_tls: bool) -> Dict[str, Any]: """ Shared HTTP helper for GET/POST requests. """ req = urlrequest.Request(url, data=body, method=method.upper()) + + # Use a standard User-Agent to avoid being blocked by Cloudflare + if "User-Agent" not in headers: + headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" + for name, value in headers.items(): req.add_header(name, value) @@ -395,7 +391,6 @@ def _http_request(url: str, method: str, body: Optional[bytes], headers: Dict[st "response": decoded if decoded is not None else response_body, } - def _ensure_env_loaded() -> None: """Populate os.environ from executor/.env if variables are missing.""" if os.getenv("PROJECT_UUID") and os.getenv("PROJECT_ID"): @@ -413,8 +408,8 @@ def _ensure_env_loaded() -> None: continue key, value = stripped.split("=", 1) key = key.strip() - value = value.strip().strip('\'"') + value = value.strip().strip('"') if key and not os.getenv(key): os.environ[key] = value except OSError: - pass + pass \ No newline at end of file diff --git a/core/__pycache__/utils.cpython-311.pyc b/core/__pycache__/utils.cpython-311.pyc index 3e314ba9e59392e3258e7a21fa291a4c17b72794..a449e2628249d9fa82f6e91305a06423766dad59 100644 GIT binary patch delta 3357 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