Updated the examples which use UserImageRequestFrame to defer the function call result.
This commit is contained in:
@@ -48,14 +48,16 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
When called, this function pushes a UserImageRequestFrame upstream to the
|
When called, this function pushes a UserImageRequestFrame upstream to the
|
||||||
transport. As a result, the transport will request the user image and push a
|
transport. As a result, the transport will request the user image and push a
|
||||||
UserImageRawFrame downstream which will be added to the context by the LLM
|
UserImageRawFrame downstream which will be added to the context by the LLM
|
||||||
assistant aggregator.
|
assistant aggregator. The result_callback will be invoked once the image is
|
||||||
|
retrieved and processed.
|
||||||
"""
|
"""
|
||||||
user_id = params.arguments["user_id"]
|
user_id = params.arguments["user_id"]
|
||||||
question = params.arguments["question"]
|
question = params.arguments["question"]
|
||||||
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
||||||
|
|
||||||
# Request a user image frame and indicate that it should be added to the
|
# Request a user image frame and indicate that it should be added to the
|
||||||
# context. Also associate it to the function call.
|
# context. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -63,16 +65,11 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
append_to_context=True,
|
append_to_context=True,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@@ -48,14 +48,16 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
When called, this function pushes a UserImageRequestFrame upstream to the
|
When called, this function pushes a UserImageRequestFrame upstream to the
|
||||||
transport. As a result, the transport will request the user image and push a
|
transport. As a result, the transport will request the user image and push a
|
||||||
UserImageRawFrame downstream which will be added to the context by the LLM
|
UserImageRawFrame downstream which will be added to the context by the LLM
|
||||||
assistant aggregator.
|
assistant aggregator. The result_callback will be invoked once the image is
|
||||||
|
retrieved and processed.
|
||||||
"""
|
"""
|
||||||
user_id = params.arguments["user_id"]
|
user_id = params.arguments["user_id"]
|
||||||
question = params.arguments["question"]
|
question = params.arguments["question"]
|
||||||
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
||||||
|
|
||||||
# Request a user image frame and indicate that it should be added to the
|
# Request a user image frame and indicate that it should be added to the
|
||||||
# context. Also associate it to the function call.
|
# context. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -63,16 +65,11 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
append_to_context=True,
|
append_to_context=True,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@@ -48,14 +48,16 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
When called, this function pushes a UserImageRequestFrame upstream to the
|
When called, this function pushes a UserImageRequestFrame upstream to the
|
||||||
transport. As a result, the transport will request the user image and push a
|
transport. As a result, the transport will request the user image and push a
|
||||||
UserImageRawFrame downstream which will be added to the context by the LLM
|
UserImageRawFrame downstream which will be added to the context by the LLM
|
||||||
assistant aggregator.
|
assistant aggregator. The result_callback will be invoked once the image is
|
||||||
|
retrieved and processed.
|
||||||
"""
|
"""
|
||||||
user_id = params.arguments["user_id"]
|
user_id = params.arguments["user_id"]
|
||||||
question = params.arguments["question"]
|
question = params.arguments["question"]
|
||||||
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
||||||
|
|
||||||
# Request a user image frame and indicate that it should be added to the
|
# Request a user image frame and indicate that it should be added to the
|
||||||
# context. Also associate it to the function call.
|
# context. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -63,16 +65,11 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
append_to_context=True,
|
append_to_context=True,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
|
|
||||||
When called, this function pushes a UserImageRequestFrame upstream to the
|
When called, this function pushes a UserImageRequestFrame upstream to the
|
||||||
transport. As a result, the transport will request the user image and push a
|
transport. As a result, the transport will request the user image and push a
|
||||||
UserImageRawFrame downstream.
|
UserImageRawFrame downstream. The result_callback will be invoked once the
|
||||||
|
image is retrieved and processed.
|
||||||
"""
|
"""
|
||||||
user_id = params.arguments["user_id"]
|
user_id = params.arguments["user_id"]
|
||||||
question = params.arguments["question"]
|
question = params.arguments["question"]
|
||||||
@@ -65,7 +66,8 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
|
|
||||||
# Request a user image frame. In this case, we don't want the requested
|
# Request a user image frame. In this case, we don't want the requested
|
||||||
# image to be added to the context because we will process it with
|
# image to be added to the context because we will process it with
|
||||||
# Moondream. Also associate it to the function call.
|
# Moondream. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -73,16 +75,11 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
append_to_context=False,
|
append_to_context=False,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
class MoondreamTextFrameWrapper(FrameProcessor):
|
class MoondreamTextFrameWrapper(FrameProcessor):
|
||||||
"""Wraps Moondream-provided TextFrames with LLM response start/end frames.
|
"""Wraps Moondream-provided TextFrames with LLM response start/end frames.
|
||||||
|
|||||||
@@ -49,14 +49,16 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
When called, this function pushes a UserImageRequestFrame upstream to the
|
When called, this function pushes a UserImageRequestFrame upstream to the
|
||||||
transport. As a result, the transport will request the user image and push a
|
transport. As a result, the transport will request the user image and push a
|
||||||
UserImageRawFrame downstream which will be added to the context by the LLM
|
UserImageRawFrame downstream which will be added to the context by the LLM
|
||||||
assistant aggregator.
|
assistant aggregator. The result_callback will be invoked once the image is
|
||||||
|
retrieved and processed.
|
||||||
"""
|
"""
|
||||||
user_id = params.arguments["user_id"]
|
user_id = params.arguments["user_id"]
|
||||||
question = params.arguments["question"]
|
question = params.arguments["question"]
|
||||||
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
||||||
|
|
||||||
# Request a user image frame and indicate that it should be added to the
|
# Request a user image frame and indicate that it should be added to the
|
||||||
# context. Also associate it to the function call.
|
# context. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -64,16 +66,11 @@ async def fetch_user_image(params: FunctionCallParams):
|
|||||||
append_to_context=True,
|
append_to_context=True,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@@ -58,14 +58,16 @@ async def get_image(params: FunctionCallParams):
|
|||||||
When called, this function pushes a UserImageRequestFrame upstream to the
|
When called, this function pushes a UserImageRequestFrame upstream to the
|
||||||
transport. As a result, the transport will request the user image and push a
|
transport. As a result, the transport will request the user image and push a
|
||||||
UserImageRawFrame downstream which will be added to the context by the LLM
|
UserImageRawFrame downstream which will be added to the context by the LLM
|
||||||
assistant aggregator.
|
assistant aggregator. The result_callback will be invoked once the image is
|
||||||
|
retrieved and processed.
|
||||||
"""
|
"""
|
||||||
user_id = params.arguments["user_id"]
|
user_id = params.arguments["user_id"]
|
||||||
question = params.arguments["question"]
|
question = params.arguments["question"]
|
||||||
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
||||||
|
|
||||||
# Request a user image frame and indicate that it should be added to the
|
# Request a user image frame and indicate that it should be added to the
|
||||||
# context. Also associate it to the function call.
|
# context. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -73,16 +75,11 @@ async def get_image(params: FunctionCallParams):
|
|||||||
append_to_context=True,
|
append_to_context=True,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
@@ -66,7 +66,8 @@ async def get_image(params: FunctionCallParams):
|
|||||||
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
logger.debug(f"Requesting image with user_id={user_id}, question={question}")
|
||||||
|
|
||||||
# Request a user image frame and indicate that it should be added to the
|
# Request a user image frame and indicate that it should be added to the
|
||||||
# context. Also associate it to the function call.
|
# context. Also associate it to the function call. Pass the result_callback
|
||||||
|
# so it can be invoked when the image is actually retrieved.
|
||||||
await params.llm.push_frame(
|
await params.llm.push_frame(
|
||||||
UserImageRequestFrame(
|
UserImageRequestFrame(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
@@ -74,16 +75,11 @@ async def get_image(params: FunctionCallParams):
|
|||||||
append_to_context=True,
|
append_to_context=True,
|
||||||
function_name=params.function_name,
|
function_name=params.function_name,
|
||||||
tool_call_id=params.tool_call_id,
|
tool_call_id=params.tool_call_id,
|
||||||
|
result_callback=params.result_callback,
|
||||||
),
|
),
|
||||||
FrameDirection.UPSTREAM,
|
FrameDirection.UPSTREAM,
|
||||||
)
|
)
|
||||||
|
|
||||||
await params.result_callback(None)
|
|
||||||
|
|
||||||
# Instead of None, it's possible to also provide a tool call answer to
|
|
||||||
# tell the LLM that we are grabbing the image to analyze.
|
|
||||||
# await params.result_callback({"result": "Image is being captured."})
|
|
||||||
|
|
||||||
|
|
||||||
async def get_saved_conversation_filenames(params: FunctionCallParams):
|
async def get_saved_conversation_filenames(params: FunctionCallParams):
|
||||||
# Construct the full pattern including the BASE_FILENAME
|
# Construct the full pattern including the BASE_FILENAME
|
||||||
|
|||||||
Reference in New Issue
Block a user