parseOpenAiEmbeddingResponse function
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(),
);
}