The type for CreateEmbeddingsResponse is a union of CreateEmbeddingsResponseBody and string.
Source from createembeddings.d.ts:
/**
* Embedding response
*/
export type CreateEmbeddingsResponseBody = {
id?: string | undefined;
object: ObjectT;
data: Array<CreateEmbeddingsData>;
model: string;
usage?: Usage | undefined;
};
export type CreateEmbeddingsResponse = CreateEmbeddingsResponseBody | string;
This requires developers to handle both cases when implementing the sdk. Additionally, CreateEmbeddingsData is typed as string | number[], which again requires handling the string case.
Here is an example of this:
export const generateEmbeddingBad = async (text: string): Promise<number[]> => {
const embedding = await openrouter.embeddings.generate({
model: "google/gemini-embedding-001",
input: text,
encodingFormat: "float",
});
// Need to handle a string only response
if (typeof embedding === "string") {
throw new Error("Invalid embedding response");
}
// Need to ensure embedding is an array of numbers
if (!Array.isArray(embedding.data[0].embedding)) {
throw new Error("Invalid embedding response");
}
return embedding.data[0].embedding;
};
Ideally, using the sdk for embeddings would look more like this:
export const generateEmbeddingGood = async (text: string): Promise<number[]> => {
const embedding = await openrouter.embeddings.generate({
model: "google/gemini-embedding-001",
input: text,
encodingFormat: "float",
});
return embedding.data[0].embedding;
};
The type for
CreateEmbeddingsResponseis a union ofCreateEmbeddingsResponseBodyandstring.Source from
createembeddings.d.ts:This requires developers to handle both cases when implementing the sdk. Additionally,
CreateEmbeddingsDatais typed asstring | number[], which again requires handling the string case.Here is an example of this:
Ideally, using the sdk for embeddings would look more like this: