Build on Weaver.
El gateway habla OpenAI-compatible: chat completions + models. Cualquier cliente OpenAI anda. El billing es crédito prepago por cuenta: creás una cuenta en /account, fondeás con USDC (Monad testnet), emitís una key wvr_… y cada request debita tokens medidos post-stream.
// opencode.jsonc — Weaver como provider custom (docs: opencode.ai, v2)
{
"$schema": "https://opencode.ai/config.json",
"providers": {
"weaver": {
"name": "Weaver",
"package": "@opencode-ai/ai/providers/openai-compatible",
"settings": { "baseURL": "http://localhost:3001/v1", "apiKey": "wvr_TU_API_KEY" },
"models": {
"qwen3:4b": { "name": "Qwen3 4B (Weaver)" }
}
}
}
}
// El id del modelo debe coincidir con GET /v1/models.
// En opencode v1: "provider" + "npm" + "options" en vez de
// "providers" + "package" + "settings".// ~/.pi/agent/models.json — Weaver en pi (docs: pi.dev)
{
"providers": {
"weaver": {
"baseUrl": "http://localhost:3001/v1",
"api": "openai-completions",
"apiKey": "wvr_TU_API_KEY",
"models": [{ "id": "qwen3:4b", "name": "Qwen3 4B (Weaver)" }]
}
}
}
// apiKey real de /account — el consumo debita créditos de tu cuenta.# camino rápido (wizard recomendado por sus docs) hermes model # → "Custom endpoint" → base URL: http://localhost:3001/v1 # → API key: wvr_TU_KEY → model: qwen3:4b # o manual en ~/.hermes/config.yaml: # model: qwen3:4b # provider: custom # base_url: http://localhost:3001/v1 # api_key: wvr_TU_KEY # auto-detect: /model custom lee GET /v1/models y, # como Weaver expone un solo ID, elige qwen3:4b solo.
# camino first-class: provider plugin (docs: hermes-agent.nousresearch.com)
# $HERMES_HOME/plugins/model-providers/weaver/__init__.py
from providers import register_provider
from providers.base import ProviderProfile
register_provider(ProviderProfile(
name="weaver",
aliases=("weaver-local",),
display_name="Weaver",
description="Weaver — OpenAI-compatible routed compute",
signup_url="https://github.com/Shugar03/Weaver",
env_vars=("WEAVER_API_KEY", "WEAVER_BASE_URL"),
base_url="http://localhost:3001/v1",
auth_type="api_key",
fallback_models=("qwen3:4b",),
))
# $HERMES_HOME/plugins/model-providers/weaver/plugin.yaml
# name: weaver
# kind: model-provider
# version: 1.0.0
# description: Weaver — OpenAI-compatible routed compute
# → aparece en el picker, --provider, y hermes doctor lo chequea
# contra {base_url}/models (nuestro endpoint lo sirve).1. Cursor Settings (Cmd+Shift+J) → Models 2. OpenAI API Key: tu wvr_… de /account 3. Override OpenAI Base URL: http://localhost:3001/v1 (con /v1, SIN /chat/completions) 4. + Add Model: qwen3:4b 5. Verify Límites honestos: Tab y Background Agents usan modelos de Cursor, no tu endpoint. Si hay errores de conexión, probá HTTP/1.1 en Settings → Network → HTTP Compatibility Mode.
curl http://localhost:3001/v1/models
# {"object":"list","data":[{"id":"qwen3:4b","object":"model","owned_by":"weaver"}]}
curl http://localhost:3001/v1/chat/completions \
-H "content-type: application/json" \
-d '{"model":"qwen3:4b","messages":[{"role":"user","content":"hola"}],"stream":true}'from openai import OpenAI
# La key se crea en /account (wvr_…, se muestra una sola vez).
client = OpenAI(base_url="http://localhost:3001/v1", api_key="wvr_TU_API_KEY")
stream = client.chat.completions.create(
model="qwen3:4b",
messages=[{"role": "user", "content": "hola"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")La key identifica quién llama y a qué cuenta debita. Formato wvr_…, guardada hasheada, visible una sola vez al emitir. Se crea y revoca self-serve en /account.
# self-serve: creá tu cuenta y tu key en /account — sin pedirle nada a nadie.
# (el panel usa estas rutas debajo del capó)
# crear cuenta (una vez — el mgmt token se muestra UNA vez):
curl -X POST http://localhost:3001/v1/accounts
# → {"accountId":"acct_...","mgmtToken":"wvr_acct_...","depositMemo":"..."}
# emitir key (con tu mgmt token):
curl -X POST http://localhost:3001/v1/me/keys \
-H "Authorization: Bearer wvr_acct_..."
# → {"id":"key_...","secret":"wvr_..."} (el secreto se muestra UNA vez)
# usar (billing por cuenta, debit medido post-stream):
curl http://localhost:3001/v1/chat/completions \
-H "content-type: application/json" \
-H "Authorization: Bearer wvr_..." \
-d '{"model":"qwen3:4b","messages":[{"role":"user","content":"hola"}],"stream":true}'Tu cuenta tiene un balance en USDC (stroops). Fondeás mandando USDC a la deposit address con tu memo (todo visible en /account → BILLING). Al servir, el gateway debita prompt+completion tokens medidos del stream real — nunca estimado si hay medición. Sin fondos: 402 antes de tocar un forge. Request fallido: sin cargo. Precios públicos en GET /v1/pricing.