Skip to content

Commit 0472509

Browse files
shantanu patilclaude
authored andcommitted
Fix empty provider in all endpoints + add 28 regression tests
The previous fix only covered websocket_wiki.py, but the same empty provider bug existed in simple_chat.py (HTTP fallback) and in the frontend's generatePageContent/regeneratePage functions. When WebSocket page generation failed and fell back to HTTP, simple_chat.py crashed with the same "Configuration for provider '' not found" error. Fixes: - api/simple_chat.py: add same default provider fallback as websocket - useWikiGeneration.ts: resolve provider in generatePageContent and regeneratePage (not just determineWikiStructure) Tests (28 new): - Provider fallback: empty string, missing, explicit, invalid - Config: get_model_config with empty/invalid/default providers - Diagram schema: backward compat with/without new fields - Diagram extraction: simplified source, validation, malformed JSON, multiple blocks, no markers - Wiki structure parser: XML, JSON, code-fenced, unescaped ampersands, sections, wrapped JSON, empty/garbage input - Mermaid node counting: flowcharts, keyword exclusion, empty source Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 040f798 commit 0472509

3 files changed

Lines changed: 509 additions & 2 deletions

File tree

api/simple_chat.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ class ChatCompletionRequest(BaseModel):
7777
async def chat_completions_stream(request: ChatCompletionRequest):
7878
"""Stream a chat completion response directly using Google Generative AI"""
7979
try:
80+
# Fall back to default provider if none specified
81+
if not request.provider:
82+
from api.config import configs as app_configs
83+
request.provider = app_configs.get("default_provider", "google")
84+
logger.info(f"No provider specified, falling back to default: {request.provider}")
85+
if not request.model:
86+
request.model = None # Let get_model_config pick the default
87+
8088
# Check if request contains very large input
8189
input_too_large = False
8290
if request.messages and len(request.messages) > 0:

src/hooks/useWikiGeneration.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,22 @@ export function useWikiGeneration(params: UseWikiGenerationParams): UseWikiGener
154154

155155
activeContentRequests.set(page.id, true);
156156

157+
// Resolve provider if still empty (race condition with useModelSelection async fetch)
158+
let resolvedProvider = selectedProviderState;
159+
if (!resolvedProvider) {
160+
try {
161+
const res = await fetch('/api/models/config');
162+
if (res.ok) {
163+
const data = await res.json();
164+
resolvedProvider = data.defaultProvider || 'google';
165+
} else {
166+
resolvedProvider = 'google';
167+
}
168+
} catch {
169+
resolvedProvider = 'google';
170+
}
171+
}
172+
157173
if (!owner || !repo) {
158174
throw new Error('Invalid repository information. Owner and repo name are required.');
159175
}
@@ -313,7 +329,7 @@ Remember:
313329
}]
314330
};
315331

316-
addTokensToRequestBody(requestBody, currentToken, effectiveRepoInfo.type, selectedProviderState, selectedModelState, isCustomSelectedModelState, customSelectedModelState, language, modelExcludedDirs, modelExcludedFiles, modelIncludedDirs, modelIncludedFiles);
332+
addTokensToRequestBody(requestBody, currentToken, effectiveRepoInfo.type, resolvedProvider, selectedModelState, isCustomSelectedModelState, customSelectedModelState, language, modelExcludedDirs, modelExcludedFiles, modelIncludedDirs, modelIncludedFiles);
317333

318334
let content = '';
319335

@@ -1042,6 +1058,22 @@ IMPORTANT:
10421058
try {
10431059
const modelToUse = isCustomSelectedModelState ? customSelectedModelState : selectedModelState;
10441060

1061+
// Resolve provider if still empty
1062+
let resolvedProvider = selectedProviderState;
1063+
if (!resolvedProvider) {
1064+
try {
1065+
const res = await fetch('/api/models/config');
1066+
if (res.ok) {
1067+
const data = await res.json();
1068+
resolvedProvider = data.defaultProvider || 'google';
1069+
} else {
1070+
resolvedProvider = 'google';
1071+
}
1072+
} catch {
1073+
resolvedProvider = 'google';
1074+
}
1075+
}
1076+
10451077
const response = await fetch('/api/wiki/regenerate_page', {
10461078
method: 'POST',
10471079
headers: { 'Content-Type': 'application/json' },
@@ -1051,7 +1083,7 @@ IMPORTANT:
10511083
repo_type: repoType,
10521084
page_id: pageId,
10531085
language,
1054-
provider: selectedProviderState,
1086+
provider: resolvedProvider,
10551087
model: modelToUse,
10561088
custom_model: isCustomSelectedModelState ? customSelectedModelState : undefined,
10571089
access_token: currentToken || undefined,

0 commit comments

Comments
 (0)