mirror of
https://github.com/foxhui/WebAI2API.git
synced 2026-06-16 21:03:59 +08:00
feat: 增加指定模型和查看可指定模型功能
This commit is contained in:
+31
-2
@@ -399,9 +399,10 @@ async function initBrowser(config) {
|
||||
* @param {object} context 浏览器上下文 {page, client, width, height}
|
||||
* @param {string} prompt 提示词
|
||||
* @param {string[]} imgPaths 图片路径数组
|
||||
* @param {string|null} modelId 模型 UUID (可选)
|
||||
* @returns {Promise<{image?: string, text?: string, error?: string}>}
|
||||
*/
|
||||
async function generateImage(context, prompt, imgPaths) {
|
||||
async function generateImage(context, prompt, imgPaths, modelId) {
|
||||
const { page, client, width, height } = context;
|
||||
const textareaSelector = 'textarea';
|
||||
|
||||
@@ -417,7 +418,6 @@ async function generateImage(context, prompt, imgPaths) {
|
||||
// 2. 粘贴图片
|
||||
if (imgPaths && imgPaths.length > 0) {
|
||||
await pasteImages(page, textareaSelector, imgPaths);
|
||||
} else {
|
||||
// 如果没有图片,也点击一下输入框获取焦点
|
||||
await safeClick(page, textareaSelector);
|
||||
}
|
||||
@@ -427,6 +427,35 @@ async function generateImage(context, prompt, imgPaths) {
|
||||
await humanType(page, textareaSelector, prompt);
|
||||
await sleep(800, 1500);
|
||||
|
||||
// --- 注入 Fetch 拦截器 ---
|
||||
if (modelId) {
|
||||
await page.evaluate((targetModelId) => {
|
||||
const originalFetch = window.fetch;
|
||||
window.fetch = async (...args) => {
|
||||
let [resource, config] = args;
|
||||
// 简单判断 URL
|
||||
const url = resource instanceof Request ? resource.url : resource.toString();
|
||||
|
||||
if (url.includes('/nextjs-api/stream/') && config && config.method === 'POST' && config.body) {
|
||||
try {
|
||||
const data = JSON.parse(config.body);
|
||||
console.log(`[Browser] 正在拦截请求。原始 modelAId: ${data.modelAId}`);
|
||||
|
||||
// 修改 modelAId
|
||||
data.modelAId = targetModelId;
|
||||
config.body = JSON.stringify(data);
|
||||
|
||||
console.log(`[Browser] 请求已修改。新 modelAId: ${data.modelAId}`);
|
||||
} catch (e) {
|
||||
console.error('[Browser] 拦截失败:', e);
|
||||
}
|
||||
}
|
||||
return originalFetch.apply(window, args);
|
||||
};
|
||||
}, modelId);
|
||||
console.log(`>>> [Test] 已注入 Fetch 拦截器,目标模型: ${modelId}`);
|
||||
}
|
||||
|
||||
// 4. 发送
|
||||
const btnSelector = 'button[type="submit"]';
|
||||
await safeClick(page, btnSelector);
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
export const MODEL_MAPPING = {
|
||||
"gemini-3-pro-image-preview": "019aa208-5c19-7162-ae3b-0a9ddbble16a",
|
||||
"seedream-4-high-res-fal": "32974d8d-333c-4d2e-abf3-f258c0ac1310",
|
||||
"hunyuan-image-3.0": "7766a45c-1b6b-4fb8-9823-2557291e1ddd",
|
||||
"gemini-2.5-flash-image-preview": "0199ef2a-583f-7088-b704-b75fd169401d",
|
||||
"imagen-4.0-ultra-generate-preview-06-06": "f8aec69d-e077-4ed1-99be-d34f48559bbf",
|
||||
"imagen-4.0-generate-preview-06-06": "2ec9f1a6-126f-4c65-a102-15ac401dcea4",
|
||||
"wan2.5-t2i-preview": "019a5050-2875-78ed-ae3a-d9a51a438685",
|
||||
"gpt-image-1": "6e855f13-55d7-4127-8656-9168a9f4dcc0",
|
||||
"gpt-image-mini": "0199c238-f8ee-7f7d-afc1-7e28fcfd21cf",
|
||||
"mai-image-1": "1b407d5c-1806-477c-90a5-e5c5a114f3bc",
|
||||
"seedream-3": "d8771262-8248-4372-90d5-eb41910db034",
|
||||
"qwen-image-prompt-extend": "9fe82ee1-c84f-417f-b0e7-cab4ae4cf3f3",
|
||||
"flux-1-kontext-pro": "28a8f330-3554-448c-9f32-2c0a08ec6477",
|
||||
"imagen-3.0-generate-002": "51ad1d79-61e2-414c-99e3-faeb64bb6b1b",
|
||||
"ideogram-v3-quality": "73378be5-cdba-49e7-b3d0-027949871aa6",
|
||||
"photon": "e7c9fa2d-6f5d-40eb-8305-0980b11c7cab",
|
||||
"lucid-origin": "5a3b3520-c87d-481f-953c-1364687b6e8f",
|
||||
"recraft-v3": "b88d5814-1d20-49cc-9eb6-e362f5851661",
|
||||
"gemini-2.0-flash-preview-image-generation": "69bbf7d4-9f44-447e-a868-abc4f7a31810",
|
||||
"dall-e-3": "bb97bc68-131c-4ea4-a59e-03a6252de0d2",
|
||||
"flux-1-kontext-dev": "eb90ae46-a73a-4f27-be8b-40f090592c9a",
|
||||
"imagen-4.0-fast-generate-001": "f44fd4f8-af30-480f-8ce2-80b2bdfea55e",
|
||||
"hunyuan-image-2.1": "a9a26426-5377-4efa-bef9-de71e29ad943"
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取模型列表
|
||||
*/
|
||||
export function getModels() {
|
||||
return {
|
||||
object: "list",
|
||||
data: Object.keys(MODEL_MAPPING).map(id => ({
|
||||
id: id,
|
||||
object: "model",
|
||||
created: Math.floor(Date.now() / 1000),
|
||||
owned_by: "lmarena"
|
||||
}))
|
||||
};
|
||||
}
|
||||
+20
-3
@@ -1,6 +1,7 @@
|
||||
import readline from 'readline';
|
||||
import config from './config.js';
|
||||
import { initBrowser, generateImage } from './lmarena.js';
|
||||
import { MODEL_MAPPING } from './models.js';
|
||||
|
||||
/**
|
||||
* 创建命令行交互接口
|
||||
@@ -47,12 +48,28 @@ async function main() {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 3. 获取模型 ID
|
||||
const modelInput = await ask('>>> [CLI] 请输入模型 ID (回车跳过使用默认): ');
|
||||
const modelName = modelInput.trim();
|
||||
let modelId = null;
|
||||
|
||||
if (modelName) {
|
||||
if (MODEL_MAPPING[modelName]) {
|
||||
modelId = MODEL_MAPPING[modelName];
|
||||
console.log(`>>> [CLI] 使用模型: ${modelName} (${modelId})`);
|
||||
} else {
|
||||
console.log(`>>> [Warn] 未找到模型 "${modelName}",将尝试直接使用默认模型。`);
|
||||
}
|
||||
} else {
|
||||
console.log('>>> [CLI] 未指定模型,使用默认值。');
|
||||
}
|
||||
|
||||
console.log(`>>> [CLI] 开始任务: Prompt="${prompt}", Images=${imagePaths.length}`);
|
||||
|
||||
// 3. 调用生图逻辑
|
||||
const result = await generateImage(browserContext, prompt, imagePaths);
|
||||
// 4. 调用生图逻辑
|
||||
const result = await generateImage(browserContext, prompt, imagePaths, modelId);
|
||||
|
||||
// 4. 显示结果
|
||||
// 5. 显示结果
|
||||
if (result.error) {
|
||||
console.error('>>> [Error]', result.error);
|
||||
} else if (result.image) {
|
||||
|
||||
Reference in New Issue
Block a user