Browse Source

Fix OpenRouter usage with better error handling

Saoud Rizwan 1 year ago
parent
commit
ecc5eb30a5
2 changed files with 13 additions and 1 deletions
  1. 7 1
      src/api/openrouter.ts
  2. 6 0
      webview-ui/src/components/ChatView.tsx

+ 7 - 1
src/api/openrouter.ts

@@ -54,6 +54,11 @@ export class OpenRouterHandler implements ApiHandler {
 			tool_choice: "auto",
 		})
 
+		const errorMessage = (completion as any).error?.message // openrouter returns an error object instead of the openai sdk throwing an error
+		if (errorMessage) {
+			throw new Error(errorMessage)
+		}
+
 		// Convert OpenAI response to Anthropic format
 		const openAiMessage = completion.choices[0].message
 		const anthropicMessage: Anthropic.Messages.Message = {
@@ -246,7 +251,8 @@ export class OpenRouterHandler implements ApiHandler {
 					openAiMessages.push({
 						role: "assistant",
 						content,
-						tool_calls,
+						// Cannot be an empty array. API expects an array with minimum length 1, and will respond with an error if it's empty
+						tool_calls: tool_calls.length > 0 ? tool_calls : undefined,
 					})
 				}
 			}

+ 6 - 0
webview-ui/src/components/ChatView.tsx

@@ -395,6 +395,12 @@ const ChatView = ({
 				case "api_req_finished": // combineApiRequests removes this from modifiedMessages anyways
 				case "api_req_retried": // this message is used to update the latest api_req_started that the request was retried
 					return false
+				case "text":
+					// Sometimes Claude returns an empty text message, we don't want to render these. (We also use a say text for user messages, so in case they just sent images we still render that)
+					if ((message.text ?? "") === "" && (message.images?.length ?? 0) === 0) {
+						return false
+					}
+					break
 			}
 			return true
 		})