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:
@@ -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 &&
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user