Aller au contenu

SDK

Clients Python et TypeScript de l'API; le reste s'appelle en HTTP, avec la même clé.

Python#

Module sextant.sdk du paquet sextant (Python 3.12+), depuis la distribution reçue:

bash
uv add <chemin-vers-sextant>   # ou: pip install <chemin-vers-sextant>
Python
import os
from sextant.sdk import Sextant

client = Sextant(base_url="https://api.example.com", api_key=os.environ["SEXTANT_API_KEY"])
ClasseSignatureNotes
SextantSextant(base_url=None, api_key=None, *, timeout=300.0, offline=False)synchrone; sans base_url, le moteur tourne dans le processus avec une bibliothèque locale (chemins locaux: SEXTANT_ALLOW_LOCAL_FILES=true); with Sextant(...) ou client.close()
AsyncSextantAsyncSextant(base_url="http://localhost:8000", api_key=None, timeout=300.0)asynchrone, distant uniquement; async with ou await client.aclose()

TypeScript#

@sextant/sdk: sans dépendance, Node 18+ et navigateurs (fetch et flux). À construire depuis sdks/typescript dans la distribution:

bash
cd <chemin-vers-sextant>/sdks/typescript && npm install && npm run build

cd <votre-projet> && npm install <chemin-vers-sextant>/sdks/typescript
TypeScript
import { Sextant } from "@sextant/sdk";

const client = new Sextant({ baseUrl: "https://api.example.com", apiKey: process.env.SEXTANT_API_KEY });

Options: baseUrl (défaut http://localhost:8000), apiKey, fetch. Dans un navigateur, n'exposez jamais la clé: appelez Sextant depuis votre serveur. Exports: les types (AskParams, AskResult, Evidence, Locator, Region, SourceInfo, ThreadSummary, ThreadDetail, StreamEvent, Budget...) et parseSSE(body) pour lire un flux SSE vous-même.

Méthodes#

Python: (async) = AsyncSextant seulement. sources: une chaîne, une liste de sources et de dossiers (identifiants, URL, chemins, noms de dossiers), ou None (toute la bibliothèque; pour une relance, les sources du thread). Les clients envoient l'heure de la machine (x-timezone). Résultats: le JSON de l'API.

AppellePythonTypeScript
POST /v1/askask(sources, question, *, budget=None, thread_id=None, max_output_tokens=None, answer_schema=None)ask({ sources?, question, budget?, thread_id?, max_output_tokens?, answer_schema? })
POST /v1/ask en streamingask_stream(sources, question, *, budget=None, thread_id=None, max_output_tokens=None): des {"event": ..., "data": ...} (distant uniquement)askStream({ ... }): un itérateur asynchrone de { event, data }
POST /v1/sources (URL, spec, text:...)add(source) (async: folder_id=)add(source, folderId?)
POST /v1/sourcesupload(path) (async)upload(file: Blob, filename)
GET /v1/sourcessources(limit=100, **filters) (async; folder, q, sort, order, offset...)
GET /v1/sources/{id}source(source_id) (async)source(sourceId)
GET /v1/sources/{id}/outlineoutline(source_id, depth=3, region_id=None) (async)outline(sourceId, depth = 3, regionId?)
dossiersfolders(), create_folder(name, *, sources=None, parent_id=None), add_to_folder(folder_id, sources) (async)
POST /v1/regions/{id}/readread_region(region_id)readRegion(regionId)
GET /v1/evidence/{id}evidence(evidence_id) (async)evidence(evidenceId)
GET /v1/runsruns(limit=20) (async)runs(limit = 20)
GET /v1/runs/{id}run(run_id)run(runId)
GET /v1/threads, GET /v1/threads/{id}threads(limit=50), thread(thread_id)threads(limit = 50), thread(threadId)
image d'une page de PDFpageImageUrl(sourceId, page, scale = 1.5) (une URL)
Python
r = client.ask("https://example.com/rapport-annuel.pdf", "Quel est le plafond de rémunération du PDG ?", budget="deep")
for ev in client.ask_stream(None, "Développe le deuxième point", thread_id=r["thread_id"]):
    if ev["event"] == "answer_delta":
        print(ev["data"]["text"], end="", flush=True)
TypeScript
const r = await client.ask({ sources: ["fld_…"], question: "Quels contrats se renouvellent tacitement ?", budget: "deep" });
for await (const ev of client.askStream({ question: "Et leurs préavis ?", thread_id: r.thread_id ?? undefined })) {
  if (ev.event === "answer_delta") process.stdout.write(ev.data.text);
}

Erreurs#

Une erreur HTTP lève SextantError (sextant.sdk ou @sextant/sdk), avec status et payload (le corps JSON de l'erreur).