@zhivex-ai/vertex 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +995 -10
- package/dist/anthropic.d.ts +9 -0
- package/dist/anthropic.d.ts.map +1 -1
- package/dist/anthropic.js +86 -16
- package/dist/anthropic.js.map +1 -1
- package/dist/capabilities.d.ts +1 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +12 -3
- package/dist/capabilities.js.map +1 -1
- package/dist/chat-profiles.d.ts +8 -0
- package/dist/chat-profiles.d.ts.map +1 -0
- package/dist/chat-profiles.js +61 -0
- package/dist/chat-profiles.js.map +1 -0
- package/dist/chat.d.ts +10 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +120 -0
- package/dist/chat.js.map +1 -0
- package/dist/embeddings.d.ts +71 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +166 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/endpoints.d.ts +76 -0
- package/dist/endpoints.d.ts.map +1 -0
- package/dist/endpoints.js +152 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/grpc.d.ts +33 -0
- package/dist/grpc.d.ts.map +1 -0
- package/dist/grpc.js +161 -0
- package/dist/grpc.js.map +1 -0
- package/dist/index.d.ts +40 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +653 -292
- package/dist/index.js.map +1 -1
- package/dist/inline-thinking.d.ts +3 -0
- package/dist/inline-thinking.d.ts.map +1 -0
- package/dist/inline-thinking.js +106 -0
- package/dist/inline-thinking.js.map +1 -0
- package/dist/interactions.d.ts +21 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +240 -0
- package/dist/interactions.js.map +1 -0
- package/dist/multimodal-embeddings.d.ts +53 -0
- package/dist/multimodal-embeddings.d.ts.map +1 -0
- package/dist/multimodal-embeddings.js +135 -0
- package/dist/multimodal-embeddings.js.map +1 -0
- package/dist/responses.d.ts +3 -0
- package/dist/responses.d.ts.map +1 -0
- package/dist/responses.js +120 -0
- package/dist/responses.js.map +1 -0
- package/dist/specialized.d.ts +14 -0
- package/dist/specialized.d.ts.map +1 -0
- package/dist/specialized.js +117 -0
- package/dist/specialized.js.map +1 -0
- package/dist/tensors.d.ts +22 -0
- package/dist/tensors.d.ts.map +1 -0
- package/dist/tensors.js +49 -0
- package/dist/tensors.js.map +1 -0
- package/dist/token-counting.d.ts +37 -0
- package/dist/token-counting.d.ts.map +1 -0
- package/dist/token-counting.js +33 -0
- package/dist/token-counting.js.map +1 -0
- package/dist/transcription.d.ts +60 -0
- package/dist/transcription.d.ts.map +1 -0
- package/dist/transcription.js +88 -0
- package/dist/transcription.js.map +1 -0
- package/dist/virtual-try-on.d.ts +23 -0
- package/dist/virtual-try-on.d.ts.map +1 -0
- package/dist/virtual-try-on.js +80 -0
- package/dist/virtual-try-on.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type DocumentExtractionInput, type DocumentExtractionResult, type TextCompletionInput, type GenerateResult, type StreamEvent } from "@zhivex-ai/core/provider";
|
|
2
|
+
export interface VertexOCRClient {
|
|
3
|
+
process(input: DocumentExtractionInput): Promise<DocumentExtractionResult>;
|
|
4
|
+
}
|
|
5
|
+
export interface VertexFIMClient {
|
|
6
|
+
generate(input: TextCompletionInput): Promise<GenerateResult>;
|
|
7
|
+
stream(input: TextCompletionInput): Promise<AsyncIterable<StreamEvent>>;
|
|
8
|
+
}
|
|
9
|
+
export interface VertexSpecializedClients {
|
|
10
|
+
ocr: VertexOCRClient;
|
|
11
|
+
fim: VertexFIMClient;
|
|
12
|
+
}
|
|
13
|
+
export declare const createVertexSpecializedClients: (baseURL: string, fetcher: typeof globalThis.fetch, assertAccess: () => void) => VertexSpecializedClients;
|
|
14
|
+
//# sourceMappingURL=specialized.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specialized.d.ts","sourceRoot":"","sources":["../src/specialized.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,uBAAuB,EAA+B,KAAK,wBAAwB,EACxF,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAChE,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC5E;AACD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;CACzE;AACD,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,eAAe,CAAC;CACtB;AAYD,eAAO,MAAM,8BAA8B,YAAa,MAAM,WAAW,OAAO,UAAU,CAAC,KAAK,gBAAgB,MAAM,IAAI,KAAG,wBAgF5H,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { ConfigurationError, ProviderHTTPError, UnsupportedFeatureError, createChatCompletionsModel, encodeMediaFrame, readErrorBodyWithLimit, readJsonWithLimit, withRetry, withTimeoutSignal } from "@zhivex-ai/core/provider";
|
|
2
|
+
import { createVertexChatModel } from "./chat.js";
|
|
3
|
+
const mistralModel = (value, family) => {
|
|
4
|
+
const model = value.replace(/^mistralai\//, "");
|
|
5
|
+
if (!model.startsWith(family) || /[\\/?#\s]/.test(model))
|
|
6
|
+
throw new ConfigurationError(`Vertex requires a ${family} model ID for this API.`);
|
|
7
|
+
return model;
|
|
8
|
+
};
|
|
9
|
+
const assertNativeOptions = (options, reserved, surface) => {
|
|
10
|
+
for (const key of reserved)
|
|
11
|
+
if (options?.[key] !== undefined)
|
|
12
|
+
throw new ConfigurationError(`Vertex ${surface} providerOptions.${key} conflicts with its dedicated input contract.`);
|
|
13
|
+
};
|
|
14
|
+
export const createVertexSpecializedClients = (baseURL, fetcher, assertAccess) => {
|
|
15
|
+
const url = (model, stream = false) => `${baseURL}/publishers/mistralai/models/${encodeURIComponent(model)}:${stream ? "streamRawPredict" : "rawPredict"}`;
|
|
16
|
+
const completion = (input) => {
|
|
17
|
+
assertAccess();
|
|
18
|
+
const modelId = mistralModel(input.modelId, "codestral");
|
|
19
|
+
assertNativeOptions(input.providerOptions, ["model", "prompt", "suffix", "stream", "messages", "tools", "tool_choice", "response_format", "max_tokens", "temperature", "top_p", "stop"], "FIM");
|
|
20
|
+
if (typeof input.prompt !== "string" || (input.suffix !== undefined && typeof input.suffix !== "string"))
|
|
21
|
+
throw new ConfigurationError("Vertex FIM requires a text prompt and optional text suffix.");
|
|
22
|
+
if (input.maxTokens !== undefined && (!Number.isInteger(input.maxTokens) || input.maxTokens <= 0))
|
|
23
|
+
throw new ConfigurationError("Vertex FIM maxTokens must be a positive integer.");
|
|
24
|
+
if (input.temperature !== undefined && (!Number.isFinite(input.temperature) || input.temperature < 0))
|
|
25
|
+
throw new ConfigurationError("Vertex FIM temperature must be finite and nonnegative.");
|
|
26
|
+
if (input.topP !== undefined && (!Number.isFinite(input.topP) || input.topP <= 0 || input.topP > 1))
|
|
27
|
+
throw new ConfigurationError("Vertex FIM topP must be greater than zero and at most one.");
|
|
28
|
+
if (input.stop !== undefined && (typeof input.stop !== "string" && (!Array.isArray(input.stop) || input.stop.some((value) => typeof value !== "string"))))
|
|
29
|
+
throw new ConfigurationError("Vertex FIM stop must be text or an array of text values.");
|
|
30
|
+
return createChatCompletionsModel({ provider: "vertex", modelId,
|
|
31
|
+
capabilities: { streaming: true, tools: false, structuredOutput: false, jsonMode: false, toolChoice: false, parallelToolCalls: false, vision: false, files: false, audioInput: false, audioOutput: false, embeddings: false, reasoning: false, webSearch: false },
|
|
32
|
+
send: (body, signal) => fetcher(url(modelId, body.stream === true), {
|
|
33
|
+
method: "POST", headers: { "content-type": "application/json" }, redirect: "error", signal,
|
|
34
|
+
body: JSON.stringify({ ...input.providerOptions, model: modelId.split("@")[0], prompt: input.prompt,
|
|
35
|
+
...(input.suffix !== undefined ? { suffix: input.suffix } : {}),
|
|
36
|
+
...(input.maxTokens !== undefined ? { max_tokens: input.maxTokens } : {}),
|
|
37
|
+
...(input.temperature !== undefined ? { temperature: input.temperature } : {}),
|
|
38
|
+
...(input.topP !== undefined ? { top_p: input.topP } : {}),
|
|
39
|
+
...(input.stop !== undefined ? { stop: input.stop } : {}), stream: body.stream })
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
fim: {
|
|
45
|
+
generate: (input) => completion(input).generate({ ...input, messages: [] }),
|
|
46
|
+
stream: (input) => completion(input).stream({ ...input, messages: [] })
|
|
47
|
+
},
|
|
48
|
+
ocr: {
|
|
49
|
+
async process(input) {
|
|
50
|
+
assertAccess();
|
|
51
|
+
assertNativeOptions(input.providerOptions, ["model", "document", "pages", "include_image_base64", "stream", "messages"], "OCR");
|
|
52
|
+
const media = input.document;
|
|
53
|
+
if (!media || (media.uri === undefined) === (media.data === undefined))
|
|
54
|
+
throw new ConfigurationError("Vertex OCR requires exactly one document uri or data value.");
|
|
55
|
+
const image = /^image\/(?:png|jpeg|webp|gif)$/.test(media.mediaType);
|
|
56
|
+
if (!image && media.mediaType !== "application/pdf")
|
|
57
|
+
throw new UnsupportedFeatureError("Vertex Mistral OCR accepts PDF or image input.");
|
|
58
|
+
if (input.pages?.some((page) => !Number.isInteger(page) || page < 0))
|
|
59
|
+
throw new ConfigurationError("OCR pages must contain nonnegative integer indices.");
|
|
60
|
+
if (input.includeImages !== undefined && typeof input.includeImages !== "boolean")
|
|
61
|
+
throw new ConfigurationError("OCR includeImages must be a boolean.");
|
|
62
|
+
if (media.uri !== undefined && !/^https?:\/\//.test(media.uri))
|
|
63
|
+
throw new ConfigurationError("Vertex OCR document URLs must use HTTP(S); use inline data for local files.");
|
|
64
|
+
const source = media.uri ?? `data:${media.mediaType};base64,${encodeMediaFrame({ data: media.data, mediaType: media.mediaType })}`;
|
|
65
|
+
if (["deepseek-ai/deepseek-ocr-maas", "publishers/deepseek-ai/models/deepseek-ocr-maas"].includes(input.modelId)) {
|
|
66
|
+
if (!image)
|
|
67
|
+
throw new UnsupportedFeatureError("Vertex DeepSeek OCR requires one image; rasterize PDF pages before extraction.");
|
|
68
|
+
if (input.pages !== undefined || input.includeImages !== undefined)
|
|
69
|
+
throw new UnsupportedFeatureError("Vertex DeepSeek OCR does not expose page selection or extracted images.");
|
|
70
|
+
if (input.prompt !== undefined && (typeof input.prompt !== "string" || !input.prompt.trim()))
|
|
71
|
+
throw new ConfigurationError("Vertex DeepSeek OCR prompt must be nonempty text.");
|
|
72
|
+
assertNativeOptions(input.providerOptions, ["prompt", "tools", "tool_choice", "response_format"], "DeepSeek OCR");
|
|
73
|
+
const result = await createVertexChatModel("deepseek-ai/deepseek-ocr-maas", baseURL, fetcher).generate({
|
|
74
|
+
...input,
|
|
75
|
+
messages: [{ role: "user", parts: [{ type: "text", text: input.prompt ?? "Free OCR" }, { type: "image", image: source }] }]
|
|
76
|
+
});
|
|
77
|
+
if (result.finishReason !== "stop")
|
|
78
|
+
throw new ConfigurationError(`Vertex DeepSeek OCR did not complete extraction (${result.finishReason ?? "unknown"}).`);
|
|
79
|
+
if (typeof result.text !== "string")
|
|
80
|
+
throw new ConfigurationError("Vertex DeepSeek OCR returned no text.");
|
|
81
|
+
// The input is one image, not a paginated document. Index zero identifies it.
|
|
82
|
+
return { text: result.text, pages: [{ index: 0, markdown: result.text }], rawResponse: result.rawResponse };
|
|
83
|
+
}
|
|
84
|
+
const model = mistralModel(input.modelId, "mistral-ocr-");
|
|
85
|
+
if (input.prompt !== undefined)
|
|
86
|
+
throw new UnsupportedFeatureError("Vertex Mistral OCR does not expose a text extraction prompt.");
|
|
87
|
+
const body = { ...input.providerOptions, model: model.split("@")[0],
|
|
88
|
+
document: image ? { type: "image_url", image_url: source } : { type: "document_url", document_url: source },
|
|
89
|
+
...(input.pages ? { pages: input.pages } : {}), ...(input.includeImages !== undefined ? { include_image_base64: input.includeImages } : {}) };
|
|
90
|
+
const { signal, cleanup } = withTimeoutSignal(input);
|
|
91
|
+
try {
|
|
92
|
+
const response = await withRetry(async () => {
|
|
93
|
+
const result = await fetcher(url(model), { method: "POST", headers: { "content-type": "application/json" }, redirect: "error", signal, body: JSON.stringify(body) });
|
|
94
|
+
if (!result.ok)
|
|
95
|
+
throw new ProviderHTTPError(`Vertex OCR failed with status ${result.status}.`, result.status, { responseBody: await readErrorBodyWithLimit(result) });
|
|
96
|
+
return result;
|
|
97
|
+
}, { ...input, abortSignal: signal });
|
|
98
|
+
const json = await readJsonWithLimit(response, { maxBytes: 128 * 1024 * 1024 });
|
|
99
|
+
if (!Array.isArray(json.pages))
|
|
100
|
+
throw new ConfigurationError("Vertex OCR returned no pages array.");
|
|
101
|
+
const indices = new Set();
|
|
102
|
+
const pages = json.pages.map((page) => {
|
|
103
|
+
if (!page || !Number.isInteger(page.index) || page.index < 0 || typeof page.markdown !== "string" || indices.has(page.index))
|
|
104
|
+
throw new ConfigurationError("Vertex OCR returned an invalid or duplicate page.");
|
|
105
|
+
indices.add(page.index);
|
|
106
|
+
return { index: page.index, markdown: page.markdown, ...(Array.isArray(page.images) ? { images: page.images } : {}), providerMetadata: page };
|
|
107
|
+
});
|
|
108
|
+
return { text: pages.map((page) => page.markdown).join("\n\n"), pages, rawResponse: json };
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
cleanup();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=specialized.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specialized.js","sourceRoot":"","sources":["../src/specialized.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type VertexTensorDataType = "DATA_TYPE_UNSPECIFIED" | "BOOL" | "STRING" | "FLOAT" | "DOUBLE" | "INT8" | "INT16" | "INT32" | "INT64" | "UINT8" | "UINT16" | "UINT32" | "UINT64";
|
|
2
|
+
type ProtoFloat = number | "NaN" | "Infinity" | "-Infinity";
|
|
3
|
+
/** Native REST Tensor. 64-bit integers stay strings to preserve precision. */
|
|
4
|
+
export interface VertexTensor {
|
|
5
|
+
dtype?: VertexTensorDataType;
|
|
6
|
+
shape?: string[];
|
|
7
|
+
boolVal?: boolean[];
|
|
8
|
+
stringVal?: string[];
|
|
9
|
+
bytesVal?: string[];
|
|
10
|
+
floatVal?: ProtoFloat[];
|
|
11
|
+
doubleVal?: ProtoFloat[];
|
|
12
|
+
intVal?: number[];
|
|
13
|
+
int64Val?: string[];
|
|
14
|
+
uintVal?: number[];
|
|
15
|
+
uint64Val?: string[];
|
|
16
|
+
listVal?: VertexTensor[];
|
|
17
|
+
structVal?: Record<string, VertexTensor>;
|
|
18
|
+
tensorVal?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function assertVertexTensor(value: unknown, depth?: number): asserts value is VertexTensor;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=tensors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tensors.d.ts","sourceRoot":"","sources":["../src/tensors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,uBAAuB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACtL,KAAK,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;AAC5D,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CA0B3F"}
|
package/dist/tensors.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ConfigurationError } from "@zhivex-ai/core/provider";
|
|
2
|
+
const types = new Set(["DATA_TYPE_UNSPECIFIED", "BOOL", "STRING", "FLOAT", "DOUBLE", "INT8", "INT16", "INT32", "INT64", "UINT8", "UINT16", "UINT32", "UINT64"]);
|
|
3
|
+
const integer64 = (value, unsigned = false) => {
|
|
4
|
+
if (typeof value !== "string" || value.length > 20 || !/^-?\d+$/.test(value))
|
|
5
|
+
return false;
|
|
6
|
+
const number = BigInt(value);
|
|
7
|
+
return unsigned ? number >= 0n && number <= 18446744073709551615n : number >= -9223372036854775808n && number <= 9223372036854775807n;
|
|
8
|
+
};
|
|
9
|
+
const protoFloat = (v) => typeof v === "number" ? Number.isFinite(v) : ["NaN", "Infinity", "-Infinity"].includes(v);
|
|
10
|
+
const base64 = (v) => typeof v === "string" && /^(?:[A-Za-z0-9+/_-]{4})*(?:[A-Za-z0-9+/_-]{2}(?:==)?|[A-Za-z0-9+/_-]{3}=?|)?$/.test(v);
|
|
11
|
+
export function assertVertexTensor(value, depth = 0) {
|
|
12
|
+
const invalid = () => { throw new ConfigurationError("Invalid Vertex REST Tensor representation."); };
|
|
13
|
+
if (depth > 32 || !value || typeof value !== "object" || Array.isArray(value))
|
|
14
|
+
invalid();
|
|
15
|
+
const tensor = value;
|
|
16
|
+
if (tensor.dtype !== undefined && !types.has(tensor.dtype))
|
|
17
|
+
invalid();
|
|
18
|
+
const arrays = {
|
|
19
|
+
shape: v => integer64(v), boolVal: v => typeof v === "boolean", stringVal: v => typeof v === "string", bytesVal: base64,
|
|
20
|
+
floatVal: protoFloat, doubleVal: protoFloat,
|
|
21
|
+
intVal: v => typeof v === "number" && Number.isInteger(v) && v >= -2147483648 && v <= 2147483647,
|
|
22
|
+
uintVal: v => typeof v === "number" && Number.isInteger(v) && v >= 0 && v <= 4294967295,
|
|
23
|
+
int64Val: v => integer64(v), uint64Val: v => integer64(v, true)
|
|
24
|
+
};
|
|
25
|
+
for (const [key, valid] of Object.entries(arrays))
|
|
26
|
+
if (tensor[key] !== undefined && (!Array.isArray(tensor[key]) || !tensor[key].every(valid)))
|
|
27
|
+
invalid();
|
|
28
|
+
if (tensor.tensorVal !== undefined && !base64(tensor.tensorVal))
|
|
29
|
+
invalid();
|
|
30
|
+
if (tensor.listVal !== undefined) {
|
|
31
|
+
if (!Array.isArray(tensor.listVal))
|
|
32
|
+
invalid();
|
|
33
|
+
for (const child of tensor.listVal)
|
|
34
|
+
assertVertexTensor(child, depth + 1);
|
|
35
|
+
}
|
|
36
|
+
if (tensor.structVal !== undefined) {
|
|
37
|
+
if (!tensor.structVal || typeof tensor.structVal !== "object" || Array.isArray(tensor.structVal))
|
|
38
|
+
invalid();
|
|
39
|
+
for (const child of Object.values(tensor.structVal))
|
|
40
|
+
assertVertexTensor(child, depth + 1);
|
|
41
|
+
}
|
|
42
|
+
const scalarFields = Object.keys(arrays).filter(key => key !== "shape" && tensor[key] !== undefined);
|
|
43
|
+
if (scalarFields.length > 1)
|
|
44
|
+
invalid();
|
|
45
|
+
const allowed = { BOOL: ["boolVal"], STRING: ["stringVal", "bytesVal"], FLOAT: ["floatVal"], DOUBLE: ["doubleVal"], INT8: ["intVal"], INT16: ["intVal"], INT32: ["intVal"], INT64: ["int64Val"], UINT8: ["uintVal"], UINT16: ["uintVal"], UINT32: ["uintVal"], UINT64: ["uint64Val"] };
|
|
46
|
+
if (scalarFields.length && tensor.dtype !== undefined && !allowed[tensor.dtype]?.includes(scalarFields[0]))
|
|
47
|
+
invalid();
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=tensors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tensors.js","sourceRoot":"","sources":["../src/tensors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type JsonValue, type RetryOptions } from "@zhivex-ai/core/provider";
|
|
2
|
+
/** Native Claude message blocks, including tools, images and documents. */
|
|
3
|
+
export interface VertexClaudeTokenCountInput extends RetryOptions {
|
|
4
|
+
modelId: string;
|
|
5
|
+
messages: Array<{
|
|
6
|
+
role: "user" | "assistant";
|
|
7
|
+
content: string | Array<Record<string, JsonValue>>;
|
|
8
|
+
}>;
|
|
9
|
+
system?: string | Array<Record<string, JsonValue>>;
|
|
10
|
+
tools?: Array<Record<string, JsonValue>>;
|
|
11
|
+
thinking?: Record<string, JsonValue>;
|
|
12
|
+
toolChoice?: Record<string, JsonValue>;
|
|
13
|
+
}
|
|
14
|
+
export interface VertexClaudeTokenCountResult {
|
|
15
|
+
inputTokens: number;
|
|
16
|
+
rawResponse: unknown;
|
|
17
|
+
}
|
|
18
|
+
export interface VertexClaudeClient {
|
|
19
|
+
countTokens(input: VertexClaudeTokenCountInput): Promise<VertexClaudeTokenCountResult>;
|
|
20
|
+
}
|
|
21
|
+
export declare const createVertexClaudeClient: (baseURL: string, fetcher: typeof globalThis.fetch, assertAccess: () => void) => VertexClaudeClient;
|
|
22
|
+
export interface VertexGeminiTokenCountInput extends RetryOptions {
|
|
23
|
+
modelId: string;
|
|
24
|
+
messages: import("@zhivex-ai/core/provider").ModelMessage[];
|
|
25
|
+
system?: string;
|
|
26
|
+
tools?: import("@zhivex-ai/core/provider").ToolCollection;
|
|
27
|
+
generationConfig?: Record<string, JsonValue>;
|
|
28
|
+
}
|
|
29
|
+
export interface VertexGeminiTokenCountResult {
|
|
30
|
+
inputTokens: number;
|
|
31
|
+
totalBillableCharacters?: number;
|
|
32
|
+
rawResponse: unknown;
|
|
33
|
+
}
|
|
34
|
+
export interface VertexGeminiClient {
|
|
35
|
+
countTokens(input: VertexGeminiTokenCountInput): Promise<VertexGeminiTokenCountResult>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=token-counting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counting.d.ts","sourceRoot":"","sources":["../src/token-counting.ts"],"names":[],"mappings":"AAAA,OAAO,EAEyB,KAAK,SAAS,EAAE,KAAK,YAAY,EAChE,MAAM,0BAA0B,CAAC;AAElC,2EAA2E;AAC3E,MAAM,WAAW,2BAA4B,SAAQ,YAAY;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IACpG,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACxC;AACD,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;CACxF;AAED,eAAO,MAAM,wBAAwB,YAAa,MAAM,WAAW,OAAO,UAAU,CAAC,KAAK,gBAAgB,MAAM,IAAI,KAAG,kBAsBrH,CAAC;AAEH,MAAM,WAAW,2BAA4B,SAAQ,YAAY;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,0BAA0B,EAAE,YAAY,EAAE,CAAC;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,0BAA0B,EAAE,cAAc,CAAC;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC9C;AACD,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;CACxF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ConfigurationError, ProviderHTTPError, readErrorBodyWithLimit, readJsonWithLimit, withRetry, withTimeoutSignal } from "@zhivex-ai/core/provider";
|
|
2
|
+
export const createVertexClaudeClient = (baseURL, fetcher, assertAccess) => ({
|
|
3
|
+
async countTokens(input) {
|
|
4
|
+
assertAccess();
|
|
5
|
+
if (!/^claude-[a-z0-9@.-]+$/.test(input.modelId))
|
|
6
|
+
throw new ConfigurationError("Vertex Claude token counting requires a Claude model ID.");
|
|
7
|
+
if (!Array.isArray(input.messages) || !input.messages.length || input.messages.some((message) => !message || !["user", "assistant"].includes(message.role) || (typeof message.content !== "string" && !Array.isArray(message.content))))
|
|
8
|
+
throw new ConfigurationError("Vertex Claude token counting requires native Claude messages.");
|
|
9
|
+
const body = JSON.stringify({ model: input.modelId, messages: input.messages, system: input.system,
|
|
10
|
+
tools: input.tools, thinking: input.thinking, tool_choice: input.toolChoice });
|
|
11
|
+
if (new TextEncoder().encode(body).byteLength > 30_000_000)
|
|
12
|
+
throw new ConfigurationError("Vertex Claude token count request exceeds 30 MB.");
|
|
13
|
+
const { signal, cleanup } = withTimeoutSignal(input);
|
|
14
|
+
try {
|
|
15
|
+
const response = await withRetry(async () => {
|
|
16
|
+
const result = await fetcher(`${baseURL}/publishers/anthropic/models/count-tokens:rawPredict`, {
|
|
17
|
+
method: "POST", headers: { "content-type": "application/json" }, body, signal, redirect: "error"
|
|
18
|
+
});
|
|
19
|
+
if (!result.ok)
|
|
20
|
+
throw new ProviderHTTPError(`Vertex Claude token counting failed with status ${result.status}.`, result.status, { responseBody: await readErrorBodyWithLimit(result) });
|
|
21
|
+
return result;
|
|
22
|
+
}, { ...input, abortSignal: signal });
|
|
23
|
+
const result = await readJsonWithLimit(response, { maxBytes: 1024 * 1024 });
|
|
24
|
+
if (!Number.isInteger(result?.input_tokens) || result.input_tokens < 0)
|
|
25
|
+
throw new ConfigurationError("Vertex Claude returned an invalid token count.");
|
|
26
|
+
return { inputTokens: result.input_tokens, rawResponse: result };
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
cleanup();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=token-counting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counting.js","sourceRoot":"","sources":["../src/token-counting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type TranscriptionModel, type TranscriptionModelInput, type TranscriptionResult } from "@zhivex-ai/core/provider";
|
|
2
|
+
export interface VertexAudioTranscriptionConfig {
|
|
3
|
+
languageCodes?: string[];
|
|
4
|
+
customVocabulary?: string[];
|
|
5
|
+
wordTimestamp?: boolean;
|
|
6
|
+
diarization?: boolean;
|
|
7
|
+
mode?: "VERBATIM" | "SMART";
|
|
8
|
+
}
|
|
9
|
+
export interface VertexTranscriptionOptions extends Record<string, unknown> {
|
|
10
|
+
audioTranscriptionConfig?: VertexAudioTranscriptionConfig;
|
|
11
|
+
}
|
|
12
|
+
export interface VertexAudioTranscription {
|
|
13
|
+
text?: string;
|
|
14
|
+
finished?: boolean;
|
|
15
|
+
languageCode?: string;
|
|
16
|
+
speakerLabel?: string;
|
|
17
|
+
words?: {
|
|
18
|
+
word?: string;
|
|
19
|
+
startOffset?: string;
|
|
20
|
+
endOffset?: string;
|
|
21
|
+
}[];
|
|
22
|
+
}
|
|
23
|
+
export interface VertexTranscriptionResult extends TranscriptionResult {
|
|
24
|
+
transcriptions: VertexAudioTranscription[];
|
|
25
|
+
}
|
|
26
|
+
export interface VertexTranscriptionModel extends TranscriptionModel<VertexTranscriptionOptions> {
|
|
27
|
+
transcribe(input: TranscriptionModelInput<VertexTranscriptionOptions>): Promise<VertexTranscriptionResult>;
|
|
28
|
+
}
|
|
29
|
+
export declare const isVertexTranscribeModel: (model: string) => model is "gemini-3.5-transcribe-preview";
|
|
30
|
+
export declare function normalizeVertexTranscriptionConfig(supplied: unknown, language?: string): VertexAudioTranscriptionConfig;
|
|
31
|
+
export declare function transcriptionRequest(model: string, input: TranscriptionModelInput, data: string): {
|
|
32
|
+
contents: {
|
|
33
|
+
role: string;
|
|
34
|
+
parts: ({
|
|
35
|
+
text?: undefined;
|
|
36
|
+
inlineData: {
|
|
37
|
+
mimeType: string;
|
|
38
|
+
data: string;
|
|
39
|
+
};
|
|
40
|
+
} | {
|
|
41
|
+
inlineData?: undefined;
|
|
42
|
+
text: string;
|
|
43
|
+
})[];
|
|
44
|
+
}[];
|
|
45
|
+
} | {
|
|
46
|
+
contents: {
|
|
47
|
+
role: string;
|
|
48
|
+
parts: {
|
|
49
|
+
inlineData: {
|
|
50
|
+
mimeType: string;
|
|
51
|
+
data: string;
|
|
52
|
+
};
|
|
53
|
+
}[];
|
|
54
|
+
}[];
|
|
55
|
+
generationConfig: {
|
|
56
|
+
audioTranscriptionConfig: VertexAudioTranscriptionConfig;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export declare function transcriptionResponse(json: any): VertexTranscriptionResult;
|
|
60
|
+
//# sourceMappingURL=transcription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcription.d.ts","sourceRoot":"","sources":["../src/transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+C,KAAK,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAExK,MAAM,WAAW,8BAA8B;IAC7C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;CAC7B;AACD,MAAM,WAAW,0BAA2B,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzE,wBAAwB,CAAC,EAAE,8BAA8B,CAAC;CAC3D;AACD,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvE;AACD,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,cAAc,EAAE,wBAAwB,EAAE,CAAC;CAC5C;AACD,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB,CAAC,0BAA0B,CAAC;IAC9F,UAAU,CAAC,KAAK,EAAE,uBAAuB,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC5G;AACD,eAAO,MAAM,uBAAuB,UAAW,MAAM,6CAA8C,CAAC;AAEpG,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,8BAA8B,CAmBvH;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB/F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,GAAG,GAAG,yBAAyB,CAqB1E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ConfigurationError, UnsupportedFeatureError } from "@zhivex-ai/core/provider";
|
|
2
|
+
export const isVertexTranscribeModel = (model) => model === "gemini-3.5-transcribe-preview";
|
|
3
|
+
export function normalizeVertexTranscriptionConfig(supplied, language) {
|
|
4
|
+
if (supplied !== undefined && (!supplied || typeof supplied !== "object" || Array.isArray(supplied)))
|
|
5
|
+
throw new ConfigurationError("audioTranscriptionConfig must be an object.");
|
|
6
|
+
const config = { ...supplied };
|
|
7
|
+
const allowed = ["languageCodes", "customVocabulary", "wordTimestamp", "diarization", "mode"];
|
|
8
|
+
for (const key of Object.keys(config))
|
|
9
|
+
if (!allowed.includes(key))
|
|
10
|
+
throw new ConfigurationError(`Unsupported audioTranscriptionConfig field: ${key}.`);
|
|
11
|
+
if (language !== undefined) {
|
|
12
|
+
if (typeof language !== "string" || !language.trim())
|
|
13
|
+
throw new ConfigurationError("Transcription language must be nonempty.");
|
|
14
|
+
if (config.languageCodes !== undefined && (config.languageCodes.length !== 1 || config.languageCodes[0] !== language))
|
|
15
|
+
throw new ConfigurationError("language conflicts with audioTranscriptionConfig.languageCodes.");
|
|
16
|
+
config.languageCodes = [language];
|
|
17
|
+
}
|
|
18
|
+
for (const key of ["languageCodes", "customVocabulary"]) {
|
|
19
|
+
const list = config[key];
|
|
20
|
+
if (list !== undefined && (!Array.isArray(list) || list.some(value => typeof value !== "string" || !value.trim())))
|
|
21
|
+
throw new ConfigurationError(`${key} must contain nonempty strings.`);
|
|
22
|
+
}
|
|
23
|
+
if ((config.customVocabulary?.length ?? 0) > 1000)
|
|
24
|
+
throw new ConfigurationError("customVocabulary accepts at most 1000 terms.");
|
|
25
|
+
for (const key of ["wordTimestamp", "diarization"])
|
|
26
|
+
if (config[key] !== undefined && typeof config[key] !== "boolean")
|
|
27
|
+
throw new ConfigurationError(`${key} must be a boolean.`);
|
|
28
|
+
if (config.mode !== undefined && !["SMART", "VERBATIM"].includes(config.mode))
|
|
29
|
+
throw new ConfigurationError("Transcription mode must be SMART or VERBATIM.");
|
|
30
|
+
if (config.mode === "SMART" && (config.wordTimestamp || config.diarization))
|
|
31
|
+
throw new ConfigurationError("SMART mode cannot combine with timestamps or diarization.");
|
|
32
|
+
return config;
|
|
33
|
+
}
|
|
34
|
+
export function transcriptionRequest(model, input, data) {
|
|
35
|
+
const options = { ...input.providerOptions };
|
|
36
|
+
const native = isVertexTranscribeModel(model);
|
|
37
|
+
if (!native) {
|
|
38
|
+
if (options.audioTranscriptionConfig !== undefined)
|
|
39
|
+
throw new UnsupportedFeatureError("audioTranscriptionConfig requires Gemini 3.5 Transcribe.");
|
|
40
|
+
return { contents: [{ role: "user", parts: [{ inlineData: { mimeType: input.audio.mediaType, data } }, { text: input.prompt ?? `Transcribe this audio${input.language ? ` in ${input.language}` : ""}. Return only the transcript.` }] }], ...options };
|
|
41
|
+
}
|
|
42
|
+
if (input.prompt !== undefined)
|
|
43
|
+
throw new UnsupportedFeatureError("Gemini 3.5 Transcribe accepts audio and transcription configuration, not a text prompt.");
|
|
44
|
+
for (const key of ["contents", "systemInstruction", "system_instruction", "tools", "toolConfig", "audio_transcription_config"]) {
|
|
45
|
+
if (options[key] !== undefined)
|
|
46
|
+
throw new ConfigurationError(`Gemini 3.5 Transcribe does not accept providerOptions.${key}.`);
|
|
47
|
+
}
|
|
48
|
+
const config = normalizeVertexTranscriptionConfig(options.audioTranscriptionConfig, input.language);
|
|
49
|
+
delete options.audioTranscriptionConfig;
|
|
50
|
+
const generation = options.generationConfig;
|
|
51
|
+
if (generation !== undefined && (!generation || typeof generation !== "object" || Array.isArray(generation)))
|
|
52
|
+
throw new ConfigurationError("generationConfig must be an object.");
|
|
53
|
+
if (generation && ("audioTranscriptionConfig" in generation || "audio_transcription_config" in generation))
|
|
54
|
+
throw new ConfigurationError("Use the dedicated audioTranscriptionConfig option, not a generationConfig override.");
|
|
55
|
+
return { ...options, contents: [{ role: "user", parts: [{ inlineData: { mimeType: input.audio.mediaType, data } }] }], generationConfig: { ...generation, audioTranscriptionConfig: config } };
|
|
56
|
+
}
|
|
57
|
+
export function transcriptionResponse(json) {
|
|
58
|
+
const parts = json.candidates?.[0]?.content?.parts ?? [];
|
|
59
|
+
if (!Array.isArray(parts))
|
|
60
|
+
throw new ConfigurationError("Invalid Vertex transcription parts.");
|
|
61
|
+
const transcriptions = [];
|
|
62
|
+
const texts = [];
|
|
63
|
+
for (const part of parts) {
|
|
64
|
+
if (!part || typeof part !== "object")
|
|
65
|
+
throw new ConfigurationError("Invalid Vertex transcription part.");
|
|
66
|
+
const value = part.audioTranscription;
|
|
67
|
+
if (value !== undefined) {
|
|
68
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
69
|
+
throw new ConfigurationError("Invalid audioTranscription response.");
|
|
70
|
+
for (const key of ["text", "languageCode", "speakerLabel"])
|
|
71
|
+
if (value[key] !== undefined && typeof value[key] !== "string")
|
|
72
|
+
throw new ConfigurationError(`Invalid transcription ${key}.`);
|
|
73
|
+
if (value.finished !== undefined && typeof value.finished !== "boolean")
|
|
74
|
+
throw new ConfigurationError("Invalid transcription finished flag.");
|
|
75
|
+
if (value.words !== undefined && (!Array.isArray(value.words) || value.words.some((word) => !word || typeof word !== "object" || Array.isArray(word) || ["word", "startOffset", "endOffset"].some(key => word[key] !== undefined && typeof word[key] !== "string"))))
|
|
76
|
+
throw new ConfigurationError("Invalid transcription word information.");
|
|
77
|
+
transcriptions.push(value);
|
|
78
|
+
}
|
|
79
|
+
if (part.thought !== true) {
|
|
80
|
+
if (typeof part.text === "string" && part.text)
|
|
81
|
+
texts.push(part.text);
|
|
82
|
+
else if (typeof value?.text === "string")
|
|
83
|
+
texts.push(value.text);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { text: texts.join(""), transcriptions, rawResponse: json };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=transcription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcription.js","sourceRoot":"","sources":["../src/transcription.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ImageGenerationResult, type MediaInput, type PredictionModel, type RetryOptions, type JsonValue } from "@zhivex-ai/core/provider";
|
|
2
|
+
export interface VertexVirtualTryOnInput extends RetryOptions {
|
|
3
|
+
personImage: MediaInput;
|
|
4
|
+
productImage: MediaInput;
|
|
5
|
+
productMask?: MediaInput;
|
|
6
|
+
productImageConfig?: Record<string, JsonValue>;
|
|
7
|
+
prompt?: string;
|
|
8
|
+
count?: number;
|
|
9
|
+
outputMimeType?: "image/png" | "image/jpeg";
|
|
10
|
+
outputStorageUri?: string;
|
|
11
|
+
/** Native VirtualTryOnModelParams, e.g. baseSteps, seed, addWatermark, outputOptions. */
|
|
12
|
+
providerOptions?: Record<string, JsonValue>;
|
|
13
|
+
}
|
|
14
|
+
export interface VertexVirtualTryOnResult extends ImageGenerationResult {
|
|
15
|
+
filtered: Array<{
|
|
16
|
+
reason: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export interface VertexVirtualTryOnClient {
|
|
20
|
+
generate(input: VertexVirtualTryOnInput): Promise<VertexVirtualTryOnResult>;
|
|
21
|
+
}
|
|
22
|
+
export declare const createVertexVirtualTryOnClient: (model: PredictionModel, assertAccess: () => void, sanitize: (value: unknown) => unknown) => VertexVirtualTryOnClient;
|
|
23
|
+
//# sourceMappingURL=virtual-try-on.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-try-on.d.ts","sourceRoot":"","sources":["../src/virtual-try-on.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EACrG,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,uBAAwB,SAAQ,YAAY;IAC3D,WAAW,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,UAAU,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC7C;AACD,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,QAAQ,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrC;AACD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7E;AAeD,eAAO,MAAM,8BAA8B,UAClC,eAAe,gBAAgB,MAAM,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,KACtF,wBA6CD,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ConfigurationError, decodeBase64WithLimit, encodeMediaFrame } from "@zhivex-ai/core/provider";
|
|
2
|
+
const gcs = (uri) => /^gs:\/\/[^/\s?#]+\/[^\s?#]+$/.test(uri);
|
|
3
|
+
const media = (image) => {
|
|
4
|
+
if (!image || !["image/png", "image/jpeg"].includes(image.mediaType) ||
|
|
5
|
+
(image.data === undefined) === (image.uri === undefined))
|
|
6
|
+
throw new ConfigurationError("Virtual Try-On requires a PNG/JPEG image with exactly one data or GCS uri.");
|
|
7
|
+
if (image.uri !== undefined) {
|
|
8
|
+
if (!gcs(image.uri))
|
|
9
|
+
throw new ConfigurationError("Virtual Try-On image URI must be a gs:// object path.");
|
|
10
|
+
return { mimeType: image.mediaType, gcsUri: image.uri };
|
|
11
|
+
}
|
|
12
|
+
const bytes = encodeMediaFrame({ data: image.data, mediaType: image.mediaType });
|
|
13
|
+
if (!bytes || !/^[A-Za-z0-9+/]+={0,2}$/.test(bytes))
|
|
14
|
+
throw new ConfigurationError("Virtual Try-On image data must be nonempty base64 or bytes.");
|
|
15
|
+
decodeBase64WithLimit(bytes, { maxBytes: 7 * 1024 * 1024, provider: "vertex", endpoint: "virtual-try-on input" });
|
|
16
|
+
return { mimeType: image.mediaType, bytesBase64Encoded: bytes };
|
|
17
|
+
};
|
|
18
|
+
export const createVertexVirtualTryOnClient = (model, assertAccess, sanitize) => ({
|
|
19
|
+
async generate(input) {
|
|
20
|
+
assertAccess();
|
|
21
|
+
const count = input.count ?? 1;
|
|
22
|
+
if (!Number.isInteger(count) || count < 1 || count > 4)
|
|
23
|
+
throw new ConfigurationError("Virtual Try-On count must be 1-4.");
|
|
24
|
+
if (input.prompt !== undefined && typeof input.prompt !== "string")
|
|
25
|
+
throw new ConfigurationError("Virtual Try-On prompt must be text.");
|
|
26
|
+
if (input.outputMimeType !== undefined && !["image/png", "image/jpeg"].includes(input.outputMimeType))
|
|
27
|
+
throw new ConfigurationError("Virtual Try-On output format must be PNG or JPEG.");
|
|
28
|
+
if (input.outputStorageUri !== undefined && !/^gs:\/\/[^/\s?#]+(?:\/[^\s?#]*)?$/.test(input.outputStorageUri))
|
|
29
|
+
throw new ConfigurationError("Virtual Try-On outputStorageUri must be a gs:// path.");
|
|
30
|
+
const parameters = { ...input.providerOptions };
|
|
31
|
+
for (const key of ["sampleCount", "storageUri", "instances", "parameters", "action", "model"]) {
|
|
32
|
+
if (parameters[key] !== undefined)
|
|
33
|
+
throw new ConfigurationError(`Virtual Try-On providerOptions.${key} conflicts with the dedicated contract.`);
|
|
34
|
+
}
|
|
35
|
+
const output = parameters.outputOptions;
|
|
36
|
+
if (output !== undefined && (!output || typeof output !== "object" || Array.isArray(output)))
|
|
37
|
+
throw new ConfigurationError("Virtual Try-On outputOptions must be an object.");
|
|
38
|
+
if (input.outputMimeType && output && output.mimeType !== undefined && output.mimeType !== input.outputMimeType)
|
|
39
|
+
throw new ConfigurationError("Conflicting Virtual Try-On output MIME types.");
|
|
40
|
+
if (parameters.seed !== undefined && parameters.addWatermark !== false)
|
|
41
|
+
throw new ConfigurationError("Virtual Try-On seed requires addWatermark:false.");
|
|
42
|
+
const result = await model.predictRaw({
|
|
43
|
+
abortSignal: input.abortSignal, timeoutMs: input.timeoutMs, maxRetries: input.maxRetries, retryBackoffMs: input.retryBackoffMs,
|
|
44
|
+
instances: [{ ...(input.prompt !== undefined ? { prompt: input.prompt } : {}),
|
|
45
|
+
personImage: { image: media(input.personImage) }, productImages: [{ image: media(input.productImage),
|
|
46
|
+
...(input.productMask ? { maskImage: media(input.productMask) } : {}),
|
|
47
|
+
...(input.productImageConfig ? { productImageConfig: input.productImageConfig } : {}) }] }],
|
|
48
|
+
parameters: { ...parameters, sampleCount: count,
|
|
49
|
+
...(input.outputMimeType ? { outputOptions: { ...output, mimeType: input.outputMimeType } } : {}),
|
|
50
|
+
...(input.outputStorageUri ? { storageUri: input.outputStorageUri } : {}) }
|
|
51
|
+
});
|
|
52
|
+
if (!Array.isArray(result.predictions) || !result.predictions.length)
|
|
53
|
+
throw new ConfigurationError("Virtual Try-On returned no predictions.");
|
|
54
|
+
const images = [], filtered = [];
|
|
55
|
+
// Both the guide's flat predictions and the REST result schema's images wrapper.
|
|
56
|
+
const predictions = result.predictions.flatMap((p) => Array.isArray(p?.images) ? p.images : [p]);
|
|
57
|
+
if (!predictions.length || predictions.length > count)
|
|
58
|
+
throw new ConfigurationError("Virtual Try-On returned an invalid image count.");
|
|
59
|
+
for (const prediction of predictions) {
|
|
60
|
+
if (!prediction || [prediction.bytesBase64Encoded, prediction.gcsUri, prediction.raiFilteredReason].filter(v => v !== undefined).length !== 1)
|
|
61
|
+
throw new ConfigurationError("Invalid Virtual Try-On image response.");
|
|
62
|
+
if (prediction.raiFilteredReason !== undefined) {
|
|
63
|
+
if (typeof prediction.raiFilteredReason !== "string" || !prediction.raiFilteredReason)
|
|
64
|
+
throw new ConfigurationError("Invalid Virtual Try-On filtering reason.");
|
|
65
|
+
filtered.push({ reason: prediction.raiFilteredReason });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (!["image/png", "image/jpeg"].includes(prediction.mimeType))
|
|
69
|
+
throw new ConfigurationError("Invalid Virtual Try-On output MIME type.");
|
|
70
|
+
if (prediction.gcsUri !== undefined && (typeof prediction.gcsUri !== "string" || !gcs(prediction.gcsUri)))
|
|
71
|
+
throw new ConfigurationError("Invalid Virtual Try-On output URI.");
|
|
72
|
+
if (prediction.bytesBase64Encoded !== undefined && (typeof prediction.bytesBase64Encoded !== "string" || !/^[A-Za-z0-9+/]+={0,2}$/.test(prediction.bytesBase64Encoded)))
|
|
73
|
+
throw new ConfigurationError("Invalid Virtual Try-On output bytes.");
|
|
74
|
+
images.push({ mediaType: prediction.mimeType,
|
|
75
|
+
...(prediction.gcsUri ? { uri: prediction.gcsUri } : { data: decodeBase64WithLimit(prediction.bytesBase64Encoded, { maxBytes: 32 * 1024 * 1024, provider: "vertex", endpoint: "virtual-try-on output" }) }) });
|
|
76
|
+
}
|
|
77
|
+
return { images, filtered, rawResponse: sanitize(result.rawResponse) };
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=virtual-try-on.js.map
|