@@ -8,8 +8,8 @@ use aws_sdk_bedrockruntime::{
8
8
types:: {
9
9
ContentBlockDeltaEvent , ContentBlockStartEvent , ConversationRole ,
10
10
ConverseStreamMetadataEvent , ConverseStreamOutput , ImageBlock , ImageFormat ,
11
- InferenceConfiguration , SystemContentBlock , Tool , ToolConfiguration , ToolInputSchema ,
12
- ToolSpecification , ToolUseBlock ,
11
+ InferenceConfiguration , MessageStopEvent , SystemContentBlock , Tool , ToolConfiguration ,
12
+ ToolInputSchema , ToolSpecification , ToolUseBlock ,
13
13
} ,
14
14
} ;
15
15
use golem_llm:: golem:: llm:: llm;
@@ -433,67 +433,77 @@ fn bedrock_image_to_llm_content_part(block: bedrock::types::ImageBlock) -> llm::
433
433
434
434
pub fn converse_stream_output_to_stream_event (
435
435
event : ConverseStreamOutput ,
436
- ) -> Option < Vec < llm:: StreamEvent > > {
436
+ ) -> Option < llm:: StreamEvent > {
437
437
match event {
438
438
ConverseStreamOutput :: ContentBlockStart ( block) => process_content_block_start_event ( block) ,
439
439
ConverseStreamOutput :: ContentBlockDelta ( block) => process_content_block_delta_event ( block) ,
440
440
ConverseStreamOutput :: Metadata ( metadata) => process_metadata_event ( metadata) ,
441
+ ConverseStreamOutput :: MessageStop ( event) => process_message_stop_event ( event) ,
441
442
_ => None ,
442
443
}
443
444
}
444
445
445
- fn process_content_block_start_event (
446
- block : ContentBlockStartEvent ,
447
- ) -> Option < Vec < llm:: StreamEvent > > {
446
+ fn process_content_block_start_event ( block : ContentBlockStartEvent ) -> Option < llm:: StreamEvent > {
448
447
if let Some ( start_info) = block. start {
449
448
if start_info. is_tool_use ( ) {
450
449
let tool_use = start_info. as_tool_use ( ) . unwrap ( ) . clone ( ) ;
451
- return Some ( vec ! [ llm:: StreamEvent :: Delta ( llm:: StreamDelta {
450
+ return Some ( llm:: StreamEvent :: Delta ( llm:: StreamDelta {
452
451
content : None ,
453
452
tool_calls : Some ( vec ! [ llm:: ToolCall {
454
453
id: tool_use. tool_use_id,
455
454
name: tool_use. name,
456
455
arguments_json: "" . to_owned( ) ,
457
456
} ] ) ,
458
- } ) ] ) ;
457
+ } ) ) ;
459
458
}
460
459
}
461
460
None
462
461
}
463
462
464
- fn process_content_block_delta_event (
465
- block : ContentBlockDeltaEvent ,
466
- ) -> Option < Vec < llm:: StreamEvent > > {
463
+ fn process_content_block_delta_event ( block : ContentBlockDeltaEvent ) -> Option < llm:: StreamEvent > {
467
464
if let Some ( block_info) = block. delta {
468
465
if block_info. is_tool_use ( ) {
469
466
let tool_use = block_info. as_tool_use ( ) . unwrap ( ) . clone ( ) ;
470
- return Some ( vec ! [ llm:: StreamEvent :: Delta ( llm:: StreamDelta {
467
+ return Some ( llm:: StreamEvent :: Delta ( llm:: StreamDelta {
471
468
content : None ,
472
469
tool_calls : Some ( vec ! [ llm:: ToolCall {
473
470
id: "" . to_owned( ) ,
474
471
name: "" . to_owned( ) ,
475
472
arguments_json: tool_use. input,
476
473
} ] ) ,
477
- } ) ] ) ;
474
+ } ) ) ;
478
475
} else if block_info. is_text ( ) {
479
476
let text = block_info. as_text ( ) . unwrap ( ) . clone ( ) ;
480
- return Some ( vec ! [ llm:: StreamEvent :: Delta ( llm:: StreamDelta {
477
+ return Some ( llm:: StreamEvent :: Delta ( llm:: StreamDelta {
481
478
content : Some ( vec ! [ llm:: ContentPart :: Text ( text) ] ) ,
482
479
tool_calls : None ,
483
- } ) ] ) ;
480
+ } ) ) ;
484
481
}
485
482
}
486
483
None
487
484
}
488
485
489
- fn process_metadata_event ( metadata : ConverseStreamMetadataEvent ) -> Option < Vec < llm:: StreamEvent > > {
490
- Some ( vec ! [ llm:: StreamEvent :: Finish ( llm:: ResponseMetadata {
486
+ fn process_metadata_event ( metadata : ConverseStreamMetadataEvent ) -> Option < llm:: StreamEvent > {
487
+ Some ( llm:: StreamEvent :: Finish ( llm:: ResponseMetadata {
491
488
finish_reason : None ,
492
489
timestamp : None ,
493
490
usage : metadata. usage ( ) . map ( bedrock_usage_to_llm_usage) ,
494
491
provider_id : Some ( "bedrock" . to_owned ( ) ) ,
495
492
provider_metadata_json : None ,
496
- } ) ] )
493
+ } ) )
494
+ }
495
+
496
+ fn process_message_stop_event ( event : MessageStopEvent ) -> Option < llm:: StreamEvent > {
497
+ Some ( llm:: StreamEvent :: Finish ( llm:: ResponseMetadata {
498
+ finish_reason : Some ( bedrock_stop_reason_to_finish_reason ( event. stop_reason ( ) ) ) ,
499
+ timestamp : None ,
500
+ usage : None ,
501
+ provider_id : None ,
502
+ provider_metadata_json : event
503
+ . additional_model_response_fields
504
+ . clone ( )
505
+ . and_then ( smithy_document_to_metadata_json) ,
506
+ } ) )
497
507
}
498
508
499
509
fn json_str_to_smithy_document ( value : & str ) -> Result < Document , llm:: Error > {
@@ -595,3 +605,18 @@ pub fn custom_error(code: llm::ErrorCode, message: String) -> llm::Error {
595
605
provider_error_json : None ,
596
606
}
597
607
}
608
+
609
+ pub fn merge_metadata (
610
+ mut metadata1 : llm:: ResponseMetadata ,
611
+ metadata2 : llm:: ResponseMetadata ,
612
+ ) -> llm:: ResponseMetadata {
613
+ metadata1. usage = metadata1. usage . or ( metadata2. usage ) ;
614
+ metadata1. timestamp = metadata1. timestamp . or ( metadata2. timestamp ) ;
615
+ metadata1. provider_id = metadata1. provider_id . or ( metadata2. provider_id ) ;
616
+ metadata1. finish_reason = metadata1. finish_reason . or ( metadata2. finish_reason ) ;
617
+ metadata1. provider_metadata_json = metadata1
618
+ . provider_metadata_json
619
+ . or ( metadata2. provider_metadata_json ) ;
620
+
621
+ metadata1
622
+ }
0 commit comments