import { streamText } from 'ai';

type StreamTextResult = ReturnType<typeof streamText>;

/**
 * 正数毫秒时返回 `AbortSignal.timeout(ms)`(Node 18+),供 `streamText({ abortSignal })`;否则不限制。
 */
export function benchStreamTextAbortSignal(timeoutMs: number | undefined): AbortSignal | undefined {
  if (timeoutMs == null || timeoutMs <= 0) {
    return undefined;
  }
  return AbortSignal.timeout(timeoutMs);
}

/**
 * 消费 `fullStream` 后解析最终 token 用量。
 * 部分提供商在流式 `finish` 分片的 `totalUsage` 中字段为空,需在消费流后 `await totalUsage` 才能得到 AI SDK 汇总的用量。
 */
export async function resolveStreamTextUsage(streamResult: StreamTextResult): Promise<{
  inputTokens: number | undefined;
  outputTokens: number | undefined;
  totalTokens: number | undefined;
}> {
  try {
    const u = await streamResult.totalUsage;
    return {
      inputTokens: u.inputTokens,
      outputTokens: u.outputTokens,
      totalTokens: u.totalTokens,
    };
  } catch {
    return { inputTokens: undefined, outputTokens: undefined, totalTokens: undefined };
  }
}