Render an agent response as a visualization

This page shows how to use the Python SDK to render a visualization from the chart specifications that are provided within a Conversational Analytics API response. The sample code extracts the chart specification (in the Vega-Lite format ) from the response's chart field and uses the Vega-Altair library to render the chart, save it as an image, and display it.

Example: Render a bar chart from an API

This example shows how to render a bar chart from a Conversational Analytics API agent response. The example sends a request with the following prompt:

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

The sample code defines the following helper functions:

  • render_chart_response : Extracts the Vega-Lite configuration from the chart message, converts it to a format that can be used by the Vega-Altair library, renders the chart, saves it to chart.png , and displays it.
  • chat : Sends a request to the Conversational Analytics API using the inline_context variable and the current messages list, processes the streaming response, and if a chart is returned, calls render_chart_response to display it.

To use the following sample code, replace the following:

  • sqlgen-testing : The ID of your billing project that has the required APIs enabled .
  • Create a bar graph that shows the top five states by the total number of airports : The prompt that you want to send to the Conversational Analytics API.
  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. 
" 
 ) 
 
Create a Mobile Website
View Site in Mobile | Classic
Share by: