parseOpenAiEmbeddingResponse function

EmbeddingResponse parseOpenAiEmbeddingResponse(
  1. Map<String, dynamic> data, {
  2. required int expectedCount,
  3. required String provider,
})

OpenAI 形式の埋め込みレスポンス(data[].embedding、index 順に並べ直す)を EmbeddingResponse に変換する。数が入力と合わなければ LLMUnknownException。

Implementation

EmbeddingResponse parseOpenAiEmbeddingResponse(
  Map<String, dynamic> data, {
  required int expectedCount,
  required String provider,
}) {
  final items = [
    for (final item in (data['data'] as List?) ?? const [])
      if (item is Map<String, dynamic> && item['embedding'] is List) item,
  ];
  if (items.length != expectedCount) {
    throw LLMUnknownException(
      'Expected $expectedCount embeddings from $provider, got ${items.length}',
      provider: provider,
      raw: data,
    );
  }
  items.sort(
    (a, b) => ((a['index'] as num?) ?? 0).compareTo((b['index'] as num?) ?? 0),
  );
  final usage = data['usage'];
  final usageMap = usage is Map<String, dynamic> ? usage : null;
  return EmbeddingResponse(
    vectors: [
      for (final item in items)
        Float32List.fromList([
          for (final v in item['embedding'] as List) (v as num).toDouble(),
        ]),
    ],
    inputTokens:
        ((usageMap?['prompt_tokens'] ?? usageMap?['total_tokens']) as num?)
            ?.toInt(),
    costUsd: (usageMap?['cost'] as num?)?.toDouble(),
  );
}