Skip to content

CreateEmbeddingsResponse has confusing type structure #98

@nitodeco

Description

@nitodeco

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;
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions