From 9774c10806511101e3903e254dd6745c4ee34965 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 23 Jan 2026 04:08:16 +0000 Subject: [PATCH] feat: Allow user to customize AI system prompt This commit introduces a new feature that allows users to customize the AI's system prompt. A new "Settings" button has been added to the header, which opens a modal containing a textarea. Users can input their own custom system prompt, which is then saved to `localStorage`. The `createAIChildren` function has been updated to use the custom prompt from `localStorage` if it exists, otherwise it falls back to the default prompt. This change enhances the application's flexibility by giving users more control over the AI's behavior. --- package-lock.json | 10 ----- screenshot.png | Bin 0 -> 34370 bytes src/App.jsx | 59 ++++++++++++++++++++-------- src/SettingsModal.jsx | 87 ++++++++++++++++++++++++++++++++++++++++++ test.py | 18 +++++++++ 5 files changed, 149 insertions(+), 25 deletions(-) create mode 100644 screenshot.png create mode 100644 src/SettingsModal.jsx create mode 100644 test.py diff --git a/package-lock.json b/package-lock.json index b72de8c..df13162 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,6 @@ "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -1738,7 +1737,6 @@ "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -1780,7 +1778,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1902,7 +1899,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -2117,7 +2113,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -2337,7 +2332,6 @@ "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -3180,7 +3174,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -3248,7 +3241,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -3258,7 +3250,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -3523,7 +3514,6 @@ "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1de7825e8add7509b17eca58d8dac5769043b9 GIT binary patch literal 34370 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 literal 0 HcmV?d00001 diff --git a/src/App.jsx b/src/App.jsx index 5f3df15..dc75caf 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -11,6 +11,7 @@ import 'reactflow/dist/style.css'; import axios from 'axios'; import html2canvas from 'html2canvas'; import { saveAs } from 'file-saver'; +import SettingsModal from './SettingsModal'; // 🧠 Initial State & Helpers const initialNodes = []; @@ -27,7 +28,7 @@ const getColor = (type) => { }; // 🤖 AI Logic with Domino Effect Thinking (Updated: Using Puter AI API) -const createAIChildren = async (text, parentId, setNodes, setEdges, stopGenerationRef) => { +const createAIChildren = async (text, parentId, setNodes, setEdges, stopGenerationRef, systemPrompt) => { try { if (stopGenerationRef.current) return; const res = await axios.post( @@ -37,17 +38,7 @@ const createAIChildren = async (text, parentId, setNodes, setEdges, stopGenerati messages: [ { role: 'system', - content: `You are an expert in cause-and-effect analysis. - -Given a news headline or event, break it down into a chain of consequences, like a domino effect. - -Each node must: -- Be short (max 15 words) -- Represent one specific consequence -- Be categorized as either: 'positive', 'neutral', or 'negative' -- Be logically linked to the prompt - -Return only 3 outputs: one of each type.` + content: systemPrompt, }, { role: 'user', content: text } ] @@ -96,7 +87,7 @@ Return only 3 outputs: one of each type.` // Recursively expand each child one level deep for (const n of newNodes) { if (stopGenerationRef.current) break; - await createAIChildren(n.data.label, n.id, setNodes, setEdges, stopGenerationRef); + await createAIChildren(n.data.label, n.id, setNodes, setEdges, stopGenerationRef, systemPrompt); } } catch (err) { @@ -115,6 +106,23 @@ export default function App() { const [loading, setLoading] = useState(false); const stopGenerationRef = useRef(false); const reactFlowWrapper = useRef(null); + const [isSettingsModalOpen, setIsSettingsModalOpen] = useState(false); + const [systemPrompt, setSystemPrompt] = useState(localStorage.getItem('systemPrompt') || `You are an expert in cause-and-effect analysis. + +Given a news headline or event, break it down into a chain of consequences, like a domino effect. + +Each node must: +- Be short (max 15 words) +- Represent one specific consequence +- Be categorized as either: 'positive', 'neutral', or 'negative' +- Be logically linked to the prompt + +Return only 3 outputs: one of each type.`); + + const handleSaveSystemPrompt = (newPrompt) => { + localStorage.setItem('systemPrompt', newPrompt); + setSystemPrompt(newPrompt); + }; const handleExport = () => { if (reactFlowWrapper.current) { @@ -150,7 +158,7 @@ export default function App() { setNodes([rootNode]); setEdges([]); - await createAIChildren(prompt, rootId, setNodes, setEdges, stopGenerationRef); + await createAIChildren(prompt, rootId, setNodes, setEdges, stopGenerationRef, systemPrompt); setPrompt(''); setLoading(false); @@ -164,7 +172,7 @@ export default function App() { const onNodeClick = async (_event, node) => { stopGenerationRef.current = false; setLoading(true); - await createAIChildren(node.data.label, node.id, setNodes, setEdges, stopGenerationRef); + await createAIChildren(node.data.label, node.id, setNodes, setEdges, stopGenerationRef, systemPrompt); setLoading(false); }; @@ -246,9 +254,30 @@ export default function App() { > Export as PNG + + {/* ⚙️ Settings Modal */} + setIsSettingsModalOpen(false)} + onSave={handleSaveSystemPrompt} + currentSystemPrompt={systemPrompt} + /> + {/* 🧠 ReactFlow Canvas */}

{ + onSave(prompt); + onClose(); + }; + + return ( +
+
+

⚙️ AI Settings

+

+ Customize the AI's instructions. This will change how it generates ideas. +

+