-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalibaba-embeddings.ts
More file actions
67 lines (57 loc) · 1.63 KB
/
Copy pathalibaba-embeddings.ts
File metadata and controls
67 lines (57 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import "server-only";
function trimTrailingSlash(value: string) {
return value.replace(/\/$/, "");
}
function resolveEmbeddingBaseUrl() {
const compatibleBaseUrl = process.env.ALIBABA_BASE_URL?.trim();
if (!compatibleBaseUrl) {
return null;
}
return `${trimTrailingSlash(compatibleBaseUrl)}/embeddings`;
}
export function hasAlibabaEmbeddingConfig() {
return Boolean(process.env.ALIBABA_API_KEY?.trim() && resolveEmbeddingBaseUrl());
}
export async function generateAlibabaTextEmbedding(
input: string,
) {
const apiKey = process.env.ALIBABA_API_KEY?.trim();
const endpoint = resolveEmbeddingBaseUrl();
const model = process.env.ALIBABA_EMBEDDING_MODEL?.trim() || "text-embedding-v4";
const dimension = Number.parseInt(
process.env.ALIBABA_EMBEDDING_DIMENSION?.trim() || "512",
10,
);
if (!apiKey || !endpoint) {
return null;
}
const response = await fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
model,
input,
dimensions: Number.isFinite(dimension) ? dimension : 512,
}),
});
if (!response.ok) {
const errorBody = await response.text();
throw new Error(
`Alibaba embedding request failed with HTTP ${response.status}: ${errorBody.slice(0, 240)}`,
);
}
const payload = (await response.json()) as {
data?: Array<{
embedding?: number[];
}>;
output?: {
embeddings?: Array<{
embedding?: number[];
}>;
};
};
return payload.data?.[0]?.embedding ?? payload.output?.embeddings?.[0]?.embedding ?? null;
}