修复模型引用与账单展示

This commit is contained in:
2026-06-15 00:17:20 +08:00
parent 10ec25d87b
commit 02ba5d3cdd
6 changed files with 146 additions and 47 deletions
+59 -6
View File
@@ -333,8 +333,8 @@ function WalletTransactionRecord(props: { transaction: GatewayWalletTransaction
const metadata = transaction.metadata;
const referenceId = transaction.referenceId || metadataString(transaction.metadata, 'taskId');
const requestId = metadataString(metadata, 'requestId');
const model = metadataString(metadata, 'resolvedModel') || metadataString(metadata, 'platformModelAlias') || metadataString(metadata, 'providerModel') || metadataString(metadata, 'model');
const requestedModel = metadataString(metadata, 'requestedModel');
const model = walletTransactionCalledModel(metadata);
const resolvedModel = walletTransactionResolvedModel(metadata);
const platform = metadataString(metadata, 'platformName') || metadataString(metadata, 'platformKey') || metadataString(metadata, 'provider') || metadataString(metadata, 'clientId');
const provider = metadataString(metadata, 'provider');
const taskType = metadataString(metadata, 'modelType') || metadataString(metadata, 'kind');
@@ -347,7 +347,7 @@ function WalletTransactionRecord(props: { transaction: GatewayWalletTransaction
<TableCell className="walletTransactionModelCell">
<span className="walletTransactionPrimaryCell">
<strong>{model || '-'}</strong>
{requestedModel && requestedModel !== model && <small>{requestedModel}</small>}
{resolvedModel && resolvedModel !== model && <small>{resolvedModel}</small>}
</span>
</TableCell>
<TableCell className="walletTransactionPlatformCell">
@@ -926,7 +926,8 @@ function TaskRecord(props: { task: GatewayTask; token: string; onCopyRequestId:
const usage = props.task.usage ?? {};
const tokenUsage = formatTokenUsage(usage);
const chargeText = props.task.finalChargeAmount !== undefined ? formatCellValue(props.task.finalChargeAmount) : '-';
const resolvedModel = props.task.resolvedModel || props.task.model;
const calledModel = taskCalledModelLabel(props.task);
const resolvedModel = taskResolvedModelLabel(props.task);
const badgeVariant = props.task.status === 'succeeded' ? 'success' : props.task.status === 'failed' ? 'destructive' : 'secondary';
return (
<TableRow>
@@ -957,8 +958,8 @@ function TaskRecord(props: { task: GatewayTask; token: string; onCopyRequestId:
<TableCell><Badge variant={badgeVariant}>{props.task.status}</Badge></TableCell>
<TableCell className="taskRecordModelCell">
<span className="taskRecordPrimaryCell">
<strong>{resolvedModel}</strong>
{props.task.requestedModel && props.task.requestedModel !== resolvedModel && <small>{props.task.requestedModel}</small>}
<strong>{calledModel || '-'}</strong>
{resolvedModel && resolvedModel !== calledModel && <small>{resolvedModel}</small>}
</span>
</TableCell>
<TableCell className="taskRecordAttemptCell">
@@ -1463,6 +1464,58 @@ function firstText(...values: Array<unknown>) {
return '';
}
function walletTransactionCalledModel(metadata: Record<string, unknown> | undefined) {
return firstText(
metadataModelReference(metadata, 'requestedModel'),
metadataModelReference(metadata, 'model'),
metadataModelReference(metadata, 'modelId'),
);
}
function walletTransactionResolvedModel(metadata: Record<string, unknown> | undefined) {
return firstText(
metadataString(metadata, 'resolvedModel'),
metadataString(metadata, 'platformModelAlias'),
metadataString(metadata, 'providerModel'),
metadataString(metadata, 'modelName'),
);
}
function taskCalledModelLabel(task: GatewayTask) {
return firstText(
task.requestedModel,
modelReferenceLabel(task.request?.model),
task.model,
);
}
function taskResolvedModelLabel(task: GatewayTask) {
return firstText(
task.resolvedModel,
metadataString(task.metrics, 'resolvedModel'),
metadataString(task.metrics, 'providerModel'),
metadataString(task.metrics, 'modelName'),
);
}
function metadataModelReference(metadata: Record<string, unknown> | undefined, key: string) {
return modelReferenceLabel(metadata?.[key]);
}
function modelReferenceLabel(value: unknown) {
if (typeof value === 'string' && value.trim()) return value.trim();
if (!value || typeof value !== 'object' || Array.isArray(value)) return '';
const record = value as Record<string, unknown>;
return firstText(
objectString(record, 'modelId'),
objectString(record, 'model_id'),
objectString(record, 'modelName'),
objectString(record, 'model_name'),
objectString(record, 'id'),
objectString(record, 'name'),
);
}
function metadataString(metadata: Record<string, unknown> | undefined, key: string) {
const value = metadata?.[key];
return typeof value === 'string' && value.trim() ? value.trim() : '';