🛂 fix: Preserve Legacy Assistant Attribution (#15118)

This commit is contained in:
Danny Avila 2026-08-22 16:21:45 -04:00 committed by GitHub
parent fc7d56dffe
commit 8f9fae0a6e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 49 additions and 1 deletions

View file

@ -3211,6 +3211,52 @@ describe('AgentClient - titleConvo', () => {
).toThrow(expect.objectContaining({ code: 'content_filter_block' }));
});
it('preserves persisted assistant attribution at the final agent provider boundary', async () => {
const marker = 'E2E-PERSISTED-UNATTRIBUTED-ASSISTANT';
mockReq.config.filters = {
messages: {
pii: {
fields: ['text'],
starterPatterns: [],
customPatterns: [
{
id: 'persisted-unattributed-assistant',
label: 'persisted unattributed assistant content',
regex: `^${marker}$`,
},
],
},
unattributedAssistantContent: 'inspect',
},
};
const storedMessage = {
messageId: 'legacy-assistant',
parentMessageId: null,
sender: 'Assistant',
text: marker,
isCreatedByUser: false,
};
client.setModelBoundStoredMessages([storedMessage]);
const result = await client.buildMessages([storedMessage], 'legacy-assistant', {}, {});
const { messages: providerMessages } = jest
.requireActual('@librechat/agents')
.formatAgentMessages(result.prompt);
expect(() =>
client
.createModelBoundChatModelCallback()
.handleChatModelStart(undefined, [providerMessages]),
).toThrow(expect.objectContaining({ code: 'content_filter_block' }));
client.setModelBoundStoredMessages([{ ...storedMessage, isUserSubmitted: false }]);
expect(() =>
client
.createModelBoundChatModelCallback()
.handleChatModelStart(undefined, [providerMessages]),
).not.toThrow();
});
it('ignores historical file refs when this agent does not replay files', async () => {
mockReq.config.filters = {
files: {

View file

@ -1986,7 +1986,9 @@ function projectStoredMessageForProvider(
role: message.role,
isCreatedByUser: message.isCreatedByUser,
isUserSubmitted: message.isUserSubmitted,
...(selectedContentPartIndices == null && messageContentCandidate == null && storedText != null
...(messageContentCandidate == null &&
storedText != null &&
(selectedContentPartIndices == null || selectedContentPartIndices.has(0))
? { text: storedText }
: {}),
...(attribution === 'user' && {