@compose-market/sdk 0.6.95 → 0.6.97
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/.speakeasy/a2a.arazzo.yaml +1 -1
- package/.speakeasy/inference.arazzo.yaml +214 -0
- package/.speakeasy/memory.arazzo.yaml +1 -1
- package/.speakeasy/tests.arazzo.yaml +1 -1
- package/CHANGELOG.md +23 -9
- package/README.md +1 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/inference.d.ts +1 -6
- package/dist/resources/inference.d.ts.map +1 -1
- package/dist/resources/inference.js +46 -469
- package/dist/resources/inference.js.map +1 -1
- package/dist/types/index.d.ts +33 -71
- package/dist/types/index.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/generated/inference/esm/lib/config.d.ts +3 -3
- package/generated/inference/esm/lib/config.js +3 -3
- package/generated/inference/package.json +1 -1
- package/generated/inference/src/lib/config.ts +3 -3
- package/generated/manowar/esm/lib/config.d.ts +3 -3
- package/generated/manowar/esm/lib/config.js +3 -3
- package/generated/manowar/package.json +1 -1
- package/generated/manowar/src/lib/config.ts +3 -3
- package/generated/memory/esm/lib/config.d.ts +3 -3
- package/generated/memory/esm/lib/config.js +3 -3
- package/generated/memory/package.json +1 -1
- package/generated/memory/src/lib/config.ts +3 -3
- package/generated/x402/esm/lib/config.d.ts +3 -3
- package/generated/x402/esm/lib/config.js +3 -3
- package/generated/x402/package.json +1 -1
- package/generated/x402/src/lib/config.ts +3 -3
- package/package.json +5 -4
- package/specs/inference.openapi.yaml +8 -3
- package/specs/manowar.openapi.yaml +1 -1
- package/specs/memory.openapi.yaml +1 -1
- package/specs/x402.openapi.yaml +1 -1
|
@@ -571,6 +571,9 @@ async function* streamResponses(client, ctx, params, options) {
|
|
|
571
571
|
let lastCompleted = null;
|
|
572
572
|
let streamError = null;
|
|
573
573
|
let sawDone = false;
|
|
574
|
+
let created = null;
|
|
575
|
+
let textOutput = "";
|
|
576
|
+
const outputItems = [];
|
|
574
577
|
const toolCallAggregator = new Map();
|
|
575
578
|
try {
|
|
576
579
|
for await (const frame of parseSSEStream(response.body, { signal: options?.signal })) {
|
|
@@ -607,6 +610,40 @@ async function* streamResponses(client, ctx, params, options) {
|
|
|
607
610
|
catch {
|
|
608
611
|
continue;
|
|
609
612
|
}
|
|
613
|
+
if (parsed.type === "response.created") {
|
|
614
|
+
created = parsed.response;
|
|
615
|
+
}
|
|
616
|
+
if (parsed.type === "response.output_text.delta") {
|
|
617
|
+
textOutput += parsed.delta;
|
|
618
|
+
}
|
|
619
|
+
if (parsed.type === "response.image_generation_call.completed") {
|
|
620
|
+
const url = `data:${parsed.mime_type || "image/png"};base64,${parsed.image_b64}`;
|
|
621
|
+
outputItems.push({
|
|
622
|
+
type: "output_image",
|
|
623
|
+
role: "assistant",
|
|
624
|
+
image_url: url,
|
|
625
|
+
mime_type: parsed.mime_type || "image/png",
|
|
626
|
+
...(parsed.revised_prompt ? { text: parsed.revised_prompt } : {}),
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
if (parsed.type === "response.output_item.completed") {
|
|
630
|
+
outputItems[parsed.output_index] = parsed.item;
|
|
631
|
+
}
|
|
632
|
+
if (parsed.type === "response.output_video.status" && parsed.status === "completed" && parsed.url) {
|
|
633
|
+
const existingIndex = outputItems.findIndex((item) => item.type === "output_video" && item.job_id === parsed.job_id);
|
|
634
|
+
const item = {
|
|
635
|
+
type: "output_video",
|
|
636
|
+
role: "assistant",
|
|
637
|
+
job_id: parsed.job_id,
|
|
638
|
+
status: parsed.status,
|
|
639
|
+
video_url: parsed.url,
|
|
640
|
+
...(typeof parsed.progress === "number" ? { progress: parsed.progress } : {}),
|
|
641
|
+
};
|
|
642
|
+
if (existingIndex >= 0)
|
|
643
|
+
outputItems[existingIndex] = { ...outputItems[existingIndex], ...item };
|
|
644
|
+
else
|
|
645
|
+
outputItems.push(item);
|
|
646
|
+
}
|
|
610
647
|
// Assemble tool_call + tool_call.delta frames so the final result
|
|
611
648
|
// carries ready-to-consume `{id,name,arguments}` entries.
|
|
612
649
|
if (parsed.type === "response.tool_call") {
|
|
@@ -681,14 +718,18 @@ async function* streamResponses(client, ctx, params, options) {
|
|
|
681
718
|
}
|
|
682
719
|
if (streamError)
|
|
683
720
|
throw streamError;
|
|
721
|
+
const compactOutput = outputItems.filter((item) => Boolean(item));
|
|
722
|
+
if (textOutput && !compactOutput.some((item) => item.type === "output_text")) {
|
|
723
|
+
compactOutput.unshift({ type: "output_text", role: "assistant", text: textOutput });
|
|
724
|
+
}
|
|
684
725
|
const finalResponse = lastCompleted
|
|
685
726
|
? {
|
|
686
727
|
id: lastCompleted.response_id,
|
|
687
728
|
object: "response",
|
|
688
|
-
created_at: Math.floor(Date.now() / 1000),
|
|
729
|
+
created_at: created?.created_at ?? Math.floor(Date.now() / 1000),
|
|
689
730
|
status: "completed",
|
|
690
731
|
model: lastCompleted.model,
|
|
691
|
-
output:
|
|
732
|
+
output: compactOutput,
|
|
692
733
|
...(lastCompleted.usage
|
|
693
734
|
? {
|
|
694
735
|
usage: {
|
|
@@ -699,7 +740,9 @@ async function* streamResponses(client, ctx, params, options) {
|
|
|
699
740
|
}
|
|
700
741
|
: {}),
|
|
701
742
|
}
|
|
702
|
-
:
|
|
743
|
+
: created
|
|
744
|
+
? { ...created, output: compactOutput }
|
|
745
|
+
: null;
|
|
703
746
|
const requestId = response.headers.get("x-request-id") ?? response.headers.get("X-Request-Id");
|
|
704
747
|
const { budget, sessionInvalidReason } = emitStreamingEvents(ctx, response, receipt, requestId);
|
|
705
748
|
const toolCalls = Array.from(toolCallAggregator.values())
|
|
@@ -952,355 +995,10 @@ async function* streamVideoStatus(client, ctx, videoId, opts) {
|
|
|
952
995
|
catch { /* best-effort */ }
|
|
953
996
|
}
|
|
954
997
|
}
|
|
955
|
-
function lower(value) {
|
|
956
|
-
return typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
957
|
-
}
|
|
958
|
-
function list(value) {
|
|
959
|
-
if (Array.isArray(value)) {
|
|
960
|
-
return value.map(lower).filter(Boolean);
|
|
961
|
-
}
|
|
962
|
-
const single = lower(value);
|
|
963
|
-
return single ? [single] : [];
|
|
964
|
-
}
|
|
965
|
-
function ops(info) {
|
|
966
|
-
const raw = info?.operations;
|
|
967
|
-
if (!Array.isArray(raw)) {
|
|
968
|
-
return [];
|
|
969
|
-
}
|
|
970
|
-
return raw.filter((item) => (Boolean(item)
|
|
971
|
-
&& typeof item === "object"
|
|
972
|
-
&& typeof item.modality === "string"
|
|
973
|
-
&& typeof item.operation === "string"));
|
|
974
|
-
}
|
|
975
|
-
function fields(info) {
|
|
976
|
-
return {
|
|
977
|
-
input: list(info?.input),
|
|
978
|
-
output: list(info?.output),
|
|
979
|
-
};
|
|
980
|
-
}
|
|
981
|
-
function part(value, signal) {
|
|
982
|
-
if (!value || typeof value !== "object") {
|
|
983
|
-
if (typeof value === "string" && value.trim())
|
|
984
|
-
signal.text = true;
|
|
985
|
-
return;
|
|
986
|
-
}
|
|
987
|
-
if (typeof Blob !== "undefined" && value instanceof Blob) {
|
|
988
|
-
const type = lower(value.type);
|
|
989
|
-
if (type.startsWith("audio/"))
|
|
990
|
-
signal.audio = true;
|
|
991
|
-
else if (type.startsWith("image/"))
|
|
992
|
-
signal.image = true;
|
|
993
|
-
else if (type.startsWith("video/"))
|
|
994
|
-
signal.video = true;
|
|
995
|
-
return;
|
|
996
|
-
}
|
|
997
|
-
if (isByteArray(value)) {
|
|
998
|
-
signal.audio = true;
|
|
999
|
-
return;
|
|
1000
|
-
}
|
|
1001
|
-
if (Array.isArray(value)) {
|
|
1002
|
-
for (const item of value)
|
|
1003
|
-
part(item, signal);
|
|
1004
|
-
return;
|
|
1005
|
-
}
|
|
1006
|
-
const record = value;
|
|
1007
|
-
const type = lower(record.type ?? record.kind ?? record.mediaType ?? record.media_type);
|
|
1008
|
-
const mime = lower(record.mimeType ?? record.mime_type ?? record.contentType ?? record.content_type);
|
|
1009
|
-
const url = lower(record.url ?? record.uri ?? record.href ?? record.image_url ?? record.audio_url ?? record.video_url);
|
|
1010
|
-
if (type.includes("audio") || mime.startsWith("audio/") || /\.(mp3|m4a|wav|ogg|opus|flac|aac)(?:[?#].*)?$/.test(url))
|
|
1011
|
-
signal.audio = true;
|
|
1012
|
-
if (type.includes("image") || mime.startsWith("image/") || /\.(png|jpe?g|gif|webp|avif|heic|svg)(?:[?#].*)?$/.test(url))
|
|
1013
|
-
signal.image = true;
|
|
1014
|
-
if (type.includes("video") || mime.startsWith("video/") || /\.(mp4|mov|webm|mkv|avi)(?:[?#].*)?$/.test(url))
|
|
1015
|
-
signal.video = true;
|
|
1016
|
-
if (typeof record.text === "string" || typeof record.content === "string")
|
|
1017
|
-
signal.text = true;
|
|
1018
|
-
for (const key of ["content", "input", "messages", "attachments", "attachment"]) {
|
|
1019
|
-
if (record[key] !== undefined)
|
|
1020
|
-
part(record[key], signal);
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
function sig(input) {
|
|
1024
|
-
const signal = {
|
|
1025
|
-
text: Boolean(input.prompt || typeof input.input === "string"),
|
|
1026
|
-
image: false,
|
|
1027
|
-
audio: Boolean(input.file),
|
|
1028
|
-
video: false,
|
|
1029
|
-
};
|
|
1030
|
-
part(input.input, signal);
|
|
1031
|
-
part(input.messages, signal);
|
|
1032
|
-
part(input.attachments, signal);
|
|
1033
|
-
part(input.attachment, signal);
|
|
1034
|
-
return signal;
|
|
1035
|
-
}
|
|
1036
|
-
function first(values) {
|
|
1037
|
-
return values.length > 0 ? values[0] : undefined;
|
|
1038
|
-
}
|
|
1039
|
-
function op(input, info) {
|
|
1040
|
-
const wanted = lower(input.operation);
|
|
1041
|
-
const wantedModality = input.modality;
|
|
1042
|
-
const catalog = ops(info);
|
|
1043
|
-
const signal = sig(input);
|
|
1044
|
-
if (wanted) {
|
|
1045
|
-
const exact = catalog.filter((item) => lower(item.operation) === wanted);
|
|
1046
|
-
const selected = first(wantedModality ? exact.filter((item) => item.modality === wantedModality) : exact) ?? exact[0];
|
|
1047
|
-
if (selected)
|
|
1048
|
-
return { modality: selected.modality, operation: selected.operation };
|
|
1049
|
-
if (wantedModality)
|
|
1050
|
-
return { modality: wantedModality, operation: wanted };
|
|
1051
|
-
}
|
|
1052
|
-
if (wantedModality) {
|
|
1053
|
-
const matches = catalog.filter((item) => item.modality === wantedModality);
|
|
1054
|
-
const unique = [...new Map(matches.map((item) => [`${item.modality}:${item.operation}`, item])).values()];
|
|
1055
|
-
if (unique.length === 1)
|
|
1056
|
-
return { modality: unique[0].modality, operation: unique[0].operation };
|
|
1057
|
-
}
|
|
1058
|
-
if (catalog.length === 1) {
|
|
1059
|
-
return { modality: catalog[0].modality, operation: catalog[0].operation };
|
|
1060
|
-
}
|
|
1061
|
-
if (catalog.length > 1) {
|
|
1062
|
-
const matches = catalog.filter((item) => {
|
|
1063
|
-
const inputKinds = list(item.input);
|
|
1064
|
-
return (signal.audio && inputKinds.includes("audio"))
|
|
1065
|
-
|| (signal.image && inputKinds.includes("image"))
|
|
1066
|
-
|| (signal.video && inputKinds.includes("video"))
|
|
1067
|
-
|| (signal.text && inputKinds.includes("text"));
|
|
1068
|
-
});
|
|
1069
|
-
const unique = [...new Map(matches.map((item) => [`${item.modality}:${item.operation}`, item])).values()];
|
|
1070
|
-
if (unique.length === 1)
|
|
1071
|
-
return { modality: unique[0].modality, operation: unique[0].operation };
|
|
1072
|
-
}
|
|
1073
|
-
const io = fields(info);
|
|
1074
|
-
if (io.output.includes("embedding"))
|
|
1075
|
-
return { modality: "embedding", operation: "embedding" };
|
|
1076
|
-
if (io.output.includes("video"))
|
|
1077
|
-
return { modality: "video", operation: io.input.includes("image") ? "image-to-video" : "text-to-video" };
|
|
1078
|
-
if (io.output.includes("image"))
|
|
1079
|
-
return { modality: "image", operation: io.input.includes("image") ? "image-to-image" : "text-to-image" };
|
|
1080
|
-
if (io.output.includes("audio")) {
|
|
1081
|
-
if (io.input.includes("audio") && !io.input.includes("text"))
|
|
1082
|
-
return { modality: "audio", operation: "speech-to-speech" };
|
|
1083
|
-
return { modality: "audio", operation: "text-to-speech" };
|
|
1084
|
-
}
|
|
1085
|
-
if (io.input.includes("audio") && io.output.includes("text"))
|
|
1086
|
-
return { modality: "audio", operation: "speech-to-text" };
|
|
1087
|
-
return { modality: "text", operation: "text-generation" };
|
|
1088
|
-
}
|
|
1089
|
-
function endpoint(plan, input) {
|
|
1090
|
-
const name = lower(plan.operation);
|
|
1091
|
-
const signal = sig(input);
|
|
1092
|
-
if (plan.modality === "embedding" || name.includes("embedding"))
|
|
1093
|
-
return "embeddings";
|
|
1094
|
-
if (name === "speech-to-text" || name.includes("transcription") || name.includes("speech-recognition")) {
|
|
1095
|
-
return input.file ? "audio-transcriptions" : "responses";
|
|
1096
|
-
}
|
|
1097
|
-
if (name === "text-to-speech"
|
|
1098
|
-
|| name === "text-to-audio"
|
|
1099
|
-
|| name === "music-generation"
|
|
1100
|
-
|| name === "sound-effects"
|
|
1101
|
-
|| name === "text-to-sound-effects") {
|
|
1102
|
-
return "audio-speech";
|
|
1103
|
-
}
|
|
1104
|
-
if (plan.modality === "audio") {
|
|
1105
|
-
if (signal.audio && !signal.text)
|
|
1106
|
-
return input.file ? "audio-transcriptions" : "responses";
|
|
1107
|
-
if (signal.text && !signal.audio)
|
|
1108
|
-
return "audio-speech";
|
|
1109
|
-
return "responses";
|
|
1110
|
-
}
|
|
1111
|
-
if (plan.modality === "video")
|
|
1112
|
-
return "videos";
|
|
1113
|
-
if (plan.modality === "image")
|
|
1114
|
-
return "images";
|
|
1115
|
-
return input.messages ? "chat" : "responses";
|
|
1116
|
-
}
|
|
1117
|
-
function text(input) {
|
|
1118
|
-
if (typeof input.prompt === "string")
|
|
1119
|
-
return input.prompt;
|
|
1120
|
-
if (typeof input.input === "string")
|
|
1121
|
-
return input.input;
|
|
1122
|
-
if (Array.isArray(input.messages)) {
|
|
1123
|
-
return input.messages
|
|
1124
|
-
.map((message) => typeof message.content === "string" ? message.content : "")
|
|
1125
|
-
.filter(Boolean)
|
|
1126
|
-
.join("\n");
|
|
1127
|
-
}
|
|
1128
|
-
return "";
|
|
1129
|
-
}
|
|
1130
|
-
function merge(input) {
|
|
1131
|
-
return {
|
|
1132
|
-
...(input.params ?? {}),
|
|
1133
|
-
...(input.customParams ? { custom_params: input.customParams } : {}),
|
|
1134
|
-
};
|
|
1135
|
-
}
|
|
1136
|
-
function attach(input) {
|
|
1137
|
-
return {
|
|
1138
|
-
...(input.attachments ? { attachments: input.attachments } : {}),
|
|
1139
|
-
...(input.attachment ? { attachment: input.attachment } : {}),
|
|
1140
|
-
};
|
|
1141
|
-
}
|
|
1142
|
-
function url(input, kind) {
|
|
1143
|
-
const values = [input.attachment, ...(input.attachments ?? [])];
|
|
1144
|
-
for (const value of values) {
|
|
1145
|
-
if (!value || typeof value === "string")
|
|
1146
|
-
continue;
|
|
1147
|
-
const record = value;
|
|
1148
|
-
const type = lower(record.type ?? record.kind);
|
|
1149
|
-
const direct = kind === "image" ? record.image_url : kind === "audio" ? record.audio_url : record.video_url;
|
|
1150
|
-
const candidate = typeof direct === "string"
|
|
1151
|
-
? direct
|
|
1152
|
-
: typeof record.url === "string"
|
|
1153
|
-
? record.url
|
|
1154
|
-
: typeof record.uri === "string"
|
|
1155
|
-
? record.uri
|
|
1156
|
-
: undefined;
|
|
1157
|
-
if (candidate && (type.includes(kind) || lower(record.mimeType ?? record.mime_type).startsWith(`${kind}/`))) {
|
|
1158
|
-
return candidate;
|
|
1159
|
-
}
|
|
1160
|
-
}
|
|
1161
|
-
return undefined;
|
|
1162
|
-
}
|
|
1163
|
-
function firstOutput(data, kind) {
|
|
1164
|
-
return data.output.find((item) => lower(item.type).includes(kind));
|
|
1165
|
-
}
|
|
1166
|
-
function dataurl(value) {
|
|
1167
|
-
if (!value)
|
|
1168
|
-
return {};
|
|
1169
|
-
const match = value.match(/^data:([^;,]+)?;base64,(.*)$/i);
|
|
1170
|
-
if (match) {
|
|
1171
|
-
return {
|
|
1172
|
-
...(match[1] ? { mimeType: match[1] } : {}),
|
|
1173
|
-
base64: match[2],
|
|
1174
|
-
};
|
|
1175
|
-
}
|
|
1176
|
-
return { url: value };
|
|
1177
|
-
}
|
|
1178
|
-
function common(plan, value) {
|
|
1179
|
-
return {
|
|
1180
|
-
plan,
|
|
1181
|
-
receipt: value.receipt,
|
|
1182
|
-
requestId: value.requestId,
|
|
1183
|
-
budget: value.budget,
|
|
1184
|
-
sessionInvalidReason: value.sessionInvalidReason,
|
|
1185
|
-
};
|
|
1186
|
-
}
|
|
1187
|
-
function chat(plan, value) {
|
|
1188
|
-
return {
|
|
1189
|
-
type: "text",
|
|
1190
|
-
...common(plan, value),
|
|
1191
|
-
text: value.data.choices[0]?.message?.content ?? "",
|
|
1192
|
-
data: value.data,
|
|
1193
|
-
};
|
|
1194
|
-
}
|
|
1195
|
-
function response(plan, value) {
|
|
1196
|
-
if (plan.modality === "embedding") {
|
|
1197
|
-
const embeddings = value.data.output
|
|
1198
|
-
.map((item) => item.embedding)
|
|
1199
|
-
.filter((item) => Array.isArray(item) && item.every((entry) => typeof entry === "number"));
|
|
1200
|
-
return { type: "embedding", ...common(plan, value), embeddings, data: value.data };
|
|
1201
|
-
}
|
|
1202
|
-
if (plan.modality === "image") {
|
|
1203
|
-
const item = firstOutput(value.data, "image");
|
|
1204
|
-
const parsed = dataurl(typeof item?.image_url === "string" ? item.image_url : undefined);
|
|
1205
|
-
return { type: "image", ...common(plan, value), ...parsed, data: value.data };
|
|
1206
|
-
}
|
|
1207
|
-
if (plan.modality === "audio") {
|
|
1208
|
-
const item = firstOutput(value.data, "audio");
|
|
1209
|
-
const parsed = dataurl(typeof item?.audio_url === "string" ? item.audio_url : undefined);
|
|
1210
|
-
return { type: "audio", ...common(plan, value), ...parsed, data: value.data };
|
|
1211
|
-
}
|
|
1212
|
-
if (plan.modality === "video") {
|
|
1213
|
-
const item = firstOutput(value.data, "video");
|
|
1214
|
-
const parsed = dataurl(typeof item?.video_url === "string" ? item.video_url : undefined);
|
|
1215
|
-
return {
|
|
1216
|
-
type: "video",
|
|
1217
|
-
...common(plan, value),
|
|
1218
|
-
jobId: typeof value.data.job_id === "string" ? value.data.job_id : undefined,
|
|
1219
|
-
status: value.data.status,
|
|
1220
|
-
url: parsed.url,
|
|
1221
|
-
data: value.data,
|
|
1222
|
-
};
|
|
1223
|
-
}
|
|
1224
|
-
const item = firstOutput(value.data, "text");
|
|
1225
|
-
return {
|
|
1226
|
-
type: "text",
|
|
1227
|
-
...common(plan, value),
|
|
1228
|
-
text: typeof item?.text === "string" ? item.text : "",
|
|
1229
|
-
data: value.data,
|
|
1230
|
-
};
|
|
1231
|
-
}
|
|
1232
|
-
function image(plan, value) {
|
|
1233
|
-
const item = value.data.data[0] ?? {};
|
|
1234
|
-
return {
|
|
1235
|
-
type: "image",
|
|
1236
|
-
...common(plan, value),
|
|
1237
|
-
url: item.url,
|
|
1238
|
-
base64: item.b64_json,
|
|
1239
|
-
mimeType: item.b64_json ? "image/png" : undefined,
|
|
1240
|
-
data: value.data,
|
|
1241
|
-
};
|
|
1242
|
-
}
|
|
1243
|
-
function embedding(plan, value) {
|
|
1244
|
-
return {
|
|
1245
|
-
type: "embedding",
|
|
1246
|
-
...common(plan, value),
|
|
1247
|
-
embeddings: value.data.data.map((item) => item.embedding),
|
|
1248
|
-
data: value.data,
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
function transcript(plan, value) {
|
|
1252
|
-
return {
|
|
1253
|
-
type: "text",
|
|
1254
|
-
...common(plan, value),
|
|
1255
|
-
text: value.data.text,
|
|
1256
|
-
data: value.data,
|
|
1257
|
-
};
|
|
1258
|
-
}
|
|
1259
|
-
function videoid(data) {
|
|
1260
|
-
if ("job_id" in data && typeof data.job_id === "string")
|
|
1261
|
-
return data.job_id;
|
|
1262
|
-
if ("id" in data && typeof data.id === "string")
|
|
1263
|
-
return data.id;
|
|
1264
|
-
return undefined;
|
|
1265
|
-
}
|
|
1266
|
-
function video(plan, value, final) {
|
|
1267
|
-
const firstVideo = value.data.data?.[0];
|
|
1268
|
-
return {
|
|
1269
|
-
type: "video",
|
|
1270
|
-
...common(plan, value),
|
|
1271
|
-
jobId: videoid(value.data),
|
|
1272
|
-
status: final?.status ?? value.data.status,
|
|
1273
|
-
url: final?.url ?? firstVideo?.url,
|
|
1274
|
-
final,
|
|
1275
|
-
data: value.data,
|
|
1276
|
-
};
|
|
1277
|
-
}
|
|
1278
|
-
async function speech(plan, value) {
|
|
1279
|
-
const cloned = value.response.clone();
|
|
1280
|
-
const arrayBuffer = await cloned.arrayBuffer();
|
|
1281
|
-
const mimeType = value.response.headers.get("content-type")?.split(";")[0]?.trim() || "audio/mpeg";
|
|
1282
|
-
const bytes = new Uint8Array(arrayBuffer);
|
|
1283
|
-
const blob = typeof Blob !== "undefined" ? new Blob([bytes], { type: mimeType }) : undefined;
|
|
1284
|
-
const objectUrl = blob && typeof URL !== "undefined" && typeof URL.createObjectURL === "function"
|
|
1285
|
-
? URL.createObjectURL(blob)
|
|
1286
|
-
: undefined;
|
|
1287
|
-
return {
|
|
1288
|
-
type: "audio",
|
|
1289
|
-
...common(plan, value),
|
|
1290
|
-
mimeType,
|
|
1291
|
-
blob,
|
|
1292
|
-
objectUrl,
|
|
1293
|
-
arrayBuffer,
|
|
1294
|
-
base64: bytesToBase64(bytes),
|
|
1295
|
-
response: value.response,
|
|
1296
|
-
};
|
|
1297
|
-
}
|
|
1298
998
|
// ---------------------------------------------------------------------------
|
|
1299
999
|
// Top-level inference resource
|
|
1300
1000
|
// ---------------------------------------------------------------------------
|
|
1301
1001
|
export class InferenceResource {
|
|
1302
|
-
client;
|
|
1303
|
-
ctx;
|
|
1304
1002
|
chat;
|
|
1305
1003
|
responses;
|
|
1306
1004
|
embeddings;
|
|
@@ -1308,8 +1006,6 @@ export class InferenceResource {
|
|
|
1308
1006
|
audio;
|
|
1309
1007
|
videos;
|
|
1310
1008
|
constructor(client, ctx) {
|
|
1311
|
-
this.client = client;
|
|
1312
|
-
this.ctx = ctx;
|
|
1313
1009
|
this.chat = { completions: new ChatCompletionsNamespace(client, ctx) };
|
|
1314
1010
|
this.responses = new ResponsesNamespace(client, ctx);
|
|
1315
1011
|
this.embeddings = new EmbeddingsNamespace(client, ctx);
|
|
@@ -1317,124 +1013,5 @@ export class InferenceResource {
|
|
|
1317
1013
|
this.audio = new AudioNamespace(client, ctx);
|
|
1318
1014
|
this.videos = new VideosNamespace(client, ctx);
|
|
1319
1015
|
}
|
|
1320
|
-
async plan(input, options) {
|
|
1321
|
-
const info = input.modelInfo ?? await this.client.request({
|
|
1322
|
-
method: "GET",
|
|
1323
|
-
path: `/v1/models/${encodeURIComponent(input.model)}`,
|
|
1324
|
-
headers: buildCallHeaders(options, this.ctx.getWalletMaybe(), this.ctx.getTokenMaybe()),
|
|
1325
|
-
signal: options?.signal,
|
|
1326
|
-
timeoutMs: options?.timeoutMs,
|
|
1327
|
-
});
|
|
1328
|
-
const selected = op(input, info);
|
|
1329
|
-
const plan = {
|
|
1330
|
-
model: input.model,
|
|
1331
|
-
...(input.provider ?? info.provider ? { provider: input.provider ?? info.provider } : {}),
|
|
1332
|
-
modality: selected.modality,
|
|
1333
|
-
operation: selected.operation,
|
|
1334
|
-
endpoint: endpoint(selected, input),
|
|
1335
|
-
};
|
|
1336
|
-
return plan;
|
|
1337
|
-
}
|
|
1338
|
-
async run(input, options) {
|
|
1339
|
-
const plan = await this.plan(input, options);
|
|
1340
|
-
const extra = merge(input);
|
|
1341
|
-
const attachments = attach(input);
|
|
1342
|
-
const prompt = text(input);
|
|
1343
|
-
if (plan.endpoint === "chat") {
|
|
1344
|
-
if (!input.messages)
|
|
1345
|
-
throw new BadRequestError({ message: "messages are required for chat inference" });
|
|
1346
|
-
return chat(plan, await this.chat.completions.create({
|
|
1347
|
-
model: input.model,
|
|
1348
|
-
messages: input.messages,
|
|
1349
|
-
provider: input.provider,
|
|
1350
|
-
...attachments,
|
|
1351
|
-
...extra,
|
|
1352
|
-
}, options));
|
|
1353
|
-
}
|
|
1354
|
-
if (plan.endpoint === "embeddings") {
|
|
1355
|
-
const embeddingInput = Array.isArray(input.input) && input.input.every((item) => typeof item === "string")
|
|
1356
|
-
? input.input
|
|
1357
|
-
: prompt;
|
|
1358
|
-
if (!embeddingInput || (Array.isArray(embeddingInput) && embeddingInput.length === 0)) {
|
|
1359
|
-
throw new BadRequestError({ message: "input is required for embedding inference" });
|
|
1360
|
-
}
|
|
1361
|
-
return embedding(plan, await this.embeddings.create({
|
|
1362
|
-
model: input.model,
|
|
1363
|
-
input: embeddingInput,
|
|
1364
|
-
provider: input.provider,
|
|
1365
|
-
...attachments,
|
|
1366
|
-
...extra,
|
|
1367
|
-
}, options));
|
|
1368
|
-
}
|
|
1369
|
-
if (plan.endpoint === "images") {
|
|
1370
|
-
if (!prompt)
|
|
1371
|
-
throw new BadRequestError({ message: "prompt is required for image inference" });
|
|
1372
|
-
const imageUrl = url(input, "image");
|
|
1373
|
-
const body = {
|
|
1374
|
-
model: input.model,
|
|
1375
|
-
prompt,
|
|
1376
|
-
provider: input.provider,
|
|
1377
|
-
...(imageUrl ? { image: imageUrl } : {}),
|
|
1378
|
-
...attachments,
|
|
1379
|
-
...extra,
|
|
1380
|
-
};
|
|
1381
|
-
return image(plan, imageUrl
|
|
1382
|
-
? await this.images.edit(body, options)
|
|
1383
|
-
: await this.images.generate(body, options));
|
|
1384
|
-
}
|
|
1385
|
-
if (plan.endpoint === "audio-speech") {
|
|
1386
|
-
if (!prompt)
|
|
1387
|
-
throw new BadRequestError({ message: "input text is required for audio generation" });
|
|
1388
|
-
return speech(plan, await this.audio.speech({
|
|
1389
|
-
model: input.model,
|
|
1390
|
-
input: prompt,
|
|
1391
|
-
provider: input.provider,
|
|
1392
|
-
...attachments,
|
|
1393
|
-
...extra,
|
|
1394
|
-
}, options));
|
|
1395
|
-
}
|
|
1396
|
-
if (plan.endpoint === "audio-transcriptions") {
|
|
1397
|
-
if (!input.file)
|
|
1398
|
-
throw new BadRequestError({ message: "file is required for audio transcription" });
|
|
1399
|
-
return transcript(plan, await this.audio.transcriptions({
|
|
1400
|
-
model: input.model,
|
|
1401
|
-
file: input.file,
|
|
1402
|
-
provider: input.provider,
|
|
1403
|
-
...attachments,
|
|
1404
|
-
...extra,
|
|
1405
|
-
}, options));
|
|
1406
|
-
}
|
|
1407
|
-
if (plan.endpoint === "videos") {
|
|
1408
|
-
if (!prompt)
|
|
1409
|
-
throw new BadRequestError({ message: "prompt is required for video inference" });
|
|
1410
|
-
const created = await this.videos.generate({
|
|
1411
|
-
model: input.model,
|
|
1412
|
-
prompt,
|
|
1413
|
-
provider: input.provider,
|
|
1414
|
-
...(url(input, "image") ? { image_url: url(input, "image") } : {}),
|
|
1415
|
-
...attachments,
|
|
1416
|
-
...extra,
|
|
1417
|
-
}, options);
|
|
1418
|
-
const id = videoid(created.data);
|
|
1419
|
-
const final = input.wait && id
|
|
1420
|
-
? await this.videos.waitUntilDone(id, {
|
|
1421
|
-
...options,
|
|
1422
|
-
pollIntervalMs: input.pollIntervalMs,
|
|
1423
|
-
timeoutMs: input.waitTimeoutMs ?? options?.timeoutMs,
|
|
1424
|
-
onStatus: input.onStatus,
|
|
1425
|
-
})
|
|
1426
|
-
: null;
|
|
1427
|
-
return video(plan, created, final);
|
|
1428
|
-
}
|
|
1429
|
-
const body = {
|
|
1430
|
-
model: input.model,
|
|
1431
|
-
input: input.input ?? prompt,
|
|
1432
|
-
modalities: [plan.modality],
|
|
1433
|
-
provider: input.provider,
|
|
1434
|
-
...attachments,
|
|
1435
|
-
...extra,
|
|
1436
|
-
};
|
|
1437
|
-
return response(plan, await this.responses.create(body, options));
|
|
1438
|
-
}
|
|
1439
1016
|
}
|
|
1440
1017
|
//# sourceMappingURL=inference.js.map
|