Language Reactor e AI

 Aggiunte utili a Language Reactor.

Lexa AI è una funzione di dizionario avanzata all'interno dell'estensione Chrome Language Reactor che aiuta gli utenti a comprendere parole e frasi complesse analizzandole nel contesto. Mentre una versione base è disponibile gratuitamente, la versione Pro offre un modello Lexa AI potenziato con una conoscenza più ampia per gestire query più complicate e fornisce funzionalità aggiuntive per gli studenti di lingue che utilizzano piattaforme di streaming come Netflix e YouTube.

1. Attivare l'AI integrata in LR: il prompt di default è già molto potente e può bastare nel 95% dei casi

2. E' possibile customizzare il prompt (aggiornare il prompt di default): col prompt opportuno è possibile far apparire quello che si vuole, ad esempio parola coreana TAB traduzione italiana

3. Creando una estensione di Opera (nel menu contestuale) è possibile, una volta selezionata un testo, appenderlo ad un file che fa da raccolta delle parole o frasi utili

4. Creando un'altra estensione di Opera nel menu contestuale è possibile mandare ad un server la frase e farsela spiegare in modo più approfondito (il numero di caratteri di risposta dell'AI integrata di LR è piccolo perché piccolo è il riquadro dove viene mostrata la risposta). Qui occorre usare l'API di openAI.


Prompt di default

Si trova nelle impostazioni alla voce " Suggerimenti dell'Assistente AI Lexa"

Al momento dell'invio a LexaAI, le parole chiave <WORD> e <CONTEXT> saranno sostituite dalla parola scelta e dalla frase in cui si trova .

La prima parola del prompt (fino ai due punti : ) viene usata per la GUI di LR, non dal AI Lexa e appare in alto nel rettangolo dedicato a Lexa:



Spiegare: Per favore, spiega l'uso della parola <WORD> in questa frase: <CONTEXT>

Esempi: Si prega di fornire fino a 5 esempi con la parola <WORD> usata in questa frase: <CONTEXT>. Output solo esempi distinti e traduzioni.

Grammatica: Per favore, spiega la grammatica della parola <WORD> in questa frase: <CONTEXT>




Customizzare il prompt

basta aggiungere una parola descrittiva , i due punti : , e il nuovo prompt 

Spiegare: Per favore, spiega l'uso della parola <WORD> in questa frase: <CONTEXT>

Esempi: Si prega di fornire fino a 5 esempi con la parola <WORD> usata in questa frase: <CONTEXT>. Output solo esempi distinti e traduzioni.

Grammatica: Per favore, spiega la grammatica della parola <WORD> in questa frase: <CONTEXT>

Luca: scrivi <WORD> seguito da tabulazione seguito dalla traduzione italiana; vai a capo; scrivi la frase <CONTEXT> e la spiegazione dettagliata della traduzione parola per parola e la grammatica usata, usa meno di 100 caratteri





Estensione che (da tasto destro del mouse) raccoglie le parole selezionate in un file

Occorre mettere in una cartella (che verrà caricata da Opera andando in opera://extensions/  se si è in modalità sviluppatore e poi “Carica estensione non pacchettizzata") questi 4 files 



manifest.json

{ "name": "Menu Personalizzato Esporta", "description": "Accumulare selezioni e esportarle in un file .txt", "version": "1.2", "manifest_version": 3, "permissions": ["contextMenus", "storage", "scripting", "tabs", "downloads"], "background": { "service_worker": "background.js" }, "action": { "default_popup": "popup.html" } }

background.js

chrome.runtime.onInstalled.addListener(() => { chrome.contextMenus.create({ id: "salva-selezione", title: "💾 Aggiungi selezione", contexts: ["selection"] }); }); chrome.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === "salva-selezione" && info.selectionText) { chrome.storage.local.get({ selezioni: [] }, (data) => { const nuovoArray = data.selezioni; nuovoArray.push(info.selectionText); chrome.storage.local.set({ selezioni: nuovoArray }); }); } });

popup.html

<!DOCTYPE html> <html> <head> <title>Esporta Selezioni</title> <style> body { font-family: sans-serif; padding: 10px; width: 200px; } button { width: 100%; padding: 10px; margin-top: 10px; } </style> </head> <body> <h3>Esporta selezioni</h3> <button id="exportBtn">📄 Esporta in TXT</button> <script src="popup.js"></script> </body> </html>

popup.js

document.getElementById("exportBtn").addEventListener("click", () => { chrome.storage.local.get({ selezioni: [] }, (data) => { const contenuto = data.selezioni.join("\\n"); const blob = new Blob([contenuto], { type: "text/plain" }); const url = URL.createObjectURL(blob); chrome.downloads.download({ url: url, filename: "selezioni.txt", conflictAction: "overwrite" }); }); });

L'esportatore in un file selezioni.txt avviene cliccando l'icona dell'estensione in alto a destra nel browser

Estensione che (da tasto destro del mouse) chiama la API di openAI

Questa estensione richiede l'esistenza di un app che ritorna il risultato di un post alla API.

Praticamente un qualsiasi sito che ritorna la traduzione ragionata della frase va bene, frase va messa dopo il $ e fra graffe:

https://nomedelsito/traduci/${frase}

Serve una cartella con due files:



manifest.json:

{ "name": "Menu Personalizzato", "version": "1.0", "manifest_version": 3, "permissions": ["contextMenus", "tabs"], "background": { "service_worker": "background.js" } }

col codice da inserire in background.js :

background.js

chrome.runtime.onInstalled.addListener(() => { chrome.contextMenus.create({ id: "traduci-selezione", title: "🌐 Traduci selezione", contexts: ["selection"] // appare solo se c'è testo selezionato }); }); chrome.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === "traduci-selezione" && info.selectionText) { const frase = encodeURIComponent(info.selectionText); // codifica per URL const url = `https://nomedelsito/traduci/${frase}`; chrome.tabs.create({ url: url }); // apre la scheda con la traduzione } });

la figura mostra la risposta di openAI

e anche la "M" in alto a destra (vicino all'estensione di papago) che è l'icona
dell'esportatore del file del punto 3


sul server deve stare questo programma di risposta (la chiave segreta va messa nelle variabili d'ambiente del server):

// api/traduci.js

export default async function handler(req, res) {
  if (req.method !== "GET") {
    return res.status(405).json({ errore: "Metodo non consentito" });
  }

  const { frase } = req.query;

  if (!frase) {
    return res.status(400).json({ errore: "Manca il parametro 'frase'" });
  }

  try {
    const response = await fetch("https://api.openai.com/v1/chat/completions", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${process.env.OPENAI_API_KEY}`
  },
  body: JSON.stringify({
    model: "gpt-4o-mini",
    messages: [
      { role: "system", content: "Sei un insegnante di Coreano e non usi mai la romanizzazione. Devi rispondere con la frase originale in coreano poi vai a capo e scrivi la traduzione in italiano;  vai a capo e poi dai spiegazioni grammaticali senza usare la romanizzazione. Non usare romanizzazione." },
      { role: "user", content: `Traduci in italiano la seguente frase (scritta in coreano): ${frase}` }
    ]
  })
});
    const data = await response.json();
    const traduzione = data.choices?.[0]?.message?.content || "Errore: nessuna traduzione trovata";
    const traduzionegrassetto = traduzione.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
    const traduzioneConLineBreaks = traduzionegrassetto.replace(/\n/g, '<br>');
    // Crea l'HTML con sfondo bianco e testo in grassetto
const html = `
<!DOCTYPE html>
<html>
<head>
<title>Traduzione</title>
<style>
  body {
    background-color: white; /* Sfondo bianco */
    font-family: Georgia; /* Opzionale: scegli un font */
    font-size: 14px;
  }
  strong {
    font-weight: bold; /* Testo in grassetto */
    font-size: 1.2em;
  }
</style>
</head>
<body>
  
  <p>${traduzioneConLineBreaks}</p>
</body>
</html>
`;
    
    //res.setHeader("Content-Type", "text/plain; charset=utf-8");
    res.setHeader("Content-Type", "text/html; charset=utf-8");
    res.send(html); // Invia l'HTML
    //res.send(traduzione);
   // res.status(200).json({ traduzione });
  } catch (error) {
    console.error(error);
    res.status(500).json({ errore: "Errore nella traduzione" });
  }
}



Commenti

Post popolari in questo blog

Particelle e complementi in coreano

come mettere i testi a Music su Honor7

ɰ IPA e Coreano