Questa guida fornisce istruzioni e best practice per gli ingegneri che creano esperienze di ordinazione di cibo con il metodo RPC FoodOrderingService.BidiProcessOrder. Questa API di streaming bidirezionale in tempo reale è il fulcro dell'agente AI per l'ordinazione di cibo, in quanto consente l'acquisizione di ordini dinamici e conversazionali in varie applicazioni come app mobile, assistenti vocali, drive-through e chioschi.
Panoramica di BidiProcessOrder
Il metodo BidiProcessOrder stabilisce un canale di comunicazione bidirezionale persistente tra l'applicazione client e l'agente AI per l'ordinazione di cibo. A differenza delle RPC standard di richiesta e risposta unarie, questo approccio di streaming consente di:
- Interazione a bassa latenza:scambio continuo di informazioni senza l'overhead di richieste HTTP ripetute.
- Input multimodale:gestione di flussi audio (per gli ordini vocali), input di testo ed eventi lato client.
- Risposte in tempo reale:l'agente può inviare audio, testo, aggiornamenti dell'ordine e altri segnali man mano che la conversazione si svolge.
BidiProcessOrder non può essere richiamato utilizzando REST. Le integrazioni devono utilizzare un protocollo orientato alla connessione:
- gRPC (consigliato): fornisce un framework solido ed efficiente per lo streaming bidirezionale.
- WebSocket: adatto a client o ambienti in cui gRPC non è adatto a causa di vincoli di linguaggio di programmazione o di rete.
Per definizioni dettagliate dei tipi, consulta il riferimento API BidiProcessOrder. Le integrazioni WebSocket utilizzano rappresentazioni JSON di questi tipi, come descritto nella sezione WebSocket.
Prerequisiti
Prima di eseguire l'integrazione con BidiProcessOrder:
- Abilita l'API:assicurati che l'API Food Ordering AI Agent sia abilitata nel tuo progetto Google Cloud .
bash gcloud services enable foodorderingaiagent.googleapis.com --project=PROJECT_ID - Autenticazione:decidi l'approccio di autenticazione e configura gli eventuali service account e ruoli IAM necessari, come descritto in Autenticazione.
- Importazione menu:deve essere importato un menu valido e associato a un
Store. Per informazioni dettagliate, consulta Integrazione dei dati del menu.
Autenticazione
Per connettersi in modo sicuro alla RPC BidiProcessOrder, l'applicazione deve autenticarsi utilizzando un service account Google Cloud .
1. Configura un service account
- Crea un service account:nel tuo progetto Google Cloud , crea un service account che la tua applicazione utilizzerà per l'autenticazione all'API Food Ordering AI Agent. Vedi Creazione e gestione degli account di servizio.
Concedi ruoli IAM:concedi i ruoli IAM necessari a questo account di servizio. Il ruolo principale richiesto per chiamare
BidiProcessOrderè:- Utente agente Food Ordering (
roles/foodorderingaiagent.agentUser): consente al account di servizio di connettersi al servizio di ordinazione ed elaborare le sessioni.
Puoi concedere questo ruolo utilizzando la console Google Cloud o
gcloud:bash gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \ --role="roles/foodorderingaiagent.agentUser"- Utente agente Food Ordering (
2. Flusso di autenticazione dell'applicazione
Il flusso di autenticazione esatto dipende dall'architettura dell'applicazione, in particolare se l'applicazione client (ad es. app mobile, software per chioschi) si connette direttamente o tramite il tuo backend.
Scenario comune: autenticazione di un'applicazione client rivolta ai consumatori
Questo è un pattern tipico per le applicazioni web o mobile:
- Client-to-YourAuth::l'app client dell'utente finale (mobile, web) esegue l'autenticazione con il tuo sistema di autenticazione utente esistente (potrebbe trattarsi di Firebase Authentication, del tuo server OAuth e così via).
- Scambio di token:l'app client, dopo aver autenticato l'utente, richiede un token di breve durata da un servizio di backend sicuro controllato da te (ad es. un "servizio di token API").
Generazione del token di accesso:il tuo servizio di backend, utilizzando le credenziali dell'entità dell'account di servizio configurata nel passaggio 1, genera un token di accesso OAuth 2.0 standard per l'ambito
https://www.googleapis.com/auth/cloud-platform. Google Cloud A tale scopo, utilizza le Google Cloud librerie client di autenticazione.- Sicurezza:le chiavi o le credenziali del service account utilizzate per generare questi token devono essere archiviate e gestite in modo sicuro nel backend. Non esporre mai direttamente le chiavi private del account di servizio alle applicazioni client dell'utente finale. Consulta Best practice per la gestione delle chiavi degli account di servizio.
Token al client:il servizio di backend restituisce il token di accesso Google generato all'app client.
Chiamata API:l'app client utilizza questo token di accesso Google per autenticare la connessione gRPC o WebSocket all'RPC
BidiProcessOrder.
3. Utilizzo del token
- gRPC:le librerie client gRPC di Google in genere gestiscono l'aggiornamento e l'inclusione dei token nei metadati della chiamata quando vengono fornite le credenziali del account di servizio.
- WebSocket (non browser): includi il token nell'intestazione
Authorization: Bearer TOKEN. - WebSocket (browser): come indicato nella sezione WebSocket, le connessioni WebSocket dirette del browser non possono utilizzare le intestazioni di autorizzazione. Per autenticare la connessione dei client a Google Cloud, è necessario un proxy di streaming lato server.
Connessione all'API
Puoi stabilire un flusso utilizzando le librerie client gRPC o una connessione WebSocket.
gRPC
L'utilizzo di gRPC è l'approccio consigliato. Utilizzerai le librerie client per la lingua che preferisci (ad es. Java, Go, Python, Node.js) basate sul riferimento API BidiProcessOrder.
I passaggi di base prevedono:
- Crea un canale gRPC all'endpoint API dell'agente AI per l'ordinazione di cibo (ad es.
foodorderingaiagent.googleapis.com). - Ottieni uno stub client per
FoodOrderingService. - Invoca il metodo
BidiProcessOrder, che restituisce un oggetto stream per l'invio di richieste e la ricezione di risposte. - Implementa la logica di business in base al tuo caso d'uso, che contemporaneamente:
- Invia input audio, di testo e di eventi dall'utente finale.
- Gestisce i messaggi dell'agente, inclusi audio, testo ed eventi.
WebSocket
Per le connessioni WebSocket, il percorso dell'URL è:
wss://foodorderingaiagent.googleapis.com/ws/google.cloud.foodorderingaiagent.v1beta.FoodOrderingService/BidiProcessOrder/locations/LOCATION
LOCATION: ad es.us
Intestazioni obbligatorie:
Authorization:Bearer TOKEN, doveTOKENè un token di accesso OAuth 2.0 ottenuto per il tuo account di servizio.
Formato messaggio:
- Client-server: messaggi inviati all'API (ad es.
Config,AudioInput,TextInput,EventInput) devono essere rappresentazioni JSON del protoBidiProcessOrderRequest, inviate comewebsocket.TextMessage. - Da server a client:i messaggi ricevuti dall'API (
BidiProcessOrderResponse) verranno inviati comewebsocket.BinaryMessage, ma il contenuto di questi messaggi binari è un payload JSON. - Dati binari: dati binari all'interno dei payload JSON (ad es.
customerAudioinAudioInput,agentAudioinAgentAudio) deve essere codificato in base64.
Ciclo di vita della sessione
Ogni chiamata a BidiProcessOrder avvia una sessione. La sessione rimane attiva finché lo stream è aperto.
Inizio (messaggio di configurazione):
- Una volta stabilita la connessione, il primo messaggio inviato dal client deve essere un
BidiProcessOrderRequestcontenente il messaggioConfig. - Campi obbligatori in
Config:session: un identificatore di sessione univoco generato dal client. Formato:projects/PROJECT/locations/LOCATION/sessions/SESSION_ID.store: il nome della risorsa diStore. Formato:projects/PROJECT/locations/LOCATION/brands/BRAND/stores/STORE.
- L'agente utilizza
storeper caricare il menu e la configurazione appropriati.
- Una volta stabilita la connessione, il primo messaggio inviato dal client deve essere un
Invio di input:
- Dopo l'
Configiniziale, il client può inviare un flusso di messaggiBidiProcessOrderRequestcontenenti uno dei seguenti input:AudioInput: dati audio non elaborati (in genere PCM lineare a 16 bit a 16000 Hz, senza intestazioni). Utilizzato per le interazioni vocali.TextInput: messaggi di testo dell'utente.EventInput: indicatori per eventi comeDriveOffEvent(per i casi d'uso drive-through quando il veicolo parte),CrewInterjectionEvent(per qualsiasi situazione in cui una persona assume il ruolo di presa degli ordini a metà conversazione) oOrderStateUpdateEvent(se l'ordine viene modificato sul lato client, ad esempio utilizzando un'interfaccia touch).
- Dopo l'
Ricezione delle risposte:
- Contemporaneamente, l'agente invia un flusso di messaggi
BidiProcessOrderResponse. Il tuo cliente deve essere pronto a gestire vari tipi di risposta all'interno del campooneof response:AgentAudio: byte audio sintetizzati da riprodurre per l'utente, utilizzati per le interazioni vocali.AgentText: versione testuale della risposta dell'agente.SpeechRecognition: trascrizione del discorso dell'utente riconosciuto.UpdatedOrderState: contiene lo stato attuale completo delOrderdel cliente ogni volta che viene aggiornato dall'agente. Utilizza questo campo per aggiornare la rappresentazione dell'ordine della tua applicazione. In genere, questo dovrebbe comportare un aggiornamento di un'interfaccia utente o di un sistema di registrazione per le informazioni sullo stato dell'ordine, ad esempio un sistema POS.InterruptionSignal: indica che l'utente ha interrotto il discorso dell'agente. Il client deve interrompere immediatamente la riproduzione di qualsiasiAgentAudioin uscita.AgentEvent: eventi speciali, ad esempioRestartOrder, che richiedono l'intervento del cliente.SuggestedOptions: fornisce opzioni contestualmente pertinenti che un utente potrebbe selezionare successivamente, utili per la visualizzazione su uno schermo.EndSession: indica che la sessione è stata terminata dall'agente (ad es. ordine completato, utente che si allontana o escalation dell'agente).
- Contemporaneamente, l'agente invia un flusso di messaggi
Chiusura dello stream:
- Lo stream può essere chiuso dal client o dal server. In genere, il server segnala la fine di una conversazione utilizzando un messaggio
EndSession. Il client deve chiudere lo stream quando riceve questo messaggio.
- Lo stream può essere chiuso dal client o dal server. In genere, il server segnala la fine di una conversazione utilizzando un messaggio
Gestione di tipi di messaggi specifici
Le sezioni seguenti descrivono come gestire tipi di risposta specifici che il client riceverà quando chiama BidiProcessOrder.
AudioInput
- Riproduci in streaming l'audio in blocchi man mano che diventano disponibili.
- Formato: PCM lineare a 16 bit, frequenza di campionamento di 16000 Hz.
- I blocchi audio non includono le intestazioni audio che in genere precedono un file WAV.
- Per gli scenari drive-through con la cancellazione eco dell'eco attivata (
enable_echo_cancellationinConfig), fornisci siacustomer_audiochecrew_audio.
UpdatedOrderState
- Questo messaggio fornisce lo stato completo dell'ordine ogni volta che viene inviato. Sostituisci qualsiasi cache locale dell'ordine con i contenuti del messaggio
Orderricevuto. - Utilizza
custom_integration_attributesall'interno di elementi e modificatoriOrderper mappare i contenutiOrderin entità equivalenti all'interno del sistema di registrazione della tua applicazione.
InterruptionSignal
- Al ricevimento, interrompi immediatamente la riproduzione di qualsiasi
AgentAudioe cancella l'audio dell'agente memorizzato nel buffer. In questo modo, il flusso della conversazione è naturale quando l'utente interrompe il discorso dell'agente.
EndSession
- Controlla
EndType(ad es.DRIVE_OFF,AGENT_ESCALATION). - L'applicazione deve chiudere correttamente la connessione e gestire la transizione dell'utente in modo appropriato (ad esempio, inviare una notifica a un supervisore umano nel caso di
AGENT_ESCALATIONo passare a uno stato di conferma dell'ordine).
Best practice
- Gestisci i messaggi in modo asincrono:riduci al minimo la latenza utilizzando thread o I/O non bloccanti per inviare richieste ed elaborare le risposte in arrivo contemporaneamente.
- Logica di riconnessione:implementa una logica di riconnessione solida in caso di problemi di rete, ricordandoti di inviare il messaggio
Configiniziale con lo stesso ID sessione per tentare la ripresa. - Gestione degli errori:monitora lo stream per rilevare errori. Le librerie gRPC e WebSocket forniscono meccanismi per rilevare la chiusura dello stream o errori di trasporto. Registra questi eventi e gestiscili in modo appropriato.
- Buffer audio:gestisci attentamente i buffer audio, implementando il buffering se necessario, per garantire una riproduzione fluida di
AgentAudioe una distribuzione tempestiva diAudioInput. Valuta attentamente il compromesso tra latenza e qualità di riproduzione quando decidi lo schema di buffering. - Gestione ID sessione:assicurati che gli ID sessione siano univoci per ogni ordine/conversazione distinto.
- Gestione delle risorse:chiudi gli stream e rilascia le risorse al termine della sessione o se si verificano errori non recuperabili.
- Timeout:anche se lo stream stesso può durare a lungo (fino a 15 minuti per impostazione predefinita), se necessario, considera i timeout a livello di applicazione per stati specifici.
Flusso di integrazione di esempio (concettuale)
- App client (ad es. app mobile) avvia un ordine.
- Stabilisci una connessione gRPC/WebSocket a
BidiProcessOrder. - Invia
BidiProcessOrderRequestconConfig(ID sessione, ID negozio). - Ricevi l'
AgentAudioiniziale (ad es. il messaggio di benvenuto) e riproducilo. - L'utente parla: acquisisci l'audio e riproducilo in streaming nei messaggi di
AudioInput. - Ricevi
SpeechRecognition(visualizza la trascrizione),AgentAudio(riproduci la risposta) e potenzialmenteUpdatedOrderState(aggiorna il carrello della UI). - Se l'utente interrompe, ricevi
InterruptionSignal, interrompi la riproduzione. - Continua lo scambio di input audio o di testo e le risposte dell'agente.
- L'utente conferma l'ordine: l'agente invia
UpdatedOrderStatefinale. - L'agente invia
EndSession: il cliente chiude lo stream e finalizza l'ordine nel sistema POS utilizzando i dati dell'ultimoUpdatedOrderState.