Add additional function call for testing to 14e, 14r, 19, 19a, 26b

This commit is contained in:
Mark Backman
2025-05-31 09:34:43 -04:00
committed by Aleix Conchillo Flaqué
parent 897a944478
commit ed84637b55
5 changed files with 103 additions and 10 deletions

View File

@@ -39,6 +39,10 @@ async def get_weather(params: FunctionCallParams):
await params.result_callback(f"The weather in {location} is currently 72 degrees and sunny.") await params.result_callback(f"The weather in {location} is currently 72 degrees and sunny.")
async def fetch_restaurant_recommendation(params: FunctionCallParams):
await params.result_callback({"name": "The Golden Dragon"})
async def get_image(params: FunctionCallParams): async def get_image(params: FunctionCallParams):
question = params.arguments["question"] question = params.arguments["question"]
logger.debug(f"Requesting image with user_id={client_id}, question={question}") logger.debug(f"Requesting image with user_id={client_id}, question={question}")
@@ -92,6 +96,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
llm = GoogleLLMService(api_key=os.getenv("GOOGLE_API_KEY"), model="gemini-2.0-flash-001") llm = GoogleLLMService(api_key=os.getenv("GOOGLE_API_KEY"), model="gemini-2.0-flash-001")
llm.register_function("get_weather", get_weather) llm.register_function("get_weather", get_weather)
llm.register_function("get_image", get_image) llm.register_function("get_image", get_image)
llm.register_function("get_restaurant_recommendation", fetch_restaurant_recommendation)
@llm.event_handler("on_function_calls_started") @llm.event_handler("on_function_calls_started")
async def on_function_calls_started(service, function_calls): async def on_function_calls_started(service, function_calls):
@@ -113,6 +118,17 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
}, },
required=["location", "format"], required=["location", "format"],
) )
restaurant_function = FunctionSchema(
name="get_restaurant_recommendation",
description="Get a restaurant recommendation",
properties={
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
},
required=["location"],
)
get_image_function = FunctionSchema( get_image_function = FunctionSchema(
name="get_image", name="get_image",
description="Get an image from the video stream.", description="Get an image from the video stream.",
@@ -124,14 +140,14 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
}, },
required=["question"], required=["question"],
) )
tools = ToolsSchema(standard_tools=[weather_function, get_image_function]) tools = ToolsSchema(standard_tools=[weather_function, get_image_function, restaurant_function])
system_prompt = """\ system_prompt = """\
You are a helpful assistant who converses with a user and answers questions. Respond concisely to general questions. You are a helpful assistant who converses with a user and answers questions. Respond concisely to general questions.
Your response will be turned into speech so use only simple words and punctuation. Your response will be turned into speech so use only simple words and punctuation.
You have access to two tools: get_weather and get_image. You have access to three tools: get_weather, get_restaurant_recommendation, and get_image.
You can respond to questions about the weather using the get_weather tool. You can respond to questions about the weather using the get_weather tool.

View File

@@ -32,6 +32,10 @@ async def fetch_weather_from_api(params: FunctionCallParams):
await params.result_callback({"conditions": "nice", "temperature": "75"}) await params.result_callback({"conditions": "nice", "temperature": "75"})
async def fetch_restaurant_recommendation(params: FunctionCallParams):
await params.result_callback({"name": "The Golden Dragon"})
# We store functions so objects (e.g. SileroVADAnalyzer) don't get # We store functions so objects (e.g. SileroVADAnalyzer) don't get
# instantiated. The function will be called when the desired transport gets # instantiated. The function will be called when the desired transport gets
# selected. # selected.
@@ -74,6 +78,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
# You can also register a function_name of None to get all functions # You can also register a function_name of None to get all functions
# sent to the same callback with an additional function_name parameter. # sent to the same callback with an additional function_name parameter.
llm.register_function("get_current_weather", fetch_weather_from_api) llm.register_function("get_current_weather", fetch_weather_from_api)
llm.register_function("get_restaurant_recommendation", fetch_restaurant_recommendation)
weather_function = FunctionSchema( weather_function = FunctionSchema(
name="get_current_weather", name="get_current_weather",
@@ -91,7 +96,18 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
}, },
required=["location", "format"], required=["location", "format"],
) )
tools = ToolsSchema(standard_tools=[weather_function]) restaurant_function = FunctionSchema(
name="get_restaurant_recommendation",
description="Get a restaurant recommendation",
properties={
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
},
required=["location"],
)
tools = ToolsSchema(standard_tools=[weather_function, restaurant_function])
messages = [ messages = [
{ {

View File

@@ -45,6 +45,10 @@ async def fetch_weather_from_api(params: FunctionCallParams):
) )
async def fetch_restaurant_recommendation(params: FunctionCallParams):
await params.result_callback({"name": "The Golden Dragon"})
weather_function = FunctionSchema( weather_function = FunctionSchema(
name="get_current_weather", name="get_current_weather",
description="Get the current weather", description="Get the current weather",
@@ -62,8 +66,20 @@ weather_function = FunctionSchema(
required=["location", "format"], required=["location", "format"],
) )
restaurant_function = FunctionSchema(
name="get_restaurant_recommendation",
description="Get a restaurant recommendation",
properties={
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
},
required=["location"],
)
# Create tools schema # Create tools schema
tools = ToolsSchema(standard_tools=[weather_function]) tools = ToolsSchema(standard_tools=[weather_function, restaurant_function])
# We store functions so objects (e.g. SileroVADAnalyzer) don't get # We store functions so objects (e.g. SileroVADAnalyzer) don't get
@@ -100,7 +116,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
# turn_detection=False, # turn_detection=False,
input_audio_noise_reduction=InputAudioNoiseReduction(type="near_field"), input_audio_noise_reduction=InputAudioNoiseReduction(type="near_field"),
# tools=tools, # tools=tools,
instructions="""Your knowledge cutoff is 2023-10. You are a helpful and friendly AI. instructions="""You are a helpful and friendly AI.
Act like a human, but remember that you aren't a human and that you can't do human Act like a human, but remember that you aren't a human and that you can't do human
things in the real world. Your voice and personality should be warm and engaging, with a lively and things in the real world. Your voice and personality should be warm and engaging, with a lively and
@@ -113,6 +129,10 @@ even if you're asked about them.
You are participating in a voice conversation. Keep your responses concise, short, and to the point You are participating in a voice conversation. Keep your responses concise, short, and to the point
unless specifically asked to elaborate on a topic. unless specifically asked to elaborate on a topic.
You have access to the following tools:
- get_current_weather: Get the current weather for a given location.
- get_restaurant_recommendation: Get a restaurant recommendation for a given location.
Remember, your responses should be short. Just one or two sentences, usually.""", Remember, your responses should be short. Just one or two sentences, usually.""",
) )
@@ -125,6 +145,7 @@ Remember, your responses should be short. Just one or two sentences, usually."""
# you can either register a single function for all function calls, or specific functions # you can either register a single function for all function calls, or specific functions
# llm.register_function(None, fetch_weather_from_api) # llm.register_function(None, fetch_weather_from_api)
llm.register_function("get_current_weather", fetch_weather_from_api) llm.register_function("get_current_weather", fetch_weather_from_api)
llm.register_function("get_restaurant_recommendation", fetch_restaurant_recommendation)
# Create a standard OpenAI LLM context object using the normal messages format. The # Create a standard OpenAI LLM context object using the normal messages format. The
# OpenAIRealtimeBetaLLMService will convert this internally to messages that the # OpenAIRealtimeBetaLLMService will convert this internally to messages that the

View File

@@ -43,6 +43,10 @@ async def fetch_weather_from_api(params: FunctionCallParams):
) )
async def fetch_restaurant_recommendation(params: FunctionCallParams):
await params.result_callback({"name": "The Golden Dragon"})
# Define weather function using standardized schema # Define weather function using standardized schema
weather_function = FunctionSchema( weather_function = FunctionSchema(
name="get_current_weather", name="get_current_weather",
@@ -61,8 +65,20 @@ weather_function = FunctionSchema(
required=["location", "format"], required=["location", "format"],
) )
restaurant_function = FunctionSchema(
name="get_restaurant_recommendation",
description="Get a restaurant recommendation",
properties={
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
},
required=["location"],
)
# Create tools schema # Create tools schema
tools = ToolsSchema(standard_tools=[weather_function]) tools = ToolsSchema(standard_tools=[weather_function, restaurant_function])
# We store functions so objects (e.g. SileroVADAnalyzer) don't get # We store functions so objects (e.g. SileroVADAnalyzer) don't get
@@ -98,7 +114,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
# Or set to False to disable openai turn detection and use transport VAD # Or set to False to disable openai turn detection and use transport VAD
# turn_detection=False, # turn_detection=False,
# tools=tools, # tools=tools,
instructions="""Your knowledge cutoff is 2023-10. You are a helpful and friendly AI. instructions="""You are a helpful and friendly AI.
Act like a human, but remember that you aren't a human and that you can't do human Act like a human, but remember that you aren't a human and that you can't do human
things in the real world. Your voice and personality should be warm and engaging, with a lively and things in the real world. Your voice and personality should be warm and engaging, with a lively and
@@ -111,6 +127,10 @@ even if you're asked about them.
You are participating in a voice conversation. Keep your responses concise, short, and to the point You are participating in a voice conversation. Keep your responses concise, short, and to the point
unless specifically asked to elaborate on a topic. unless specifically asked to elaborate on a topic.
You have access to the following tools:
- get_current_weather: Get the current weather for a given location.
- get_restaurant_recommendation: Get a restaurant recommendation for a given location.
Remember, your responses should be short. Just one or two sentences, usually.""", Remember, your responses should be short. Just one or two sentences, usually.""",
) )
@@ -124,6 +144,7 @@ Remember, your responses should be short. Just one or two sentences, usually."""
# you can either register a single function for all function calls, or specific functions # you can either register a single function for all function calls, or specific functions
# llm.register_function(None, fetch_weather_from_api) # llm.register_function(None, fetch_weather_from_api)
llm.register_function("get_current_weather", fetch_weather_from_api) llm.register_function("get_current_weather", fetch_weather_from_api)
llm.register_function("get_restaurant_recommendation", fetch_restaurant_recommendation)
# Create a standard OpenAI LLM context object using the normal messages format. The # Create a standard OpenAI LLM context object using the normal messages format. The
# OpenAIRealtimeBetaLLMService will convert this internally to messages that the # OpenAIRealtimeBetaLLMService will convert this internally to messages that the

View File

@@ -40,11 +40,17 @@ async def fetch_weather_from_api(params: FunctionCallParams):
) )
async def fetch_restaurant_recommendation(params: FunctionCallParams):
await params.result_callback({"name": "The Golden Dragon"})
system_instruction = """ system_instruction = """
You are a helpful assistant who can answer questions and use tools. You are a helpful assistant who can answer questions and use tools.
You have a tool called "get_current_weather" that can be used to get the current weather. If the user asks You have three tools available to you:
for the weather, call this function. 1. get_current_weather: Use this tool to get the current weather in a specific location.
2. get_restaurant_recommendation: Use this tool to get a restaurant recommendation in a specific location.
3. google_search: Use this tool to search the web for information.
""" """
@@ -101,9 +107,21 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
}, },
required=["location", "format"], required=["location", "format"],
) )
restaurant_function = FunctionSchema(
name="get_restaurant_recommendation",
description="Get a restaurant recommendation",
properties={
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
},
required=["location"],
)
search_tool = {"google_search": {}} search_tool = {"google_search": {}}
tools = ToolsSchema( tools = ToolsSchema(
standard_tools=[weather_function], custom_tools={AdapterType.GEMINI: [search_tool]} standard_tools=[weather_function, restaurant_function],
custom_tools={AdapterType.GEMINI: [search_tool]},
) )
llm = GeminiMultimodalLiveLLMService( llm = GeminiMultimodalLiveLLMService(
@@ -113,6 +131,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si
) )
llm.register_function("get_current_weather", fetch_weather_from_api) llm.register_function("get_current_weather", fetch_weather_from_api)
llm.register_function("get_restaurant_recommendation", fetch_restaurant_recommendation)
context = OpenAILLMContext( context = OpenAILLMContext(
[{"role": "user", "content": "Say hello."}], [{"role": "user", "content": "Say hello."}],