fix: improve config loading resilience for non-localhost access (#510) (#658)

* fix: improve config loading resilience for non-localhost access (#510)

- Add DEFAULT_CONFIG fallback to always return valid config even if fetch fails
- Implement retry logic with exponential backoff (max 2 retries) to handle transient failures
- Add 5-second fetch timeout to prevent hanging on unreachable backends
- Improve error logging with clear messages about config fetch status
- Always return DeerFlowConfig (never null) to prevent UI rendering issues
- Add safety checks in input-box component to verify reasoning models before access
- Improve type safety: verify array length before accessing array indices
- Add comprehensive documentation in .env.example with examples for different deployment scenarios
- Document NEXT_PUBLIC_API_URL variable behavior and fallback mechanism

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: add nullish coalescing to prevent TypeScript error in input-box

- Add ?? operator to handle potential undefined value when accessing reasoning[0]
- Fixes TS2322 error: Type 'string | undefined' is not assignable to type 'string | number | Date'

---------

Co-authored-by: Willem Jiang <143703838+willem-bd@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Willem Jiang
2025-10-26 07:34:12 +08:00
committed by GitHub
parent c7a82b82b4
commit 0441038672
3 changed files with 80 additions and 16 deletions
+2 -2
View File
@@ -214,7 +214,7 @@ export function InputBox({
</div>
<div className="flex items-center px-4 py-2">
<div className="flex grow gap-2">
{config?.models.reasoning?.[0] && (
{config?.models?.reasoning && config.models.reasoning.length > 0 && (
<Tooltip
className="max-w-60"
title={
@@ -226,7 +226,7 @@ export function InputBox({
</h3>
<p>
{t("deepThinkingTooltip.description", {
model: config.models.reasoning?.[0] ?? "",
model: config.models.reasoning[0] ?? "",
})}
</p>
</div>