@@ -19,13 +19,24 @@ module.exports = class Messages {
19
19
}
20
20
if ( ! message . content ) {
21
21
if ( message . tool_calls ) {
22
- return message ;
22
+ message . content = [ ] ;
23
+ for ( let i = 0 ; i < message . tool_calls . length ; i ++ ) {
24
+ const tool_call = message . tool_calls [ i ] ;
25
+ message . content . push ( {
26
+ type : 'tool_use' ,
27
+ id : tool_call . id ,
28
+ name : tool_call . function . name ,
29
+ input : tool_call . function . arguments ,
30
+ } ) ;
31
+ }
32
+ delete message . tool_calls ;
23
33
}
24
34
throw new Error ( `each message must have a 'content' property` ) ;
25
35
}
26
36
if ( whatis ( message . content ) !== 'array' ) {
27
37
message . content = [ message . content ] ;
28
38
}
39
+ // Coerce each content block into an object
29
40
for ( let i = 0 ; i < message . content . length ; i ++ ) {
30
41
if ( whatis ( message . content [ i ] ) === 'string' ) {
31
42
message . content [ i ] = {
@@ -41,6 +52,16 @@ module.exports = class Messages {
41
52
}
42
53
}
43
54
55
+ // Remove "text" properties from content blocks with type=tool_result
56
+ for ( let i = 0 ; i < message . content . length ; i ++ ) {
57
+ if ( message . content [ i ] . type !== 'tool_use' ) {
58
+ continue ;
59
+ }
60
+ if ( message . content [ i ] . hasOwnProperty ( 'text' ) ) {
61
+ delete message . content [ i ] . text ;
62
+ }
63
+ }
64
+
44
65
console . log ( '???' , message )
45
66
return message ;
46
67
}
@@ -49,6 +70,28 @@ module.exports = class Messages {
49
70
messages [ i ] = this . normalize_single_message ( messages [ i ] , params ) ;
50
71
}
51
72
73
+ // Split messages with tool_use content into separate messages
74
+ // TODO: unit test this
75
+ messages = [ ...messages ] ;
76
+ for ( let i = 0 ; i < messages . length ; i ++ ) {
77
+ let message = messages [ i ] ;
78
+ let separated_messages = [ ] ;
79
+ for ( let j = 0 ; j < message . content . length ; j ++ ) {
80
+ if ( message . content [ j ] . type === 'tool_result' ) {
81
+ separated_messages . push ( {
82
+ role : message . role ,
83
+ content : [ message . content [ j ] ] ,
84
+ } ) ;
85
+ } else {
86
+ separated_messages . push ( {
87
+ role : message . role ,
88
+ content : [ message . content [ j ] ] ,
89
+ } ) ;
90
+ }
91
+ }
92
+ messages . splice ( i , 1 , ...separated_messages ) ;
93
+ }
94
+
52
95
// If multiple messages are from the same role, merge them
53
96
let merged_messages = [ ] ;
54
97
let current_role = null ;
0 commit comments