fix: 统一传递完整 thinking 配置而非仅 thinkingType

Langfuse 追踪直接传递整个 thinking 对象(含 type 和 budget_tokens),
Analytics 日志同步补充 thinkingBudgetTokens 字段,logAPIQuery 改为
接收 ThinkingConfig 类型参数。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
claude-code-best
2026-04-27 10:02:37 +08:00
parent 3fb48ec106
commit bcbb8a6e93
4 changed files with 22 additions and 8 deletions

View File

@@ -6907,6 +6907,9 @@ async function logTenguInit({
allowDangerouslySkipPermissionsPassed, allowDangerouslySkipPermissionsPassed,
thinkingType: thinkingType:
thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
...(thinkingConfig.type === "enabled" && {
thinkingBudgetTokens: thinkingConfig.budgetTokens,
}),
...(systemPromptFlag && { ...(systemPromptFlag && {
systemPromptFlag: systemPromptFlag:
systemPromptFlag as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, systemPromptFlag as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,

View File

@@ -1787,7 +1787,6 @@ async function* queryModel(
}) })
const logMessagesLength = queryParams.messages.length const logMessagesLength = queryParams.messages.length
const logBetas = useBetas ? (queryParams.betas ?? []) : [] const logBetas = useBetas ? (queryParams.betas ?? []) : []
const logThinkingType = queryParams.thinking?.type ?? 'disabled'
const logEffortValue = queryParams.output_config?.effort const logEffortValue = queryParams.output_config?.effort
if (queryParams.thinking && queryParams.thinking.type !== 'disabled') { if (queryParams.thinking && queryParams.thinking.type !== 'disabled') {
langfuseThinking = queryParams.thinking langfuseThinking = queryParams.thinking
@@ -1801,7 +1800,7 @@ async function* queryModel(
permissionMode: permissionContext.mode, permissionMode: permissionContext.mode,
querySource: options.querySource, querySource: options.querySource,
queryTracking: options.queryTracking, queryTracking: options.queryTracking,
thinkingType: logThinkingType, thinkingConfig,
effortValue: logEffortValue, effortValue: logEffortValue,
fastMode: isFastMode, fastMode: isFastMode,
previousRequestId, previousRequestId,
@@ -2552,6 +2551,9 @@ async function* queryModel(
maxOutputTokens, maxOutputTokens,
thinkingType: thinkingType:
thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
...(thinkingConfig.type === 'enabled' && {
thinkingBudgetTokens: thinkingConfig.budgetTokens,
}),
fallback_disabled: true, fallback_disabled: true,
request_id: (streamRequestId ?? request_id: (streamRequestId ??
'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, 'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
@@ -2584,6 +2586,9 @@ async function* queryModel(
maxOutputTokens, maxOutputTokens,
thinkingType: thinkingType:
thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
...(thinkingConfig.type === 'enabled' && {
thinkingBudgetTokens: thinkingConfig.budgetTokens,
}),
fallback_disabled: false, fallback_disabled: false,
request_id: (streamRequestId ?? request_id: (streamRequestId ??
'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, 'unknown') as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
@@ -2700,6 +2705,9 @@ async function* queryModel(
maxOutputTokens, maxOutputTokens,
thinkingType: thinkingType:
thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, thinkingConfig.type as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
...(thinkingConfig.type === 'enabled' && {
thinkingBudgetTokens: thinkingConfig.budgetTokens,
}),
request_id: request_id:
failedRequestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, failedRequestId as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
fallback_cause: fallback_cause:

View File

@@ -23,6 +23,7 @@ import { getAPIProviderForStatsig } from 'src/utils/model/providers.js'
import type { PermissionMode } from 'src/utils/permissions/PermissionMode.js' import type { PermissionMode } from 'src/utils/permissions/PermissionMode.js'
import { jsonStringify } from 'src/utils/slowOperations.js' import { jsonStringify } from 'src/utils/slowOperations.js'
import { logOTelEvent } from 'src/utils/telemetry/events.js' import { logOTelEvent } from 'src/utils/telemetry/events.js'
import type { ThinkingConfig } from 'src/utils/thinking.js'
import { import {
endLLMRequestSpan, endLLMRequestSpan,
isBetaTracingEnabled, isBetaTracingEnabled,
@@ -176,7 +177,7 @@ export function logAPIQuery({
permissionMode, permissionMode,
querySource, querySource,
queryTracking, queryTracking,
thinkingType, thinkingConfig,
effortValue, effortValue,
fastMode, fastMode,
previousRequestId, previousRequestId,
@@ -188,11 +189,13 @@ export function logAPIQuery({
permissionMode?: PermissionMode permissionMode?: PermissionMode
querySource: string querySource: string
queryTracking?: QueryChainTracking queryTracking?: QueryChainTracking
thinkingType?: 'adaptive' | 'enabled' | 'disabled' thinkingConfig?: ThinkingConfig
effortValue?: EffortLevel | null effortValue?: EffortLevel | null
fastMode?: boolean fastMode?: boolean
previousRequestId?: string | null previousRequestId?: string | null
}): void { }): void {
const thinkingType = thinkingConfig?.type ?? 'disabled'
const thinkingBudgetTokens = thinkingConfig?.type === 'enabled' ? thinkingConfig.budgetTokens : undefined
logEvent('tengu_api_query', { logEvent('tengu_api_query', {
model: model as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, model: model as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
messagesLength, messagesLength,
@@ -219,6 +222,9 @@ export function logAPIQuery({
: {}), : {}),
thinkingType: thinkingType:
thinkingType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, thinkingType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
...(thinkingBudgetTokens !== undefined && {
thinkingBudgetTokens,
}),
effortValue: effortValue:
effortValue as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, effortValue as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
fastMode, fastMode,

View File

@@ -107,10 +107,7 @@ export function recordLLMObservation(
metadata: { metadata: {
provider: params.provider, provider: params.provider,
model: params.model, model: params.model,
...(params.thinking && { thinkingType: params.thinking.type }), ...(params.thinking && { thinking: params.thinking }),
...(params.thinking && (params.thinking.budget_tokens !== undefined || params.thinking.budgetTokens !== undefined) && {
thinkingBudgetTokens: (params.thinking.budget_tokens ?? params.thinking.budgetTokens) as number,
}),
}, },
...(params.completionStartTime && { completionStartTime: params.completionStartTime }), ...(params.completionStartTime && { completionStartTime: params.completionStartTime }),
}, },