Spaces:
Running
Running
Update ai_engine.js
Browse files- ai_engine.js +18 -18
ai_engine.js
CHANGED
|
@@ -18,11 +18,8 @@ const getModelId = (modelName) => {
|
|
| 18 |
case "nemotron-12b": return "nvidia/nemotron-nano-12b-v2-vl:free";
|
| 19 |
case "gpt": case "gpt-5.4-nano": return "openai/gpt-5.4-nano";
|
| 20 |
case "qwen-non": return "qwen/qwen3-vl-30b-a3b-instruct";
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
case "mistral-small": return "mistralai/mistral-small-2603";
|
| 24 |
-
|
| 25 |
-
|
| 26 |
case "qwen": default: return "qwen/qwen3-vl-30b-a3b-thinking:floor";
|
| 27 |
}
|
| 28 |
};
|
|
@@ -30,8 +27,8 @@ const getModelId = (modelName) => {
|
|
| 30 |
// --- IMAGE MODEL ROUTER ---
|
| 31 |
const getImageModelId = (tier) => {
|
| 32 |
switch (tier) {
|
| 33 |
-
case "premium": return "bytedance-seed/seedream-4.5";
|
| 34 |
-
case "quick": return "sourceful/riverflow-v2-fast";
|
| 35 |
default: return "sourceful/riverflow-v2-fast";
|
| 36 |
}
|
| 37 |
};
|
|
@@ -50,7 +47,9 @@ const logOpenRouterError = (error, context) => {
|
|
| 50 |
};
|
| 51 |
|
| 52 |
// --- TEXT COMPLETION ---
|
| 53 |
-
|
|
|
|
|
|
|
| 54 |
try {
|
| 55 |
const targetModel = getModelId(model);
|
| 56 |
let messagesPayload = [
|
|
@@ -70,12 +69,19 @@ export const generateCompletion = async ({ model, prompt, system_prompt, images
|
|
| 70 |
messagesPayload.push({ role: "user", content: prompt });
|
| 71 |
}
|
| 72 |
|
| 73 |
-
const
|
| 74 |
model: targetModel,
|
| 75 |
messages: messagesPayload,
|
| 76 |
-
response_format: { type: "json_object" },
|
| 77 |
max_tokens: 1200,
|
| 78 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
|
| 80 |
return {
|
| 81 |
success: true,
|
|
@@ -136,7 +142,6 @@ export const streamCompletion = async ({ model, prompt, system_prompt, images, r
|
|
| 136 |
};
|
| 137 |
|
| 138 |
// --- IMAGE GENERATION ---
|
| 139 |
-
// Uses OpenRouter's image generation endpoint directly (not chat completions)
|
| 140 |
export const generateImage = async ({ prompt, tier = "quick" }) => {
|
| 141 |
try {
|
| 142 |
const model = getImageModelId(tier);
|
|
@@ -149,12 +154,7 @@ export const generateImage = async ({ prompt, tier = "quick" }) => {
|
|
| 149 |
"HTTP-Referer": process.env.YOUR_SITE_URL || "https://everydaycats.web.app",
|
| 150 |
"X-Title": process.env.YOUR_SITE_NAME || "lightnovel.ai",
|
| 151 |
},
|
| 152 |
-
body: JSON.stringify({
|
| 153 |
-
model,
|
| 154 |
-
prompt,
|
| 155 |
-
n: 1,
|
| 156 |
-
size: "1024x1024",
|
| 157 |
-
})
|
| 158 |
});
|
| 159 |
|
| 160 |
if (!response.ok) {
|
|
|
|
| 18 |
case "nemotron-12b": return "nvidia/nemotron-nano-12b-v2-vl:free";
|
| 19 |
case "gpt": case "gpt-5.4-nano": return "openai/gpt-5.4-nano";
|
| 20 |
case "qwen-non": return "qwen/qwen3-vl-30b-a3b-instruct";
|
| 21 |
+
case "bytedance-1.6": return "bytedance-seed/seed-1.6-flash:floor";
|
| 22 |
+
case "mistral-small": return "mistralai/mistral-small-2603";
|
|
|
|
|
|
|
|
|
|
| 23 |
case "qwen": default: return "qwen/qwen3-vl-30b-a3b-thinking:floor";
|
| 24 |
}
|
| 25 |
};
|
|
|
|
| 27 |
// --- IMAGE MODEL ROUTER ---
|
| 28 |
const getImageModelId = (tier) => {
|
| 29 |
switch (tier) {
|
| 30 |
+
case "premium": return "bytedance-seed/seedream-4.5";
|
| 31 |
+
case "quick": return "sourceful/riverflow-v2-fast";
|
| 32 |
default: return "sourceful/riverflow-v2-fast";
|
| 33 |
}
|
| 34 |
};
|
|
|
|
| 47 |
};
|
| 48 |
|
| 49 |
// --- TEXT COMPLETION ---
|
| 50 |
+
// forceJson: true → response_format json_object (structured calls, e.g. aura scan)
|
| 51 |
+
// forceJson: false → plain text (e.g. ReplyGenius chat replies)
|
| 52 |
+
export const generateCompletion = async ({ model, prompt, system_prompt, images, forceJson = true }) => {
|
| 53 |
try {
|
| 54 |
const targetModel = getModelId(model);
|
| 55 |
let messagesPayload = [
|
|
|
|
| 69 |
messagesPayload.push({ role: "user", content: prompt });
|
| 70 |
}
|
| 71 |
|
| 72 |
+
const requestParams = {
|
| 73 |
model: targetModel,
|
| 74 |
messages: messagesPayload,
|
|
|
|
| 75 |
max_tokens: 1200,
|
| 76 |
+
};
|
| 77 |
+
|
| 78 |
+
// ✅ Only enforce JSON schema when explicitly requested.
|
| 79 |
+
// Sending response_format with a plain-text prompt causes 400 on most providers.
|
| 80 |
+
if (forceJson) {
|
| 81 |
+
requestParams.response_format = { type: "json_object" };
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
const response = await openRouterAI.chat.completions.create(requestParams);
|
| 85 |
|
| 86 |
return {
|
| 87 |
success: true,
|
|
|
|
| 142 |
};
|
| 143 |
|
| 144 |
// --- IMAGE GENERATION ---
|
|
|
|
| 145 |
export const generateImage = async ({ prompt, tier = "quick" }) => {
|
| 146 |
try {
|
| 147 |
const model = getImageModelId(tier);
|
|
|
|
| 154 |
"HTTP-Referer": process.env.YOUR_SITE_URL || "https://everydaycats.web.app",
|
| 155 |
"X-Title": process.env.YOUR_SITE_NAME || "lightnovel.ai",
|
| 156 |
},
|
| 157 |
+
body: JSON.stringify({ model, prompt, n: 1, size: "1024x1024" })
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
});
|
| 159 |
|
| 160 |
if (!response.ok) {
|