fix: 修复 services/utils 层 strict 模式类型错误

- api/errors: formatAPIError 参数类型适配
- rawDump/logger: 导出可同时作为函数和对象调用的 log
- rawDump/worker: postJson body 类型断言、reduce 泛型标注
- sideQueryOpenAICompat: tool_calls 类型收窄为 FunctionToolCall
This commit is contained in:
DoSun 2026-05-11 14:33:50 +08:00
parent 5d6b31398a
commit 3aab6fb889
4 changed files with 28 additions and 15 deletions

View File

@ -916,7 +916,7 @@ export function getAssistantMessageFromError(
// Connection errors (non-timeout) — use formatAPIError for detailed messages // Connection errors (non-timeout) — use formatAPIError for detailed messages
if (error instanceof APIConnectionError) { if (error instanceof APIConnectionError) {
return createAssistantAPIErrorMessage({ return createAssistantAPIErrorMessage({
content: `${API_ERROR_MESSAGE_PREFIX}: ${formatAPIError(error)}`, content: `${API_ERROR_MESSAGE_PREFIX}: ${formatAPIError(error as unknown as Parameters<typeof formatAPIError>[0])}`,
error: 'unknown', error: 'unknown',
}) })
} }

View File

@ -30,10 +30,21 @@ export function createLogger(prefix: string) {
} }
} }
return { type LogFn = (level: string, msg: string, meta?: Record<string, unknown>) => void
debug: (msg: string, meta?: Record<string, unknown>) => write('debug', msg, meta), const log: LogFn & {
info: (msg: string, meta?: Record<string, unknown>) => write('info', msg, meta), debug: (msg: string, meta?: Record<string, unknown>) => void
warn: (msg: string, meta?: Record<string, unknown>) => write('warn', msg, meta), info: (msg: string, meta?: Record<string, unknown>) => void
error: (msg: string, meta?: Record<string, unknown>) => write('error', msg, meta), warn: (msg: string, meta?: Record<string, unknown>) => void
} error: (msg: string, meta?: Record<string, unknown>) => void
} = Object.assign(
(level: string, msg: string, meta?: Record<string, unknown>) => write(level, msg, meta),
{
debug: (msg: string, meta?: Record<string, unknown>) => write('debug', msg, meta),
info: (msg: string, meta?: Record<string, unknown>) => write('info', msg, meta),
warn: (msg: string, meta?: Record<string, unknown>) => write('warn', msg, meta),
error: (msg: string, meta?: Record<string, unknown>) => write('error', msg, meta),
},
)
return log
} }

View File

@ -412,7 +412,7 @@ export async function uploadConversation(
} }
log('debug', 'sending conversation request', { task_id: payload.sessionID, request_id: requestID, bodyKeys: Object.keys(body) }) log('debug', 'sending conversation request', { task_id: payload.sessionID, request_id: requestID, bodyKeys: Object.keys(body) })
await postJson(authData.baseUrl, authData.headers, '/raw-store/task-conversation', body) await postJson(authData.baseUrl, authData.headers, '/raw-store/task-conversation', body as unknown as Record<string, unknown>)
state.conversation[key] = true state.conversation[key] = true
log('info', 'conversation uploaded', { task_id: payload.sessionID, request_id: requestID, upstream_tokens: body.upstream_tokens, downstream_tokens: body.downstream_tokens }) log('info', 'conversation uploaded', { task_id: payload.sessionID, request_id: requestID, upstream_tokens: body.upstream_tokens, downstream_tokens: body.downstream_tokens })
return true return true
@ -433,13 +433,13 @@ export async function uploadSummary(
const assistants = payload.messages.filter((m) => m.type === 'assistant') const assistants = payload.messages.filter((m) => m.type === 'assistant')
const { upstream_tokens, downstream_tokens } = assistants.reduce( const { upstream_tokens, downstream_tokens } = assistants.reduce(
(acc, m) => { (acc: { upstream_tokens: number; downstream_tokens: number }, m) => {
const usage = extractUsage(m) const usage = extractUsage(m)
acc.upstream_tokens += usage.input_tokens + usage.cache_read_input_tokens + usage.cache_creation_input_tokens acc.upstream_tokens += usage.input_tokens + usage.cache_read_input_tokens + usage.cache_creation_input_tokens
acc.downstream_tokens += usage.output_tokens acc.downstream_tokens += usage.output_tokens
return acc return acc
}, },
{ upstream_tokens: 0, downstream_tokens: 0 }, { upstream_tokens: 0, downstream_tokens: 0 } as { upstream_tokens: number; downstream_tokens: number },
) )
const firstMsg = payload.messages[0] const firstMsg = payload.messages[0]
@ -467,7 +467,7 @@ export async function uploadSummary(
files: rawDiff ? extractFilesFromDiff(rawDiff) : [], files: rawDiff ? extractFilesFromDiff(rawDiff) : [],
} }
await postJson(authData.baseUrl, authData.headers, '/raw-store/task-summary', body) await postJson(authData.baseUrl, authData.headers, '/raw-store/task-summary', body as unknown as Record<string, unknown>)
log('info', 'summary uploaded', { task_id: payload.sessionID, upstream_tokens: body.upstream_tokens, downstream_tokens: body.downstream_tokens, diff_lines: body.diff_lines }) log('info', 'summary uploaded', { task_id: payload.sessionID, upstream_tokens: body.upstream_tokens, downstream_tokens: body.downstream_tokens, diff_lines: body.diff_lines })
} }
@ -525,7 +525,7 @@ export async function uploadCommits(
comment: toCommitComment(commit.subject), comment: toCommitComment(commit.subject),
subject: commit.subject, subject: commit.subject,
} }
await postJson(authData.baseUrl, authData.headers, '/raw-store/commit', body) await postJson(authData.baseUrl, authData.headers, '/raw-store/commit', body as unknown as Record<string, unknown>)
// 每成功一个 commit 立即更新 state避免失败后全部重传 // 每成功一个 commit 立即更新 state避免失败后全部重传
state.commits[stateKey] = commit.commit_id state.commits[stateKey] = commit.commit_id
log('info', 'commit uploaded', { commit_id: commit.commit_id, progress: `${i + 1}/${commits.length}` }) log('info', 'commit uploaded', { commit_id: commit.commit_id, progress: `${i + 1}/${commits.length}` })

View File

@ -5,6 +5,7 @@
*/ */
import type OpenAI from 'openai' import type OpenAI from 'openai'
import type { ChatCompletionMessageFunctionToolCall } from 'openai/resources/chat/completions/completions.js'
import type { BetaMessage } from '@anthropic-ai/sdk/resources/beta/messages.js' import type { BetaMessage } from '@anthropic-ai/sdk/resources/beta/messages.js'
import type { SideQueryOptions } from './sideQuery.js' import type { SideQueryOptions } from './sideQuery.js'
import { logEvent } from '../services/analytics/index.js' import { logEvent } from '../services/analytics/index.js'
@ -98,18 +99,19 @@ export async function sideQueryOpenAICompat(
const content: BetaMessage['content'] = [] const content: BetaMessage['content'] = []
if (choice?.message?.content) { if (choice?.message?.content) {
content.push({ type: 'text', text: choice.message.content }) content.push({ type: 'text', text: choice.message.content, citations: null })
} }
if (choice?.message?.tool_calls) { if (choice?.message?.tool_calls) {
for (const tc of choice.message.tool_calls) { for (const tc of choice.message.tool_calls) {
const funcTc = tc as ChatCompletionMessageFunctionToolCall
let input: Record<string, unknown> = {} let input: Record<string, unknown> = {}
try { try {
input = JSON.parse(tc.function.arguments) as Record<string, unknown> input = JSON.parse(funcTc.function.arguments) as Record<string, unknown>
} catch { } catch {
// leave input empty on parse failure // leave input empty on parse failure
} }
content.push({ type: 'tool_use', id: tc.id, name: tc.function.name, input }) content.push({ type: 'tool_use', id: tc.id, name: funcTc.function.name, input })
} }
} }