Tornar al blog
claudeiaagentshermesoauthproxyproductivitatopenclaw
·6 min de lectura

Com uso la meva subscripció de Claude com a API gratuïta — el proxy OAuth que ho canvia tot

Tinc una subscripció a Claude Max. Pago per ella. La uso tot el dia amb Claude Code al terminal. Però quan vull que el meu agent d'IA (Hermes) usi Claude Sonnet per respondre'm per Telegram... necessito una API key que costa a part. Per què no puc reutilitzar el que ja pago?

Avui ho vam resoldre. I el resultat és un proxy de 80 línies en Node.js que canvia les regles del joc.

El problema

La subscripció de Claude (Pro, Max) et dóna accés als models a través del web i de Claude Code CLI. Però si vols usar l'API d'Anthropic des del teu propi codi — un bot de Telegram, un agent, una app — necessites una API key amb facturació separada. Tokens d'entrada, tokens de sortida, tot facturat a part.

Jo tinc un agent anomenat Harvie funcionant al meu VPS. És un assistent personal que em parla per Telegram, gestiona les meves dades d'entrenament, em prepara el briefing diari i executa eines. Fins ara usava un model gratuït (StepFun via OpenRouter), però volia donar-li la potència de Claude Sonnet. El problema: no volia pagar dos cops.

El descobriment

Quan et logueges amb Claude Code CLI (claude), es genera un token OAuth que es guarda a ~/.claude/.credentials.json. Aquest token és el que autentica totes les teves peticions amb la teva subscripció. La pregunta era: puc usar aquest mateix token per fer crides a l'API des de fora de Claude Code?

La resposta: , amb dos trucs clau.

Els dos trucs que fan que funcioni

1. Authorization: Bearer en lloc d'x-api-key

Les API keys normals d'Anthropic usen l'header x-api-key. Però els tokens OAuth usen Authorization: Bearer ***. Són mecanismes d'autenticació diferents. Si envies un token OAuth com x-api-key, no funciona.

2. L'header secret: anthropic-beta

L'API d'Anthropic rebutja tokens OAuth a menys que incloguis un header específic:

anthropic-beta: oauth-2025-04-20

Sense aquest header, l'API et retorna un error. Amb ell, accepta el teu token OAuth i respon com si fos una API key normal. La teva subscripció Max cobreix el cost.

La solució: un proxy local

En lloc de modificar cada aplicació que vulgui usar l'API, muntem un proxy intermedi:

Hermes / curl / la teva app
        ↓
  Proxy local (:[PORT])    ← injecta token OAuth + headers
        ↓
  api.anthropic.com       ← respon amb la teva subscripció

El proxy és un servidor Node.js que:

  1. Escolta a http://127.0.0.1:[PORT]
  2. Llegeix el token OAuth de Claude en cada petició
  3. Reemplaça l'autenticació amb Bearer <token>
  4. Afegeix l'header
  5. Reenvia a api.anthropic.com i streameja la resposta de tornada

Des de la perspectiva d'Hermes (o qualsevol altra app), és com parlar amb l'API d'Anthropic directament. No sap que hi ha un proxy al mig.

El bug invisible que ens va costar hores

La primera versió del proxy semblava funcionar. El test amb curl retornava respostes perfectes. Però Hermes fallava amb "Connection error" després de cada petició — encara que el proxy loguejava un HTTP 200 exitós.

El problema? gzip.

fetch() de Node.js descomprimeix automàticament les respostes gzip. Però no elimina l'header content-encoding: gzip de la resposta. Així que el proxy reenviava dades ja descomprimides amb un header que deia "això està comprimit". L'SDK de Python d'Anthropic (que usa Hermes/openclaw) intentava descomprimir dades en text pla i explotava silenciosament.

La solució és quirúrgica: tres delete als headers.

// Als headers del REQUEST (no demanar gzip a l'upstream)
delete headers["accept-encoding"];

// Als headers del RESPONSE (no mentir al client)
delete resHeaders["content-encoding"];
delete resHeaders["content-length"];

Sense això, el proxy sembla funcionar però trenca qualsevol client Python que usi streaming. Ens va costar hores de debug amb logs detallats al proxy per caçar-lo.

Un altre bug: el model de compressió

Hermes usa compressió de context — quan la conversa és molt llarga, la resumeix amb un model barat. Teníem configurat google/gemini-3-flash-preview per això. El problema: aquest model s'enrutava pel proxy d'Anthropic, que només accepta models de Claude. Resultat: HTTP 404.

La solució: forçar que el model de compressió usi OpenRouter directament.

# A config.yaml d'Hermes
context_compression:
  summary_model: "google/gemini-3-flash-preview"
  summary_provider: "openrouter"  # NO deixar en "auto"

El resultat

Ara el meu agent Hermes respon per Telegram usant Claude Sonnet 4, a través de la meva subscripció Max. Sense API keys extra. Sense facturació addicional. La mateixa subscripció que ja pago.

Johnny (Telegram) → "Què entreno avui?"
        ↓
Hermes Agent → consulta dades COROS, llegeix pla setmanal
        ↓
Proxy OAuth → injecta token, crida a Anthropic
        ↓
Claude Sonnet 4 → genera resposta
        ↓
Johnny (Telegram) ← "Avui toca cursa amb canvis de ritme: 3km escalfament..."

El proxy funciona com a servei systemd, s'inicia sol amb el servidor, sobreviu a reboots. Els logs van a un fitxer per debug. El token es rellegeix en cada petició, així que si caduca només cal obrir claude una vegada per refrescar-lo.

Limitacions (les que cal saber)

  1. Rate limit compartit: Si uses Claude Code CLI al mateix temps que Hermes, competeixen pel mateix rate limit.

  2. Token amb caducitat: El token OAuth no és etern. Quan caduca, cal executar claude per regenerar-lo. A la pràctica, dura bastant.

  3. Només localhost: El proxy escolta a 127.0.0.1 — no és accessible des de fora del servidor. Això és una feature de seguretat, no un bug.

  4. Només models d'Anthropic: No pots passar models de Google o OpenAI per aquest proxy. Només Claude (Haiku, Sonnet, Opus).

Com muntar-ho tu

Si tens una subscripció de Claude i un VPS:

1. Instal·la Claude Code CLI i logueja't:

npm install -g @anthropic-ai/claude-code
claude  # segueix el login OAuth

2. Verifica que tens el token:

python3 -c "import json; d=json.load(open('$HOME/.claude/.credentials.json')); print(d['claudeAiOauth']['accessToken'][:20]+'...')"

3. Crea el proxy (80 línies de Node.js) i configura'l com a servei systemd.

4. Testa:

curl http://127.0.0.1:[PORT]/v1/messages \
  -H "content-type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-haiku-4-5-20251001","max_tokens":10,"messages":[{"role":"user","content":"hola"}]}'

Si veus una resposta JSON amb "content", funciona. Apunta la teva app a http://127.0.0.1:[PORT] i llest.

Tot el codi del proxy i un script d'instal·lació automàtica estan disponibles. Si t'interessa, escriu-me.

El que ve

Amb Sonnet alimentant Hermes, les respostes són molt més potents. El següent pas és migrar completament d'OpenClaw a Hermes com el meu agent principal — quelcom que ja està en marxa. També vull explorar si el proxy pot servir per altres coses: apps Next.js que usin l'API, scripts d'automatització, o fins i tot compartir-lo amb altres developers que tinguin subscripció Max.

La subscripció que ja pagues pot fer molt més del que creus.


— jo, Johnny — agent configurat: Harvie. El futur no s'espera, es construeix — i sí, a vegades amb l'ajuda d'una màquina.