Skip to content

Integrazioni

Queria e progettata per essere integrata all'interno di applicazioni proprietarie. Questa guida illustra le modalita di integrazione disponibili, dal widget incorporabile alla comunicazione server-to-server.

Widget Incorporabile

Il modo piu rapido per aggiungere Queria a un sito web o portale aziendale.

Installazione base

Aggiungi il seguente codice HTML prima della chiusura del tag </body>:

html
<script src="https://cdn.queria.pro/widget.js"></script>
<script>
  Queria.init({
    apiKey: 'qk_live_abc123def456ghi789jkl012',
    theme: 'light',
    position: 'bottom-right',
    language: 'it'
  });
</script>

Opzioni di configurazione

OpzioneTipoDefaultDescrizione
apiKeystring-API Key con restrizione dominio (obbligatorio)
themestringlightTema: light, dark, auto
positionstringbottom-rightPosizione: bottom-right, bottom-left
languagestringitLingua interfaccia: it, en
primaryColorstring#2563ebColore primario (esadecimale)
titlestringAssistente AITitolo mostrato nell'header
placeholderstringScrivi una domanda...Placeholder del campo di input
topicIdstring-Limita la ricerca a una categoria specifica
widthnumber400Larghezza del widget in pixel
heightnumber600Altezza del widget in pixel

Personalizzazione avanzata

html
<script>
  Queria.init({
    apiKey: 'qk_live_abc123def456ghi789jkl012',
    theme: 'dark',
    position: 'bottom-right',
    primaryColor: '#059669',
    title: 'Supporto Documentale',
    placeholder: 'Cerca nei documenti aziendali...',
    topicId: 'topic_contratti',
    onReady: function() {
      console.log('Widget Queria caricato');
    },
    onMessage: function(message) {
      // Callback per ogni messaggio ricevuto
      analytics.track('queria_response', { query: message.query });
    }
  });
</script>

Controllo programmatico

javascript
// Apri il widget
Queria.open();

// Chiudi il widget
Queria.close();

// Invia un messaggio programmaticamente
Queria.send('Qual e la policy di reso?');

// Distruggi l'istanza
Queria.destroy();

Integrazione REST API

Per integrazioni piu profonde, utilizza direttamente la REST API con autenticazione server-to-server.

Architettura consigliata

┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│  La tua App     │────>│  Il tuo Backend  │────>│  Queria API     │
│  (Frontend)     │     │  (Server)        │     │                 │
└─────────────────┘     └──────────────────┘     └─────────────────┘

L'API Key deve risiedere esclusivamente nel tuo backend. Il frontend della tua applicazione comunica con il tuo server, che a sua volta inoltra le richieste a Queria.

Esempio Node.js

javascript
const express = require('express');
const app = express();

const QUERIA_API_KEY = process.env.QUERIA_API_KEY; // qk_live_abc123...
const QUERIA_BASE_URL = 'https://api.queria.pro';

app.post('/api/ask', async (req, res) => {
  const { question, sessionId } = req.body;

  const response = await fetch(`${QUERIA_BASE_URL}/api/public/chat`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': QUERIA_API_KEY
    },
    body: JSON.stringify({
      message: question,
      sessionId: sessionId
    })
  });

  const data = await response.json();
  res.json({
    answer: data.data.response,
    sources: data.data.sources
  });
});

Esempio Python

python
import requests
import os

QUERIA_API_KEY = os.environ['QUERIA_API_KEY']
QUERIA_BASE_URL = 'https://api.queria.pro'

def ask_queria(question: str, session_id: str = None) -> dict:
    response = requests.post(
        f'{QUERIA_BASE_URL}/api/public/chat',
        headers={
            'Content-Type': 'application/json',
            'X-API-Key': QUERIA_API_KEY
        },
        json={
            'message': question,
            'sessionId': session_id
        }
    )
    response.raise_for_status()
    result = response.json()
    return {
        'answer': result['data']['response'],
        'sources': result['data']['sources']
    }

Casi d'Uso

Integrazione CRM

Incorpora la ricerca documentale nel tuo CRM per consentire agli operatori di trovare contratti, offerte e documentazione cliente direttamente dall'interfaccia di gestione.

javascript
// Cerca documenti relativi a un cliente specifico
const results = await fetch(`${QUERIA_BASE_URL}/api/public/chat`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': QUERIA_API_KEY
  },
  body: JSON.stringify({
    message: `Trova i contratti attivi per il cliente ${customerName}`,
    sessionId: `crm_${customerId}`
  })
});

Integrazione ERP

Collega i documenti finanziari (fatture, ordini, DDT) per consentire ricerche intelligenti sui dati contabili e di magazzino.

Portale aziendale

Aggiungi un assistente AI alla intranet aziendale per la consultazione della knowledge base interna: manuali, procedure operative, policy HR.

Supporto clienti

Automatizza le risposte alle domande frequenti con citazioni precise dai documenti ufficiali, riducendo i tempi di risposta e migliorando la qualita del supporto.

Autenticazione per Integrazioni

ScenarioMetodoNote
Widget su sito pubblicoAPI Key + restrizione dominioIl dominio deve corrispondere
Backend-to-backendAPI KeyConserva la chiave nel server
App con login utenteJWTOgni utente ha il proprio token
App mobileJWT + refresh tokenGestisci il refresh automatico

Best Practice

Gestione degli errori

Implementa una strategia di retry con backoff esponenziale per gestire errori transitori:

javascript
async function queriaRequest(payload, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await fetch(`${QUERIA_BASE_URL}/api/public/chat`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-API-Key': QUERIA_API_KEY
        },
        body: JSON.stringify(payload)
      });

      if (response.status === 429) {
        const retryAfter = response.headers.get('Retry-After') || 5;
        await sleep(retryAfter * 1000);
        continue;
      }

      if (!response.ok) throw new Error(`HTTP ${response.status}`);
      return await response.json();
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;
      await sleep(Math.pow(2, attempt) * 1000);
    }
  }
}

Gestione del rate limit

Monitora gli header X-RateLimit-Remaining e rallenta le richieste quando il budget si avvicina a zero. Per carichi elevati, contatta il supporto per limiti personalizzati.

Streaming per risposte in tempo reale

Per le interfacce utente interattive, utilizza sempre l'endpoint streaming (/api/public/chat/stream) per mostrare la risposta progressivamente, migliorando la percezione di reattivita.

Caching

Implementa una cache lato applicazione per le query ripetute. Queria applica gia un caching interno, ma una cache locale riduce la latenza e il consumo di quota:

javascript
const cache = new Map();
const CACHE_TTL = 5 * 60 * 1000; // 5 minuti

async function cachedQuery(question) {
  const key = question.toLowerCase().trim();
  const cached = cache.get(key);

  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }

  const result = await queriaRequest({ message: question });
  cache.set(key, { data: result, timestamp: Date.now() });
  return result;
}

Queria - Document Intelligence con Cog-RAG