Google AI Studio 默认系统提示词

自动设置Google AI Studio的系统提示词

目前為 2025-01-10 提交的版本,檢視 最新版本

/*
 * File: global-system-prompt.js
 * Project: g-ai-studio-global-system-prompt
 * Created: 2025-01-10 09:46:13
 * Author: Victor Cheng
 * Email: [email protected]
 * Description: 
 */

// 写一个Tampermonkey脚本
// 用在 https://aistudio.google.com/prompts/ 开头的网页
// 在页面上加一个链接,"Set Global System Prompt"
// 点击链接出现弹窗,里面有个输入框,可以输入全局系统提示词,默认为:
// Always search in English. Answer in the same language as the question.
// 这个全局系统提示词保存到本地,如果用户调整过,下次打开页面时,要保持用户调整后的内容
// 找到class名为 "system-instructions" 的节点,找到里面的textarea,把textarea里的内容改为全局系统提示词

// ==UserScript==
// @name         Google AI Studio 默认系统提示词
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  自动设置Google AI Studio的系统提示词
// @author       Victor Cheng
// @match        https://aistudio.google.com/prompts/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 默认系统提示词
    const DEFAULT_PROMPT = 'Always search in English. Answer in the same language as the question.';
    
    // 从localStorage获取保存的提示词
    const getSavedPrompt = () => localStorage.getItem('aiStudioSystemPrompt') || DEFAULT_PROMPT;

    // 创建设置链接
    const createSettingLink = () => {
        const link = document.createElement('a');
        link.textContent = 'Set Global System Prompt';
        link.href = 'javascript:void(0)';
        link.style.cssText = `
            display: block;
            color: #1a73e8;
            text-decoration: none;
            font-size: 14px;
            margin-bottom: 20px;
        `;
        return link;
    };

    // 创建弹窗
    const createDialog = () => {
        const dialog = document.createElement('div');
        dialog.style.cssText = `
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            z-index: 10000;
            min-width: 300px;
        `;
        
        const textarea = document.createElement('textarea');
        textarea.value = getSavedPrompt();
        textarea.style.cssText = `
            width: 100%;
            min-height: 100px;
            margin: 10px 0;
            padding: 8px;
            border: 1px solid #ccc;
            border-radius: 4px;
        `;

        const buttonContainer = document.createElement('div');
        buttonContainer.style.cssText = `
            display: flex;
            gap: 10px;
        `;

        const saveButton = document.createElement('button');
        saveButton.textContent = '保存';
        saveButton.style.cssText = `
            padding: 8px 16px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        `;

        const resetButton = document.createElement('button');
        resetButton.textContent = '重置';
        resetButton.style.cssText = `
            padding: 8px 16px;
            background-color: #f8f9fa;
            color: #3c4043;
            border: 1px solid #dadce0;
            border-radius: 4px;
            cursor: pointer;
        `;

        const cancelButton = document.createElement('button');
        cancelButton.textContent = '取消';
        cancelButton.style.cssText = `
            padding: 8px 16px;
            background-color: #f8f9fa;
            color: #3c4043;
            border: 1px solid #dadce0;
            border-radius: 4px;
            cursor: pointer;
        `;

        buttonContainer.appendChild(saveButton);
        buttonContainer.appendChild(cancelButton);
        buttonContainer.appendChild(resetButton);

        dialog.appendChild(textarea);
        dialog.appendChild(buttonContainer);

        // 添加重置按钮的点击事件
        resetButton.addEventListener('click', () => {
            textarea.value = DEFAULT_PROMPT;
        });

        return { dialog, textarea, saveButton, cancelButton };
    };

    // 更新系统提示词
    const updateSystemPrompt = (prompt) => {
        const systemInstructions = document.querySelector('.system-instructions');
        if (systemInstructions) {
            const textarea = systemInstructions.querySelector('textarea');
            if (textarea) {
                textarea.value = prompt;
                const inputEvent = new Event('input', {
                    bubbles: true,
                    cancelable: true,
                });
                textarea.dispatchEvent(inputEvent);
            }
        }
    };

    // 创建遮罩层
    const createOverlay = () => {
        const overlay = document.createElement('div');
        overlay.style.cssText = `
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0,0,0,0.5);
            z-index: 9999;
        `;
        return overlay;
    };

    // 初始化
    const init = () => {
        const link = createSettingLink();
        
        // 监听DOM变化,等待navigation区域出现
        const observer = new MutationObserver((mutations, obs) => {
            const nav = document.querySelector('[role="navigation"]');
            if (nav && !nav.querySelector('a[href="javascript:void(0)"]')) {
                // 在导航区域的开头插入链接
                nav.insertBefore(link, nav.firstChild);
                // 找到后就停止观察
                obs.disconnect();
            }
        });

        // 观察文档变化
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });

        // 设置链接的点击事件
        link.addEventListener('click', () => {
            const overlay = createOverlay();
            document.body.appendChild(overlay);
            
            const { dialog, textarea, saveButton, cancelButton } = createDialog();
            document.body.appendChild(dialog);

            saveButton.addEventListener('click', () => {
                const newPrompt = textarea.value.trim();
                localStorage.setItem('aiStudioSystemPrompt', newPrompt);
                updateSystemPrompt(newPrompt);
                document.body.removeChild(dialog);
                document.body.removeChild(overlay);
            });

            cancelButton.addEventListener('click', () => {
                document.body.removeChild(dialog);
                document.body.removeChild(overlay);
            });
        });
    };

    // 监听DOM变化,自动设置系统提示词
    const observer = new MutationObserver((mutations, obs) => {
        const systemInstructions = document.querySelector('.system-instructions');
        if (systemInstructions) {
            const textarea = systemInstructions.querySelector('textarea');
            if (textarea && textarea.spellcheck === true) {
                updateSystemPrompt(getSavedPrompt());
            }
        }
    });

    // 开始观察文档变化
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    // 初始化
    init();
})();