Representar la respuesta de un agente como una visualización

En esta página se muestra cómo usar el SDK de Python para renderizar una visualización a partir de las especificaciones de gráficos que se proporcionan en una respuesta de la API Conversational Analytics. El código de ejemplo extrae la especificación del gráfico (en formato Vega-Lite) del campo chart de la respuesta y usa la biblioteca Vega-Altair para renderizar el gráfico, guardarlo como imagen y mostrarlo.

Ejemplo: renderizar un gráfico de barras a partir de una API

En este ejemplo se muestra cómo renderizar un gráfico de barras a partir de la respuesta de un agente de la API Conversational Analytics. En el ejemplo se envía una solicitud con la siguiente petición:

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

El código de ejemplo define las siguientes funciones auxiliares:

  • render_chart_response: extrae la configuración de Vega-Lite del mensaje chart, la convierte a un formato que pueda usar la biblioteca Vega-Altair, renderiza el gráfico, lo guarda en chart.png y lo muestra.
  • chat: envía una solicitud a la API Conversational Analytics mediante la variable inline_context y la lista messages actual, procesa la respuesta de streaming y, si se devuelve un gráfico, llama a render_chart_response para mostrarlo.

Para usar el siguiente código de muestra, sustituye lo siguiente:

  • sqlgen-testing: el ID de tu proyecto de facturación que tiene las APIs necesarias habilitadas.
  • Create a bar graph that shows the top five states by the total number of airports: la petición que quieres enviar a la 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.")