Pulsa / para buscar

Toda la documentación
docs Llamarlo desde tu software SDK

Se ejecuta enWrit CloudAutoalojado

sdk ▸ cuatro clientes

Cuatro SDKs. Un agente.

TypeScript, Python, Go y Rust — publicados, versionados y ligeros. Cada cliente descubre el agente Writ que corre en tu máquina, y el mismo cliente llega a Writ Cloud cuando le das una clave wt_.

Los SDKs manejan software en tu máquina, en tus cuentas. Nada llama a casa.

install ▸ primer run

Instala, descubre, ejecuta.

Cada quickstart sigue los mismos tres tiempos: el cliente encuentra el agente en marcha (sin URL, sin token que pegar), lista tus workflows, ejecuta uno y lee las filas extraídas. Estos ejemplos son los paquetes publicados, al pie de la letra.

TypeScript typescript/ Desde el repo · Node ≥ 18 · cero dependencias runtime
Python python/ Desde el repo · Python ≥ 3.10 · import writ_agent
Go github.com/usewrit/writ-sdks/go go get · Go ≥ 1.23 · solo stdlib
Rust rust/ Dependencia git · async, cualquier runtime compatible con reqwest

run.ts

import { WritAgent, runRowId } from "@usewrit/agent-sdk";

const client = new WritAgent();              // discovers the running agent + token
const { data: workflows } = await client.workflows.list();
const run = await client.workflows.runAndWait(workflows[0].id, {
  inputs: { city: "Paris" },
});
const { data: rows } = await client.runs.data(runRowId(run));
console.log(run.status, rows);

superficies ▸ dos

Un cliente, dos superficies.

Los SDKs hablan con dos lugares distintos, y la doc nunca los mezcla. El agente local es el software en tu máquina: solo loopback, gratis, con sus propias familias de tokens. Writ Cloud es la superficie alojada que una clave wt_ desbloquea — con un nivel sin clave que no pide cuenta.

SuperficieURL baseAuth
Agente local (writ-agentd)http://127.0.0.1:8131 · https://127.0.0.1:8132token runtime wlt_ · clave acotada wlk_ · OAuth wlo_
Writ Cloudhttps://api.usewrit.appclave API wt_ (medida) · X-Writ-Client-Id (sin clave)

Habla con 127.0.0.1, no con localhost — el daemon aplica una guardia anti DNS-rebind sobre el Host y el Origin que acepta. El gemelo HTTPS en :8132 usa una CA local por instalación en ~/.writ/tls/ca.pem.

Variables de entorno

El descubrimiento lee primero el entorno y luego los runtime.json del directorio Writ, sondeando cada candidato. Nombres idénticos en los cuatro SDKs:

VariableQué hace
WRIT_API_URLSustituye la URL base del daemon local
WRIT_TOKENSustituye el token bearer del daemon local
WRIT_HOMEPrimer directorio candidato para runtime.json
WRIT_API_KEYClave API medida de Writ Cloud (wt_)
WRIT_CLOUD_URLSustituye la URL base de Writ Cloud
WRIT_CLIENT_IDSustituye el id de dispositivo sin clave

runs ▸ tres formas de esperar

Ejecuta, y espera a tu manera.

Cada SDK expone las mismas tres posturas para el mismo run:

  1. Handle async — run() vuelve de inmediato con un id de run — consulta o streamea cuando quieras.
  2. Espera en el servidor — run con wait — la propia llamada HTTP bloquea hasta que el run se resuelve (timeout en segundos, acotado en el servidor).
  3. runAndWait — El SDK se suscribe al stream de eventos en vivo con polling de respaldo, y devuelve el run resuelto.

Un run fallido es un resultado, no un error: recibes el run con su estado. Solo un presupuesto de espera agotado lanza — y el error aún lleva el id del run, nada se pierde.

Los elementos del feed de runs llevan un id compuesto como workflow-3. Cada llamada runs.* toma el id numérico de fila — extráelo con el ayudante del lenguaje: runRowId(run) (TS), run_row_id(run) (Python), item.RowID() (Go), item.row_id() (Rust).

Eventos en vivo por SSE

El progreso paso a paso llega en stream desde el daemon; cada lenguaje tiene su idioma nativo — iterador async, generador, range-over-func, Stream.

events.ts

for await (const ev of client.runs.events(runRowId(run))) {
  console.log(ev.type, ev);
}

superficie ▸ servicios

Todo el agente, por espacios de nombres.

Un solo objeto cliente lleva toda la superficie: agent, workflows, runs, monitors, selectors, extractors, automations, personas, secrets, vault, files, data, crawl, datasets, keys — más cloud. Los nombres son idénticos entre lenguajes; los idiomas, nativos:

TypeScriptEspacios de nombres con Promises; sobres Page<T>; run() sobrecargado para wait y dry-run.
PythonGemelos WritAgent síncrono y AsyncWritAgent; respuestas como dicts; Page iterable.
GoCada método toma ctx primero; errores tipados compatibles con errors.As; cero dependencias.
RustSolo async; listas filtradas con variantes *_with; Cloud es un CloudClient aparte; un único enum WritError.

cloud ▸ medido + sin clave

El nivel cloud viene integrado.

Dale al cliente una clave wt_ y scrape, map y crawl en la nube se descuentan de tu fondo de créditos. Sin clave alguna, el nivel keyless scrapea páginas públicas identificado solo por un id de dispositivo — con un endpoint de cuota que dice cuánto queda.

cloud.ts

const cloud = new CloudApi({ apiKey: process.env.WRIT_API_KEY }); // wt_…
const page = await cloud.scrape("https://example.com");
const site = await cloud.map("https://example.com", { search: "pricing", limit: 20 });
console.log(cloud.tier); // "metered" | "keyless"

El cliente expone su nivel ("metered" o "keyless") para que tu código pueda bifurcar. El sin-clave responde 429 cuando la asignación se agota; el medido responde 402 cuando el fondo está vacío — ambos como errores tipados.

claves ▸ errores

Claves acotadas, fallos tipados.

Acuñar una clave wlk_ acotada (scopes: read, run, admin) exige el token runtime de acceso completo — una clave de CI filtrada nunca puede ampliarse a sí misma.

const key = await client.keys.create({ name: "ci-runner", scopes: "read,run" });

Taxonomía de errores

El mismo fallo es el mismo tipo en cada lenguaje — captura lo que sepas manejar; el resto lleva status, code y body:

ApiErrorCualquier no-2xx con un código estable: bad_request, unauthorized, forbidden, not_found, vault_locked (423), too_many_requests, internal.
RunTimeoutUn presupuesto de espera expiró — lleva el id del run, aún válido.
RateLimitedAsignación sin clave agotada — lleva la hora de reinicio y los contadores restantes.
InsufficientCreditsFondo medido vacío (402). Recarga o vuelve a local.
ApiKeyRequiredLlamada cloud medida sin clave wt_.
Connection / DiscoveryNingún agente vivo encontrado, o daemon inalcanzable.

rest ▸ sin sdk

¿Sin SDK? El endpoint es REST puro.

Un endpoint de workflow publicado es un POST HTTPS corriente con Bearer wt_ — estos wrappers son toda la integración si prefieres poseer el HTTP tú mismo.

writ.py

import os, requests

WRIT_BASE = "https://api.usewrit.app"

def run_workflow(slug: str, path: str, inputs: dict) -> dict:
    res = requests.post(
        f"{WRIT_BASE}/v1/{slug}/{path}",
        headers={"Authorization": f"Bearer {os.environ['WRIT_CONSUMER_KEY']}"},
        json=inputs,
        timeout=120,
    )
    res.raise_for_status()
    return res.json()

payload = run_workflow("acme", "price-check", {"url": "https://example.com/product/42"})
print(payload["data"])

faq

Preguntas de SDK, respondidas.

¿Necesito un SDK para usar Writ?
No. Los endpoints publicados son REST puro con Bearer wt_, y el nivel cloud sin clave es una llamada curl. Los SDKs se ganan su lugar cuando manejas el agente local: descubrimiento, eventos SSE, errores tipados y toda la superficie de servicios sin HTTP artesanal.
¿Qué lenguajes están publicados?
TypeScript, Python, Go y Rust, todos en github.com/usewrit/writ-sdks. Go se instala con go get; los demás se instalan desde el repo por ahora — los paquetes de registro aún no están publicados. Clientes generados para otros lenguajes se construyen desde la misma spec OpenAPI.
¿Cómo encuentran los SDKs mi agente?
Primero el entorno (WRIT_API_URL / WRIT_TOKEN), luego los candidatos runtime.json del directorio Writ, cada uno sondeado con un presupuesto de dos segundos. Siempre puedes pasar URL base y token explícitamente.
¿Cómo manejo workflows largos?
Tres formas: tomar el id de run async y volver luego; pedir al servidor que espere (la llamada bloquea hasta el veredicto); o runAndWait, donde el SDK streamea eventos con polling de respaldo. Un run fallido vuelve como resultado con su estado, no como excepción.
¿Funcionan los SDKs en un navegador?
El descubrimiento lee el sistema de archivos, así que es solo de escritorio. En un navegador, pasa baseUrl y token explícitamente — o llama a tu endpoint cloud publicado, REST puro hecho exactamente para eso.

fin ▸ enviar

Instala uno y haz la primera llamada.

El quickstart ejecuta tu primer workflow en pocos minutos, en local y gratis.