Mark abstract image/vision generators as real async generators
`ImageGenService.run_image_gen` and `VisionService.run_vision` were declared `async def ... -> AsyncGenerator[Frame, None]` with `pass` bodies. Without a `yield` anywhere in the body, Python treats the function as a coroutine returning an `AsyncGenerator`, not as an async generator itself, so callers got a coroutine where they expected an iterator. Add `raise NotImplementedError; yield` so the body contains a yield (making this a real async generator) while still raising cleanly if a subclass ever calls `super().run_*` by mistake.
This commit is contained in:
@@ -76,7 +76,6 @@
|
|||||||
"src/pipecat/services/heygen/client.py",
|
"src/pipecat/services/heygen/client.py",
|
||||||
"src/pipecat/services/heygen/video.py",
|
"src/pipecat/services/heygen/video.py",
|
||||||
"src/pipecat/services/hume/tts.py",
|
"src/pipecat/services/hume/tts.py",
|
||||||
"src/pipecat/services/image_service.py",
|
|
||||||
"src/pipecat/services/inworld/realtime/llm.py",
|
"src/pipecat/services/inworld/realtime/llm.py",
|
||||||
"src/pipecat/services/inworld/tts.py",
|
"src/pipecat/services/inworld/tts.py",
|
||||||
"src/pipecat/services/kokoro/tts.py",
|
"src/pipecat/services/kokoro/tts.py",
|
||||||
@@ -115,7 +114,6 @@
|
|||||||
"src/pipecat/services/tavus/video.py",
|
"src/pipecat/services/tavus/video.py",
|
||||||
"src/pipecat/services/tts_service.py",
|
"src/pipecat/services/tts_service.py",
|
||||||
"src/pipecat/services/ultravox/llm.py",
|
"src/pipecat/services/ultravox/llm.py",
|
||||||
"src/pipecat/services/vision_service.py",
|
|
||||||
"src/pipecat/services/websocket_service.py",
|
"src/pipecat/services/websocket_service.py",
|
||||||
"src/pipecat/services/whisper/stt.py",
|
"src/pipecat/services/whisper/stt.py",
|
||||||
"src/pipecat/services/xai/realtime/events.py",
|
"src/pipecat/services/xai/realtime/events.py",
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ class ImageGenService(AIService):
|
|||||||
Frame: Frames containing the generated image (typically ImageRawFrame
|
Frame: Frames containing the generated image (typically ImageRawFrame
|
||||||
or URLImageRawFrame).
|
or URLImageRawFrame).
|
||||||
"""
|
"""
|
||||||
pass
|
raise NotImplementedError
|
||||||
|
yield # pragma: no cover
|
||||||
|
|
||||||
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
||||||
"""Process frames for image generation.
|
"""Process frames for image generation.
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ class VisionService(AIService):
|
|||||||
Frame: Frames containing the vision analysis results, typically TextFrame
|
Frame: Frames containing the vision analysis results, typically TextFrame
|
||||||
objects with descriptions or answers.
|
objects with descriptions or answers.
|
||||||
"""
|
"""
|
||||||
pass
|
raise NotImplementedError
|
||||||
|
yield # pragma: no cover
|
||||||
|
|
||||||
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
||||||
"""Process frames, handling vision image frames for analysis.
|
"""Process frames, handling vision image frames for analysis.
|
||||||
|
|||||||
Reference in New Issue
Block a user