Spaces:
Running
Running
| import { GoogleGenAI } from '@google/genai'; | |
| import fs from 'fs'; | |
| import path from 'path'; | |
| import { fileURLToPath } from 'url'; | |
| const __dirname = path.dirname(fileURLToPath(import.meta.url)); | |
| export const getPrompt = (filename) => { | |
| try { | |
| const filePath = path.resolve(__dirname, '..', '..', 'prompts', filename); | |
| if (fs.existsSync(filePath)) { | |
| return fs.readFileSync(filePath, 'utf8'); | |
| } else { | |
| const internalPath = path.resolve(__dirname, '..', '..', '..', 'prompts', filename); | |
| return fs.existsSync(internalPath) ? fs.readFileSync(internalPath, 'utf8') : ""; | |
| } | |
| } catch (e) { | |
| console.error(`[AI-ENGINE] Prompt Load Error (${filename}):`, e.message); | |
| return ""; | |
| } | |
| }; | |
| export function cleanJson(raw) { | |
| if (!raw) return ""; | |
| return raw.replace(/```json/gi, '').replace(/```/gi, '').trim(); | |
| } | |
| export function cleanSRTOutput(text) { | |
| if (!text) return ""; | |
| let cleaned = text.replace(/```srt/gi, '').replace(/```/gi, '').trim(); | |
| const firstIndex = cleaned.search(/^\d+\s*\r?\n\d{2}:\d{2}:\d{2},\d{3}/m); | |
| if (firstIndex !== -1) { | |
| cleaned = cleaned.substring(firstIndex); | |
| } | |
| return cleaned; | |
| } | |
| export const DEFAULT_SAFETY_SETTINGS = [ | |
| { category: 'HARM_CATEGORY_HARASSMENT', threshold: 'BLOCK_ONLY_HIGH' }, | |
| { category: 'HARM_CATEGORY_HATE_SPEECH', threshold: 'BLOCK_ONLY_HIGH' }, | |
| { category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT', threshold: 'BLOCK_ONLY_HIGH' }, | |
| { category: 'HARM_CATEGORY_DANGEROUS_CONTENT', threshold: 'BLOCK_ONLY_HIGH' }, | |
| { category: 'HARM_CATEGORY_CIVIC_INTEGRITY', threshold: 'BLOCK_ONLY_HIGH' } | |
| ]; | |
| export async function tryModels(apiKey, modelList, taskFn) { | |
| let lastError = null; | |
| const ai = new GoogleGenAI({ apiKey }); | |
| const MAX_RETRIES_PER_MODEL = 2; | |
| for (const modelName of modelList) { | |
| for (let attempt = 0; attempt <= MAX_RETRIES_PER_MODEL; attempt++) { | |
| try { | |
| return await taskFn(ai, modelName); | |
| } catch (e) { | |
| const rawError = (e.message || "Unknown error").toLowerCase(); | |
| const isRateLimit = rawError.includes('429') || rawError.includes('quota') || rawError.includes('limit'); | |
| if (isRateLimit && attempt < MAX_RETRIES_PER_MODEL) { | |
| const waitTime = (attempt + 1) * 5000; | |
| console.warn(`[AI-ENGINE] Rate limit on ${modelName}. Retry in ${waitTime}ms...`); | |
| await new Promise(r => setTimeout(r, waitTime)); | |
| continue; | |
| } | |
| console.error(`[AI-ENGINE] Error on ${modelName}:`, rawError); | |
| lastError = e; | |
| break; | |
| } | |
| } | |
| } | |
| throw lastError; | |
| } | |