@@ -29,12 +29,12 @@ import type {
2929 Model ,
3030 OpenAIModel ,
3131} from '@codebuff/common/constants'
32- import type { CodebuffMessage , Message } from '@codebuff/common/types/message'
32+ import type { CodebuffMessage } from '@codebuff/common/types/messages/codebuff- message'
3333import type {
3434 OpenRouterProviderOptions ,
3535 OpenRouterUsageAccounting ,
3636} from '@openrouter/ai-sdk-provider'
37- import type { AssistantModelMessage , UserModelMessage , LanguageModel } from 'ai'
37+ import type { LanguageModel } from 'ai'
3838import type { z } from 'zod/v4'
3939
4040// TODO: We'll want to add all our models here!
@@ -370,7 +370,7 @@ export const promptAiSdkStructured = async function <T>(options: {
370370// TODO: temporary - ideally we move to using CodebuffMessage[] directly
371371// and don't need this transform!!
372372export function transformMessages (
373- messages : ( Message | CodebuffMessage ) [ ] ,
373+ messages : CodebuffMessage [ ] ,
374374 system ?: System ,
375375) : CodebuffMessage [ ] {
376376 const codebuffMessages : CodebuffMessage [ ] = [ ]
@@ -385,115 +385,14 @@ export function transformMessages(
385385 } )
386386 }
387387
388- for ( const message of messages ) {
389- if ( message . role === 'system' ) {
390- if ( typeof message . content === 'string' ) {
391- codebuffMessages . push ( { role : 'system' , content : message . content } )
392- continue
393- } else {
394- throw new Error (
395- 'Multiple part system message - unsupported (TODO: fix if we hit this.)' ,
396- )
397- }
398- }
399-
400- if ( message . role === 'user' ) {
401- if ( typeof message . content === 'string' ) {
402- codebuffMessages . push ( {
403- ...message ,
404- role : 'user' ,
405- content : message . content ,
406- } )
407- continue
408- } else {
409- const parts : UserModelMessage [ 'content' ] = [ ]
410- const modelMessage : UserModelMessage = { role : 'user' , content : parts }
411- for ( const part of message . content ) {
412- // Add ephemeral if present
413- if ( 'cache_control' in part ) {
414- modelMessage . providerOptions = {
415- anthropic : { cacheControl : { type : 'ephemeral' } } ,
416- openrouter : { cacheControl : { type : 'ephemeral' } } ,
417- }
418- }
419- // Handle Message type image format
420- if ( part . type === 'image' && 'source' in part ) {
421- parts . push ( {
422- type : 'image' as const ,
423- image : `data:${ part . source . media_type } ;base64,${ part . source . data } ` ,
424- } )
425- continue
426- }
427- if ( part . type === 'file' ) {
428- throw new Error ( 'File messages not supported' )
429- }
430- if ( part . type === 'text' ) {
431- parts . push ( {
432- type : 'text' as const ,
433- text : part . text ,
434- } )
435- continue
436- }
437- if ( part . type === 'tool_use' || part . type === 'tool_result' ) {
438- // Skip tool parts in user messages - they should be in assistant/tool messages
439- continue
440- }
441- }
442- codebuffMessages . push ( modelMessage )
443- continue
444- }
445- }
446-
447- if ( message . role === 'assistant' ) {
448- if ( message . content === undefined || message . content === null ) {
449- continue
450- }
451- if ( typeof message . content === 'string' ) {
452- codebuffMessages . push ( {
453- ...message ,
454- role : 'assistant' ,
455- content : message . content ,
456- } )
457- continue
458- } else {
459- let messageContent : AssistantModelMessage [ 'content' ] = [ ]
460- const modelMessage : AssistantModelMessage = {
461- ...message ,
462- role : 'assistant' ,
463- content : messageContent ,
464- }
465- for ( const part of message . content ) {
466- // Add ephemeral if present
467- if ( 'cache_control' in part ) {
468- modelMessage . providerOptions = {
469- anthropic : { cacheControl : { type : 'ephemeral' } } ,
470- openrouter : { cacheControl : { type : 'ephemeral' } } ,
471- }
472- }
473- if ( part . type === 'text' ) {
474- messageContent . push ( { type : 'text' , text : part . text } )
475- }
476- if ( part . type === 'tool_use' ) {
477- messageContent . push ( {
478- type : 'tool-call' ,
479- toolCallId : part . id ,
480- toolName : part . name ,
481- input : part . input ,
482- } )
483- }
484- }
485- codebuffMessages . push ( modelMessage )
486- continue
487- }
488- }
489-
490- if ( message . role === 'tool' ) {
491- codebuffMessages . push ( message )
492- continue
493- }
494-
495- throw new Error ( 'Unknown message role received: ' + message )
496- }
497-
498- return codebuffMessages
388+ return buildArray < CodebuffMessage > ( [
389+ system && {
390+ role : 'system' ,
391+ content :
392+ typeof system === 'string'
393+ ? system
394+ : system . map ( ( block ) => block . text ) . join ( '\n\n' ) ,
395+ } ,
396+ messages ,
397+ ] )
499398}
0 commit comments