When we ask a question about function calling, Gemini Pro calls the function and provides a response from it. However, if we ask a general question where we expect Gemini itself to provide an answer without needing to call a function, it responds with: 'I am sorry, I cannot fulfill this request. The available tools lack the desired functionality
import vertexai
from vertexai.generative_models import (
FunctionDeclaration,
GenerativeModel,
Part,
Tool,
)
def generate_function_call_chat(project_id: str, location: str) -> tuple:
prompts = []
summaries = []
# Initialize Vertex AI
vertexai.init(project=project_id, location=location)
# Specify a function declaration and parameters for an API request
get_product_info_func = FunctionDeclaration(
name="get_product_sku",
description="Get the SKU for a product",
# Function parameters are specified in OpenAPI JSON schema format
parameters={
"type": "object",
"properties": {
"product_name": {"type": "string", "description": "Product name"}
},
},
)
# Specify another function declaration and parameters for an API request
get_store_location_func = FunctionDeclaration(
name="get_store_location",
description="Get the location of the closest store",
# Function parameters are specified in OpenAPI JSON schema format
parameters={
"type": "object",
"properties": {"location": {"type": "string", "description": "Location"}},
},
)
# Define a tool that includes the above functions
retail_tool = Tool(
function_declarations=[
get_product_info_func,
get_store_location_func,
],
)
# Initialize Gemini model
model = GenerativeModel(
"gemini-1.0-pro", generation_config={"temperature": 0}, tools=[retail_tool]
)
# Start a chat session
chat = model.start_chat()
# Send a prompt for the first conversation turn that should invoke the get_product_sku function
prompt = "Do you have the Pixel 8 Pro in stock?"
response = chat.send_message(prompt)
prompts.append(prompt)
# Check the function name that the model responded with, and make an API call to an external system
if response.candidates[0].content.parts[0].function_call.name == "get_product_sku":
# Extract the arguments to use in your API call
product_name = (
response.candidates[0].content.parts[0].function_call.args["product_name"]
)
product_name
# Here you can use your preferred method to make an API request to retrieve the product SKU, as in:
# api_response = requests.post(product_api_url, data={"product_name": product_name})
# In this example, we'll use synthetic data to simulate a response payload from an external API
api_response = {"sku": "GA04834-US", "in_stock": "yes"}
# Return the API response to Gemini so it can generate a model response or request another function call
response = chat.send_message(
Part.from_function_response(
name="get_product_sku",
response={
"content": api_response,
},
),
)
# Extract the text from the summary response
summary = response.candidates[0].content.parts[0].text
summaries.append(summary)
# Send a prompt for the second conversation turn that should invoke the get_store_location function
prompt = "Is there a store in Mountain View, CA that I can visit to try it out?"
response = chat.send_message(prompt)
prompts.append(prompt)
# Check the function name that the model responded with, and make an API call to an external system
if (
response.candidates[0].content.parts[0].function_call.name
== "get_store_location"
):
# Extract the arguments to use in your API call
location = (
response.candidates[0].content.parts[0].function_call.args["location"]
)
location
# Here you can use your preferred method to make an API request to retrieve store location closest to the user, as in:
# api_response = requests.post(store_api_url, data={"location": location})
# In this example, we'll use synthetic data to simulate a response payload from an external API
api_response = {"store": "2000 N Shoreline Blvd, Mountain View, CA 94043, US"}
# Return the API response to Gemini so it can generate a model response or request another function call
response = chat.send_message(
Part.from_function_response(
name="get_store_location",
response={
"content": api_response,
},
),
)
# Extract the text from the summary response
summary = response.candidates[0].content.parts[0].text
summaries.append(summary)
return prompts, summaries
This appears to still be the case. When I include Tools in my GenerativeModel.generate_content request, Gemini can no longer answer generalized queries about anything.
Doing a simple test in Python with the latest API reveals:
I can't answer that question. I can get the current weather, time zone, and realtime information about stocks.
Same here, opened a ticket: https://github.com/googleapis/python-aiplatform/issues/3775
User | Count |
---|---|
2 | |
1 | |
1 | |
1 | |
1 |