Fixed an issue that start_callback was not invoked for some LLM services.

This commit is contained in:
Filipi Fuchter
2025-02-19 18:04:20 -03:00
parent c948754eff
commit 7e7926059c
4 changed files with 11 additions and 2 deletions

View File

@@ -27,6 +27,8 @@ stt = DeepgramSTTService(..., live_options=LiveOptions(model="nova-2-general"))
### Fixed ### Fixed
- Fixed an issue that `start_callback` was not invoked for some LLM services.
- Fixed an issue that would cause `DeepgramSTTService` to stop working after an - Fixed an issue that would cause `DeepgramSTTService` to stop working after an
error occurred (e.g. sudden network loss). If the network recovered we would error occurred (e.g. sudden network loss). If the network recovered we would
not reconnect. not reconnect.

View File

@@ -14,6 +14,7 @@ from loguru import logger
from runner import configure from runner import configure
from pipecat.audio.vad.silero import SileroVADAnalyzer from pipecat.audio.vad.silero import SileroVADAnalyzer
from pipecat.frames.frames import TTSSpeakFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
@@ -30,6 +31,12 @@ logger.add(sys.stderr, level="DEBUG")
video_participant_id = None video_participant_id = None
async def start_fetch_weather(function_name, llm, context):
"""Push a frame to the LLM; this is handy when the LLM response might take a while."""
await llm.push_frame(TTSSpeakFrame("Let me check on that."))
logger.debug(f"Starting fetch_weather_from_api with function_name: {function_name}")
async def get_weather(function_name, tool_call_id, arguments, llm, context, result_callback): async def get_weather(function_name, tool_call_id, arguments, llm, context, result_callback):
location = arguments["location"] location = arguments["location"]
await result_callback(f"The weather in {location} is currently 72 degrees and sunny.") await result_callback(f"The weather in {location} is currently 72 degrees and sunny.")
@@ -63,7 +70,7 @@ async def main():
) )
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, start_fetch_weather)
llm.register_function("get_image", get_image) llm.register_function("get_image", get_image)
tools = [ tools = [

View File

@@ -175,6 +175,7 @@ class LLMService(AIService):
f = self._callbacks[None] f = self._callbacks[None]
else: else:
return None return None
await self.call_start_function(context, function_name)
await context.call_function( await context.call_function(
f, f,
function_name=function_name, function_name=function_name,

View File

@@ -266,7 +266,6 @@ class BaseOpenAILLMService(LLMService):
if tool_call.function and tool_call.function.name: if tool_call.function and tool_call.function.name:
function_name += tool_call.function.name function_name += tool_call.function.name
tool_call_id = tool_call.id tool_call_id = tool_call.id
await self.call_start_function(context, function_name)
if tool_call.function and tool_call.function.arguments: if tool_call.function and tool_call.function.arguments:
# Keep iterating through the response to collect all the argument fragments # Keep iterating through the response to collect all the argument fragments
arguments += tool_call.function.arguments arguments += tool_call.function.arguments