diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 8c625e85..9f0ff6db 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -50,7 +50,7 @@ export default defineConfig({ } }, optimizeDeps: { - exclude: ['chunk-PZ64DZKH.js'] + exclude: ['chunk-PZ64DZKH.js', 'chunk-JMKENWIY.js'] } } }) diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index 9f0da4f1..1b863f29 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -225,7 +225,7 @@ export default class OpenAIProvider extends BaseProvider { onChunk({ text: delta?.content || '', // @ts-ignore key is not typed - reasoning_content: delta?.reasoning_content || delta.reasoning || '', + reasoning_content: delta?.reasoning_content || delta?.reasoning || '', usage: chunk.usage, metrics: { completion_tokens: chunk.usage?.completion_tokens, diff --git a/src/renderer/src/services/ApiService.ts b/src/renderer/src/services/ApiService.ts index ac4d7ec1..e08fa4f7 100644 --- a/src/renderer/src/services/ApiService.ts +++ b/src/renderer/src/services/ApiService.ts @@ -2,6 +2,7 @@ import i18n from '@renderer/i18n' import store from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import { Assistant, Message, Model, Provider, Suggestion } from '@renderer/types' +import { formatErrorMessage } from '@renderer/utils/error' import { isEmpty } from 'lodash' import AiProvider from '../providers/AiProvider' @@ -241,11 +242,3 @@ export async function fetchModels(provider: Provider) { return [] } } - -function formatErrorMessage(error: any): string { - try { - return '```json\n' + JSON.stringify(error, null, 2) + '\n```' - } catch (e) { - return 'Error: ' + error?.message - } -} diff --git a/src/renderer/src/utils/error.ts b/src/renderer/src/utils/error.ts new file mode 100644 index 00000000..f3bc7c9b --- /dev/null +++ b/src/renderer/src/utils/error.ts @@ -0,0 +1,41 @@ +export function getErrorDetails(err: any, seen = new WeakSet()): any { + // Handle circular references + if (err === null || typeof err !== 'object' || seen.has(err)) { + return err + } + + seen.add(err) + const result: any = {} + + // Get all enumerable properties, including those from the prototype chain + const allProps = new Set([...Object.getOwnPropertyNames(err), ...Object.keys(err)]) + + for (const prop of allProps) { + try { + const value = err[prop] + // Skip function properties + if (typeof value === 'function') continue + // Recursively process nested objects + result[prop] = getErrorDetails(value, seen) + } catch (e) { + result[prop] = '' + } + } + + return result +} + +export function formatErrorMessage(error: any): string { + console.error('Original error:', error) + + try { + const detailedError = getErrorDetails(error) + return '```json\n' + JSON.stringify(detailedError, null, 2) + '\n```' + } catch (e) { + try { + return '```\n' + String(error) + '\n```' + } catch { + return 'Error: Unable to format error message' + } + } +}