feat(ai-chat): load full transcript for model history (drop 50-msg window)
The per-turn model conversation was rebuilt via findRecent(chatId, ws, 50), a sliding window that dropped the beginning of any chat longer than ~50 stored rows. Switch streamChat to the existing findAllByChat, which loads the full non-deleted transcript chronologically with a 5000-row memory-safety backstop (keeps the newest rows + logs a warning on overflow) — a safety net, not a conversational limit. Remove the now-unused findRecent method and update the comments/log text that referenced it (findAllByChat now feeds both the Markdown export and the model history). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
committed by
claude code agent 227
parent
fad1aa0501
commit
1f459d8d26
@@ -240,7 +240,7 @@ describe('prepareAgentStep', () => {
|
||||
* write path. It runs identically for the upfront insert (empty steps,
|
||||
* 'streaming'), every per-step update, and the terminal finalize — so a future
|
||||
* background worker can call the same function. These tests pin the four status
|
||||
* shapes and the `metadata.parts` shape that rowToUiMessage/findRecent depend on
|
||||
* shapes and the `metadata.parts` shape that rowToUiMessage/findAllByChat depend on
|
||||
* (per-step text + tool parts via assistantParts, in-progress text appended).
|
||||
*/
|
||||
describe('flushAssistant', () => {
|
||||
|
||||
@@ -322,12 +322,14 @@ export class AiChatService implements OnModuleInit {
|
||||
|
||||
// Rebuild the conversation from persisted history (not the client payload),
|
||||
// so the model always sees the authoritative server-side transcript. Load
|
||||
// the most RECENT tail (oldest -> newest) so chats longer than one page do
|
||||
// not drop recent turns (incl. the user message just inserted above).
|
||||
const history = await this.aiChatMessageRepo.findRecent(
|
||||
// the FULL history in chronological order (oldest -> newest, incl. the user
|
||||
// message just inserted above) so NO turns are dropped — there is no
|
||||
// recent-tail window anymore. `findAllByChat` keeps a 5000-row memory-safety
|
||||
// backstop (on overflow it keeps the NEWEST rows and logs a warning); that
|
||||
// is a safety net far above any realistic chat, not a conversational limit.
|
||||
const history = await this.aiChatMessageRepo.findAllByChat(
|
||||
chatId,
|
||||
workspace.id,
|
||||
50,
|
||||
);
|
||||
const uiMessages = history.map(rowToUiMessage);
|
||||
// convertToModelMessages is async in ai@6.0.134 (returns Promise<ModelMessage[]>).
|
||||
@@ -1215,7 +1217,7 @@ export async function applyFinalize(
|
||||
*
|
||||
* `metadata.parts` is built by assistantParts over the finished steps, then the
|
||||
* in-progress text appended as a trailing text part, so rowToUiMessage /
|
||||
* findRecent keep replaying the turn unchanged. `metadata.finishReason`,
|
||||
* findAllByChat keep replaying the turn unchanged. `metadata.finishReason`,
|
||||
* `metadata.error`, `metadata.usage`, `metadata.contextTokens` and
|
||||
* `metadata.maxContextTokens` are attached only when provided/relevant, matching
|
||||
* the pre-#183 onFinish/onError records.
|
||||
|
||||
Reference in New Issue
Block a user