Zpět na domů

Proxy Claude API pro OpenClaw: kód a tool use

Proxy-server obnovuje přístup k Claude v openclaw po blokaci Anthropic. Emulace prohlížeče s curl_cffi, podpora tool use přes XML-prompts a auto-fix JSON. Plný kód, config a integrace pro vývojáře.

Obnovte Claude v OpenClaw: proxy s tool use
Advertisement 728x90

Proxy server pro Claude API prostřednictvím webové relace: integrace s OpenClaw

Anthropic zablokovala používání Claude v aplikacích třetích stran, včetně openclaw. Předplatitelé Pro (100 USD/měsíc) obdrželi kompenzaci 100 USD na další použití, ale to neřeší problém integrace s agenty. Řešením je proxy server, který emuluje webovou relaci Claude.ai s API ve formátu OpenAI. Umožňuje používat Claude Sonnet/Opus v openclaw s podporou tool use.

Server je naprogramován v Pythonu s využitím curl_cffi pro otisk TLS Chrome. Cookies a device-id jsou převzaty z aktivní relace. Pro každý požadavek je vytvořena nová konverzace a completion je streamováno přes SSE.

Základní implementace relace a hlaviček

Relace je maskována jako Chrome s cookies z prohlížeče. Testování probíhá přes antidetekční prohlížeč camoufox.

Google AdInline article slot
def make_session() -> cf_requests.Session:
    """Vytvoř novou relaci curl_cffi s otiskem TLS Chrome."""
    cookies = get_cookies()
    session = cf_requests.Session(impersonate=IMPERSONATE)
    session.cookies.update(cookies)
    return session

def get_headers(cookies: dict) -> dict:
    return {
        "User-Agent": (
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
            "(KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36"
        ),
        "Origin": "https://claude.ai",
        "Referer": "https://claude.ai/new",
        "anthropic-device-id": cookies.get("anthropic-device-id", ""),
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
    }

Logika completion-požadavku

  • POST na /api/organizations/{org_id}/chat_conversations pro vytvoření konverzace.
  • POST na /chat_conversations/{conv_id}/completion s text/event-stream.
def claude_complete(
    prompt: str,
    internal_model: str,
) -> Generator[str, None, None]:
    """Synchronní generátor, který vydává řádky SSE z completion Claude.ai."""
    cookies = get_cookies()
    org_id = cookies["lastActiveOrg"]
    headers = get_headers(cookies)

    session = make_session()

    # 1. Vytvoř konverzaci
    r = session.post(
        f"https://claude.ai/api/organizations/{org_id}/chat_conversations",
        json={"uuid": None, "name": ""},
        headers=headers,
        timeout=15,
    )
    r.raise_for_status()
    conv_id = r.json()["uuid"]
    log.info(f"Konverzace vytvořena: {conv_id} model={internal_model}")

    # 2. Streamuj completion
    payload = {
        "prompt": prompt,
        "model": internal_model,
        "timezone": "Europe/Prague",
        "attachments": [],
        "files": [],
    }
    r2 = session.post(
        f"https://claude.ai/api/organizations/{org_id}/chat_conversations/{conv_id}/completion",
        json=payload,
        headers={**headers, "Accept": "text/event-stream"},
        stream=True,
        timeout=60,
    )
    r2.raise_for_status()
    for line in r2.iter_lines():
        yield line

API server na aiohttp: cesty /v1/models, /v1/chat/completions, /health. Spuštění na 127.0.0.1:8787.

def make_app() -> web.Application:
    app = web.Application()
    app.router.add_get("/v1/models", handle_models)
    app.router.add_get("/health", handle_health)
    app.router.add_post("/v1/chat/completions", handle_chat_completions)
    return app

Integrace v OpenClaw

Konfigurace poskytovatele:

"claude-web": {
    "baseUrl": "http://127.0.0.1:8787/v1",
    "apiKey": "dummy",
    "api": "openai-completions",
    "models": [
      {
        "id": "claude-sonnet-4-6-web",
        "name": "Claude Sonnet 4.6 (Web)",
        "reasoning": false,
        "input": ["text"],
        "cost": {"input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0},
        "contextWindow": 200000,
        "maxTokens": 32000
      }
    ]
}

Textová generace funguje okamžitě. Tool use vyžaduje další úpravy.

Google AdInline article slot

Podpora tool use: injektáž promptu

Systémový prompt nutí Claude vyvádět tool calls ve formátu XML:

TOOL_SYSTEM_PROMPT = """Máte přístup k nástrojům. Když potřebujete volat nástroj, výstupte POUZE blok volání nástroje — žádné vysvětlení, žádný text před nebo za ním:

<tool_call>
{{"name": "název_nástroje_zde", "arguments": {{"param1": "hodnota1", "param2": "hodnota2"}}}}
</tool_call>

PRAVIDLA:
- JSON uvnitř <tool_call> musí být platný — žádné nadbytečné čárky, žádné komentáře
- Můžete vyvádět více bloků <tool_call> v sekvenci
- Po přijetí bloků <tool_result> pokračujte normálně ve své odpovědi
- Pokud nevoláte nástroj, reagujte normálně bez jakýchkoli značek <tool_call>

Dostupné nástroje:
{tools_json}"""

Parsování přes regex, automatická oprava JSON chyb (odstranění nadbytečných čárek, komentářů).

Finální zpracování tool calls a výsledků

  • Parser extrahuje bloky <tool_call>, opravuje JSON, konvertuje do formátu OpenAI.
  • Tool results jsou vloženy jako XML <tool_result id="...">obsah</tool_result> v uživatelských zprávách.
def parse_tool_calls(text: str) -> tuple[list[dict], str]:
    tool_calls = []
    for match in TOOL_CALL_RE.finditer(text):
        raw_json = match.group(1).strip()
        obj = None
        try:
            obj = json.loads(raw_json)
        except json.JSONDecodeError:
            fixed = _try_fix_json(raw_json)
            obj = json.loads(fixed)
        if obj:
            tool_calls.append({
                "id": f"call_{uuid.uuid4().hex[:12]}",
                "type": "function",
                "function": {
                    "name": obj.get("name", ""),
                    "arguments": json.dumps(obj.get("arguments", {})),
                },
            })
    remaining = TOOL_CALL_RE.sub("", text).strip()
    return tool_calls, remaining

def inject_tool_results(messages: list[dict], tools: list[dict]) -> list[dict]:
    # Konverze OpenAI tool_calls/results do XML pro Claude
    # ... (logika dávkování a generování XML)

Co je důležité

  • Plná kompatibilita: OpenAI API s tool use pro openclaw/Claude Sonnet 4.6 (kontext 200k).
  • Antidetekce: curl_cffi + skutečné cookies/device-id, TLS Chrome.
  • Automatická oprava: Zpracování typických JSON chyb Clauda (čárky, komentáře).
  • Streamování: SSE z webového API, nová konverzace na požadavek.
  • Omezení: Funguje v rámci Pro-předplatného bez dalšího použití.

Omezení a vylepšení

Řešení závisí na stabilitě webového API Claude.ai. Možná rizika:

Google AdInline article slot
  • Captcha na webu.
  • Omezení relace časem.
  • Změny endpointů.

Pro obejití: aktualizace cookies přes automatizaci, rotace device-id, zpracování chyb.

— Editorial Team

Advertisement 728x90

Číst dál