Skip to content

Commit 13b389f

Browse files
committed
feat: Compatible with Claude code JSONL file usage error scenarios, delay closeBlockIfOpen and map responses api to anthropic support tool_use and fix spelling errors
1 parent 11d256e commit 13b389f

File tree

3 files changed

+17
-21
lines changed

3 files changed

+17
-21
lines changed

src/routes/messages/responses-stream-translation.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,6 @@ const handleOutputItemDone = (
176176
state.blockHasDelta.add(blockIndex)
177177
}
178178

179-
closeBlockIfOpen(state, blockIndex, events)
180-
181179
return events
182180
}
183181

@@ -232,7 +230,6 @@ const handleFunctionCallArgumentsDone = (
232230
state.blockHasDelta.add(blockIndex)
233231
}
234232

235-
closeBlockIfOpen(state, blockIndex, events)
236233
state.functionCallStateByOutputIndex.delete(outputIndex)
237234
return events
238235
}
@@ -340,8 +337,6 @@ const handleOutputTextDone = (
340337
})
341338
}
342339

343-
closeBlockIfOpen(state, blockIndex, events)
344-
345340
return events
346341
}
347342

@@ -421,9 +416,7 @@ const messageStart = (
421416
usage: {
422417
input_tokens: inputTokens,
423418
output_tokens: 0,
424-
...(inputCachedTokens !== undefined && {
425-
cache_creation_input_tokens: inputCachedTokens,
426-
}),
419+
cache_read_input_tokens: inputCachedTokens ?? 0,
427420
},
428421
},
429422
},
@@ -449,6 +442,7 @@ const openTextBlockIfNeeded = (
449442
}
450443

451444
if (!state.openBlocks.has(blockIndex)) {
445+
closeOpenBlocks(state, events)
452446
events.push({
453447
type: "content_block_start",
454448
index: blockIndex,
@@ -480,6 +474,7 @@ const openThinkingBlockIfNeeded = (
480474
}
481475

482476
if (!state.openBlocks.has(blockIndex)) {
477+
closeOpenBlocks(state, events)
483478
events.push({
484479
type: "content_block_start",
485480
index: blockIndex,
@@ -508,13 +503,20 @@ const closeBlockIfOpen = (
508503
state.blockHasDelta.delete(blockIndex)
509504
}
510505

511-
const closeAllOpenBlocks = (
506+
const closeOpenBlocks = (
512507
state: ResponsesStreamState,
513508
events: Array<AnthropicStreamEventData>,
514509
) => {
515510
for (const blockIndex of state.openBlocks) {
516511
closeBlockIfOpen(state, blockIndex, events)
517512
}
513+
}
514+
515+
const closeAllOpenBlocks = (
516+
state: ResponsesStreamState,
517+
events: Array<AnthropicStreamEventData>,
518+
) => {
519+
closeOpenBlocks(state, events)
518520

519521
state.functionCallStateByOutputIndex.clear()
520522
}
@@ -562,6 +564,7 @@ const openFunctionCallBlock = (
562564
const { blockIndex } = functionCallState
563565

564566
if (!state.openBlocks.has(blockIndex)) {
567+
closeOpenBlocks(state, events)
565568
events.push({
566569
type: "content_block_start",
567570
index: blockIndex,

src/routes/messages/responses-translation.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,9 @@ const mapResponsesStopReason = (
535535
const { status, incomplete_details: incompleteDetails } = response
536536

537537
if (status === "completed") {
538+
if (response.output.some((item) => item.type === "function_call")) {
539+
return "tool_use"
540+
}
538541
return "end_turn"
539542
}
540543

tests/responses-stream-translation.test.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,7 @@ describe("translateResponsesStreamEvent tool calls", () => {
9696
partial_json: "[]}",
9797
})
9898

99-
const blockStop = events.find(
100-
(event) => event.type === "content_block_stop",
101-
)
102-
expect(blockStop).toBeDefined()
103-
104-
expect(state.openBlocks.size).toBe(0)
99+
expect(state.openBlocks.size).toBe(1)
105100
expect(state.functionCallStateByOutputIndex.size).toBe(0)
106101
})
107102

@@ -139,12 +134,7 @@ describe("translateResponsesStreamEvent tool calls", () => {
139134
'{"todos":[{"content":"Review src/routes/responses/translation.ts"}]}',
140135
})
141136

142-
const blockStop = events.find(
143-
(event) => event.type === "content_block_stop",
144-
)
145-
expect(blockStop).toBeDefined()
146-
147-
expect(state.openBlocks.size).toBe(0)
137+
expect(state.openBlocks.size).toBe(1)
148138
expect(state.functionCallStateByOutputIndex.size).toBe(0)
149139
})
150140
})

0 commit comments

Comments
 (0)