From fa0eb13e0cfdf7177510a9749a7c4bee3927b264 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 10 Jul 2026 21:05:48 +0200 Subject: [PATCH] feat(proxy): ARIA-Persona ueber echten System-Prompt-Kanal (--append-system-prompt) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Statt System/Persona als -getaggten User-Content in den Prompt zu falten (was das Modell als Prompt-Injection fehldeutete und ARIA aus der Rolle warf), geht sie jetzt ueber den ECHTEN System-Prompt-Kanal der Claude-CLI. - openai-to-cli.js: openaiToCli liefert prompt = NUR Verlauf (conversationToPrompt), systemPrompt = Persona + Tool-Block (extractSystemPrompt, ohne -Tags). - docker-compose: neue sed-Zeile schleust "--append-system-prompt",options.systemPrompt ins buildArgs-Array von manager.js (gleicher Stil wie die bestehenden Patches; options ist dort in scope). routes.js reicht systemPrompt bereits an subprocess.start durch (b9150f2). systemPrompt ist immer ein String (extractSystemPrompt → "" statt undefined), also kein spawn-Crash bei leerem System. sed-Transformation gegen echten buildArgs simuliert → valides JS-Array verifiziert. Rollback falls die CLI-Version --append-system-prompt nicht kennt: die eine sed-Zeile aus docker-compose entfernen + openaiToCli.prompt zurueck auf messagesToPrompt. Co-Authored-By: Claude Opus 4.8 (1M context) --- docker-compose.yml | 1 + proxy-patches/openai-to-cli.js | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9d92a75..4435d7d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ services: DIST=$$(find /usr/local/lib -path '*/claude-max-api-proxy/dist' -type d | head -1) && sed -i 's/startServer({ port })/startServer({ port, host: process.env.HOST || \"127.0.0.1\" })/' $$DIST/server/standalone.js && sed -i 's/\"--no-session-persistence\",/\"--no-session-persistence\",\"--dangerously-skip-permissions\",/' $$DIST/subprocess/manager.js && + sed -i 's/\"--dangerously-skip-permissions\",/\"--dangerously-skip-permissions\",\"--append-system-prompt\",options.systemPrompt,/' $$DIST/subprocess/manager.js && sed -i 's/const DEFAULT_TIMEOUT = 300000;/const DEFAULT_TIMEOUT = 86400000;/' $$DIST/subprocess/manager.js && sed -i '/prompt, \\/\\/ Pass prompt as argument/d' $$DIST/subprocess/manager.js && sed -i 's|this\\.process\\.stdin?\\.end();|this.process.stdin?.end(prompt);|' $$DIST/subprocess/manager.js && diff --git a/proxy-patches/openai-to-cli.js b/proxy-patches/openai-to-cli.js index 82151ea..d378975 100644 --- a/proxy-patches/openai-to-cli.js +++ b/proxy-patches/openai-to-cli.js @@ -216,14 +216,16 @@ export function conversationToPrompt(messages) { } export function openaiToCli(request) { + // Persona/System + Tool-Block gehen ueber den ECHTEN System-Prompt-Kanal + // (--append-system-prompt, siehe manager.js buildArgs-Patch). Der Prompt + // enthaelt nur noch den Gespraechsverlauf — so kann das Modell die + // ARIA-Vorgaben nicht mehr als -getaggten User-Content und damit als + // Prompt-Injection fehldeuten. + // systemPrompt ist immer ein String (extractSystemPrompt liefert "" statt + // undefined) → --append-system-prompt "" ist harmlos, kein spawn-Crash. return { - // prompt: solange manager.js --append-system-prompt noch NICHT nutzt, - // bleibt der System-Inhalt zusaetzlich im Prompt (messagesToPrompt), sonst - // ginge die Persona verloren. Sobald der echte Kanal steht: hier auf - // conversationPrompt umstellen. - prompt: messagesToPrompt(request.messages, request.tools), + prompt: conversationToPrompt(request.messages), systemPrompt: extractSystemPrompt(request.messages, request.tools), - conversationPrompt: conversationToPrompt(request.messages), model: extractModel(request.model), sessionId: request.user, };