fix: restore message migration CI coverage

This commit is contained in:
_Kerman
2026-07-28 14:29:54 +08:00
parent 744a821319
commit 971f20b66e
8 changed files with 39 additions and 12 deletions
+6 -6
View File
@@ -9,7 +9,7 @@
*/
import { LlmError } from '@deepseek-ai/dsh-llm'
import type { Message } from '@deepseek-ai/dsh-llm'
import type { Message, ModelMessageSource } from '@deepseek-ai/dsh-llm'
import type { Api, AssistantMessage, Usage as PiUsage } from '@earendil-works/pi-ai'
type PiAiReplayBlock =
@@ -155,10 +155,8 @@ function foreignAssistant(message: Message): AssistantMessage {
}
/** Recombine durable Harness content with validated pi-ai replay metadata. */
function replayedAssistant(message: Message, rawState: unknown): AssistantMessage {
function replayedAssistant(message: Message, source: ModelMessageSource, rawState: unknown): AssistantMessage {
const state = readReplayState(rawState)
const source = message.source
if (source.kind !== 'model') return invalidReplay('assistant message lacks model source')
if (state.provider !== source.provider) return invalidReplay('provider does not match assistant source')
if (state.model !== source.model) return invalidReplay('model does not match assistant source')
if (state.blocks.length !== message.content.length) return invalidReplay('block count does not match assistant content')
@@ -208,6 +206,8 @@ function replayedAssistant(message: Message, rawState: unknown): AssistantMessag
* @returns a native pi-ai assistant message reconstructed from durable content.
*/
export function toPiAssistant(message: Message): AssistantMessage {
const replayState = message.source.kind === 'model' ? message.source.replayState : undefined
return replayState === undefined ? foreignAssistant(message) : replayedAssistant(message, replayState)
const source = message.source
return source.kind !== 'model' || source.replayState === undefined
? foreignAssistant(message)
: replayedAssistant(message, source, source.replayState)
}
@@ -102,6 +102,24 @@ describe('toPiContext', () => {
expect((context.messages[0] as AssistantMessage).stopReason).toBe('stop')
})
it('preserves model provenance for foreign assistant messages without replay state', () => {
const context = toPiContext({
provider: 'openai',
model: 'new-model',
messages: [createMessage({
role: 'assistant',
content: [{ type: 'text', text: 'done' }],
source: { kind: 'model', provider: 'deepseek', model: 'old-model' },
})],
})
expect(context.messages[0]).toMatchObject({
role: 'assistant',
api: 'dsh-foreign',
provider: 'deepseek',
model: 'old-model',
})
})
it('parses malformed tool-call arguments to {}', () => {
const context = toPiContext({
provider: 'deepseek',