Exemplos completos

Codigo Node.js e Python pronto pra copiar — clientes completos com retry, webhooks e pipelines reais.

Codigo pronto pra copiar — copie o .md desta pagina e cole na sua IA pra ela te ajudar a integrar.

Node.js / TypeScript

Setup

npm install node-fetch form-data dotenv

.env:

BUILDSHIP_API_KEY=bld_sua_chave_aqui
BUILDSHIP_WEBHOOK_SECRET=seu_secret_webhook

Cliente completo

// src/buildship-client.ts
import fetch from 'node-fetch';
import FormData from 'form-data';
import fs from 'fs';

const BASE = 'https://api.buildship.com.br/api/v1';
const KEY = process.env.BUILDSHIP_API_KEY!;

export class BuildShip {
  private headers = { 'X-API-Key': KEY };

  async chat(opts: { message: string; sessionId?: string; endUserId?: string; templateId?: string; templateVars?: Record<string, string> }) {
    const res = await fetch(`${BASE}/chat`, {
      method: 'POST',
      headers: { ...this.headers, 'Content-Type': 'application/json' },
      body: JSON.stringify(opts),
    });
    if (!res.ok) throw new Error(`BuildShip ${res.status}: ${await res.text()}`);
    return res.json();
  }

  async process(filePath: string, prompt: string, opts?: { endUserId?: string; templateId?: string }) {
    const form = new FormData();
    form.append('file', fs.createReadStream(filePath));
    form.append('prompt', prompt);
    if (opts?.endUserId) form.append('endUserId', opts.endUserId);
    if (opts?.templateId) form.append('templateId', opts.templateId);

    const res = await fetch(`${BASE}/process`, {
      method: 'POST',
      headers: this.headers,
      body: form as any,
    });
    if (!res.ok) throw new Error(`BuildShip ${res.status}: ${await res.text()}`);
    return res.json();
  }

  async getSession(sessionId: string) {
    const res = await fetch(`${BASE}/sessions/${sessionId}`, { headers: this.headers });
    if (!res.ok) throw new Error(`BuildShip ${res.status}`);
    return res.json();
  }

  async pollUntilDone(sessionId: string, maxWaitMs = 120_000) {
    const start = Date.now();
    while (Date.now() - start < maxWaitMs) {
      const session = await this.getSession(sessionId);
      if (session.status === 'completed' || session.status === 'failed') return session;
      await new Promise(r => setTimeout(r, 2000));
    }
    throw new Error('Timeout aguardando IA');
  }
}

Uso

// src/index.ts
import { BuildShip } from './buildship-client';

const bs = new BuildShip();

async function main() {
  // 1. Chat simples
  const chat = await bs.chat({
    message: 'Resuma este texto: Lorem ipsum...',
    endUserId: 'user-123',
  });
  console.log('Sessao:', chat.sessionId);

  // 2. Aguardar resultado (polling)
  const result = await bs.pollUntilDone(chat.sessionId);
  console.log('Resposta:', result.lastOutput);

  // 3. Processar arquivo
  const fileResult = await bs.process(
    './curriculo.pdf',
    'Extraia nome, email e telefone',
    { endUserId: 'user-123' },
  );
  const cv = await bs.pollUntilDone(fileResult.sessionId);
  console.log('CV:', cv.lastOutput);
}

main().catch(console.error);

Com webhook (recomendado em producao)

// src/server.ts — receba callbacks do BuildShip
import express from 'express';
import crypto from 'crypto';

const app = express();
const SECRET = process.env.BUILDSHIP_WEBHOOK_SECRET!;

app.post('/buildship/callback',
  express.raw({ type: 'application/json' }),
  (req, res) => {
    const sig = req.header('X-Buildship-Signature');
    const expected = crypto.createHmac('sha256', SECRET).update(req.body).digest('hex');
    if (sig !== expected) return res.status(401).send('invalid signature');

    const event = JSON.parse(req.body.toString());

    switch (event.type) {
      case 'completion':
        console.log(`✓ session=${event.sessionId} output=${event.output.slice(0, 80)}`);
        // Salva no DB, notifica usuario, etc
        break;
      case 'error':
        console.error(`✗ session=${event.sessionId} error=${event.error}`);
        break;
    }

    res.send('ok');
  }
);

app.listen(3000, () => console.log('Webhook listener em :3000'));

Python

Setup

pip install requests python-dotenv

Cliente completo

# buildship_client.py
import os
import time
import requests

BASE = 'https://api.buildship.com.br/api/v1'
KEY = os.environ['BUILDSHIP_API_KEY']
HEADERS = {'X-API-Key': KEY}


class BuildShip:
    def chat(self, message, session_id=None, end_user_id=None, template_id=None, template_vars=None):
        body = {'message': message}
        if session_id: body['sessionId'] = session_id
        if end_user_id: body['endUserId'] = end_user_id
        if template_id: body['templateId'] = template_id
        if template_vars: body['templateVars'] = template_vars

        r = requests.post(f'{BASE}/chat', headers={**HEADERS, 'Content-Type': 'application/json'}, json=body)
        r.raise_for_status()
        return r.json()

    def process(self, file_path, prompt, end_user_id=None, template_id=None):
        with open(file_path, 'rb') as f:
            files = {'file': f}
            data = {'prompt': prompt}
            if end_user_id: data['endUserId'] = end_user_id
            if template_id: data['templateId'] = template_id

            r = requests.post(f'{BASE}/process', headers=HEADERS, files=files, data=data)
            r.raise_for_status()
            return r.json()

    def get_session(self, session_id):
        r = requests.get(f'{BASE}/sessions/{session_id}', headers=HEADERS)
        r.raise_for_status()
        return r.json()

    def poll_until_done(self, session_id, max_wait=120):
        start = time.time()
        while time.time() - start < max_wait:
            session = self.get_session(session_id)
            if session['status'] in ('completed', 'failed'):
                return session
            time.sleep(2)
        raise TimeoutError('IA nao terminou em ' + str(max_wait) + 's')

Uso

# main.py
from buildship_client import BuildShip

bs = BuildShip()

# 1. Chat
chat = bs.chat(message='Ola, IA!', end_user_id='user-123')
print('Sessao:', chat['sessionId'])

result = bs.poll_until_done(chat['sessionId'])
print('Resposta:', result['lastOutput'])

# 2. Processar arquivo
file_res = bs.process('./curriculo.pdf', 'Extraia nome, email, telefone')
cv = bs.poll_until_done(file_res['sessionId'])
print('CV:', cv['lastOutput'])

Webhook listener (Flask)

# webhook_server.py
import hmac
import hashlib
import os
from flask import Flask, request

app = Flask(__name__)
SECRET = os.environ['BUILDSHIP_WEBHOOK_SECRET']


@app.route('/buildship/callback', methods=['POST'])
def callback():
    sig = request.headers.get('X-Buildship-Signature')
    expected = hmac.new(SECRET.encode(), request.data, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(sig or '', expected):
        return 'invalid signature', 401

    event = request.json

    if event['type'] == 'completion':
        print(f"✓ session={event['sessionId']} output={event['output'][:80]}")
    elif event['type'] == 'error':
        print(f"✗ session={event['sessionId']} error={event.get('error')}")

    return 'ok', 200


if __name__ == '__main__':
    app.run(port=3000)

Pipeline completo: extrator de CVs

Cenario: receber CVs de candidatos via webhook e extrair dados estruturados.

1. Criar template

curl -X POST https://api.buildship.com.br/api/v1/templates \
  -H "X-API-Key: $BUILDSHIP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Extrator de CV v1",
    "promptTemplate": "Extraia do curriculo:\n- Nome\n- Email\n- Telefone\n- Anos de experiencia em {{area}}\n- Educacao\n\nRetorne JSON valido com chaves: name, email, phone, experience_years, education.",
    "variables": { "area": "engenharia de software" }
  }'

→ Salva o id retornado (tmpl_xyz).

2. Endpoint que recebe upload + dispara processamento

// Recebe upload do candidato e dispara IA com webhook
import express from 'express';
import multer from 'multer';
import { BuildShip } from './buildship-client';

const app = express();
const upload = multer({ dest: '/tmp' });
const bs = new BuildShip();

app.post('/api/cv', upload.single('cv'), async (req, res) => {
  const result = await bs.process(req.file!.path, '', {
    templateId: 'tmpl_xyz',
    endUserId: req.user.id,
  });
  res.json({ jobId: result.sessionId, status: 'processing' });
});

3. Webhook handler que persiste

app.post('/buildship/callback', validateSignature, async (req, res) => {
  const event = JSON.parse(req.body.toString());
  if (event.type !== 'completion') return res.send('ignored');

  const cv = JSON.parse(event.output);  // template retornou JSON
  await db.candidates.upsert({
    sessionId: event.sessionId,
    userId: event.endUserId,
    ...cv,
  });

  res.send('ok');
});

Pronto — usuario faz upload, IA extrai dados, persiste no DB. Tudo async, sem polling.


Mais exemplos

Quer integrar com ajuda da IA?

Copia esta pagina como .md e cola no ChatGPT/Claude — ela vai te guiar na integracao