Renderiza una respuesta del 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 del gráfico que se proporcionan en una respuesta de la API de Conversational Analytics. El código de muestra extrae la especificación del gráfico (en el formato de Vega-Lite) del campo chart de la respuesta y usa la biblioteca Vega-Altair para renderizar el gráfico, guardarlo como una imagen y mostrarlo.

Ejemplo: Renderiza 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 una respuesta del agente de la API de Conversational Analytics. En el ejemplo, se envía una solicitud con la siguiente instrucción:

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

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

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

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

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