Skip to main content

Overview

The runtime SDK is intentionally session-first. For multi-doc agent deploy, use sessions for ingestion and the deploy HTTP endpoint for orchestration.

SDK + HTTP flow

import { createOkra } from '@okrapdf/runtime';

const okra = createOkra({ apiKey: process.env.OKRA_API_KEY });

const [a, b] = await Promise.all([
  okra.sessions.create('./nvidia-10k.pdf', { wait: true }),
  okra.sessions.create('./amd-10k.pdf', { wait: true }),
]);

const response = await fetch('https://api.okrapdf.com/api/agents/deploy', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.OKRA_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    documentIds: [a.id, b.id],
    name: 'gpu-comparison',
    documents: [
      { jobId: a.id, fileName: 'NVIDIA 10-K' },
      { jobId: b.id, fileName: 'AMD 10-K' },
    ],
  }),
});

const agent = await response.json();
console.log(agent.url, agent.token);
documents[].jobId is legacy field naming on the deploy endpoint. It currently expects document IDs under that key. documentIds remains canonical for the top-level list.

Curl flow

curl -X POST "https://api.okrapdf.com/api/agents/deploy" \
  -H "Authorization: Bearer $OKRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "documentIds":["ocr_doc_a","ocr_doc_b"],
    "name":"gpu-comparison"
  }'
Query the returned url with the returned bearer token:
curl -X POST "https://api.okrapdf.com/v1/agents/gpu-comparison-xxxxxx/completion" \
  -H "Authorization: Bearer agt_..." \
  -H "Content-Type: application/json" \
  -d '{"query":"Compare revenue growth between NVIDIA and AMD"}'

Notes

  • Deploy URLs are content-addressed by document set.
  • Same document set reuses the same slug.
  • Different document set yields a new slug.