Skip to content

Commit 8ec5788

Browse files
authored
Merge pull request #1099 from Portkey-AI/fix/bedrock-tool-empty-content
fix: handle empty content for bedrock tool role message
2 parents abf5e38 + 9c809fb commit 8ec5788

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

src/providers/bedrock/chatComplete.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,17 @@ const transformAndAppendThinkingMessageItem = (
136136
};
137137

138138
const getMessageContent = (message: Message) => {
139-
if (!message.content && !message.tool_calls) return [];
139+
if (!message.content && !message.tool_calls && !message.tool_call_id)
140+
return [];
140141
if (message.role === 'tool') {
142+
const toolResultContent = getMessageTextContentArray(message);
141143
return [
142144
{
143145
toolResult: {
144-
content: getMessageTextContentArray(message),
146+
...(toolResultContent.length &&
147+
(toolResultContent[0] as { text: string })?.text
148+
? { content: toolResultContent }
149+
: { content: [] }), // Bedrock allows empty array but does not allow empty string in content.
145150
toolUseId: message.tool_call_id,
146151
},
147152
},
@@ -151,11 +156,11 @@ const getMessageContent = (message: Message) => {
151156
const inputContent: ContentType[] | string | undefined =
152157
message.content_blocks ?? message.content;
153158
// if message is a string, return a single element array with the text
154-
if (typeof inputContent === 'string') {
159+
if (typeof inputContent === 'string' && inputContent.trim()) {
155160
out.push({
156161
text: inputContent,
157162
});
158-
} else if (inputContent) {
163+
} else if (inputContent && Array.isArray(inputContent)) {
159164
inputContent.forEach((item) => {
160165
if (item.type === 'text') {
161166
out.push({
@@ -280,7 +285,9 @@ export const BedrockConverseChatCompleteConfig: ProviderConfig = {
280285
required: false,
281286
transform: (params: BedrockChatCompletionsParams) => {
282287
if (!params.messages) return;
283-
const systemMessages = params.messages.reduce(
288+
const systemMessages: Array<
289+
{ text: string } | { cachePoint: { type: string } }
290+
> = params.messages.reduce(
284291
(
285292
acc: Array<{ text: string } | { cachePoint: { type: string } }>,
286293
msg
@@ -321,7 +328,7 @@ export const BedrockConverseChatCompleteConfig: ProviderConfig = {
321328
}
322329
});
323330
const toolConfig = {
324-
tools: tools,
331+
tools,
325332
};
326333
let toolChoice = undefined;
327334
if (params.tool_choice) {
@@ -551,7 +558,7 @@ export const BedrockChatCompleteResponseTransform: (
551558
usage: {
552559
prompt_tokens: response.usage.inputTokens,
553560
completion_tokens: response.usage.outputTokens,
554-
total_tokens: response.usage.totalTokens,
561+
total_tokens: response.usage.totalTokens, // contains the cache usage as well
555562
...(shouldSendCacheUsage && {
556563
cache_read_input_tokens: response.usage.cacheReadInputTokens,
557564
cache_creation_input_tokens: response.usage.cacheWriteInputTokens,
@@ -866,7 +873,7 @@ export const BedrockCohereChatCompleteConfig: ProviderConfig = {
866873
required: true,
867874
transform: (params: Params) => {
868875
let prompt: string = '';
869-
if (!!params.messages) {
876+
if (params.messages) {
870877
let messages: Message[] = params.messages;
871878
messages.forEach((msg, index) => {
872879
if (index === 0 && SYSTEM_MESSAGE_ROLES.includes(msg.role)) {
@@ -1068,7 +1075,7 @@ export const BedrockAI21ChatCompleteConfig: ProviderConfig = {
10681075
required: true,
10691076
transform: (params: Params) => {
10701077
let prompt: string = '';
1071-
if (!!params.messages) {
1078+
if (params.messages) {
10721079
let messages: Message[] = params.messages;
10731080
messages.forEach((msg, index) => {
10741081
if (index === 0 && SYSTEM_MESSAGE_ROLES.includes(msg.role)) {

0 commit comments

Comments
 (0)