mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-18 22:35:51 +00:00
feat: 全部类型问题解决
This commit is contained in:
@@ -579,13 +579,13 @@ export function userMessageToMessageParam(
|
||||
querySource?: QuerySource,
|
||||
): MessageParam {
|
||||
if (addCache) {
|
||||
if (typeof message.message.content === 'string') {
|
||||
if (typeof message.message!.content === 'string') {
|
||||
return {
|
||||
role: 'user',
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: message.message.content,
|
||||
text: message.message!.content,
|
||||
...(enablePromptCaching && {
|
||||
cache_control: getCacheControl({ querySource }),
|
||||
}),
|
||||
@@ -595,9 +595,9 @@ export function userMessageToMessageParam(
|
||||
} else {
|
||||
return {
|
||||
role: 'user',
|
||||
content: message.message.content.map((_, i) => ({
|
||||
content: message.message!.content!.map((_, i) => ({
|
||||
..._,
|
||||
...(i === message.message.content.length - 1
|
||||
...(i === message.message!.content!.length - 1
|
||||
? enablePromptCaching
|
||||
? { cache_control: getCacheControl({ querySource }) }
|
||||
: {}
|
||||
@@ -611,9 +611,9 @@ export function userMessageToMessageParam(
|
||||
// to addCacheBreakpoints share the same array and each splices in duplicate cache_edits.
|
||||
return {
|
||||
role: 'user',
|
||||
content: Array.isArray(message.message.content)
|
||||
? [...message.message.content]
|
||||
: message.message.content,
|
||||
content: (Array.isArray(message.message!.content)
|
||||
? [...message.message!.content]
|
||||
: message.message!.content) as import('@anthropic-ai/sdk/resources/beta/messages/messages.js').BetaContentBlockParam[],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,13 +624,13 @@ export function assistantMessageToMessageParam(
|
||||
querySource?: QuerySource,
|
||||
): MessageParam {
|
||||
if (addCache) {
|
||||
if (typeof message.message.content === 'string') {
|
||||
if (typeof message.message!.content === 'string') {
|
||||
return {
|
||||
role: 'assistant',
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: message.message.content,
|
||||
text: message.message!.content,
|
||||
...(enablePromptCaching && {
|
||||
cache_control: getCacheControl({ querySource }),
|
||||
}),
|
||||
@@ -640,11 +640,11 @@ export function assistantMessageToMessageParam(
|
||||
} else {
|
||||
return {
|
||||
role: 'assistant',
|
||||
content: message.message.content.map((_, i) => {
|
||||
content: message.message!.content!.map((_, i) => {
|
||||
const contentBlock = stripGeminiProviderMetadata(_)
|
||||
return {
|
||||
...contentBlock,
|
||||
...(i === message.message.content.length - 1 &&
|
||||
...(i === message.message!.content!.length - 1 &&
|
||||
contentBlock.type !== 'thinking' &&
|
||||
contentBlock.type !== 'redacted_thinking' &&
|
||||
(feature('CONNECTOR_TEXT')
|
||||
@@ -662,9 +662,9 @@ export function assistantMessageToMessageParam(
|
||||
return {
|
||||
role: 'assistant',
|
||||
content:
|
||||
typeof message.message.content === 'string'
|
||||
? message.message.content
|
||||
: message.message.content.map(stripGeminiProviderMetadata) as BetaContentBlockParam[],
|
||||
typeof message.message!.content === 'string'
|
||||
? message.message!.content
|
||||
: message.message!.content!.map(stripGeminiProviderMetadata) as BetaContentBlockParam[],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -972,8 +972,8 @@ export function stripExcessMediaItems(
|
||||
): (UserMessage | AssistantMessage)[] {
|
||||
let toRemove = 0
|
||||
for (const msg of messages) {
|
||||
if (!Array.isArray(msg.message.content)) continue
|
||||
for (const block of msg.message.content) {
|
||||
if (!Array.isArray(msg.message!.content)) continue
|
||||
for (const block of msg.message!.content) {
|
||||
if (isMedia(block)) toRemove++
|
||||
if (isToolResult(block) && Array.isArray(block.content)) {
|
||||
for (const nested of block.content) {
|
||||
@@ -987,7 +987,7 @@ export function stripExcessMediaItems(
|
||||
|
||||
return messages.map(msg => {
|
||||
if (toRemove <= 0) return msg
|
||||
const content = msg.message.content
|
||||
const content = msg.message!.content
|
||||
if (!Array.isArray(content)) return msg
|
||||
|
||||
const before = toRemove
|
||||
|
||||
@@ -65,7 +65,7 @@ export function isPromptTooLongMessage(msg: AssistantMessage): boolean {
|
||||
if (!msg.isApiErrorMessage) {
|
||||
return false
|
||||
}
|
||||
const content = msg.message.content
|
||||
const content = msg.message!.content
|
||||
if (!Array.isArray(content)) {
|
||||
return false
|
||||
}
|
||||
@@ -230,7 +230,7 @@ function logToolUseToolResultMismatch(
|
||||
for (let i = 0; i < messagesForAPI.length; i++) {
|
||||
const msg = messagesForAPI[i]
|
||||
if (!msg) continue
|
||||
const content = msg.message.content
|
||||
const content = msg.message!.content
|
||||
if (Array.isArray(content)) {
|
||||
for (const block of content) {
|
||||
if (
|
||||
@@ -252,7 +252,7 @@ function logToolUseToolResultMismatch(
|
||||
const msg = messages[i]
|
||||
if (!msg) continue
|
||||
if (msg.type === 'assistant' && 'message' in msg) {
|
||||
const content = msg.message.content
|
||||
const content = msg.message!.content
|
||||
if (Array.isArray(content)) {
|
||||
for (const block of content) {
|
||||
if (
|
||||
@@ -274,10 +274,10 @@ function logToolUseToolResultMismatch(
|
||||
for (let i = normalizedIndex + 1; i < messagesForAPI.length; i++) {
|
||||
const msg = messagesForAPI[i]
|
||||
if (!msg) continue
|
||||
const content = msg.message.content
|
||||
const content = msg.message!.content
|
||||
if (Array.isArray(content)) {
|
||||
for (const block of content) {
|
||||
const role = msg.message.role
|
||||
const role = msg.message!.role
|
||||
if (block.type === 'tool_use' && 'id' in block) {
|
||||
normalizedSeq.push(`${role}:tool_use:${block.id}`)
|
||||
} else if (block.type === 'tool_result' && 'tool_use_id' in block) {
|
||||
@@ -307,10 +307,10 @@ function logToolUseToolResultMismatch(
|
||||
case 'user':
|
||||
case 'assistant': {
|
||||
if ('message' in msg) {
|
||||
const content = msg.message.content
|
||||
const content = msg.message!.content
|
||||
if (Array.isArray(content)) {
|
||||
for (const block of content) {
|
||||
const role = msg.message.role
|
||||
const role = msg.message!.role
|
||||
if (block.type === 'tool_use' && 'id' in block) {
|
||||
preNormalizedSeq.push(`${role}:tool_use:${block.id}`)
|
||||
} else if (
|
||||
@@ -331,14 +331,14 @@ function logToolUseToolResultMismatch(
|
||||
}
|
||||
}
|
||||
} else if (typeof content === 'string') {
|
||||
preNormalizedSeq.push(`${msg.message.role}:string_content`)
|
||||
preNormalizedSeq.push(`${msg.message!.role}:string_content`)
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
case 'attachment':
|
||||
if ('attachment' in msg) {
|
||||
preNormalizedSeq.push(`attachment:${msg.attachment.type}`)
|
||||
preNormalizedSeq.push(`attachment:${msg.attachment!.type}`)
|
||||
}
|
||||
break
|
||||
case 'system':
|
||||
|
||||
@@ -84,7 +84,7 @@ function convertInternalUserMessage(
|
||||
return {
|
||||
role: 'user',
|
||||
parts: content.flatMap(block =>
|
||||
convertUserContentBlockToGeminiParts(block, toolNamesById),
|
||||
convertUserContentBlockToGeminiParts(block as unknown as string | Record<string, unknown>, toolNamesById),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,9 +45,8 @@ export async function* adaptGeminiStreamToAnthropic(
|
||||
cache_read_input_tokens: 0,
|
||||
},
|
||||
},
|
||||
} as BetaRawMessageStreamEvent
|
||||
} as unknown as BetaRawMessageStreamEvent
|
||||
}
|
||||
|
||||
const candidate = chunk.candidates?.[0]
|
||||
const parts = candidate?.content?.parts ?? []
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@ describe('buildOpenAIRequestBody — thinking params', () => {
|
||||
const body = buildOpenAIRequestBody({ ...baseParams, enableThinking: true })
|
||||
expect(body.thinking).toEqual({ type: 'enabled' })
|
||||
expect(body.enable_thinking).toBe(true)
|
||||
expect(body.chat_template_kwargs.thinking).toBe(true)
|
||||
expect(body.chat_template_kwargs!.thinking).toBe(true)
|
||||
})
|
||||
|
||||
test('does NOT include thinking params when disabled', () => {
|
||||
|
||||
@@ -6,6 +6,7 @@ import type {
|
||||
SystemAPIErrorMessage,
|
||||
AssistantMessage,
|
||||
} from '../../../types/message.js'
|
||||
import type { AgentId } from '../../../types/ids.js'
|
||||
import type { Tools } from '../../../Tool.js'
|
||||
import type { Stream } from 'openai/streaming.mjs'
|
||||
import type {
|
||||
@@ -149,7 +150,7 @@ function assembleFinalAssistantOutputs(params: {
|
||||
outputs.push({
|
||||
message: {
|
||||
...partialMessage,
|
||||
content: normalizeContentFromAPI(allBlocks, tools, agentId),
|
||||
content: normalizeContentFromAPI(allBlocks, tools, agentId as AgentId | undefined),
|
||||
usage,
|
||||
stop_reason: stopReason,
|
||||
stop_sequence: null,
|
||||
|
||||
@@ -111,9 +111,10 @@ export async function* adaptOpenAIStreamToAnthropic(
|
||||
cache_read_input_tokens: cachedReadTokens,
|
||||
},
|
||||
},
|
||||
} as BetaRawMessageStreamEvent
|
||||
} as unknown as BetaRawMessageStreamEvent
|
||||
}
|
||||
|
||||
// Skip chunks that carry only usage data (no delta content)
|
||||
if (!delta) continue
|
||||
|
||||
// Handle reasoning_content → Anthropic thinking block
|
||||
|
||||
Reference in New Issue
Block a user