AI Studio Super-Configurer

Combines auto-configuration (safety, tools, temp) with a persistent, auto-closing system prompt for Google's AI Studio.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         AI Studio Super-Configurer
// @version      1.7.8
// @description  Combines auto-configuration (safety, tools, temp) with a persistent, auto-closing system prompt for Google's AI Studio.
// @author       Based on work by Kytrex & combined by AI
// @license      MIT
// @match        https://aistudio.google.com/prompts/*
// @grant        none
// @namespace    http://tampermonkey.net/
// ==/UserScript==

(function() {
    'use strict';

    if (window.superConfigHasRun) {
        console.warn('Super-Configurer: Script has already been executed. Halting.');
        return;
    }
    window.superConfigHasRun = true;

    // --- 1. EDIT YOUR SYSTEM INSTRUCTIONS HERE ---
    const systemInstructions = `
Core Identity:

You are a hyper-intelligent, direct, and logical AI. Your purpose is to provide accurate, unbiased, and concise answers based exclusively on verifiable, real-time information.
Primary Mandate:

Your entire response must be synthesized from information retrieved via real-time web searches conducted after receiving the user's query. Do not access or rely on any pre-existing or internal knowledge base.
Operational Protocol:

Source Verification and Citation:
Every statement you make must be directly supported by the search results.
End every sentence with a citation marker referencing the source index, like this: statement. [1].
If a sentence synthesizes information from multiple sources, cite all of them: statement. [1, 2].
Handling Uncertainty and Inference:
If you cannot find information through a web search, you must state: Can't find related sources。
If you make a logical inference that is not explicitly stated in the sources, you must append the marker [This has source] to that sentence.

Communication Style:
Direct & Concise: Address the user's query head-on. Omit apologies, disclaimers, moralizing, and redundant phrases. Assume the user is an expert.
Language: All responses must be in English.
Formatting: Use Markdown (headings, lists, bolding) to structure responses for maximum clarity. Any code blocks must be written in English.
Internal Process:
For complex or multi-step queries, reason step-by-step internally before formulating the final, user-facing response. This ensures accuracy and logical coherence.
    `.trim();
    // --------------------------------------------

    console.log('--- AI Studio Super-Configurer v1.1 Initializing ---');

    function findSwitchByLabel(labelText) {
        const allTextElements = Array.from(document.querySelectorAll('h3, .mdc-label'));
        const labelElement = allTextElements.find(el => el.textContent.trim() === labelText);
        if (!labelElement) return null;
        const parentContainer = labelElement.closest('.settings-item');
        return parentContainer ? parentContainer.querySelector('button[role="switch"]') : null;
    }

    async function configureBaseSettings() {
        console.log('Phase 1: Configuring base settings...');
        try {
            const safetyButton = document.querySelector('.edit-safety-button');
            if (safetyButton) {
                safetyButton.click();
                await new Promise(resolve => setTimeout(resolve, 500));
                document.querySelectorAll('.run-safety-settings .mat-mdc-slider input[type="range"]').forEach(slider => {
                    slider.value = -4;
                    slider.dispatchEvent(new Event('input', { bubbles: true }));
                });
                const closeButton = document.querySelector('button[aria-label="Close Run Safety Settings"]');
                if (closeButton) closeButton.click();
                console.log('SUCCESS: Safety settings configured.');
            }
        } catch (e) { console.error('ERROR: Could not configure Safety Settings.', e); }

        ['URL context', 'Code execution'].forEach(label => {
            const toggle = findSwitchByLabel(label);
            if (toggle && toggle.getAttribute('aria-checked') === 'false') {
                toggle.click();
                console.log(`SUCCESS: Enabled '${label}'.`);
            } else if (toggle) {
                console.log(`INFO: '${label}' was already enabled.`);
            } else {
                console.error(`ERROR: Could not find toggle for '${label}'.`);
            }
        });

        const slider = document.querySelector('input[matsliderthumb]');
        if (slider) {
            slider.value = 1.35;
            slider.dispatchEvent(new Event('input', { bubbles: true }));
            console.log('SUCCESS: Temperature set to 1.35.');
        } else {
            console.error('ERROR: Temperature slider not found.');
        }
    }

    async function injectSystemInstructions() {
        console.log('Phase 2 (Delayed): Managing System Instructions...');
        try {
            // <<< THIS IS THE FIX >>>
            // Using the precise selector from the HTML you provided.
            const openButton = document.querySelector('button[aria-label="System instructions"]');
            if (!openButton) throw new Error("Could not find 'System Instructions' open button using aria-label.");

            openButton.click();
            await new Promise(resolve => setTimeout(resolve, 500));

            const textarea = document.querySelector('textarea[aria-label="System instructions"], textarea[placeholder="Optional tone and style instructions for the model"]');
            if (!textarea) throw new Error("Could not find System Instructions textarea.");

            textarea.value = systemInstructions;
            textarea.dispatchEvent(new Event('input', { bubbles: true }));
            console.log('SUCCESS: System instructions injected.');

            console.log('Waiting 3 seconds before closing...');
            await new Promise(resolve => setTimeout(resolve, 3000));

            const closeButton = document.querySelector('button[aria-label="System instructions"]');
            if (closeButton) {
                closeButton.click();
                console.log('SUCCESS: System Instructions panel closed.');
            } else {
                console.warn('WARNING: Could not find System Instructions close button. Panel left open.');
            }
        } catch (error) {
            console.error('ERROR during System Instructions injection:', error.message);
        }
    }

    // --- EXECUTION SCHEDULE ---
    setTimeout(configureBaseSettings, 2000);
    setTimeout(injectSystemInstructions, 5000);

})();