@agentskit/adapters 0.9.1 → 0.10.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/dist/index.cjs CHANGED
@@ -781,13 +781,47 @@ function vercelAI(config) {
781
781
  var mistral = createOpenAICompatibleAdapter("https://api.mistral.ai/v1");
782
782
 
783
783
  // src/cohere.ts
784
- var cohere = createOpenAICompatibleAdapter("https://api.cohere.com/compatibility/v1");
784
+ var COHERE_BASE_URL = "https://api.cohere.com/compatibility/v1";
785
+ var DEFAULT_MODEL = "command-r-plus";
786
+ var baseFactory = createOpenAICompatibleAdapter(COHERE_BASE_URL);
787
+ function cohere(config) {
788
+ const factory = baseFactory({
789
+ model: DEFAULT_MODEL,
790
+ ...config
791
+ });
792
+ return {
793
+ ...factory,
794
+ capabilities: {
795
+ streaming: true,
796
+ tools: true,
797
+ usage: true
798
+ }
799
+ };
800
+ }
801
+ var cohereAdapter = cohere;
785
802
 
786
803
  // src/together.ts
787
804
  var together = createOpenAICompatibleAdapter("https://api.together.xyz/v1");
788
805
 
789
806
  // src/groq.ts
790
- var groq = createOpenAICompatibleAdapter("https://api.groq.com/openai/v1");
807
+ var GROQ_BASE_URL = "https://api.groq.com/openai/v1";
808
+ var DEFAULT_MODEL2 = "llama-3.3-70b-versatile";
809
+ var baseFactory2 = createOpenAICompatibleAdapter(GROQ_BASE_URL);
810
+ function groq(config) {
811
+ const factory = baseFactory2({
812
+ model: DEFAULT_MODEL2,
813
+ ...config
814
+ });
815
+ return {
816
+ ...factory,
817
+ capabilities: {
818
+ streaming: true,
819
+ tools: true,
820
+ usage: true
821
+ }
822
+ };
823
+ }
824
+ var groqAdapter = groq;
791
825
 
792
826
  // src/fireworks.ts
793
827
  var fireworks = createOpenAICompatibleAdapter("https://api.fireworks.ai/inference/v1");
@@ -807,6 +841,439 @@ var vllm = createOpenAICompatibleAdapter("http://localhost:8000/v1");
807
841
  // src/llamacpp.ts
808
842
  var llamacpp = createOpenAICompatibleAdapter("http://localhost:8080/v1");
809
843
 
844
+ // src/cerebras.ts
845
+ var CEREBRAS_BASE_URL = "https://api.cerebras.ai/v1";
846
+ var DEFAULT_MODEL3 = "llama-3.3-70b";
847
+ var baseFactory3 = createOpenAICompatibleAdapter(CEREBRAS_BASE_URL);
848
+ function cerebras(config) {
849
+ const factory = baseFactory3({
850
+ model: DEFAULT_MODEL3,
851
+ ...config
852
+ });
853
+ return {
854
+ ...factory,
855
+ capabilities: {
856
+ streaming: true,
857
+ tools: true,
858
+ usage: true
859
+ }
860
+ };
861
+ }
862
+ var cerebrasAdapter = cerebras;
863
+
864
+ // src/azure-openai.ts
865
+ var DEFAULT_API_VERSION = "2024-10-21";
866
+ function azureOpenAI(config) {
867
+ const { apiKey, endpoint, deployment, apiVersion = DEFAULT_API_VERSION, retry } = config;
868
+ const includeUsage = config.includeUsage ?? true;
869
+ const url = `${endpoint.replace(/\/$/, "")}/openai/deployments/${encodeURIComponent(deployment)}/chat/completions?api-version=${encodeURIComponent(apiVersion)}`;
870
+ return {
871
+ capabilities: {
872
+ streaming: true,
873
+ tools: true,
874
+ usage: true
875
+ },
876
+ createSource: (request) => {
877
+ const body = {
878
+ messages: toProviderMessages(request.messages),
879
+ tools: request.context?.tools?.map((tool) => ({
880
+ type: "function",
881
+ function: {
882
+ name: tool.name,
883
+ description: tool.description,
884
+ parameters: tool.schema
885
+ }
886
+ })),
887
+ temperature: request.context?.temperature,
888
+ max_tokens: request.context?.maxTokens,
889
+ stream: true
890
+ };
891
+ if (includeUsage) body.stream_options = { include_usage: true };
892
+ return createStreamSource(
893
+ (signal) => fetch(url, {
894
+ method: "POST",
895
+ headers: {
896
+ "Content-Type": "application/json",
897
+ "api-key": apiKey
898
+ },
899
+ body: JSON.stringify(body),
900
+ signal
901
+ }),
902
+ parseOpenAIStream,
903
+ "Azure OpenAI API",
904
+ retry
905
+ );
906
+ }
907
+ };
908
+ }
909
+ var azureOpenAIAdapter = azureOpenAI;
910
+
911
+ // src/replicate.ts
912
+ var DEFAULT_BASE_URL = "https://api.replicate.com";
913
+ function defaultPrompt(request) {
914
+ return request.messages.map((m) => {
915
+ if (m.role === "system") return `[SYSTEM] ${m.content}`;
916
+ if (m.role === "assistant") return `[ASSISTANT] ${m.content}`;
917
+ return `[USER] ${m.content}`;
918
+ }).join("\n\n") + "\n\n[ASSISTANT] ";
919
+ }
920
+ async function* parseReplicateStream(stream) {
921
+ const reader = stream.getReader();
922
+ const decoder = new TextDecoder();
923
+ let buffer = "";
924
+ let currentEvent = "";
925
+ try {
926
+ while (true) {
927
+ const { done, value } = await reader.read();
928
+ if (done) break;
929
+ buffer += decoder.decode(value, { stream: true });
930
+ const lines = buffer.split("\n");
931
+ buffer = lines.pop() ?? "";
932
+ for (const line of lines) {
933
+ if (line.startsWith("event: ")) {
934
+ currentEvent = line.slice(7).trim();
935
+ continue;
936
+ }
937
+ if (!line.startsWith("data: ")) continue;
938
+ const data = line.slice(6);
939
+ if (currentEvent === "output" && data) {
940
+ yield { type: "text", content: data };
941
+ } else if (currentEvent === "done") {
942
+ yield { type: "done" };
943
+ return;
944
+ } else if (currentEvent === "error") {
945
+ yield { type: "error", content: data || "replicate stream error" };
946
+ return;
947
+ }
948
+ }
949
+ }
950
+ } finally {
951
+ reader.releaseLock();
952
+ }
953
+ yield { type: "done" };
954
+ }
955
+ function replicate(config) {
956
+ const { apiKey, model, version, baseUrl = DEFAULT_BASE_URL, toInput = (r) => ({ prompt: defaultPrompt(r) }) } = config;
957
+ const predictionUrl = version ? `${baseUrl}/v1/predictions` : `${baseUrl}/v1/models/${model}/predictions`;
958
+ return {
959
+ capabilities: {
960
+ streaming: true,
961
+ tools: false
962
+ },
963
+ createSource: (request) => {
964
+ const controller = new AbortController();
965
+ let aborted = false;
966
+ return {
967
+ stream: async function* () {
968
+ if (aborted) return;
969
+ try {
970
+ const body = {
971
+ input: toInput(request),
972
+ stream: true
973
+ };
974
+ if (version) body.version = version;
975
+ const response = await fetch(predictionUrl, {
976
+ method: "POST",
977
+ headers: {
978
+ "Content-Type": "application/json",
979
+ "Authorization": `Bearer ${apiKey}`
980
+ },
981
+ body: JSON.stringify(body),
982
+ signal: controller.signal
983
+ });
984
+ if (!response.ok) {
985
+ yield { type: "error", content: `Replicate API error: ${response.status}` };
986
+ return;
987
+ }
988
+ const prediction = await response.json();
989
+ if (prediction.error) {
990
+ yield { type: "error", content: prediction.error };
991
+ return;
992
+ }
993
+ const streamUrl = prediction.urls?.stream;
994
+ if (!streamUrl) {
995
+ yield { type: "error", content: "Replicate prediction has no stream URL" };
996
+ return;
997
+ }
998
+ const streamResponse = await fetch(streamUrl, {
999
+ method: "GET",
1000
+ headers: { Accept: "text/event-stream" },
1001
+ signal: controller.signal
1002
+ });
1003
+ if (!streamResponse.ok || !streamResponse.body) {
1004
+ yield { type: "error", content: `Replicate stream error: ${streamResponse.status}` };
1005
+ return;
1006
+ }
1007
+ for await (const chunk of parseReplicateStream(streamResponse.body)) {
1008
+ if (aborted) return;
1009
+ yield chunk;
1010
+ }
1011
+ } catch (err) {
1012
+ if (err instanceof DOMException && err.name === "AbortError") return;
1013
+ yield { type: "error", content: err instanceof Error ? err.message : String(err) };
1014
+ }
1015
+ },
1016
+ abort: () => {
1017
+ aborted = true;
1018
+ controller.abort();
1019
+ }
1020
+ };
1021
+ }
1022
+ };
1023
+ }
1024
+ var replicateAdapter = replicate;
1025
+
1026
+ // src/bail.ts
1027
+ var BAIL_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1";
1028
+ var DEFAULT_MODEL4 = "qwen-max";
1029
+ var baseFactory4 = createOpenAICompatibleAdapter(BAIL_BASE_URL);
1030
+ function bail(config) {
1031
+ const factory = baseFactory4({
1032
+ model: DEFAULT_MODEL4,
1033
+ ...config
1034
+ });
1035
+ return {
1036
+ ...factory,
1037
+ capabilities: {
1038
+ streaming: true,
1039
+ tools: true,
1040
+ multiModal: true,
1041
+ usage: true
1042
+ }
1043
+ };
1044
+ }
1045
+ var bailAdapter = bail;
1046
+ var qwen = bail;
1047
+
1048
+ // src/vertex.ts
1049
+ function vertex(config) {
1050
+ const { project, region, model, accessToken, publisher = "google", retry } = config;
1051
+ const url = `https://${region}-aiplatform.googleapis.com/v1/projects/${project}/locations/${region}/publishers/${publisher}/models/${model}:streamGenerateContent?alt=sse`;
1052
+ return {
1053
+ capabilities: {
1054
+ streaming: true,
1055
+ tools: true,
1056
+ multiModal: true,
1057
+ usage: true,
1058
+ reasoning: model.includes("pro")
1059
+ },
1060
+ createSource: (request) => {
1061
+ const body = {
1062
+ contents: request.messages.filter((message) => message.role !== "system").map((message) => ({
1063
+ role: message.role === "assistant" ? "model" : "user",
1064
+ parts: [{ text: message.content }]
1065
+ })),
1066
+ systemInstruction: request.messages.find((message) => message.role === "system") ? {
1067
+ role: "system",
1068
+ parts: [{ text: request.messages.find((message) => message.role === "system").content }]
1069
+ } : void 0,
1070
+ tools: request.context?.tools && request.context.tools.length > 0 ? [{
1071
+ functionDeclarations: request.context.tools.map((tool) => ({
1072
+ name: tool.name,
1073
+ description: tool.description,
1074
+ parameters: tool.schema
1075
+ }))
1076
+ }] : void 0
1077
+ };
1078
+ return createStreamSource(
1079
+ async (signal) => {
1080
+ const token = typeof accessToken === "string" ? accessToken : await accessToken();
1081
+ return fetch(url, {
1082
+ method: "POST",
1083
+ headers: {
1084
+ "Content-Type": "application/json",
1085
+ "Authorization": `Bearer ${token}`
1086
+ },
1087
+ body: JSON.stringify(body),
1088
+ signal
1089
+ });
1090
+ },
1091
+ parseGeminiStream,
1092
+ "Vertex AI",
1093
+ retry
1094
+ );
1095
+ }
1096
+ };
1097
+ }
1098
+ var vertexAdapter = vertex;
1099
+
1100
+ // src/bedrock.ts
1101
+ var cachedSdk = null;
1102
+ async function loadSdk() {
1103
+ if (!cachedSdk) {
1104
+ cachedSdk = (async () => {
1105
+ try {
1106
+ const moduleId = "@aws-sdk/client-bedrock-runtime";
1107
+ return await import(
1108
+ /* @vite-ignore */
1109
+ moduleId
1110
+ );
1111
+ } catch {
1112
+ throw new Error(
1113
+ "Install @aws-sdk/client-bedrock-runtime to use the bedrock adapter: npm install @aws-sdk/client-bedrock-runtime"
1114
+ );
1115
+ }
1116
+ })();
1117
+ }
1118
+ return cachedSdk;
1119
+ }
1120
+ function isAnthropicModel(model) {
1121
+ return model.startsWith("anthropic.");
1122
+ }
1123
+ function buildAnthropicBody(request, maxTokens) {
1124
+ const messages = request.messages.filter((m) => m.role !== "system").map((m) => ({ role: m.role, content: m.content }));
1125
+ const system = request.messages.find((m) => m.role === "system")?.content;
1126
+ const tools = request.context?.tools?.map((tool) => ({
1127
+ name: tool.name,
1128
+ description: tool.description,
1129
+ input_schema: tool.schema
1130
+ }));
1131
+ const body = {
1132
+ anthropic_version: "bedrock-2023-05-31",
1133
+ max_tokens: request.context?.maxTokens ?? maxTokens,
1134
+ messages
1135
+ };
1136
+ if (system) body.system = system;
1137
+ if (tools && tools.length > 0) body.tools = tools;
1138
+ return JSON.stringify(body);
1139
+ }
1140
+ async function* parseAnthropicBedrockEvents(events) {
1141
+ const decoder = new TextDecoder();
1142
+ const pendingToolCalls = /* @__PURE__ */ new Map();
1143
+ for await (const item of events) {
1144
+ const bytes = item.chunk?.bytes;
1145
+ if (!bytes) continue;
1146
+ let event;
1147
+ try {
1148
+ event = JSON.parse(decoder.decode(bytes));
1149
+ } catch {
1150
+ continue;
1151
+ }
1152
+ const type = event.type;
1153
+ if (type === "content_block_delta") {
1154
+ const delta = event.delta;
1155
+ if (delta?.type === "text_delta" && delta.text) {
1156
+ yield { type: "text", content: delta.text };
1157
+ } else if (delta?.type === "input_json_delta") {
1158
+ const index = event.index ?? 0;
1159
+ const existing = pendingToolCalls.get(index);
1160
+ if (existing) existing.args += delta.partial_json ?? "";
1161
+ }
1162
+ } else if (type === "content_block_start") {
1163
+ const index = event.index ?? 0;
1164
+ const block = event.content_block;
1165
+ if (block?.type === "tool_use" && block.id && block.name) {
1166
+ pendingToolCalls.set(index, { id: block.id, name: block.name, args: "" });
1167
+ }
1168
+ } else if (type === "content_block_stop") {
1169
+ const index = event.index ?? 0;
1170
+ const tc = pendingToolCalls.get(index);
1171
+ if (tc) {
1172
+ yield { type: "tool_call", toolCall: { id: tc.id, name: tc.name, args: tc.args || "{}" } };
1173
+ pendingToolCalls.delete(index);
1174
+ }
1175
+ } else if (type === "message_delta") {
1176
+ const usage = event.usage;
1177
+ if (usage) {
1178
+ const promptTokens = usage.input_tokens ?? 0;
1179
+ const completionTokens = usage.output_tokens ?? 0;
1180
+ yield {
1181
+ type: "usage",
1182
+ usage: { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens }
1183
+ };
1184
+ }
1185
+ } else if (type === "message_start") {
1186
+ const usage = event.message?.usage;
1187
+ if (usage) {
1188
+ yield {
1189
+ type: "usage",
1190
+ usage: {
1191
+ promptTokens: usage.input_tokens ?? 0,
1192
+ completionTokens: 0,
1193
+ totalTokens: usage.input_tokens ?? 0
1194
+ }
1195
+ };
1196
+ }
1197
+ } else if (type === "message_stop") {
1198
+ for (const [, tc] of pendingToolCalls) {
1199
+ yield { type: "tool_call", toolCall: { id: tc.id, name: tc.name, args: tc.args || "{}" } };
1200
+ }
1201
+ pendingToolCalls.clear();
1202
+ yield { type: "done" };
1203
+ return;
1204
+ }
1205
+ }
1206
+ for (const [, tc] of pendingToolCalls) {
1207
+ yield { type: "tool_call", toolCall: { id: tc.id, name: tc.name, args: tc.args || "{}" } };
1208
+ }
1209
+ pendingToolCalls.clear();
1210
+ yield { type: "done" };
1211
+ }
1212
+ function bedrock(config) {
1213
+ const { model, region, maxTokens = 4096 } = config;
1214
+ if (!isAnthropicModel(model)) {
1215
+ throw new Error(
1216
+ `bedrock: model "${model}" is not supported in v1. Only anthropic.* models are wired up; Titan + others are tracked as a follow-up.`
1217
+ );
1218
+ }
1219
+ let clientPromise = null;
1220
+ const getClient = async () => {
1221
+ if (config.client) return config.client;
1222
+ if (!clientPromise) {
1223
+ clientPromise = (async () => {
1224
+ const sdk = await loadSdk();
1225
+ return new sdk.BedrockRuntimeClient({ region });
1226
+ })();
1227
+ }
1228
+ return clientPromise;
1229
+ };
1230
+ return {
1231
+ capabilities: {
1232
+ streaming: true,
1233
+ tools: true,
1234
+ reasoning: model.includes("sonnet") || model.includes("opus"),
1235
+ multiModal: true,
1236
+ usage: true
1237
+ },
1238
+ createSource: (request) => {
1239
+ const controller = new AbortController();
1240
+ let aborted = false;
1241
+ return {
1242
+ stream: async function* () {
1243
+ if (aborted) return;
1244
+ try {
1245
+ const client = await getClient();
1246
+ const sdk = config.client ? null : await loadSdk();
1247
+ const input = {
1248
+ modelId: model,
1249
+ contentType: "application/json",
1250
+ accept: "application/json",
1251
+ body: buildAnthropicBody(request, maxTokens)
1252
+ };
1253
+ const command = sdk ? new sdk.InvokeModelWithResponseStreamCommand(input) : { input };
1254
+ const response = await client.send(command);
1255
+ if (!response.body) {
1256
+ yield { type: "error", content: "Bedrock: empty response body" };
1257
+ return;
1258
+ }
1259
+ for await (const chunk of parseAnthropicBedrockEvents(response.body)) {
1260
+ if (aborted) return;
1261
+ yield chunk;
1262
+ }
1263
+ } catch (err) {
1264
+ yield { type: "error", content: err instanceof Error ? err.message : String(err) };
1265
+ }
1266
+ },
1267
+ abort: () => {
1268
+ aborted = true;
1269
+ controller.abort();
1270
+ }
1271
+ };
1272
+ }
1273
+ };
1274
+ }
1275
+ var bedrockAdapter = bedrock;
1276
+
810
1277
  // src/router.ts
811
1278
  function requireCapabilities(request) {
812
1279
  const needs = {};
@@ -1332,8 +1799,17 @@ var grokEmbedder = createOpenAICompatibleEmbedder("Grok", "https://api.x.ai");
1332
1799
  var kimiEmbedder = createOpenAICompatibleEmbedder("Kimi", "https://api.moonshot.ai");
1333
1800
 
1334
1801
  exports.anthropic = anthropic;
1802
+ exports.azureOpenAI = azureOpenAI;
1803
+ exports.azureOpenAIAdapter = azureOpenAIAdapter;
1804
+ exports.bail = bail;
1805
+ exports.bailAdapter = bailAdapter;
1806
+ exports.bedrock = bedrock;
1807
+ exports.bedrockAdapter = bedrockAdapter;
1808
+ exports.cerebras = cerebras;
1809
+ exports.cerebrasAdapter = cerebrasAdapter;
1335
1810
  exports.chunkText = chunkText;
1336
1811
  exports.cohere = cohere;
1812
+ exports.cohereAdapter = cohereAdapter;
1337
1813
  exports.createAdapter = createAdapter;
1338
1814
  exports.createEnsembleAdapter = createEnsembleAdapter;
1339
1815
  exports.createFallbackAdapter = createFallbackAdapter;
@@ -1349,6 +1825,7 @@ exports.generic = generic;
1349
1825
  exports.grok = grok;
1350
1826
  exports.grokEmbedder = grokEmbedder;
1351
1827
  exports.groq = groq;
1828
+ exports.groqAdapter = groqAdapter;
1352
1829
  exports.huggingface = huggingface;
1353
1830
  exports.inMemorySink = inMemorySink;
1354
1831
  exports.kimi = kimi;
@@ -1364,11 +1841,16 @@ exports.ollamaEmbedder = ollamaEmbedder;
1364
1841
  exports.openai = openai;
1365
1842
  exports.openaiEmbedder = openaiEmbedder;
1366
1843
  exports.openrouter = openrouter;
1844
+ exports.qwen = qwen;
1367
1845
  exports.recordingAdapter = recordingAdapter;
1368
1846
  exports.replayAdapter = replayAdapter;
1847
+ exports.replicate = replicate;
1848
+ exports.replicateAdapter = replicateAdapter;
1369
1849
  exports.simulateStream = simulateStream;
1370
1850
  exports.together = together;
1371
1851
  exports.vercelAI = vercelAI;
1852
+ exports.vertex = vertex;
1853
+ exports.vertexAdapter = vertexAdapter;
1372
1854
  exports.vllm = vllm;
1373
1855
  //# sourceMappingURL=index.cjs.map
1374
1856
  //# sourceMappingURL=index.cjs.map