Fix false autonomous safety handoffs

This commit is contained in:
jjbrunton committed 2026-08-09 21:27:53 +01:00
1 parent 84a133451f
commit c0cc661a2f
6 files changed
+144 -29

No files matched your search

+21 -11
View File
@@ -12,10 +12,10 @@ import {
chooseConversationIntent,
conversationMessageFingerprint,
createConversationAutomationState,
isSafeHybridMediaAsk,
isSafeR4RReply,
hybridMediaAskSafetyFailure,
LEGACY_AUTOMATED_CONVERSATION_TURNS,
mergeConversationState,
r4rReplySafetyFailure,
remainingAutomationTurns,
type ConversationState,
} from './conversation-state.js';
@@ -355,22 +355,32 @@ export class ConversationAutomationService {
if (isLegacy && intent.kind !== 'media-ask') {
return this.finish(conversation, conversationId, state, incomingKey, 'human-required', intent.reason);
}
const reply = isLegacy
? await this.ai.generateMediaAsk(mapped, conversation.username, state, intent)
const generatePlannedReply = () => isLegacy
? this.ai.generateMediaAsk(mapped, conversation.username, state, intent)
: isHybridMediaAsk
? await this.ai.generateR4RMediaAsk(mapped, conversation.username, state)
: await this.ai.generateReply(mapped, conversation.username, state, intent);
const safeReply = isLegacy || isHybridMediaAsk
? isSafeHybridMediaAsk(reply)
: isSafeR4RReply(reply);
if (!safeReply) {
? this.ai.generateR4RMediaAsk(mapped, conversation.username, state)
: this.ai.generateReply(mapped, conversation.username, state, intent);
let reply = await generatePlannedReply();
let safetyFailure = isLegacy || isHybridMediaAsk
? hybridMediaAskSafetyFailure(reply)
: r4rReplySafetyFailure(reply);
if ((isLegacy || isHybridMediaAsk)
&& safetyFailure === 'media ask does not contain a recognizable image or video request') {
this.logger.warn?.(
`[automation] Regenerating media ask for u/${conversation.username}; the first response did not contain a recognizable request`,
);
reply = await generatePlannedReply();
safetyFailure = hybridMediaAskSafetyFailure(reply);
}
if (safetyFailure) {
const outputKind = isLegacy || isHybridMediaAsk ? 'media ask' : 'reply';
return this.finish(
conversation,
conversationId,
state,
incomingKey,
'human-required',
'The generated reply failed autonomous safety checks.',
`The generated ${outputKind} was rejected: ${safetyFailure}.`,
);
}
if (this.dryRun) {