Nikita Titov
9f2ab37162
community[patch]: don't try to parse json in case of errored response ( #18317 )
...
Related issue: #13896 .
In case Ollama is behind a proxy, proxy error responses cannot be
viewed. You aren't even able to check response code.
For example, if your Ollama has basic access authentication and it's not
passed, `JSONDecodeError` will overwrite the truth response error.
<details>
<summary><b>Log now:</b></summary>
```
{
"name": "JSONDecodeError",
"message": "Expecting value: line 1 column 1 (char 0)",
"stack": "---------------------------------------------------------------------------
JSONDecodeError Traceback (most recent call last)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/requests/models.py:971, in Response.json(self, **kwargs)
970 try:
--> 971 return complexjson.loads(self.text, **kwargs)
972 except JSONDecodeError as e:
973 # Catch JSON-related errors and raise as requests.JSONDecodeError
974 # This aliases json.JSONDecodeError and simplejson.JSONDecodeError
File /opt/miniforge3/envs/.gpt/lib/python3.10/json/__init__.py:346, in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
343 if (cls is None and object_hook is None and
344 parse_int is None and parse_float is None and
345 parse_constant is None and object_pairs_hook is None and not kw):
--> 346 return _default_decoder.decode(s)
347 if cls is None:
File /opt/miniforge3/envs/.gpt/lib/python3.10/json/decoder.py:337, in JSONDecoder.decode(self, s, _w)
333 \"\"\"Return the Python representation of ``s`` (a ``str`` instance
334 containing a JSON document).
335
336 \"\"\"
--> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
338 end = _w(s, end).end()
File /opt/miniforge3/envs/.gpt/lib/python3.10/json/decoder.py:355, in JSONDecoder.raw_decode(self, s, idx)
354 except StopIteration as err:
--> 355 raise JSONDecodeError(\"Expecting value\", s, err.value) from None
356 return obj, end
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
During handling of the above exception, another exception occurred:
JSONDecodeError Traceback (most recent call last)
Cell In[3], line 1
----> 1 print(translate_func().invoke('text'))
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/runnables/base.py:2053, in RunnableSequence.invoke(self, input, config)
2051 try:
2052 for i, step in enumerate(self.steps):
-> 2053 input = step.invoke(
2054 input,
2055 # mark each step as a child run
2056 patch_config(
2057 config, callbacks=run_manager.get_child(f\"seq:step:{i+1}\")
2058 ),
2059 )
2060 # finish the root run
2061 except BaseException as e:
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:165, in BaseChatModel.invoke(self, input, config, stop, **kwargs)
154 def invoke(
155 self,
156 input: LanguageModelInput,
(...)
160 **kwargs: Any,
161 ) -> BaseMessage:
162 config = ensure_config(config)
163 return cast(
164 ChatGeneration,
--> 165 self.generate_prompt(
166 [self._convert_input(input)],
167 stop=stop,
168 callbacks=config.get(\"callbacks\"),
169 tags=config.get(\"tags\"),
170 metadata=config.get(\"metadata\"),
171 run_name=config.get(\"run_name\"),
172 **kwargs,
173 ).generations[0][0],
174 ).message
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:543, in BaseChatModel.generate_prompt(self, prompts, stop, callbacks, **kwargs)
535 def generate_prompt(
536 self,
537 prompts: List[PromptValue],
(...)
540 **kwargs: Any,
541 ) -> LLMResult:
542 prompt_messages = [p.to_messages() for p in prompts]
--> 543 return self.generate(prompt_messages, stop=stop, callbacks=callbacks, **kwargs)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:407, in BaseChatModel.generate(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)
405 if run_managers:
406 run_managers[i].on_llm_error(e, response=LLMResult(generations=[]))
--> 407 raise e
408 flattened_outputs = [
409 LLMResult(generations=[res.generations], llm_output=res.llm_output)
410 for res in results
411 ]
412 llm_output = self._combine_llm_outputs([res.llm_output for res in results])
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:397, in BaseChatModel.generate(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)
394 for i, m in enumerate(messages):
395 try:
396 results.append(
--> 397 self._generate_with_cache(
398 m,
399 stop=stop,
400 run_manager=run_managers[i] if run_managers else None,
401 **kwargs,
402 )
403 )
404 except BaseException as e:
405 if run_managers:
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:576, in BaseChatModel._generate_with_cache(self, messages, stop, run_manager, **kwargs)
572 raise ValueError(
573 \"Asked to cache, but no cache found at `langchain.cache`.\"
574 )
575 if new_arg_supported:
--> 576 return self._generate(
577 messages, stop=stop, run_manager=run_manager, **kwargs
578 )
579 else:
580 return self._generate(messages, stop=stop, **kwargs)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_community/chat_models/ollama.py:250, in ChatOllama._generate(self, messages, stop, run_manager, **kwargs)
226 def _generate(
227 self,
228 messages: List[BaseMessage],
(...)
231 **kwargs: Any,
232 ) -> ChatResult:
233 \"\"\"Call out to Ollama's generate endpoint.
234
235 Args:
(...)
247 ])
248 \"\"\"
--> 250 final_chunk = self._chat_stream_with_aggregation(
251 messages,
252 stop=stop,
253 run_manager=run_manager,
254 verbose=self.verbose,
255 **kwargs,
256 )
257 chat_generation = ChatGeneration(
258 message=AIMessage(content=final_chunk.text),
259 generation_info=final_chunk.generation_info,
260 )
261 return ChatResult(generations=[chat_generation])
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_community/chat_models/ollama.py:183, in ChatOllama._chat_stream_with_aggregation(self, messages, stop, run_manager, verbose, **kwargs)
174 def _chat_stream_with_aggregation(
175 self,
176 messages: List[BaseMessage],
(...)
180 **kwargs: Any,
181 ) -> ChatGenerationChunk:
182 final_chunk: Optional[ChatGenerationChunk] = None
--> 183 for stream_resp in self._create_chat_stream(messages, stop, **kwargs):
184 if stream_resp:
185 chunk = _chat_stream_response_to_chat_generation_chunk(stream_resp)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_community/chat_models/ollama.py:156, in ChatOllama._create_chat_stream(self, messages, stop, **kwargs)
147 def _create_chat_stream(
148 self,
149 messages: List[BaseMessage],
150 stop: Optional[List[str]] = None,
151 **kwargs: Any,
152 ) -> Iterator[str]:
153 payload = {
154 \"messages\": self._convert_messages_to_ollama_messages(messages),
155 }
--> 156 yield from self._create_stream(
157 payload=payload, stop=stop, api_url=f\"{self.base_url}/api/chat/\", **kwargs
158 )
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_community/llms/ollama.py:234, in _OllamaCommon._create_stream(self, api_url, payload, stop, **kwargs)
228 raise OllamaEndpointNotFoundError(
229 \"Ollama call failed with status code 404. \"
230 \"Maybe your model is not found \"
231 f\"and you should pull the model with `ollama pull {self.model}`.\"
232 )
233 else:
--> 234 optional_detail = response.json().get(\"error\")
235 raise ValueError(
236 f\"Ollama call failed with status code {response.status_code}.\"
237 f\" Details: {optional_detail}\"
238 )
239 return response.iter_lines(decode_unicode=True)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/requests/models.py:975, in Response.json(self, **kwargs)
971 return complexjson.loads(self.text, **kwargs)
972 except JSONDecodeError as e:
973 # Catch JSON-related errors and raise as requests.JSONDecodeError
974 # This aliases json.JSONDecodeError and simplejson.JSONDecodeError
--> 975 raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
JSONDecodeError: Expecting value: line 1 column 1 (char 0)"
}
```
</details>
<details>
<summary><b>Log after a fix:</b></summary>
```
{
"name": "ValueError",
"message": "Ollama call failed with status code 401. Details: <html>\r
<head><title>401 Authorization Required</title></head>\r
<body>\r
<center><h1>401 Authorization Required</h1></center>\r
<hr><center>nginx/1.18.0 (Ubuntu)</center>\r
</body>\r
</html>\r
",
"stack": "---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[2], line 1
----> 1 print(translate_func().invoke('text'))
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/runnables/base.py:2053, in RunnableSequence.invoke(self, input, config)
2051 try:
2052 for i, step in enumerate(self.steps):
-> 2053 input = step.invoke(
2054 input,
2055 # mark each step as a child run
2056 patch_config(
2057 config, callbacks=run_manager.get_child(f\"seq:step:{i+1}\")
2058 ),
2059 )
2060 # finish the root run
2061 except BaseException as e:
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:165, in BaseChatModel.invoke(self, input, config, stop, **kwargs)
154 def invoke(
155 self,
156 input: LanguageModelInput,
(...)
160 **kwargs: Any,
161 ) -> BaseMessage:
162 config = ensure_config(config)
163 return cast(
164 ChatGeneration,
--> 165 self.generate_prompt(
166 [self._convert_input(input)],
167 stop=stop,
168 callbacks=config.get(\"callbacks\"),
169 tags=config.get(\"tags\"),
170 metadata=config.get(\"metadata\"),
171 run_name=config.get(\"run_name\"),
172 **kwargs,
173 ).generations[0][0],
174 ).message
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:543, in BaseChatModel.generate_prompt(self, prompts, stop, callbacks, **kwargs)
535 def generate_prompt(
536 self,
537 prompts: List[PromptValue],
(...)
540 **kwargs: Any,
541 ) -> LLMResult:
542 prompt_messages = [p.to_messages() for p in prompts]
--> 543 return self.generate(prompt_messages, stop=stop, callbacks=callbacks, **kwargs)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:407, in BaseChatModel.generate(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)
405 if run_managers:
406 run_managers[i].on_llm_error(e, response=LLMResult(generations=[]))
--> 407 raise e
408 flattened_outputs = [
409 LLMResult(generations=[res.generations], llm_output=res.llm_output)
410 for res in results
411 ]
412 llm_output = self._combine_llm_outputs([res.llm_output for res in results])
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:397, in BaseChatModel.generate(self, messages, stop, callbacks, tags, metadata, run_name, **kwargs)
394 for i, m in enumerate(messages):
395 try:
396 results.append(
--> 397 self._generate_with_cache(
398 m,
399 stop=stop,
400 run_manager=run_managers[i] if run_managers else None,
401 **kwargs,
402 )
403 )
404 except BaseException as e:
405 if run_managers:
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:576, in BaseChatModel._generate_with_cache(self, messages, stop, run_manager, **kwargs)
572 raise ValueError(
573 \"Asked to cache, but no cache found at `langchain.cache`.\"
574 )
575 if new_arg_supported:
--> 576 return self._generate(
577 messages, stop=stop, run_manager=run_manager, **kwargs
578 )
579 else:
580 return self._generate(messages, stop=stop, **kwargs)
File /opt/miniforge3/envs/.gpt/lib/python3.10/site-packages/langchain_community/chat_models/ollama.py:250, in ChatOllama._generate(self, messages, stop, run_manager, **kwargs)
226 def _generate(
227 self,
228 messages: List[BaseMessage],
(...)
231 **kwargs: Any,
232 ) -> ChatResult:
233 \"\"\"Call out to Ollama's generate endpoint.
234
235 Args:
(...)
247 ])
248 \"\"\"
--> 250 final_chunk = self._chat_stream_with_aggregation(
251 messages,
252 stop=stop,
253 run_manager=run_manager,
254 verbose=self.verbose,
255 **kwargs,
256 )
257 chat_generation = ChatGeneration(
258 message=AIMessage(content=final_chunk.text),
259 generation_info=final_chunk.generation_info,
260 )
261 return ChatResult(generations=[chat_generation])
File /storage/gpt-project/Repos/repo_nikita/gpt_lib/langchain/ollama.py:328, in ChatOllamaCustom._chat_stream_with_aggregation(self, messages, stop, run_manager, verbose, **kwargs)
319 def _chat_stream_with_aggregation(
320 self,
321 messages: List[BaseMessage],
(...)
325 **kwargs: Any,
326 ) -> ChatGenerationChunk:
327 final_chunk: Optional[ChatGenerationChunk] = None
--> 328 for stream_resp in self._create_chat_stream(messages, stop, **kwargs):
329 if stream_resp:
330 chunk = _chat_stream_response_to_chat_generation_chunk(stream_resp)
File /storage/gpt-project/Repos/repo_nikita/gpt_lib/langchain/ollama.py:301, in ChatOllamaCustom._create_chat_stream(self, messages, stop, **kwargs)
292 def _create_chat_stream(
293 self,
294 messages: List[BaseMessage],
295 stop: Optional[List[str]] = None,
296 **kwargs: Any,
297 ) -> Iterator[str]:
298 payload = {
299 \"messages\": self._convert_messages_to_ollama_messages(messages),
300 }
--> 301 yield from self._create_stream(
302 payload=payload, stop=stop, api_url=f\"{self.base_url}/api/chat\", **kwargs
303 )
File /storage/gpt-project/Repos/repo_nikita/gpt_lib/langchain/ollama.py:134, in _OllamaCommonCustom._create_stream(self, api_url, payload, stop, **kwargs)
132 else:
133 optional_detail = response.text
--> 134 raise ValueError(
135 f\"Ollama call failed with status code {response.status_code}.\"
136 f\" Details: {optional_detail}\"
137 )
138 return response.iter_lines(decode_unicode=True)
ValueError: Ollama call failed with status code 401. Details: <html>\r
<head><title>401 Authorization Required</title></head>\r
<body>\r
<center><h1>401 Authorization Required</h1></center>\r
<hr><center>nginx/1.18.0 (Ubuntu)</center>\r
</body>\r
</html>\r
"
}
```
</details>
The same is true for timeout errors or when you simply mistyped in
`base_url` arg and get response from some other service, for instance.
Real Ollama errors are still clearly readable:
```
ValueError: Ollama call failed with status code 400. Details: {"error":"invalid options: unknown_option"}
```
---------
Co-authored-by: Bagatur <baskaryan@gmail.com>
2024-03-01 12:17:29 -08:00