SDK in abbonamento
OAuth per utente · limiti del piano condivisi tra le app · modello gestito da Pura.
Cerchi le API a consumo?SDK TypeScript
Node e browser: servizi, chat, streaming, audio e consumo.
Configura il client
PuraInferenceClient riceve apiBase terminante in /v1, clientId e il TokenStore del grant. clientSecret è previsto solo su backend confidential. fetch è opzionale per adattare il trasporto; in produzione preserva HTTPS, header e body del contratto.
import {PuraInferenceClient} from '@pura-ai/sdk';
const pura = new PuraInferenceClient({
apiBase: 'https://ai.puradigital.it/v1',
clientId: process.env.PURA_CLIENT_ID!,
clientSecret: process.env.PURA_CLIENT_SECRET!,
store: userTokenStore,
});
const capabilities = await pura.capabilities();
const usage = await pura.usage();Metodi di inferenza
capabilities() restituisce services.chat e services.audio_transcription. chat(body) restituisce il JSON della risposta. streamChat(body) restituisce una Response con un ReadableStream SSE; gestisci parsing e cancellazione. transcribe(options) restituisce text. usage() espone le percentuali dell’account. Nessuno di questi metodi consente di scegliere un modello.
Consuma lo stream
Il reader riceve chunk, non eventi completi: il confine di un chunk non coincide necessariamente con una riga SSE. Decodifica con TextDecoder in modalità stream e mantieni un buffer fino al separatore tra eventi. Chiudi il reader quando l’utente interrompe.
const response = await pura.streamChat({
messages: [{role: 'user', content: 'Hello'}],
});
const reader = response.body!.getReader();
const decoder = new TextDecoder();
try {
while (true) {
const {done, value} = await reader.read();
if (done) break;
consumeSseChunk(decoder.decode(value, {stream: true}));
}
consumeSseChunk(decoder.decode());
} finally {
await reader.cancel();
reader.releaseLock();
}Errori tipizzati
PuraError.status e PuraError.code permettono di distinguere autenticazione, revoca, limiti e indisponibilità . L’SDK rinnova il token quando necessario; non cambia provider, non addebita il wallet e non ripete automaticamente una richiesta di inferenza con esito ambiguo.
import {PuraError} from '@pura-ai/sdk';
try {
await pura.chat({messages});
} catch (error) {
if (error instanceof PuraError && error.status === 402) {
showSubscriptionLimit(error.code);
} else {
throw error;
}
}