@@ -151,6 +151,10 @@ def from_dict(cls, d: Dict[str, Any]) -> "ChatMessage":
151151 args_dict = json .loads (raw_args )
152152 except json .JSONDecodeError :
153153 raise ValueError (f"Tool call arguments are not valid JSON: { raw_args !r} " )
154+ if not isinstance (args_dict , dict ):
155+ raise ValueError (
156+ f"Tool call arguments must be a JSON object, got { type (args_dict ).__name__ } : { raw_args !r} "
157+ )
154158 else :
155159 args_dict = raw_args
156160
@@ -165,13 +169,17 @@ def from_dict(cls, d: Dict[str, Any]) -> "ChatMessage":
165169 )
166170 )
167171
172+ _standard_keys = {"role" , "content" , "tool_calls" , "tool_call_id" , "name" , "provider_metadata" }
173+ extra = {k : v for k , v in d .items () if k not in _standard_keys }
174+ provider_metadata = {** d .get ("provider_metadata" , {}), ** extra }
175+
168176 return cls (
169177 role = role ,
170178 content = d .get ("content" ),
171179 tool_calls = tool_calls ,
172180 tool_call_id = d .get ("tool_call_id" ),
173181 name = d .get ("name" ),
174- provider_metadata = d . get ( " provider_metadata" , {}) ,
182+ provider_metadata = provider_metadata ,
175183 )
176184
177185
@@ -221,7 +229,7 @@ async def generate(
221229 ** kwargs ,
222230 ) -> "LLMResponse" : ...
223231
224- async def stream (
232+ def stream (
225233 self ,
226234 prompt : Union [str , List ["ChatMessage" ]],
227235 * ,
0 commit comments