Browse Source

update

feature/add_provider_popi
weige 2 months ago
parent
commit
f12544e52b
  1. 7
      src/app/api/llm/__tests__/route.test.ts
  2. 11
      src/app/api/llm/route.ts
  3. 8
      src/lib/__tests__/llmModels.test.ts
  4. 3
      src/lib/llmModels.ts
  5. 2
      src/store/execution/__tests__/llmGenerateExecutor.test.ts
  6. 26
      src/store/execution/llmGenerateExecutor.ts
  7. 2
      src/store/utils/defaultImageModel.ts
  8. 2
      src/utils/popiLlmModels.ts

7
src/app/api/llm/__tests__/route.test.ts

@ -479,6 +479,11 @@ describe("/api/llm route", () => {
provider: "popiserver", provider: "popiserver",
model: "kimi-k2.6", model: "kimi-k2.6",
images: ["https://static.popi.art/uploads/input.png"], images: ["https://static.popi.art/uploads/input.png"],
parameters: {
temperature: 0.7,
maxTokens: 8192,
max_tokens: 8192,
},
}); });
const response = await POST(request); const response = await POST(request);
@ -492,6 +497,8 @@ describe("/api/llm route", () => {
expect.objectContaining({ expect.objectContaining({
method: "POST", method: "POST",
body: JSON.stringify({ body: JSON.stringify({
maxTokens: 8192,
max_tokens: 8192,
messages: [ messages: [
{ role: "system", content: "You are a helpful assistant." }, { role: "system", content: "You are a helpful assistant." },
{ {

11
src/app/api/llm/route.ts

@ -45,9 +45,14 @@ const NEWAPIWG_LLM_MODEL_ALIASES: Record<string, string> = {
}; };
const POPISERVER_LLM_MODEL_IDS: Record<string, number> = { const POPISERVER_LLM_MODEL_IDS: Record<string, number> = {
"doubao-seed-2-0-lite-260428": 31,
"kimi-k2.6": 31, "kimi-k2.6": 31,
}; };
function isPopiserverKimiModel(modelId: string): boolean {
return modelId === "kimi-k2.6" || modelId === "31";
}
type PopiserverLlmResponse = { type PopiserverLlmResponse = {
status?: string; status?: string;
message?: string; message?: string;
@ -339,6 +344,10 @@ async function generateWithPopiserver(
): Promise<string> { ): Promise<string> {
const modelId = model || "kimi-k2.6"; const modelId = model || "kimi-k2.6";
const content = buildChatContent(prompt, images, videos); 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 url = `${getPopiserverBaseUrl(request)}/api_client/anime/task/llmChat`;
const init: RequestInit = { const init: RequestInit = {
method: "POST", method: "POST",
@ -347,7 +356,7 @@ async function generateWithPopiserver(
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify({ body: JSON.stringify({
...(parameters || {}), ...bodyParameters,
messages: [ messages: [
{ role: "system", content: "You are a helpful assistant." }, { role: "system", content: "You are a helpful assistant." },
{ role: "user", content }, { role: "user", content },

8
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"); expect(DEFAULT_NEWAPIWG_LLM_MODEL_ID).toBe("doubao-seed-2-0-lite-260428");
}); });
it("defaults PopiServer text generation to Kimi K2.6", () => { it("defaults PopiServer text generation to Doubao Seed 2.0 Lite", () => {
expect(DEFAULT_POPISERVER_LLM_MODEL_ID).toBe("kimi-k2.6"); 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({ expect(LLM_MODELS.popiserver).toContainEqual({
value: "kimi-k2.6", value: "kimi-k2.6",
label: "Kimi K2.6", label: "Kimi K2.6",

3
src/lib/llmModels.ts

@ -25,7 +25,8 @@ export const LLM_PROVIDERS: { value: LLMProvider; label: string }[] =
export const LLM_MODELS: Record<LLMProvider, LLMModelOption[]> = { export const LLM_MODELS: Record<LLMProvider, LLMModelOption[]> = {
popiserver: [ 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: [ newapiwg: [
{ value: "doubao-seed-2-0-lite-260428", label: "Doubao Seed 2.0 Lite" }, { value: "doubao-seed-2-0-lite-260428", label: "Doubao Seed 2.0 Lite" },

2
src/store/execution/__tests__/llmGenerateExecutor.test.ts

@ -247,6 +247,8 @@ describe("executeLlmGenerate", () => {
const body = JSON.parse(mockFetch.mock.calls[1][1].body); const body = JSON.parse(mockFetch.mock.calls[1][1].body);
expect(body.provider).toBe("popiserver"); expect(body.provider).toBe("popiserver");
expect(body.images).toEqual(["https://static.popi.art/uploads/input.png"]); 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 () => { it("should not include images field when none connected", async () => {

26
src/store/execution/llmGenerateExecutor.ts

@ -18,6 +18,7 @@ import { runWithFallback } from "./runWithFallback";
import type { NodeExecutionContext } from "./types"; import type { NodeExecutionContext } from "./types";
import { mergeConfiguredParameters } from "./generationParameters"; import { mergeConfiguredParameters } from "./generationParameters";
import { uploadPopiserverMediaForGeneration } from "@/utils/temporaryImageUpload"; import { uploadPopiserverMediaForGeneration } from "@/utils/temporaryImageUpload";
import { DEFAULT_POPISERVER_LLM_MODEL_ID } from "@/lib/llmModels";
export interface LlmGenerateOptions { export interface LlmGenerateOptions {
/** When true, falls back to stored inputImages/inputPrompt if no connections provide them. */ /** 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; return undefined;
} }
function isKimiModel(modelId: string): boolean {
return modelId === "kimi-k2.6" || modelId === "31";
}
export async function executeLlmGenerate( export async function executeLlmGenerate(
ctx: NodeExecutionContext, ctx: NodeExecutionContext,
options: LlmGenerateOptions = {} options: LlmGenerateOptions = {}
@ -104,14 +109,19 @@ export async function executeLlmGenerate(
const llmModel = modelToUse.modelId as LLMModelType; const llmModel = modelToUse.modelId as LLMModelType;
const aiModelId = asNumber(modelToUse.metadata?.aiModelId); const aiModelId = asNumber(modelToUse.metadata?.aiModelId);
const headers = buildLlmHeaders(llmProvider, providerSettings); const headers = buildLlmHeaders(llmProvider, providerSettings);
const omitTemperature = llmProvider === "popiserver" && isKimiModel(llmModel);
const temperature = (parametersOverride?.temperature as number | undefined) ?? nodeData.temperature; const temperature = (parametersOverride?.temperature as number | undefined) ?? nodeData.temperature;
const maxTokens = (parametersOverride?.maxTokens as number | undefined) ?? nodeData.maxTokens; const maxTokens = (parametersOverride?.maxTokens as number | undefined) ?? nodeData.maxTokens;
const effectiveParameters = mergeConfiguredParameters(parametersOverride, { const effectiveParameters = mergeConfiguredParameters(
temperature, parametersOverride,
maxTokens, omitTemperature
max_tokens: maxTokens, ? { maxTokens, max_tokens: maxTokens }
}); : { temperature, maxTokens, max_tokens: maxTokens }
);
if (omitTemperature) {
delete effectiveParameters.temperature;
}
try { try {
const preparedMedia = llmProvider === "popiserver" const preparedMedia = llmProvider === "popiserver"
@ -133,7 +143,7 @@ export async function executeLlmGenerate(
provider: llmProvider, provider: llmProvider,
model: llmModel, model: llmModel,
...(aiModelId !== undefined && { aiModelId }), ...(aiModelId !== undefined && { aiModelId }),
temperature, ...(!omitTemperature && { temperature }),
maxTokens, maxTokens,
parameters: effectiveParameters, parameters: effectiveParameters,
}), }),
@ -211,10 +221,10 @@ export async function executeLlmGenerate(
const primaryModel: SelectedModel = { const primaryModel: SelectedModel = {
provider: primaryProviderType, provider: primaryProviderType,
modelId: usePopiserverLlm modelId: usePopiserverLlm
? nodeData.selectedModel?.modelId || "kimi-k2.6" ? nodeData.selectedModel?.modelId || DEFAULT_POPISERVER_LLM_MODEL_ID
: nodeData.model, : nodeData.model,
displayName: usePopiserverLlm displayName: usePopiserverLlm
? nodeData.selectedModel?.displayName || "Kimi K2.6" ? nodeData.selectedModel?.displayName || "Doubao Seed 2.0 Lite"
: nodeData.model, : nodeData.model,
metadata: usePopiserverLlm ? nodeData.selectedModel?.metadata : undefined, metadata: usePopiserverLlm ? nodeData.selectedModel?.metadata : undefined,
}; };

2
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_IMAGE_MODEL_ID = "gpt-image-2-all";
export const POPISERVER_DEFAULT_VIDEO_MODEL_ID = "viduq3-turbo"; export const POPISERVER_DEFAULT_VIDEO_MODEL_ID = "viduq3-turbo";
export const POPISERVER_DEFAULT_AUDIO_MODEL_ID = "speech-2.8-hd"; 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 { export function createPopiserverDefaultImageModel(): SelectedModel {
return { return {

2
src/utils/popiLlmModels.ts

@ -21,5 +21,5 @@ export function toPopiLlmOptions(models: ProviderModel[]): LLMModelOption[] {
})); }));
return options.length > 0 return options.length > 0
? options ? options
: [{ value: DEFAULT_POPISERVER_LLM_MODEL_ID, label: "Kimi K2.6" }]; : [{ value: DEFAULT_POPISERVER_LLM_MODEL_ID, label: "Doubao Seed 2.0 Lite" }];
} }

Loading…
Cancel
Save