diff --git a/src/app/api/llm/__tests__/route.test.ts b/src/app/api/llm/__tests__/route.test.ts index aac84910..35a59c16 100644 --- a/src/app/api/llm/__tests__/route.test.ts +++ b/src/app/api/llm/__tests__/route.test.ts @@ -479,6 +479,11 @@ describe("/api/llm route", () => { provider: "popiserver", model: "kimi-k2.6", images: ["https://static.popi.art/uploads/input.png"], + parameters: { + temperature: 0.7, + maxTokens: 8192, + max_tokens: 8192, + }, }); const response = await POST(request); @@ -492,6 +497,8 @@ describe("/api/llm route", () => { expect.objectContaining({ method: "POST", body: JSON.stringify({ + maxTokens: 8192, + max_tokens: 8192, messages: [ { role: "system", content: "You are a helpful assistant." }, { diff --git a/src/app/api/llm/route.ts b/src/app/api/llm/route.ts index 046cef82..31894037 100644 --- a/src/app/api/llm/route.ts +++ b/src/app/api/llm/route.ts @@ -45,9 +45,14 @@ const NEWAPIWG_LLM_MODEL_ALIASES: Record = { }; const POPISERVER_LLM_MODEL_IDS: Record = { + "doubao-seed-2-0-lite-260428": 31, "kimi-k2.6": 31, }; +function isPopiserverKimiModel(modelId: string): boolean { + return modelId === "kimi-k2.6" || modelId === "31"; +} + type PopiserverLlmResponse = { status?: string; message?: string; @@ -339,6 +344,10 @@ async function generateWithPopiserver( ): Promise { const modelId = model || "kimi-k2.6"; const content = buildChatContent(prompt, images, videos); + const bodyParameters = { ...(parameters || {}) }; + if (isPopiserverKimiModel(modelId)) { + delete bodyParameters.temperature; + } const url = `${getPopiserverBaseUrl(request)}/api_client/anime/task/llmChat`; const init: RequestInit = { method: "POST", @@ -347,7 +356,7 @@ async function generateWithPopiserver( "Content-Type": "application/json", }, body: JSON.stringify({ - ...(parameters || {}), + ...bodyParameters, messages: [ { role: "system", content: "You are a helpful assistant." }, { role: "user", content }, diff --git a/src/lib/__tests__/llmModels.test.ts b/src/lib/__tests__/llmModels.test.ts index 5fca8b4d..4b53f894 100644 --- a/src/lib/__tests__/llmModels.test.ts +++ b/src/lib/__tests__/llmModels.test.ts @@ -6,8 +6,12 @@ describe("LLM model options", () => { expect(DEFAULT_NEWAPIWG_LLM_MODEL_ID).toBe("doubao-seed-2-0-lite-260428"); }); - it("defaults PopiServer text generation to Kimi K2.6", () => { - expect(DEFAULT_POPISERVER_LLM_MODEL_ID).toBe("kimi-k2.6"); + it("defaults PopiServer text generation to Doubao Seed 2.0 Lite", () => { + expect(DEFAULT_POPISERVER_LLM_MODEL_ID).toBe("doubao-seed-2-0-lite-260428"); + expect(LLM_MODELS.popiserver).toContainEqual({ + value: "doubao-seed-2-0-lite-260428", + label: "Doubao Seed 2.0 Lite", + }); expect(LLM_MODELS.popiserver).toContainEqual({ value: "kimi-k2.6", label: "Kimi K2.6", diff --git a/src/lib/llmModels.ts b/src/lib/llmModels.ts index 91635941..bdef932d 100644 --- a/src/lib/llmModels.ts +++ b/src/lib/llmModels.ts @@ -25,7 +25,8 @@ export const LLM_PROVIDERS: { value: LLMProvider; label: string }[] = export const LLM_MODELS: Record = { popiserver: [ - { value: DEFAULT_POPISERVER_LLM_MODEL_ID, label: "Kimi K2.6" }, + { value: DEFAULT_POPISERVER_LLM_MODEL_ID, label: "Doubao Seed 2.0 Lite" }, + { value: "kimi-k2.6", label: "Kimi K2.6" }, ], newapiwg: [ { value: "doubao-seed-2-0-lite-260428", label: "Doubao Seed 2.0 Lite" }, diff --git a/src/store/execution/__tests__/llmGenerateExecutor.test.ts b/src/store/execution/__tests__/llmGenerateExecutor.test.ts index 45c02e1c..ca70082c 100644 --- a/src/store/execution/__tests__/llmGenerateExecutor.test.ts +++ b/src/store/execution/__tests__/llmGenerateExecutor.test.ts @@ -247,6 +247,8 @@ describe("executeLlmGenerate", () => { const body = JSON.parse(mockFetch.mock.calls[1][1].body); expect(body.provider).toBe("popiserver"); expect(body.images).toEqual(["https://static.popi.art/uploads/input.png"]); + expect(body.temperature).toBeUndefined(); + expect(body.parameters.temperature).toBeUndefined(); }); it("should not include images field when none connected", async () => { diff --git a/src/store/execution/llmGenerateExecutor.ts b/src/store/execution/llmGenerateExecutor.ts index cac4f989..50fa45ff 100644 --- a/src/store/execution/llmGenerateExecutor.ts +++ b/src/store/execution/llmGenerateExecutor.ts @@ -18,6 +18,7 @@ import { runWithFallback } from "./runWithFallback"; import type { NodeExecutionContext } from "./types"; import { mergeConfiguredParameters } from "./generationParameters"; import { uploadPopiserverMediaForGeneration } from "@/utils/temporaryImageUpload"; +import { DEFAULT_POPISERVER_LLM_MODEL_ID } from "@/lib/llmModels"; export interface LlmGenerateOptions { /** When true, falls back to stored inputImages/inputPrompt if no connections provide them. */ @@ -53,6 +54,10 @@ function asNumber(value: unknown): number | undefined { return undefined; } +function isKimiModel(modelId: string): boolean { + return modelId === "kimi-k2.6" || modelId === "31"; +} + export async function executeLlmGenerate( ctx: NodeExecutionContext, options: LlmGenerateOptions = {} @@ -104,14 +109,19 @@ export async function executeLlmGenerate( const llmModel = modelToUse.modelId as LLMModelType; const aiModelId = asNumber(modelToUse.metadata?.aiModelId); const headers = buildLlmHeaders(llmProvider, providerSettings); + const omitTemperature = llmProvider === "popiserver" && isKimiModel(llmModel); const temperature = (parametersOverride?.temperature as number | undefined) ?? nodeData.temperature; const maxTokens = (parametersOverride?.maxTokens as number | undefined) ?? nodeData.maxTokens; - const effectiveParameters = mergeConfiguredParameters(parametersOverride, { - temperature, - maxTokens, - max_tokens: maxTokens, - }); + const effectiveParameters = mergeConfiguredParameters( + parametersOverride, + omitTemperature + ? { maxTokens, max_tokens: maxTokens } + : { temperature, maxTokens, max_tokens: maxTokens } + ); + if (omitTemperature) { + delete effectiveParameters.temperature; + } try { const preparedMedia = llmProvider === "popiserver" @@ -133,7 +143,7 @@ export async function executeLlmGenerate( provider: llmProvider, model: llmModel, ...(aiModelId !== undefined && { aiModelId }), - temperature, + ...(!omitTemperature && { temperature }), maxTokens, parameters: effectiveParameters, }), @@ -211,10 +221,10 @@ export async function executeLlmGenerate( const primaryModel: SelectedModel = { provider: primaryProviderType, modelId: usePopiserverLlm - ? nodeData.selectedModel?.modelId || "kimi-k2.6" + ? nodeData.selectedModel?.modelId || DEFAULT_POPISERVER_LLM_MODEL_ID : nodeData.model, displayName: usePopiserverLlm - ? nodeData.selectedModel?.displayName || "Kimi K2.6" + ? nodeData.selectedModel?.displayName || "Doubao Seed 2.0 Lite" : nodeData.model, metadata: usePopiserverLlm ? nodeData.selectedModel?.metadata : undefined, }; diff --git a/src/store/utils/defaultImageModel.ts b/src/store/utils/defaultImageModel.ts index e1ac75c3..263f07e9 100644 --- a/src/store/utils/defaultImageModel.ts +++ b/src/store/utils/defaultImageModel.ts @@ -10,7 +10,7 @@ const DEFAULT_AUDIO_MODEL_ID = "elevenlabs/turbo-v2.5"; export const POPISERVER_DEFAULT_IMAGE_MODEL_ID = "gpt-image-2-all"; export const POPISERVER_DEFAULT_VIDEO_MODEL_ID = "viduq3-turbo"; export const POPISERVER_DEFAULT_AUDIO_MODEL_ID = "speech-2.8-hd"; -export const POPISERVER_DEFAULT_LLM_MODEL_ID = "kimi-k2.6"; +export const POPISERVER_DEFAULT_LLM_MODEL_ID = "doubao-seed-2-0-lite-260428"; export function createPopiserverDefaultImageModel(): SelectedModel { return { diff --git a/src/utils/popiLlmModels.ts b/src/utils/popiLlmModels.ts index 025d468f..4454da25 100644 --- a/src/utils/popiLlmModels.ts +++ b/src/utils/popiLlmModels.ts @@ -21,5 +21,5 @@ export function toPopiLlmOptions(models: ProviderModel[]): LLMModelOption[] { })); return options.length > 0 ? options - : [{ value: DEFAULT_POPISERVER_LLM_MODEL_ID, label: "Kimi K2.6" }]; + : [{ value: DEFAULT_POPISERVER_LLM_MODEL_ID, label: "Doubao Seed 2.0 Lite" }]; }