refactor(ai-client): unify OpenAI-compatible path to AI SDK generateText

Eliminate the dual code path (raw fetch vs AI SDK) for text and vision.
All providers now go through createLanguageModel() + generateText(),
removing chatOpenAiCompatible/analyzeOpenAiCompatible, the manual Usage
type, summarizeUsage, and responseFormat plumbing from 8 call sites.

Key fix: @ai-sdk/openai v3 defaults to the Responses API (/responses);
DeepSeek only supports Chat Completions, so we use .chat() explicitly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
yuanzonghao
2026-06-07 00:31:36 +08:00
parent 04b869eed0
commit 57bc6556ab
8 changed files with 40 additions and 239 deletions
+1 -1
View File
@@ -53,7 +53,7 @@ export async function runArchitect(
{ role: "system", content: ARCHITECT_SYSTEM },
{ role: "user", content: buildArchitectUserMessage(session) },
],
{ temperature: 0.85, responseFormat: "json_object", tag: "architect" },
{ temperature: 0.85, tag: "architect" },
);
const parsed = parseJsonLoose<RawStoryState>(raw);
+1 -1
View File
@@ -56,7 +56,7 @@ async function runDesignLLM(
content: buildCharacterDesignerUserMessage(charName, session),
},
],
{ temperature: 0.7, responseFormat: "json_object", tag: "character-designer" },
{ temperature: 0.7, tag: "character-designer" },
);
return parseJsonLoose<CharacterDesignOutput>(raw);
}
+1 -1
View File
@@ -67,7 +67,7 @@ export async function runCinematographer(
),
},
],
{ temperature: 0.6, responseFormat: "json_object", tag: "cinematographer" },
{ temperature: 0.6, tag: "cinematographer" },
);
const parsed = parseJsonLoose<RawCinematographerOutput>(raw);
+2 -2
View File
@@ -423,7 +423,7 @@ export async function runWriterPlan(
{ role: "system", content: WRITER_PLAN_SYSTEM },
{ role: "user", content: buildWriterPlanUserMessage(session) },
],
{ temperature: 0.9, responseFormat: "json_object", tag: "writer-plan" },
{ temperature: 0.9, tag: "writer-plan" },
);
const parsed = parseJsonLoose<RawPlan>(raw);
@@ -473,7 +473,7 @@ export async function runWriterBeats(
{ role: "system", content: WRITER_BEATS_SYSTEM },
{ role: "user", content: buildWriterBeatsUserMessage(session, plan) },
],
{ temperature: 0.9, responseFormat: "json_object", tag: "writer-beats" },
{ temperature: 0.9, tag: "writer-beats" },
);
const parsed = parseJsonLoose<RawBeats>(raw);
+1 -1
View File
@@ -446,7 +446,7 @@ export async function directInsertBeat(
content: buildInsertBeatUserMessage(session, freeformAction),
},
],
{ temperature: 0.9, responseFormat: "json_object", tag: "insert-beat" },
{ temperature: 0.9, tag: "insert-beat" },
);
const parsed = parseJsonLoose<InsertBeatPartial>(raw);