feat: 全部类型问题解决

This commit is contained in:
claude-code-best
2026-04-11 10:24:00 +08:00
parent 7088fe3c8b
commit 6a70056910
135 changed files with 671 additions and 503 deletions

View File

@@ -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

View File

@@ -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':

View File

@@ -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),
),
}
}

View File

@@ -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 ?? []

View File

@@ -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', () => {

View File

@@ -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,

View File

@@ -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