Repository navigation
Expand file tree
/
Copy pathbackground.js
More file actions
92 lines (78 loc) · 3.57 KB
/
Copy pathbackground.js
File metadata and controls
92 lines (78 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// background.js - Versión Corregida y Sincronizada
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === "openOptions") {
browser.runtime.openOptionsPage();
return;
}
if (request.action === "callChatGPT") {
handleAIRequest(request.type, request.text, sender.tab.id);
return true;
}
});
async function handleAIRequest(type, text, tabId) {
// Obtener configuración actualizada del storage
const storage = await browser.storage.local.get(["apiKey", "prompts", "model"]);
const apiKey = storage.apiKey;
const customPrompts = storage.prompts || [];
const model = storage.model || "gpt-4o-mini";
// Validar API Key
if (!apiKey) {
browser.tabs.sendMessage(tabId, {
action: "showChatGPTResult",
result: "⚠️ Configura tu API Key en las opciones para usar el asistente."
});
return;
}
let promptTemplate = "";
// 1. Buscar primero en los prompts personalizados del usuario
const customMatch = customPrompts.find(p => p.id === type);
if (customMatch) {
// Reemplazar el marcador de posición con el texto seleccionado
promptTemplate = customMatch.template.replace("{{text}}", text);
} else {
// 2. Si no es personalizado, usar los comandos del sistema (IDs sincronizados con content.js)
const defaults = {
// Menú Básico
explain: `Explica este concepto de forma sencilla y clara: "${text}"`,
summarize: `Haz un resumen ejecutivo y conciso de los puntos clave: "${text}"`,
// Menú Asistente de Escritura (System Prompts)
improve: `Mejora la redacción y fluidez de este texto, manteniendo el mensaje original: "${text}"`,
professional: `Reescribe este texto con un tono profesional, formal y ejecutivo: "${text}"`,
grammar: `Corrige únicamente la ortografía y gramática de este texto sin cambiar su significado: "${text}"`,
// Otros
translate: `Traduce este texto al español (o al inglés si ya está en español): "${text}"`,
code: `Analiza este fragmento de código, explica qué hace y sugiere mejoras si es necesario: "${text}"`
};
// Si el tipo no existe en defaults, enviamos el texto tal cual
promptTemplate = defaults[type] || text;
}
try {
const response = await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${apiKey}`
},
body: JSON.stringify({
model: model,
messages: [
{ role: "system", content: "Eres un asistente útil integrado en el navegador Zen." },
{ role: "user", content: promptTemplate }
],
temperature: 0.7
})
});
const data = await response.json();
if (data.error) {
throw new Error(data.error.message);
}
const resultText = data.choices[0].message.content.trim();
browser.tabs.sendMessage(tabId, { action: "showChatGPTResult", result: resultText });
} catch (error) {
console.error("Error en la llamada a OpenAI:", error);
browser.tabs.sendMessage(tabId, {
action: "showChatGPTResult",
result: "❌ Error: " + (error.message || "No se pudo conectar con la IA.")
});
}
}