feat(proxy): ARIA-Persona ueber echten System-Prompt-Kanal (--append-system-prompt)

Statt System/Persona als <system>-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 <system>-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) <noreply@anthropic.com>
This commit is contained in:
2026-07-10 21:05:48 +02:00
co-authored by Claude Opus 4.8
parent 885e825f8b
commit fa0eb13e0c
2 changed files with 9 additions and 6 deletions
+8 -6
View File
@@ -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 <system>-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,
};