-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Open
Labels
bugSomething isn't workingSomething isn't working
Description
What happened?
StreamListener crashes when _output_type is a Generic with the following error message:
TypeError: issubclass() arg 1 must be a classSteps to reproduce
MNE
import asyncio
import dspy
dspy.configure(lm=dspy.LM("openai/gpt-4o-mini", cache=False))
# Create the program and wrap it with streaming functionality
class Hello(dspy.Signature):
world: List[str] = dspy.OutputField()
predict = dspy.Predict(Hello)
stream_listeners = [
dspy.streaming.StreamListener(signature_field_name="world"),
]
stream_predict = dspy.streamify(predict, stream_listeners=stream_listeners)
async def use_streaming():
output = stream_predict(
question="why did a chicken cross the kitchen?",
include_final_prediction_in_output_stream=False,
)
return_value = None
async for value in output:
if isinstance(value, dspy.Prediction):
return_value = value
else:
print(value)
return return_value
output = asyncio.run(use_streaming())
print(output)this happens because issubclass expects a non-generic class.
dspy/dspy/streaming/streaming_listener.py
Line 138 in d42f29e
| if self._output_type and issubclass(self._output_type, Type) and self._output_type.is_streamable(): |
the following snippet shows the core components at work:
import dspy
from typing import List
class Hello(dspy.Signature):
world: List[str] = dspy.OutputField()
t=Hello.output_fields["world"].annotation
print(f"{t=}")
# Only call issubclass if t is actually a class
import inspect
if inspect.isclass(t):
issubclass(t, str)
else: print("not a class")it seem that an easy way to fix the issue would be to check if self._output_type is an instantiable class before running issubclass.
i'm bypassing that check entirely by overloading the _output_type property with type(str)
DSPy version
3.1.0b1
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working