דילוג לתוכן
  • כללי הפורום
  • רשימת תגים
  • פוסטים אחרונים
  • לא נפתר
  • פופולרי
  • משתמשים
  • קבוצות
עיצובים
  • בהיר
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • כהה
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
לוגו אתר
CSSC

CSS

@CSS
מנהל ראשי
הפסקת מעקב מעקב
אודות
פוסטים
145
נושאים
68
שיתופים
0
קבוצות
6
עוקבים
1
עוקב אחרי
0

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • כללי הפורום
    CSSC CSS
    כללי הפורום

    כללי הפורום של טכנו קליק

    ברוכים הבאים לטכנו קליק!
    כדי שכולם יהנו מקהילה נעימה, מכבדת ומועילה — אנא קראו את הכללים לפני שאתם מתחילים לכתוב.


    1. כבוד הדדי

    מתייחסים לכל חברי הקהילה בכבוד, גם כשלא מסכימים.
    ביקורת עניינית על תוכן — מותר ואף רצויה. פגיעה באדם — אסורה.

    2. אין תוכן פוגעני או לא חוקי

    אין לפרסם תוכן המפר זכויות יוצרים, סימני מסחר או פרטיות של אחרים.
    אין לפרסם מידע אישי של אחרים (כתובת, טלפון, תמונות) בלי רשותם.
    אין לבקש/לדון על פריצת או עקיפת סינונים, בכל צורה שהיא. וכן אין לדון על עקיפת\פריצת קושחות וגרסאות מותאמות אישית לכלל הפלאפונים
    אין לבקש או לדון על סרטים/משחקים וכדומה, ללא יוצא מן הכלל.

    3. פרסום במקום הנכון

    לפני פתיחת נושא חדש — חפשו אם כבר קיים נושא דומה.
    בחרו את הקטגוריה המתאימה ביותר לנושא שלכם.
    כתבו כותרת ברורה ומתארת — לא "עזרה!!!" אלא לדוגמא "בעיה בהתקנת מנהל התקן בכרטיס מסך".
    אין להקפיץ נושאים או להקפיץ הודעות על כך שאתה מחכה לתגובה - המתינו בסבלנות לתשובה.

    4. ספאם ופרסום מסחרי

    אין לפרסם פרסומות, קישורי שותפים (Affiliate) או ספאם מכל סוג.
    אין לשלוח הודעות פרטיות המוניות בכוונת פרסום.
    פרסום מיזם או מוצר אישי — רק באישור מנהל ומראש.

    5. קבצים ותמונות

    יש להעלות תמונות וקבצים רלוונטיים בלבד ולשמור על גודל סביר.
    אין להעלות קבצים נגועים, סיסמאות, מפתחות רישיון או קראקים.
    אין להעלות תוכנות פרוצות או קישורים להורדה שלהן.
    אין להעלות בשופ"א קבצים או תמונות וכד' הנוגדים את כללי נטפרי, מי שיעלה יחסם מהשימוש בפורום

    6. איכות התוכן

    כתבו בעברית תקינה ככל האפשר, והשתמשו בסימני פיסוק.
    לפני שאלה טכנית — תארו את הבעיה, את סביבת העבודה (מערכת הפעלה, גרסה) ואת מה שכבר ניסיתם.
    אין להציף את הפורום בהודעות קצרות וחסרות תוכן.

    7. חשבון משתמש

    כל משתמש אחראי לכל פעילות בחשבונו. אין לשתף סיסמה.
    אין לפתוח חשבונות מרובים כדי לעקוף הרחקה או חסימה.
    אין להתחזות למנהל מערכת או לחבר צוות.

    8. אכיפה וענישה

    צוות ההנהלה רשאי לערוך, להעביר או למחוק תוכן שאינו עומד בכללים — ללא הודעה מוקדמת.
    הפרות יגררו אזהרה, הרחקה זמנית או חסימה קבועה — בהתאם לחומרת ההפרה ולהיסטוריה של המשתמש.
    החלטות הצוות מחייבות. ערעור יתקבל בהודעה פרטית למנהל בלבד.

    9. זכויות יוצרים :

    אסור להעלות חומר מוגן בזכויות יוצרים
    אין לפרסם קבצים, תמונות, טקסטים, מוזיקה, סרטונים, או כל תוכן אחר שמוגן בזכויות יוצרים, אלא אם יש לכם אישור ברור לשתף אותו.

    10. אחריות על תוכן שיתפרסם :

    תוכן שמועלה לפורום הוא באחריות המפרסם בלבד. הנהלת הפורום אינה נושאת בכל אחריות משפטית או אחרת לתוכן שפורסם על ידי משתמשים, כולל הפרת זכויות יוצרים, לשון הרע, פגיעה בפרטיות או כל נזק אחר.
    במקרה של הפרת זכויות או פגיעה אחרת, האחריות היא על המשתמש שהעלה את התוכן בלבד, והפורום שומר לעצמו את הזכות להסיר תכנים ולחסום משתמשים לפי שיקול דעתו.

    11. שימוש בלייק/דיסלייק :

    אין לבקש לייקים בשופו"א גם לא ברמז או בפרטי
    נתינת דיס תעשה במקרי קיצון ממש כדי להתריע שלא יטעו מדברי הכותב
    נתינת דיס שלא במקרים מעין זה, תביא לביטול האפשרות לדיס מהכותב או מכלל המשתמשים. או לסנקציות אחרות לפי שיקול ההנהלה.

    12.צ'אטים:

    גם בצ'אטים חלים כל כללי הפורום ויש לשמור על שפה נקיה ושמורה.
    הצ'אטים לא מהווים מקום שאפשר לעשות בו הכל.
    כמו כן למען שמירה על הפורום, לצוות ההנהלה יש גישה גם לצאטים פרטיים.

    13. שמות/ תמונות ניקים:

    בשמות הניקים אין לקרוא לעצמכם שם מבזה או שם של אדם מפורסם במידה ואתם לא אותו אדם.
    כמו כן אין לשים תמונה של מישהו מפורסם/מפורום אחר, במידה וזה לא אתם. הדבר מהווה התחזות.
    במידה ואתם רוצים לשנות את שם הניק יש לפנות לצוות ההנהלה והיא תחליט לפי שיקול דעתה.

    14. תגים והישגים:

    בפורום קיימת מערכת תגים שנועדה להכיר במשתמשים שתורמים, עוזרים ומשתתפים באופן פעיל בקהילה.
    לכל תג יש תנאים משלו, והוא מוענק בהתאם לפעילות ולהישגים של המשתמש.
    התגים מאפשרים לכם להציג את הניסיון, ההשקעה והתרומה שלכם לקהילה, ולהראות לאחרים במה הצטיינתם.
    ככל שתהיו פעילים יותר, תעזרו לאחרים ותתרמו לפורום — כך תוכלו לצבור הישגים ותגים חדשים שיבלטו בפרופיל שלכם.
    השקיעו, השתתפו ועזרו לאחרים — ההישגים שלכם הם הדרך שלנו להכיר בתרומה שלכם לטכנו קליק.


  • שיתוף | פתרון למעבר בין חלונות
    CSSC CSS
    עזרה הדדית - תוכנות

    מכירים את זה שזה מעצבן שכדי לכתוב משהו אתם צריכים לעבור בין חלוניות? הנה הפתרון!
    התוכנה בגודל ממש קטן
    היא פועלת מעל כל האפליקציות,
    ניתנת לשינוי הגודל,
    ושינוי המיקום שלה ע"י גרירה!
    יש בה את כל מה שיש בפנקס הרשימות!

    notepad.py
    יש לשמור אותו וללחוץ עליו פעמיים!
    וזהו!
    7967ed89-01b4-47f0-bb03-d65bc3f96619-image.png


  • שיתוף | תוכנת AI שמבצעת פעולות במחשב! עם ג'ימיני, עובד למנוטרפים.
    CSSC CSS
    אפליקציות ותוכנות

    בניתי (עם AI) תוכנה שרצה על המחשב ויכולה ל:

    • לבצע פעולות מה שתרצו...
    • לכתוב קוד בממשק מיוחד שיכול גם להריץ את הקוד וכ"ו.
    • לכתוב מאמרים.
    • צ'אט.
    • לכתוב תוכן.
    • עם - gemini 3.1 pro
    • עובד למנוטרפים.
    • דורש API.

    כיצד להפעיל:

    התוכנה בהפעלה הראשונה תיצור מסביבה תיקיות וקבצים הכל תקין!
    יש להכנס לקטגורית API" ושם להזין את ה- API מג'ימיני!
    התוכנה משתמש במודל המהיר לצ'אט ו בפרו לביצוע פעולות קוד וכ"ו

    להורדה:

    AI פועל V.1

    לא להעתיק ללא כוכביות!!!


    תמונות בספוילר


    420adf2f-3212-4417-b75b-822f8a43fd86-image.png
    f8f398f1-c0e9-4a60-b71a-83583440fa0c-image.png
    cc268e95-284e-42fa-b5c6-c0607bb1c90d-image.png
    85c6f359-10ff-432e-bb87-ed2c0352c0c5-image.png
    59011699-0049-446f-b457-aa3116933381-image.png
    1b768941-cd89-4af1-94a0-e187a4449b16-image.png
    e4a17931-42ce-4cc4-a968-88d43782e4d5-image.png


    קוד מקור:

    app.py

    import os
    import io
    import sys
    import time
    import json
    import subprocess
    import threading
    import requests
    import urllib3
    from flask import Flask, request, jsonify
    import google.generativeai as genai
    from dotenv import load_dotenv
    from werkzeug.utils import secure_filename
    from PyQt5.QtWidgets import QApplication, QMainWindow
    from PyQt5.QtWebEngineWidgets import QWebEngineView
    from PyQt5.QtGui import QIcon
    from PyQt5.QtCore import QUrl
    
    if getattr(sys, 'frozen', False):
        sys.stdout = open(os.devnull, 'w')
        sys.stderr = open(os.devnull, 'w')
        BASE_DIR = os.path.dirname(sys.executable)
        ASSETS_DIR = sys._MEIPASS
    else:
        BASE_DIR = os.path.dirname(os.path.abspath(__file__))
        ASSETS_DIR = BASE_DIR
    
    CERT_FILE = os.path.join(BASE_DIR, "certificate.crt")
    if os.path.exists(CERT_FILE):
        os.environ["REQUESTS_CA_BUNDLE"] = CERT_FILE
        os.environ["SSL_CERT_FILE"] = CERT_FILE
    else:
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        old_merge_environment_settings = requests.Session.merge_environment_settings
        def merge_environment_settings(self, url, proxies, stream, verify, cert):
            settings = old_merge_environment_settings(self, url, proxies, stream, verify, cert)
            settings['verify'] = False 
            return settings
        requests.Session.merge_environment_settings = merge_environment_settings
    
    app = Flask(__name__)
    
    ENV_FILE = os.path.join(BASE_DIR, ".env")
    if not os.path.exists(ENV_FILE):
        with open(ENV_FILE, "w", encoding="utf-8") as f:
            f.write("GOOGLE_API_KEY=\n")
    
    load_dotenv(ENV_FILE)
    
    PROJECTS_DIR = os.path.join(BASE_DIR, "projects")
    UPLOADS_DIR = os.path.join(BASE_DIR, "uploads")
    KNOWLEDGE_DIR = os.path.join(BASE_DIR, "knowledge_bases")
    
    for d in [PROJECTS_DIR, UPLOADS_DIR, KNOWLEDGE_DIR]:
        if not os.path.exists(d): os.makedirs(d)
    
    MODEL_MAIN_NAME = 'gemini-3.1-pro-preview' 
    MODEL_FAST_NAME = 'gemini-3.1-flash-lite-preview'
    
    model_main = None
    model_fast = None
    chat_session = None
    
    def init_gemini():
        global model_main, model_fast, chat_session
        api_key = os.getenv("GOOGLE_API_KEY")
        if api_key:
            try:
                genai.configure(api_key=api_key, transport='rest')
                model_main = genai.GenerativeModel(MODEL_MAIN_NAME)
                model_fast = genai.GenerativeModel(MODEL_FAST_NAME)
                chat_session = model_fast.start_chat(history=[])
            except Exception as e:
                pass
    
    init_gemini()
    
    stop_generation_flag = False
    
    HTML_CONTENT = """<!DOCTYPE html>
    <html lang="he" dir="rtl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>JARVIS V5 ULTIMATE</title>
        <script src="https://cdn.tailwindcss.com"></script>
        <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
        <style>
            body { background: #000; color: #e2e8f0; height: 100vh; overflow: hidden; font-family: 'Segoe UI', sans-serif; }
            .glass { background: rgba(15, 15, 20, 0.95); border: 1px solid #333; }
            .active-tab { border-right: 4px solid #3b82f6; background: rgba(59, 130, 246, 0.15) !important; color: #60a5fa; }
            
            button, input, textarea, select { color: #ffffff !important; }
            button { background-color: #1e293b; border: none; cursor: pointer; }
            nav button { background-color: transparent; }
            input, textarea, select { background-color: #0f172a; border: 1px solid #334155; }
            
            .thinking-bar {
                height: 4px; width: 100%; background: linear-gradient(90deg, transparent, #3b82f6, transparent);
                animation: loading 1.5s infinite; position: absolute; top: 0; left: 0;
            }
            @keyframes loading { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } }
    
            .voice-active { animation: pulse 1s infinite; color: #f87171; }
            @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.2); opacity: 0.8; } 100% { transform: scale(1); opacity: 1; } }
    
            .prose h1, h2, h3 { color: #60a5fa; font-weight: bold; margin-top: 0.5rem; }
            .prose pre { background: #111; padding: 10px; direction: ltr; border-radius: 5px; border: 1px solid #333; }
        </style>
    </head>
    <body class="flex h-screen">
    
        <aside class="w-64 glass flex flex-col p-4 border-l border-gray-800">
            <div class="text-center mb-6">
                <h1 class="text-4xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-blue-500 to-cyan-500">JARVIS</h1>
                <div class="text-xs text-gray-500 mt-1">SYSTEM V5 | NETFREE PATCHED</div>
            </div>
    
            <nav class="space-y-3 flex-1 overflow-y-auto">
                <button onclick="switchTab('chat')" id="btn-chat" class="active-tab w-full p-3 rounded flex items-center gap-3 transition"><i class="fas fa-comment-dots"></i> צ'אט (מהיר)</button>
                <button onclick="switchTab('content')" id="btn-content" class="w-full p-3 rounded flex items-center gap-3 transition"><i class="fas fa-pen-nib"></i> כתיבת תוכן</button>
                <button onclick="switchTab('code')" id="btn-code" class="w-full p-3 rounded flex items-center gap-3 transition"><i class="fas fa-code"></i> קוד ופרויקטים</button>
                <button onclick="switchTab('agent')" id="btn-agent" class="w-full p-3 rounded flex items-center gap-3 transition"><i class="fas fa-robot text-red-400"></i> סוכן אוטונומי</button>
                <button onclick="switchTab('knowledge')" id="btn-knowledge" class="w-full p-3 rounded flex items-center gap-3 transition"><i class="fas fa-server text-yellow-400"></i> מפעל המידע</button>
                <button onclick="switchTab('settings')" id="btn-settings" class="w-full p-3 rounded flex items-center gap-3 transition"><i class="fas fa-key text-gray-400"></i> הגדרות API</button>
            </nav>
            
            <div class="text-[10px] text-gray-600 text-center">
                Main: Gemini 3.0 Pro<br>Chat: Gemini 2.5 Flash
            </div>
        </aside>
    
        <main class="flex-1 p-4 relative flex flex-col">
            
            <div id="tab-chat" class="flex-1 flex flex-col glass rounded-xl h-full relative overflow-hidden">
                <div id="chat-loader" class="hidden"><div class="thinking-bar"></div></div>
                <div id="chat-box" class="flex-1 overflow-y-auto space-y-4 p-4 pb-20"></div>
                
                <div class="absolute bottom-4 left-4 right-4 flex gap-2">
                    <label class="bg-slate-800 p-4 rounded-xl cursor-pointer hover:bg-slate-700 text-gray-400">
                        <i class="fas fa-paperclip"></i>
                        <input type="file" id="file-upload" class="hidden" onchange="fileSelected()">
                    </label>
                    <input id="chat-input" class="flex-1 bg-slate-900 border border-slate-700 rounded-xl p-4 text-white outline-none" placeholder="הקלד או דבר...">
                    <button id="mic-btn" onclick="toggleVoice()" class="bg-slate-800 p-4 rounded-xl text-white hover:bg-slate-700"><i class="fas fa-microphone"></i></button>
                    <button onclick="sendChat()" class="bg-blue-600 p-4 rounded-xl text-white hover:bg-blue-500"><i class="fas fa-paper-plane"></i></button>
                </div>
                <div id="file-notify" class="absolute bottom-20 right-6 text-xs text-blue-400"></div>
            </div>
    
            <div id="tab-content" class="hidden flex-1 flex flex-col glass rounded-xl h-full p-6 space-y-4 relative overflow-hidden">
                <div id="content-loader" class="hidden"><div class="thinking-bar"></div></div>
                <h2 class="text-2xl font-bold text-purple-400">יצירת תוכן (3.0 Pro)</h2>
                <div class="flex gap-2">
                    <input id="content-topic" class="flex-1 bg-slate-900 border border-slate-700 p-3 rounded outline-none" placeholder="נושא...">
                    <select id="content-type" class="bg-slate-900 border border-slate-700 p-3 rounded"><option>מאמר</option><option>פוסט</option><option>מייל</option></select>
                    <button onclick="genContent()" class="bg-purple-600 text-white px-6 rounded hover:bg-purple-500">צור</button>
                </div>
                <div id="content-res" class="prose flex-1 bg-black/50 p-6 rounded overflow-y-auto border border-gray-800"></div>
            </div>
    
            <div id="tab-code" class="hidden flex-1 flex flex-col glass rounded-xl h-full p-6 space-y-4 relative overflow-hidden">
                <div id="code-loader" class="hidden"><div class="thinking-bar"></div></div>
                <h2 class="text-2xl font-bold text-blue-400">בניית פרויקטים</h2>
                <input id="proj-name" class="bg-slate-900 border border-slate-700 p-3 rounded outline-none" placeholder="שם הפרויקט (באנגלית)">
                <textarea id="proj-desc" class="bg-slate-900 border border-slate-700 p-3 rounded outline-none h-32" placeholder="תיאור המערכת..."></textarea>
                <button onclick="genCode()" class="bg-blue-600 text-white p-4 rounded hover:bg-blue-500 font-bold">בנה ושמור</button>
                <div id="code-res" class="text-center text-gray-400 mt-4"></div>
            </div>
    
            <div id="tab-agent" class="hidden flex-1 flex flex-col glass rounded-xl h-full p-6 space-y-4 relative overflow-hidden">
                <div id="agent-loader" class="hidden"><div class="thinking-bar"></div></div>
                <h2 class="text-2xl font-bold text-red-500">סוכן אוטונומי</h2>
                <div class="flex gap-2">
                    <input id="agent-input" class="flex-1 bg-black border border-red-900 p-4 rounded text-red-100 font-mono" placeholder="פקודה (למשל: תפתח מחשבון ותיצור תיקייה בשם X)">
                    <button onclick="runAgent()" class="bg-red-700 text-white px-6 rounded hover:bg-red-600">בצע</button>
                </div>
                <div id="agent-log" class="flex-1 bg-black p-4 rounded border border-red-900/30 text-green-400 font-mono overflow-y-auto text-sm">
                    > System Ready.
                </div>
            </div>
    
            <div id="tab-knowledge" class="hidden flex-1 flex flex-col glass rounded-xl h-full p-6 space-y-4 relative overflow-hidden">
                <h2 class="text-2xl font-bold text-yellow-400">מפעל המידע</h2>
                <div class="flex gap-2">
                    <input id="know-topic" class="flex-1 bg-slate-900 border border-yellow-700 p-3 rounded outline-none" placeholder="נושא למאגר...">
                    <button id="btn-start" onclick="startKnow()" class="bg-green-600 text-white px-6 rounded">התחל</button>
                    <button id="btn-stop" onclick="stopKnow()" class="hidden bg-red-600 text-white px-6 rounded">עצור</button>
                </div>
                <div id="know-log" class="flex-1 bg-black/50 p-4 rounded border border-yellow-900 text-gray-300 overflow-y-auto"></div>
            </div>
    
            <div id="tab-settings" class="hidden flex-1 flex flex-col glass rounded-xl h-full p-6 space-y-4 relative overflow-hidden">
                <h2 class="text-2xl font-bold text-gray-400">הגדרות API</h2>
                <div class="flex gap-2">
                    <input id="api-key-input" type="password" class="flex-1 bg-slate-900 border border-slate-700 p-3 rounded outline-none text-left" placeholder="Google Gemini API Key">
                    <button onclick="saveApiKey()" class="bg-gray-700 text-white px-6 rounded hover:bg-gray-600 font-bold">שמור מפתח</button>
                </div>
                <div id="api-status" class="text-green-400 mt-2"></div>
            </div>
    
        </main>
    
        <script>
            function switchTab(t) {
                ['chat','content','code','agent','knowledge','settings'].forEach(x => {
                    document.getElementById('tab-'+x).classList.add('hidden');
                    document.getElementById('btn-'+x).classList.remove('active-tab');
                });
                document.getElementById('tab-'+t).classList.remove('hidden');
                document.getElementById('btn-'+t).classList.add('active-tab');
            }
    
            let voiceActive = false;
            const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
            recognition.lang = 'he-IL';
            
            recognition.onresult = e => {
                document.getElementById('chat-input').value = e.results[0][0].transcript;
                sendChat();
            };
            recognition.onend = () => { if(voiceActive && !window.speechSynthesis.speaking) recognition.start(); };
    
            function toggleVoice() {
                voiceActive = !voiceActive;
                const btn = document.getElementById('mic-btn');
                if(voiceActive) {
                    recognition.start();
                    btn.classList.add('voice-active');
                } else {
                    recognition.stop();
                    btn.classList.remove('voice-active');
                    window.speechSynthesis.cancel();
                }
            }
    
            let file = null;
            function fileSelected() {
                file = document.getElementById('file-upload').files[0];
                document.getElementById('file-notify').innerText = "קובץ: " + file.name;
            }
    
            async function sendChat() {
                const inp = document.getElementById('chat-input');
                const txt = inp.value; if(!txt && !file) return;
                const box = document.getElementById('chat-box');
                
                box.innerHTML += `<div class='flex'><div class='bg-blue-900/50 p-3 rounded-xl max-w-[80%]'>${txt || '[קובץ]'}</div></div>`;
                inp.value = ''; document.getElementById('file-notify').innerText = '';
                
                document.getElementById('chat-loader').classList.remove('hidden');
                
                const fd = new FormData();
                fd.append('message', txt);
                if(file) { fd.append('file', file); file = null; }
    
                try {
                    const res = await fetch('/api/chat', {method:'POST', body:fd});
                    const d = await res.json();
                    const html = marked.parse(d.response || d.error);
                    box.innerHTML += `<div class='flex justify-end mt-2'><div class='prose bg-slate-800 p-3 rounded-xl max-w-[80%]'>${html}</div></div>`;
                    box.scrollTop = box.scrollHeight;
                    
                    if(voiceActive) {
                        const u = new SpeechSynthesisUtterance((d.response||'').replace(/[*#]/g, ''));
                        u.lang = 'he-IL';
                        window.speechSynthesis.speak(u);
                    }
                } catch(e) {}
                document.getElementById('chat-loader').classList.add('hidden');
            }
    
            async function runAgent() {
                const txt = document.getElementById('agent-input').value;
                const log = document.getElementById('agent-log');
                log.innerHTML += `\\n> Executing: ${txt}...`;
                document.getElementById('agent-loader').classList.remove('hidden');
                
                try {
                    const res = await fetch('/api/agent_execute', {
                        method:'POST', headers:{'Content-Type':'application/json'},
                        body: JSON.stringify({request:txt})
                    });
                    const d = await res.json();
                    log.innerHTML += `\\n${d.log}\\n----------------`;
                } catch(e) { log.innerHTML += `\\nError.`; }
                document.getElementById('agent-loader').classList.add('hidden');
            }
    
            async function genContent() {
                document.getElementById('content-loader').classList.remove('hidden');
                const res = await fetch('/api/content', {
                    method:'POST', headers:{'Content-Type':'application/json'},
                    body: JSON.stringify({
                        topic: document.getElementById('content-topic').value,
                        type: document.getElementById('content-type').value
                    })
                });
                const d = await res.json();
                document.getElementById('content-res').innerHTML = marked.parse(d.content || d.error);
                document.getElementById('content-loader').classList.add('hidden');
            }
    
            async function genCode() {
                document.getElementById('code-loader').classList.remove('hidden');
                const res = await fetch('/api/code', {
                    method:'POST', headers:{'Content-Type':'application/json'},
                    body: JSON.stringify({
                        projectName: document.getElementById('proj-name').value,
                        description: document.getElementById('proj-desc').value
                    })
                });
                const d = await res.json();
                document.getElementById('code-res').innerText = d.success ? "✅ הפרויקט נשמר בהצלחה!" : "Error";
                document.getElementById('code-loader').classList.add('hidden');
            }
            
            let knowCtx = '';
            let knowFile = '';
            async function startKnow() {
                document.getElementById('btn-start').classList.add('hidden');
                document.getElementById('btn-stop').classList.remove('hidden');
                const t = document.getElementById('know-topic').value;
                const res = await fetch('/api/knowledge/start', {
                    method:'POST', headers:{'Content-Type':'application/json'},
                    body: JSON.stringify({topic:t})
                });
                const d = await res.json();
                knowFile = d.filename;
                document.getElementById('know-log').innerHTML = "התחלנו...";
                nextChunk(t);
            }
            async function nextChunk(t) {
                const res = await fetch('/api/knowledge/chunk', {
                    method:'POST', headers:{'Content-Type':'application/json'},
                    body: JSON.stringify({topic:t, filename:knowFile, context:knowCtx})
                });
                const d = await res.json();
                if(d.status === 'continue') {
                    document.getElementById('know-log').innerHTML += `<div>✅ פרק נכתב.</div>`;
                    knowCtx += d.summary;
                    nextChunk(t);
                } else {
                    document.getElementById('know-log').innerHTML += `<div class='text-red-400'>נעצר.</div>`;
                    stopKnow();
                }
            }
            function stopKnow() {
                fetch('/api/knowledge/stop', {method:'POST'});
                document.getElementById('btn-start').classList.remove('hidden');
                document.getElementById('btn-stop').classList.add('hidden');
            }
    
            async function saveApiKey() {
                const key = document.getElementById('api-key-input').value;
                if(!key) return;
                const res = await fetch('/api/settings', {
                    method:'POST', headers:{'Content-Type':'application/json'},
                    body: JSON.stringify({api_key: key})
                });
                const d = await res.json();
                document.getElementById('api-status').innerText = d.success ? "✅ מפתח נשמר והמערכת עודכנה בהצלחה!" : "❌ שגיאה בשמירת המפתח";
            }
    
            document.getElementById('chat-input').addEventListener('keypress', e=>{if(e.key==='Enter') sendChat()});
            document.getElementById('agent-input').addEventListener('keypress', e=>{if(e.key==='Enter') runAgent()});
        </script>
    </body>
    </html>"""
    
    @app.route('/')
    def home():
        return HTML_CONTENT
    
    @app.route('/api/settings', methods=['POST'])
    def save_settings():
        try:
            data = request.json
            new_key = data.get('api_key')
            if new_key:
                with open(ENV_FILE, "w", encoding="utf-8") as f:
                    f.write(f"GOOGLE_API_KEY={new_key}\n")
                os.environ["GOOGLE_API_KEY"] = new_key
                init_gemini()
                return jsonify({'success': True})
            return jsonify({'success': False})
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    @app.route('/api/chat', methods=['POST'])
    def chat():
        if not chat_session:
            return jsonify({'error': 'Missing API Key. Please configure it in settings.'}), 400
        try:
            uploaded_file = None
            if 'file' in request.files:
                file = request.files['file']
                if file.filename != '':
                    filename = secure_filename(file.filename)
                    path = os.path.join(UPLOADS_DIR, filename)
                    file.save(path)
                    uploaded_file = genai.upload_file(path)
    
            user_msg = request.form.get('message')
            
            if uploaded_file:
                response = chat_session.send_message([user_msg, uploaded_file])
            else:
                response = chat_session.send_message(user_msg)
                
            return jsonify({'response': response.text})
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    @app.route('/api/content', methods=['POST'])
    def generate_content():
        if not model_main:
            return jsonify({'error': 'Missing API Key.'}), 400
        try:
            data = request.json
            prompt = f"נושא: {data.get('topic')}. סוג: {data.get('type')}. כתוב בעברית ברמה אקדמית."
            
            response = model_main.generate_content(prompt)
            return jsonify({'content': response.text})
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    @app.route('/api/code', methods=['POST'])
    def generate_code_direct():
        if not model_main:
            return jsonify({'error': 'Missing API Key.'}), 400
        try:
            data = request.json
            proj_name = data.get('projectName')
            target_dir = os.path.join(PROJECTS_DIR, proj_name)
            if not os.path.exists(target_dir): os.makedirs(target_dir)
    
            prompt = f'''
            Act as an Expert Developer using {MODEL_MAIN_NAME}.
            Project: {proj_name}
            Description: {data.get('description')}
            OUTPUT FORMAT ONLY:
            ###FILENAME: filename.ext
            content...
            NO MARKDOWN.
            '''
            response = model_main.generate_content(prompt)
            
            files_created = []
            files = response.text.split("###FILENAME: ")
            for f in files:
                if not f.strip(): continue
                parts = f.split("\n", 1)
                if len(parts) < 2: continue
                filename = parts[0].strip()
                content = parts[1].replace("```python", "").replace("```", "")
                
                full_path = os.path.join(target_dir, filename)
                os.makedirs(os.path.dirname(full_path), exist_ok=True)
                with open(full_path, "w", encoding="utf-8") as file:
                    file.write(content)
                files_created.append(filename)
                
            if not files_created: raise Exception("No files generated")
            return jsonify({'success': True, 'path': target_dir, 'files': files_created})
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    @app.route('/api/agent_execute', methods=['POST'])
    def agent_execute():
        if not model_main:
            return jsonify({'log': 'Missing API Key.'})
        try:
            data = request.json
            user_request = data.get('request')
            
            prompt = f'''
            You are an Autonomous System Agent.
            User Request: "{user_request}"
            
            Supported Actions JSON format:
            [
                {{"action": "create_folder", "path": "name"}},
                {{"action": "create_file", "path": "name.txt", "content": "text"}},
                {{"action": "open_app", "app_name": "calc"}},
                {{"action": "run_cmd", "command": "ping 8.8.8.8"}}
            ]
            RETURN ONLY JSON ARRAY.
            '''
            
            plan_response = model_main.generate_content(prompt)
            plan_text = plan_response.text.replace("```json", "").replace("```", "").strip()
            
            try:
                actions = json.loads(plan_text)
            except:
                start = plan_text.find('[')
                end = plan_text.rfind(']') + 1
                if start != -1 and end != -1:
                    actions = json.loads(plan_text[start:end])
                else:
                    return jsonify({'log': "❌ שגיאה בפענוח הפקודה. נסה שוב."})
    
            log = []
            for act in actions:
                action = act.get('action')
                try:
                    if action == 'create_folder':
                        path = os.path.join(PROJECTS_DIR, act.get('path'))
                        os.makedirs(path, exist_ok=True)
                        log.append(f"✅ תיקייה: {act.get('path')}")
                    elif action == 'create_file':
                        path = os.path.join(PROJECTS_DIR, act.get('path'))
                        with open(path, "w", encoding="utf-8") as f: f.write(act.get('content', ''))
                        log.append(f"✅ קובץ: {act.get('path')}")
                    elif action == 'open_app':
                        os.system(f"start {act.get('app_name')}")
                        log.append(f"🚀 הפעלה: {act.get('app_name')}")
                    elif action == 'run_cmd':
                        res = subprocess.run(act.get('command'), shell=True, capture_output=True, text=True)
                        log.append(f"💻 פקודה: {act.get('command')}\n>> {res.stdout}")
                except Exception as e:
                    log.append(f"❌ שגיאה בביצוע {action}: {e}")
    
            return jsonify({'log': "\n".join(log)})
        except Exception as e:
            return jsonify({'log': f"Critical Error: {str(e)}"})
    
    @app.route('/api/knowledge/start', methods=['POST'])
    def start_knowledge():
        global stop_generation_flag
        stop_generation_flag = False
        data = request.json
        topic = data.get('topic')
        filename = f"{topic.replace(' ', '_')}_{int(time.time())}.html"
        filepath = os.path.join(KNOWLEDGE_DIR, filename)
        with open(filepath, "w", encoding="utf-8") as f:
            f.write(f"<h1 dir='rtl' style='text-align:center'>{topic}</h1><hr>")
        return jsonify({'filename': filename, 'path': filepath})
    
    @app.route('/api/knowledge/chunk', methods=['POST'])
    def generate_chunk():
        if not model_main:
            return jsonify({'status': 'error', 'summary': 'Missing API Key.'})
        if stop_generation_flag: return jsonify({'status': 'stopped'})
        data = request.json
        
        prompt = f'''
        Continue writing the knowledge base about: "{data.get('topic')}".
        Previous context: {data.get('context')}
        Write the next chapter in Hebrew (HTML format). High detail.
        '''
        try:
            response = model_main.generate_content(prompt)
            filepath = os.path.join(KNOWLEDGE_DIR, data.get('filename'))
            with open(filepath, "a", encoding="utf-8") as f:
                f.write(f"<div dir='rtl' style='margin:20px; font-family:sans-serif'>{response.text}</div>")
            return jsonify({'status': 'continue', 'content': response.text, 'summary': "פרק נוסף נכתב..."})
        except Exception as e:
            return jsonify({'status': 'error'})
    
    @app.route('/api/knowledge/stop', methods=['POST'])
    def stop_knowledge():
        global stop_generation_flag
        stop_generation_flag = True
        return jsonify({'status': 'stopping'})
    
    def run_flask_server():
        app.run(host='127.0.0.1', port=5000, debug=False, use_reloader=False)
    
    if __name__ == '__main__':
        server_thread = threading.Thread(target=run_flask_server, daemon=True)
        server_thread.start()
        
        time.sleep(1.5)
        
        qt_app = QApplication(sys.argv)
        qt_app.setStyleSheet("QMainWindow { background-color: #0f0f14; }")
        
        main_window = QMainWindow()
        main_window.setWindowTitle("JARVIS V5 ULTIMATE")
        main_window.resize(1280, 800)
        
        icon_path = os.path.join(ASSETS_DIR, "123.ico")
        if os.path.exists(icon_path):
            main_window.setWindowIcon(QIcon(icon_path))
            
        browser = QWebEngineView()
        browser.setUrl(QUrl("http://127.0.0.1:5000"))
        
        main_window.setCentralWidget(browser)
        main_window.show()
        
        sys.exit(qt_app.exec_())
    

  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
מופעל על ידי NodeBB התורמים
  • פוסט ראשון
    פוסט אחרון
0
  • כללי הפורום
  • רשימת תגים
  • פוסטים אחרונים
  • לא נפתר
  • פופולרי
  • משתמשים
  • קבוצות