Eseguire il rendering di una risposta dell'agente come visualizzazione

Questa pagina mostra come utilizzare l'SDK Python per eseguire il rendering di una visualizzazione dalle specifiche del grafico fornite all'interno di una risposta dell'API Conversational Analytics. Il codice di esempio estrae la specifica del grafico (in formato Vega-Lite) dal campo chart della risposta e utilizza la libreria Vega-Altair per eseguire il rendering del grafico, salvarlo come immagine e visualizzarlo.

Esempio: visualizzare un grafico a barre da un'API

Questo esempio mostra come eseguire il rendering di un grafico a barre da una risposta dell'agente dell'API Conversational Analytics. L'esempio invia una richiesta con il seguente prompt:

"Create a bar graph that shows the top five states by the total number of airports."

Il codice campione definisce le seguenti funzioni di assistenza:

  • render_chart_response: estrae la configurazione Vega-Lite dal messaggio chart, la converte in un formato utilizzabile dalla libreria Vega-Altair, esegue il rendering del grafico, lo salva in chart.png e lo visualizza.
  • chat: invia una richiesta all'API Conversational Analytics utilizzando la variabile inline_context e l'elenco messages corrente, elabora la risposta di streaming e, se viene restituito un grafico, chiama render_chart_response per visualizzarlo.

Per utilizzare il seguente codice campione, sostituisci quanto segue:

  • sqlgen-testing: l'ID del tuo progetto di fatturazione in cui sono abilitate le API richieste.
  • Create a bar graph that shows the top five states by the total number of airports: il prompt che vuoi inviare all'API Conversational Analytics.
from google.cloud import geminidataanalytics
from google.protobuf.json_format import MessageToDict
import altair as alt
import proto

# Helper function for rendering chart response
def render_chart_response(resp):
  def _convert(v):
    if isinstance(v, proto.marshal.collections.maps.MapComposite):
      return {k: _convert(v) for k, v in v.items()}
    elif isinstance(v, proto.marshal.collections.RepeatedComposite):
      return [_convert(el) for el in v]
    elif isinstance(v, (int, float, str, bool)):
      return v
    else:
      return MessageToDict(v)

  vega_config = _convert(resp.result.vega_config)
  chart = alt.Chart.from_dict(vega_config)
  chart.save('chart.png')
  chart.display()

# Helper function for calling the API
def chat(q: str):
  billing_project = "sqlgen-testing"

  input_message = geminidataanalytics.Message(
      user_message=geminidataanalytics.UserMessage(text=q)
  )

  client = geminidataanalytics.DataChatServiceClient()
  request = geminidataanalytics.ChatRequest(
      inline_context=inline_context,
      parent=f"projects/{billing_project}/locations/global",
      messages=messages,
  )

  # Make the request
  stream = client.chat(request=request)

  for reply in stream:
    if "chart" in reply.system_message:
      # ChartMessage includes `query` for generating a chart and `result` with the generated chart.
      if "result" in reply.system_message.chart:
        render_chart_response(reply.system_message.chart)

# Send the prompt to make a bar graph
chat("Create a bar graph that shows the top five states by the total number of airports.")