המלצה | ✨חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם✨
-
@יוסי-רחמים כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@מוח-קודח dbb5577e-16db-4d17-9054-96f97b198c10-cglajpafddcffakjmpijpdhlhdkgdebc (1).crx
כל עוד לא תוקנה הבעיה שהיתה שם זה לא יעזור [אימות מפתח דרך מודל לא תקף], תשאיר את הגירסא הקודמת רק תשנה את המודל
@אהרן כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@יוסי-רחמים כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@מוח-קודח dbb5577e-16db-4d17-9054-96f97b198c10-cglajpafddcffakjmpijpdhlhdkgdebc (1).crx
כל עוד לא תוקנה הבעיה שהיתה שם זה לא יעזור [אימות מפתח דרך מודל לא תקף], תשאיר את הגירסא הקודמת רק תשנה את המודל
נשלח לבדיקה
-
פורסם
-
פורסם
@יוסי-רחמים כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
פורסם
יש קובץ למנוטפרים?
-
@יוסי-רחמים כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
פורסם
יש קובץ למנוטפרים?
-
@יוסי-רחמים שגיאת 418
גם במפתח אישי
אזלו הסיכויים למנוטפרים? -
@יוסי-רחמים שגיאת 418
גם במפתח אישי
אזלו הסיכויים למנוטפרים?@מוח-קודח כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@יוסי-רחמים שגיאת 418
גם במפתח אישי
אזלו הסיכויים למנוטפרים?עד ש@יוסי-רחמים יתאים את התוסף שלו למנוטפרים, הכנתי משהו זמני, שצריך להוסיף לתוסף tampermonkey, בלי אחריות, ולא ישבתי לדייק אותו, במיוחד שאפילו לא קראתי מה כתוב בו, סמכתי על בינה וראיתי שעובד. רק לשימוש לבינתיים, חובה להוסיף מפתח API של גוגל היכן שכתוב [לתמונות לא הצלחתי להפעיל, כנראה צריך תיקון קל]:
// ==UserScript==
// @name Gemini Universal Explainer (Text & Images) - Lite Model
// @namespace http://tampermonkey.net/
// @version 1.4
// @description מסביר טקסט מסומן או תמונות (Alt+Click) בכל אתר באמצעות Gemini API, כולל צ'אט המשך.
// @author You
// @match :///*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @connect generativelanguage.googleapis.com
// @connect *
// ==/UserScript==(function() {
'use strict';// ========================================== // הגדרות משתמש - חובה למלא // ========================================== const GEMINI_API_KEY = 'כאן להוסיף את המפתח האישי בין הגרשיים'; // ========================================== const MODEL_NAME = 'gemini-2.5-flash-lite'; const API_URL = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL_NAME}:generateContent?key=${GEMINI_API_KEY}`; let chatHistory = []; let currentContext = null; // שומר את הטקסט או נתוני התמונה שנבחרו let triggerButton, modal, chatContent, inputField, sendBtn, closeBtn, loadingIndicator; // --- הוספת סגנונות CSS (עיצוב) --- GM_addStyle(` #gemini-trigger-btn { position: absolute; z-index: 99999; background: #4285F4; /* Google Blue */ color: white; border: none; border-radius: 50%; width: 32px; height: 32px; cursor: pointer; display: none; box-shadow: 0 2px 5px rgba(0,0,0,0.3); font-size: 16px; align-items: center; justify-content: center; transition: transform 0.2s; } #gemini-trigger-btn:hover { transform: scale(1.1); } #gemini-modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 100000; display: none; justify-content: center; align-items: center; } #gemini-modal { background: white; width: 500px; max-width: 90%; height: 600px; border-radius: 12px; display: flex; flex-direction: column; box-shadow: 0 10px 25px rgba(0,0,0,0.5); overflow: hidden; font-family: sans-serif; direction: rtl; } #gemini-header { padding: 15px; background: #f1f3f4; border-bottom: 1px solid #ddd; display: flex; justify-content: space-between; align-items: center; font-weight: bold; color: #333; } #gemini-close-btn { cursor: pointer; font-size: 20px; color: #666; } #gemini-close-btn:hover { color: #000; } #gemini-chat-content { flex: 1; padding: 15px; overflow-y: auto; background: #fafafa; display: flex; flex-direction: column; gap: 10px; } .gemini-message { padding: 10px 15px; border-radius: 18px; max-width: 80%; line-height: 1.5; word-wrap: break-word; white-space: pre-wrap; } .gemini-user-msg { background: #dcf8c6; align-self: flex-start; border-bottom-right-radius: 4px; color: #000; } .gemini-model-msg { background: #ffffff; border: 1px solid #eee; align-self: flex-end; border-bottom-left-radius: 4px; color: #000; } .gemini-context-preview { font-size: 0.8em; color: #666; font-style: italic; border-bottom: 1px dashed #ccc; margin-bottom: 5px; padding-bottom: 5px; max-height: 60px; overflow: hidden; } .gemini-context-preview img { max-height: 50px; border-radius: 4px; } #gemini-input-area { padding: 10px; border-top: 1px solid #ddd; background: white; display: flex; gap: 10px; } #gemini-input { flex: 1; padding: 10px; border: 1px solid #ccc; border-radius: 20px; outline: none; } #gemini-send-btn { padding: 0 20px; background: #4285F4; color: white; border: none; border-radius: 20px; cursor: pointer; font-weight: bold; } #gemini-send-btn:disabled { background: #ccc; cursor: not-allowed; } #gemini-loading { display: none; align-self: center; margin: 10px; color: #666; font-style: italic; } /* Dark mode support for websites that have it */ @media (prefers-color-scheme: dark) { #gemini-modal { background: #2d2d2d; color: #e0e0e0; } #gemini-header { background: #1e1e1e; border-bottom-color: #444; color: #fff; } #gemini-chat-content { background: #252525; } #gemini-input-area { background: #1e1e1e; border-top-color: #444; } #gemini-input { background: #333; color: white; border-color: #555; } .gemini-model-msg { background: #333; border-color: #444; color: #e0e0e0; } .gemini-user-msg { background: #054740; color: #e0e0e0; } #gemini-close-btn { color: #aaa; } } `); // --- יצירת רכיבי הממשק (UI) --- function createUI() { // כפתור טריגר (נורה) triggerButton = document.createElement('button'); triggerButton.id = 'gemini-trigger-btn'; triggerButton.innerHTML = '💡'; triggerButton.title = 'קבל הסבר מג\'מיני'; document.body.appendChild(triggerButton); // חלונית מודאלית const overlay = document.createElement('div'); overlay.id = 'gemini-modal-overlay'; overlay.innerHTML = ` <div id="gemini-modal"> <div id="gemini-header"> <span>Gemini Explainer</span> <span id="gemini-close-btn">×</span> </div> <div id="gemini-chat-content"></div> <div id="gemini-loading">חושב...</div> <div id="gemini-input-area"> <input type="text" id="gemini-input" placeholder="שאל שאלת המשך..." disabled> <button id="gemini-send-btn" disabled>שלח</button> </div> </div> `; document.body.appendChild(overlay); // שמירת הפניות לאלמנטים modal = overlay; chatContent = overlay.querySelector('#gemini-chat-content'); inputField = overlay.querySelector('#gemini-input'); sendBtn = overlay.querySelector('#gemini-send-btn'); closeBtn = overlay.querySelector('#gemini-close-btn'); loadingIndicator = overlay.querySelector('#gemini-loading'); // הגדרת מאזינים לאירועים בממשק triggerButton.addEventListener('click', startExplanation); closeBtn.addEventListener('click', closeModal); modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); }); sendBtn.addEventListener('click', sendFollowUp); inputField.addEventListener('keypress', (e) => { if (e.key === 'Enter') sendFollowUp(); }); } // --- לוגיקת אינטראקציה באתר (בחירה/קליק) --- // טיפול בבחירת טקסט document.addEventListener('mouseup', (e) => { // התעלם אם הקליק בתוך המודאל או על הכפתור if (modal.style.display === 'flex' || e.target === triggerButton) return; const selection = window.getSelection(); const selectedText = selection.toString().trim(); if (selectedText.length > 0) { currentContext = { type: 'text', data: selectedText }; showTriggerButton(e.pageX, e.pageY); } else { // אם זו לא תמונה, הסתר כפתור setTimeout(() => { if(triggerButton.style.display === 'flex') hideTriggerButton(); }, 200); } }); // טיפול בלחיצה על תמונה (Alt + Click כדי לא להפריע לגלישה רגילה) document.addEventListener('click', (e) => { if (e.altKey && e.target.tagName === 'IMG') { e.preventDefault(); e.stopPropagation(); const imgUrl = e.target.src; currentContext = { type: 'image', url: imgUrl }; showTriggerButton(e.pageX, e.pageY); } }, true); // Use capture to intercept early function showTriggerButton(x, y) { triggerButton.style.left = `${x + 10}px`; triggerButton.style.top = `${y + 10}px`; triggerButton.style.display = 'flex'; } function hideTriggerButton() { triggerButton.style.display = 'none'; } // --- לוגיקת הצ'אט וה-API --- async function startExplanation() { if (GEMINI_API_KEY === 'הכנס_את_מפתח_ה-API_שלך_כאן' || !GEMINI_API_KEY) { alert('נא להגדיר מפתח API של Gemini בקוד הסקריפט.'); return; } hideTriggerButton(); openModal(); clearChat(); setLoading(true); chatHistory = []; // איפוס היסטוריה let initialPromptParts = []; // הצגת ההקשר שנבחר בחלונית addMessageToChat('context', currentContext); if (currentContext.type === 'text') { const prompt = `הסבר בקצרה בעברית את הטקסט הבא: "${currentContext.data}"`; initialPromptParts = [{ text: prompt }]; chatHistory.push({ role: 'user', parts: initialPromptParts }); await callGeminiAPI(chatHistory); } else if (currentContext.type === 'image') { addMessageToChat('model', 'מוריד ומעבד את התמונה...'); try { const base64Data = await fetchImageAsBase64(currentContext.url); // הסרת הכותרת של ה-base64 אם קיימת (data:image/png;base64,) const base64String = base64Data.split(',')[1]; const mimeType = base64Data.split(';')[0].split(':')[1]; const prompt = "הסבר בקצרה בעברית מה רואים בתמונה הזו."; initialPromptParts = [ { text: prompt }, { inline_data: { mime_type: mimeType, data: base64String } } ]; chatHistory.push({ role: 'user', parts: initialPromptParts }); // מחיקת הודעת ה"מעבד" לפני שליחת הבקשה chatContent.lastChild.remove(); await callGeminiAPI(chatHistory); } catch (error) { setLoading(false); addMessageToChat('model', 'שגיאה בטעינת התמונה: ' + error.message); console.error(error); } } } async function sendFollowUp() { const text = inputField.value.trim(); if (!text) return; inputField.value = ''; addMessageToChat('user', text); setLoading(true); chatHistory.push({ role: 'user', parts: [{ text: text }] }); await callGeminiAPI(chatHistory); } async function callGeminiAPI(contents) { const payload = { contents: contents, generationConfig: { temperature: 0.7, maxOutputTokens: 1024, } }; GM_xmlhttpRequest({ method: "POST", url: API_URL, headers: { "Content-Type": "application/json" }, data: JSON.stringify(payload), onload: function(response) { setLoading(false); if (response.status >= 200 && response.status < 300) { try { const data = JSON.parse(response.responseText); const reply = data.candidates[0].content.parts[0].text; chatHistory.push({ role: 'model', parts: [{ text: reply }] }); addMessageToChat('model', reply); } catch (e) { addMessageToChat('model', 'שגיאה בפענוח התשובה מג\'מיני.'); console.error('Parsing error:', e, response.responseText); } } else { const errorMsg = `שגיאת API: ${response.status} - ${response.statusText}. ייתכן ששם המודל שגוי או לא זמין.`; addMessageToChat('model', errorMsg); console.error('API Error:', response.responseText); } }, onerror: function(error) { setLoading(false); addMessageToChat('model', 'שגיאת רשת בחיבור לג\'מיני.'); console.error('Network error:', error); } }); } // --- פונקציות עזר --- function fetchImageAsBase64(url) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: url, responseType: 'blob', onload: function(response) { if (response.status === 200) { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(response.response); } else { reject(new Error(`Failed to fetch image: ${response.status}`)); } }, onerror: (err) => reject(err) }); }); } // --- ניהול חלונית המודאל --- function openModal() { modal.style.display = 'flex'; inputField.focus(); } function closeModal() { modal.style.display = 'none'; currentContext = null; } function clearChat() { chatContent.innerHTML = ''; } function setLoading(isLoading) { loadingIndicator.style.display = isLoading ? 'block' : 'none'; inputField.disabled = isLoading; sendBtn.disabled = isLoading; if (!isLoading) inputField.focus(); chatContent.scrollTop = chatContent.scrollHeight; } function addMessageToChat(role, content) { const msgDiv = document.createElement('div'); if (role === 'context') { msgDiv.className = 'gemini-context-preview'; if (content.type === 'text') { msgDiv.textContent = `נבחר: "${content.data.substring(0, 50)}${content.data.length > 50 ? '...' : ''}"`; } else { msgDiv.innerHTML = `נבחרה תמונה: <br><img src="${content.url}" style="max-height:50px;">`; } } else { msgDiv.className = `gemini-message gemini-${role}-msg`; msgDiv.innerHTML = content.replace(/\n/g, '<br>'); } chatContent.appendChild(msgDiv); chatContent.scrollTop = chatContent.scrollHeight; } // אתחול ראשוני createUI();
})();
-
@מוח-קודח כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@יוסי-רחמים שגיאת 418
גם במפתח אישי
אזלו הסיכויים למנוטפרים?עד ש@יוסי-רחמים יתאים את התוסף שלו למנוטפרים, הכנתי משהו זמני, שצריך להוסיף לתוסף tampermonkey, בלי אחריות, ולא ישבתי לדייק אותו, במיוחד שאפילו לא קראתי מה כתוב בו, סמכתי על בינה וראיתי שעובד. רק לשימוש לבינתיים, חובה להוסיף מפתח API של גוגל היכן שכתוב [לתמונות לא הצלחתי להפעיל, כנראה צריך תיקון קל]:
// ==UserScript==
// @name Gemini Universal Explainer (Text & Images) - Lite Model
// @namespace http://tampermonkey.net/
// @version 1.4
// @description מסביר טקסט מסומן או תמונות (Alt+Click) בכל אתר באמצעות Gemini API, כולל צ'אט המשך.
// @author You
// @match :///*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @connect generativelanguage.googleapis.com
// @connect *
// ==/UserScript==(function() {
'use strict';// ========================================== // הגדרות משתמש - חובה למלא // ========================================== const GEMINI_API_KEY = 'כאן להוסיף את המפתח האישי בין הגרשיים'; // ========================================== const MODEL_NAME = 'gemini-2.5-flash-lite'; const API_URL = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL_NAME}:generateContent?key=${GEMINI_API_KEY}`; let chatHistory = []; let currentContext = null; // שומר את הטקסט או נתוני התמונה שנבחרו let triggerButton, modal, chatContent, inputField, sendBtn, closeBtn, loadingIndicator; // --- הוספת סגנונות CSS (עיצוב) --- GM_addStyle(` #gemini-trigger-btn { position: absolute; z-index: 99999; background: #4285F4; /* Google Blue */ color: white; border: none; border-radius: 50%; width: 32px; height: 32px; cursor: pointer; display: none; box-shadow: 0 2px 5px rgba(0,0,0,0.3); font-size: 16px; align-items: center; justify-content: center; transition: transform 0.2s; } #gemini-trigger-btn:hover { transform: scale(1.1); } #gemini-modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 100000; display: none; justify-content: center; align-items: center; } #gemini-modal { background: white; width: 500px; max-width: 90%; height: 600px; border-radius: 12px; display: flex; flex-direction: column; box-shadow: 0 10px 25px rgba(0,0,0,0.5); overflow: hidden; font-family: sans-serif; direction: rtl; } #gemini-header { padding: 15px; background: #f1f3f4; border-bottom: 1px solid #ddd; display: flex; justify-content: space-between; align-items: center; font-weight: bold; color: #333; } #gemini-close-btn { cursor: pointer; font-size: 20px; color: #666; } #gemini-close-btn:hover { color: #000; } #gemini-chat-content { flex: 1; padding: 15px; overflow-y: auto; background: #fafafa; display: flex; flex-direction: column; gap: 10px; } .gemini-message { padding: 10px 15px; border-radius: 18px; max-width: 80%; line-height: 1.5; word-wrap: break-word; white-space: pre-wrap; } .gemini-user-msg { background: #dcf8c6; align-self: flex-start; border-bottom-right-radius: 4px; color: #000; } .gemini-model-msg { background: #ffffff; border: 1px solid #eee; align-self: flex-end; border-bottom-left-radius: 4px; color: #000; } .gemini-context-preview { font-size: 0.8em; color: #666; font-style: italic; border-bottom: 1px dashed #ccc; margin-bottom: 5px; padding-bottom: 5px; max-height: 60px; overflow: hidden; } .gemini-context-preview img { max-height: 50px; border-radius: 4px; } #gemini-input-area { padding: 10px; border-top: 1px solid #ddd; background: white; display: flex; gap: 10px; } #gemini-input { flex: 1; padding: 10px; border: 1px solid #ccc; border-radius: 20px; outline: none; } #gemini-send-btn { padding: 0 20px; background: #4285F4; color: white; border: none; border-radius: 20px; cursor: pointer; font-weight: bold; } #gemini-send-btn:disabled { background: #ccc; cursor: not-allowed; } #gemini-loading { display: none; align-self: center; margin: 10px; color: #666; font-style: italic; } /* Dark mode support for websites that have it */ @media (prefers-color-scheme: dark) { #gemini-modal { background: #2d2d2d; color: #e0e0e0; } #gemini-header { background: #1e1e1e; border-bottom-color: #444; color: #fff; } #gemini-chat-content { background: #252525; } #gemini-input-area { background: #1e1e1e; border-top-color: #444; } #gemini-input { background: #333; color: white; border-color: #555; } .gemini-model-msg { background: #333; border-color: #444; color: #e0e0e0; } .gemini-user-msg { background: #054740; color: #e0e0e0; } #gemini-close-btn { color: #aaa; } } `); // --- יצירת רכיבי הממשק (UI) --- function createUI() { // כפתור טריגר (נורה) triggerButton = document.createElement('button'); triggerButton.id = 'gemini-trigger-btn'; triggerButton.innerHTML = '💡'; triggerButton.title = 'קבל הסבר מג\'מיני'; document.body.appendChild(triggerButton); // חלונית מודאלית const overlay = document.createElement('div'); overlay.id = 'gemini-modal-overlay'; overlay.innerHTML = ` <div id="gemini-modal"> <div id="gemini-header"> <span>Gemini Explainer</span> <span id="gemini-close-btn">×</span> </div> <div id="gemini-chat-content"></div> <div id="gemini-loading">חושב...</div> <div id="gemini-input-area"> <input type="text" id="gemini-input" placeholder="שאל שאלת המשך..." disabled> <button id="gemini-send-btn" disabled>שלח</button> </div> </div> `; document.body.appendChild(overlay); // שמירת הפניות לאלמנטים modal = overlay; chatContent = overlay.querySelector('#gemini-chat-content'); inputField = overlay.querySelector('#gemini-input'); sendBtn = overlay.querySelector('#gemini-send-btn'); closeBtn = overlay.querySelector('#gemini-close-btn'); loadingIndicator = overlay.querySelector('#gemini-loading'); // הגדרת מאזינים לאירועים בממשק triggerButton.addEventListener('click', startExplanation); closeBtn.addEventListener('click', closeModal); modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); }); sendBtn.addEventListener('click', sendFollowUp); inputField.addEventListener('keypress', (e) => { if (e.key === 'Enter') sendFollowUp(); }); } // --- לוגיקת אינטראקציה באתר (בחירה/קליק) --- // טיפול בבחירת טקסט document.addEventListener('mouseup', (e) => { // התעלם אם הקליק בתוך המודאל או על הכפתור if (modal.style.display === 'flex' || e.target === triggerButton) return; const selection = window.getSelection(); const selectedText = selection.toString().trim(); if (selectedText.length > 0) { currentContext = { type: 'text', data: selectedText }; showTriggerButton(e.pageX, e.pageY); } else { // אם זו לא תמונה, הסתר כפתור setTimeout(() => { if(triggerButton.style.display === 'flex') hideTriggerButton(); }, 200); } }); // טיפול בלחיצה על תמונה (Alt + Click כדי לא להפריע לגלישה רגילה) document.addEventListener('click', (e) => { if (e.altKey && e.target.tagName === 'IMG') { e.preventDefault(); e.stopPropagation(); const imgUrl = e.target.src; currentContext = { type: 'image', url: imgUrl }; showTriggerButton(e.pageX, e.pageY); } }, true); // Use capture to intercept early function showTriggerButton(x, y) { triggerButton.style.left = `${x + 10}px`; triggerButton.style.top = `${y + 10}px`; triggerButton.style.display = 'flex'; } function hideTriggerButton() { triggerButton.style.display = 'none'; } // --- לוגיקת הצ'אט וה-API --- async function startExplanation() { if (GEMINI_API_KEY === 'הכנס_את_מפתח_ה-API_שלך_כאן' || !GEMINI_API_KEY) { alert('נא להגדיר מפתח API של Gemini בקוד הסקריפט.'); return; } hideTriggerButton(); openModal(); clearChat(); setLoading(true); chatHistory = []; // איפוס היסטוריה let initialPromptParts = []; // הצגת ההקשר שנבחר בחלונית addMessageToChat('context', currentContext); if (currentContext.type === 'text') { const prompt = `הסבר בקצרה בעברית את הטקסט הבא: "${currentContext.data}"`; initialPromptParts = [{ text: prompt }]; chatHistory.push({ role: 'user', parts: initialPromptParts }); await callGeminiAPI(chatHistory); } else if (currentContext.type === 'image') { addMessageToChat('model', 'מוריד ומעבד את התמונה...'); try { const base64Data = await fetchImageAsBase64(currentContext.url); // הסרת הכותרת של ה-base64 אם קיימת (data:image/png;base64,) const base64String = base64Data.split(',')[1]; const mimeType = base64Data.split(';')[0].split(':')[1]; const prompt = "הסבר בקצרה בעברית מה רואים בתמונה הזו."; initialPromptParts = [ { text: prompt }, { inline_data: { mime_type: mimeType, data: base64String } } ]; chatHistory.push({ role: 'user', parts: initialPromptParts }); // מחיקת הודעת ה"מעבד" לפני שליחת הבקשה chatContent.lastChild.remove(); await callGeminiAPI(chatHistory); } catch (error) { setLoading(false); addMessageToChat('model', 'שגיאה בטעינת התמונה: ' + error.message); console.error(error); } } } async function sendFollowUp() { const text = inputField.value.trim(); if (!text) return; inputField.value = ''; addMessageToChat('user', text); setLoading(true); chatHistory.push({ role: 'user', parts: [{ text: text }] }); await callGeminiAPI(chatHistory); } async function callGeminiAPI(contents) { const payload = { contents: contents, generationConfig: { temperature: 0.7, maxOutputTokens: 1024, } }; GM_xmlhttpRequest({ method: "POST", url: API_URL, headers: { "Content-Type": "application/json" }, data: JSON.stringify(payload), onload: function(response) { setLoading(false); if (response.status >= 200 && response.status < 300) { try { const data = JSON.parse(response.responseText); const reply = data.candidates[0].content.parts[0].text; chatHistory.push({ role: 'model', parts: [{ text: reply }] }); addMessageToChat('model', reply); } catch (e) { addMessageToChat('model', 'שגיאה בפענוח התשובה מג\'מיני.'); console.error('Parsing error:', e, response.responseText); } } else { const errorMsg = `שגיאת API: ${response.status} - ${response.statusText}. ייתכן ששם המודל שגוי או לא זמין.`; addMessageToChat('model', errorMsg); console.error('API Error:', response.responseText); } }, onerror: function(error) { setLoading(false); addMessageToChat('model', 'שגיאת רשת בחיבור לג\'מיני.'); console.error('Network error:', error); } }); } // --- פונקציות עזר --- function fetchImageAsBase64(url) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: url, responseType: 'blob', onload: function(response) { if (response.status === 200) { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(response.response); } else { reject(new Error(`Failed to fetch image: ${response.status}`)); } }, onerror: (err) => reject(err) }); }); } // --- ניהול חלונית המודאל --- function openModal() { modal.style.display = 'flex'; inputField.focus(); } function closeModal() { modal.style.display = 'none'; currentContext = null; } function clearChat() { chatContent.innerHTML = ''; } function setLoading(isLoading) { loadingIndicator.style.display = isLoading ? 'block' : 'none'; inputField.disabled = isLoading; sendBtn.disabled = isLoading; if (!isLoading) inputField.focus(); chatContent.scrollTop = chatContent.scrollHeight; } function addMessageToChat(role, content) { const msgDiv = document.createElement('div'); if (role === 'context') { msgDiv.className = 'gemini-context-preview'; if (content.type === 'text') { msgDiv.textContent = `נבחר: "${content.data.substring(0, 50)}${content.data.length > 50 ? '...' : ''}"`; } else { msgDiv.innerHTML = `נבחרה תמונה: <br><img src="${content.url}" style="max-height:50px;">`; } } else { msgDiv.className = `gemini-message gemini-${role}-msg`; msgDiv.innerHTML = content.replace(/\n/g, '<br>'); } chatContent.appendChild(msgDiv); chatContent.scrollTop = chatContent.scrollHeight; } // אתחול ראשוני createUI();
})();
-
@smct כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@אהרן
לא הבנתי את מה צריך להעתיק?
הקוד לא כולו בתוך הבלוק של הקודלתצוגה פתרונים, צריך להכניס הכל [אולי זה לא נצרך אבל ודאי לא מזיק, אצלי בtampermonkey זה נמצא בסקריפט עצמו]
-
@smct כתב בהמלצה |
חסכו שעות עבודה עם ClarityAI: התוסף שמסכם, מתרגם ומסביר כל דף אינטרנט בשבילכם
:
@אהרן
לא הבנתי את מה צריך להעתיק?
הקוד לא כולו בתוך הבלוק של הקודלתצוגה פתרונים, צריך להכניס הכל [אולי זה לא נצרך אבל ודאי לא מזיק, אצלי בtampermonkey זה נמצא בסקריפט עצמו]