call-ai 0.10.2 → 0.11.0-dev-preview3

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.
Files changed (71) hide show
  1. package/README.md +60 -58
  2. package/api-core.d.ts +13 -0
  3. package/{dist/api-core.js → api-core.js} +51 -126
  4. package/api-core.js.map +1 -0
  5. package/api.d.ts +4 -0
  6. package/api.js +364 -0
  7. package/api.js.map +1 -0
  8. package/api.ts.off +595 -0
  9. package/{dist/error-handling.d.ts → error-handling.d.ts} +4 -2
  10. package/{dist/error-handling.js → error-handling.js} +34 -70
  11. package/error-handling.js.map +1 -0
  12. package/image.d.ts +2 -0
  13. package/{dist/image.js → image.js} +10 -33
  14. package/image.js.map +1 -0
  15. package/index.d.ts +6 -0
  16. package/index.js +7 -0
  17. package/index.js.map +1 -0
  18. package/index.ts.bak +16 -0
  19. package/key-management.d.ts +29 -0
  20. package/key-management.js +189 -0
  21. package/key-management.js.map +1 -0
  22. package/{dist/non-streaming.d.ts → non-streaming.d.ts} +5 -8
  23. package/{dist/non-streaming.js → non-streaming.js} +28 -87
  24. package/non-streaming.js.map +1 -0
  25. package/package.json +15 -31
  26. package/response-metadata.d.ts +6 -0
  27. package/response-metadata.js +22 -0
  28. package/response-metadata.js.map +1 -0
  29. package/strategies/index.d.ts +2 -0
  30. package/strategies/index.js +3 -0
  31. package/strategies/index.js.map +1 -0
  32. package/strategies/model-strategies.d.ts +6 -0
  33. package/{dist/strategies → strategies}/model-strategies.js +26 -72
  34. package/strategies/model-strategies.js.map +1 -0
  35. package/strategies/strategy-selector.d.ts +2 -0
  36. package/strategies/strategy-selector.js +66 -0
  37. package/strategies/strategy-selector.js.map +1 -0
  38. package/streaming.d.ts +4 -0
  39. package/{dist/streaming.js → streaming.js} +66 -184
  40. package/streaming.js.map +1 -0
  41. package/streaming.ts.off +571 -0
  42. package/tsconfig.json +18 -0
  43. package/types.d.ts +226 -0
  44. package/types.js +33 -0
  45. package/types.js.map +1 -0
  46. package/utils.d.ts +32 -0
  47. package/utils.js +129 -0
  48. package/utils.js.map +1 -0
  49. package/version.d.ts +1 -0
  50. package/version.js +2 -0
  51. package/version.js.map +1 -0
  52. package/dist/api-core.d.ts +0 -40
  53. package/dist/api.d.ts +0 -15
  54. package/dist/api.js +0 -498
  55. package/dist/image.d.ts +0 -12
  56. package/dist/index.d.ts +0 -7
  57. package/dist/index.js +0 -32
  58. package/dist/key-management.d.ts +0 -43
  59. package/dist/key-management.js +0 -312
  60. package/dist/response-metadata.d.ts +0 -18
  61. package/dist/response-metadata.js +0 -44
  62. package/dist/strategies/index.d.ts +0 -5
  63. package/dist/strategies/index.js +0 -21
  64. package/dist/strategies/model-strategies.d.ts +0 -24
  65. package/dist/strategies/strategy-selector.d.ts +0 -8
  66. package/dist/strategies/strategy-selector.js +0 -79
  67. package/dist/streaming.d.ts +0 -7
  68. package/dist/types.d.ts +0 -226
  69. package/dist/types.js +0 -5
  70. package/dist/utils.d.ts +0 -8
  71. package/dist/utils.js +0 -52
@@ -0,0 +1,66 @@
1
+ import { claudeStrategy, defaultStrategy, geminiStrategy, openAIStrategy, systemMessageStrategy } from "./model-strategies.js";
2
+ export function chooseSchemaStrategy(model, schema) {
3
+ const resolvedModel = model || (schema ? "openai/gpt-4o" : "openrouter/auto");
4
+ if (!schema) {
5
+ return {
6
+ strategy: "none",
7
+ model: resolvedModel,
8
+ prepareRequest: defaultStrategy.prepareRequest,
9
+ processResponse: defaultStrategy.processResponse,
10
+ shouldForceStream: false,
11
+ };
12
+ }
13
+ if (/claude/i.test(resolvedModel)) {
14
+ return {
15
+ strategy: "tool_mode",
16
+ model: resolvedModel,
17
+ prepareRequest: claudeStrategy.prepareRequest,
18
+ processResponse: claudeStrategy.processResponse,
19
+ shouldForceStream: !!claudeStrategy.shouldForceStream,
20
+ };
21
+ }
22
+ if (/gemini/i.test(resolvedModel)) {
23
+ return {
24
+ strategy: "json_schema",
25
+ model: resolvedModel,
26
+ prepareRequest: geminiStrategy.prepareRequest,
27
+ processResponse: geminiStrategy.processResponse,
28
+ shouldForceStream: !!geminiStrategy.shouldForceStream,
29
+ };
30
+ }
31
+ if (/gpt-4-turbo/i.test(resolvedModel)) {
32
+ return {
33
+ strategy: "system_message",
34
+ model: resolvedModel,
35
+ prepareRequest: systemMessageStrategy.prepareRequest,
36
+ processResponse: systemMessageStrategy.processResponse,
37
+ shouldForceStream: !!systemMessageStrategy.shouldForceStream,
38
+ };
39
+ }
40
+ if (/openai|gpt/i.test(resolvedModel)) {
41
+ return {
42
+ strategy: "json_schema",
43
+ model: resolvedModel,
44
+ prepareRequest: openAIStrategy.prepareRequest,
45
+ processResponse: openAIStrategy.processResponse,
46
+ shouldForceStream: !!openAIStrategy.shouldForceStream,
47
+ };
48
+ }
49
+ if (/llama-3|deepseek/i.test(resolvedModel)) {
50
+ return {
51
+ strategy: "system_message",
52
+ model: resolvedModel,
53
+ prepareRequest: systemMessageStrategy.prepareRequest,
54
+ processResponse: systemMessageStrategy.processResponse,
55
+ shouldForceStream: !!systemMessageStrategy.shouldForceStream,
56
+ };
57
+ }
58
+ return {
59
+ strategy: "system_message",
60
+ model: resolvedModel,
61
+ prepareRequest: systemMessageStrategy.prepareRequest,
62
+ processResponse: systemMessageStrategy.processResponse,
63
+ shouldForceStream: !!systemMessageStrategy.shouldForceStream,
64
+ };
65
+ }
66
+ //# sourceMappingURL=strategy-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy-selector.js","sourceRoot":"","sources":["../../jsr/strategies/strategy-selector.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAK/H,MAAM,UAAU,oBAAoB,CAAC,KAAyB,EAAE,MAAqB,EAAkB;IAErG,MAAM,aAAa,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAG9E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,eAAe,CAAC,cAAc;YAC9C,eAAe,EAAE,eAAe,CAAC,eAAe;YAChD,iBAAiB,EAAE,KAAK;SACzB,CAAC;IACJ,CAAC;IAGD,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,cAAc,CAAC,cAAc;YAC7C,eAAe,EAAE,cAAc,CAAC,eAAe;YAC/C,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC,iBAAiB;SACtD,CAAC;IACJ,CAAC;IAGD,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,cAAc,CAAC,cAAc;YAC7C,eAAe,EAAE,cAAc,CAAC,eAAe;YAC/C,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC,iBAAiB;SACtD,CAAC;IACJ,CAAC;IAGD,IAAI,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,qBAAqB,CAAC,cAAc;YACpD,eAAe,EAAE,qBAAqB,CAAC,eAAe;YACtD,iBAAiB,EAAE,CAAC,CAAC,qBAAqB,CAAC,iBAAiB;SAC7D,CAAC;IACJ,CAAC;IAGD,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,cAAc,CAAC,cAAc;YAC7C,eAAe,EAAE,cAAc,CAAC,eAAe;YAC/C,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC,iBAAiB;SACtD,CAAC;IACJ,CAAC;IAGD,IAAI,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,qBAAqB,CAAC,cAAc;YACpD,eAAe,EAAE,qBAAqB,CAAC,eAAe;YACtD,iBAAiB,EAAE,CAAC,CAAC,qBAAqB,CAAC,iBAAiB;SAC7D,CAAC;IACJ,CAAC;IAGD,OAAO;QACL,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,aAAa;QACpB,cAAc,EAAE,qBAAqB,CAAC,cAAc;QACpD,eAAe,EAAE,qBAAqB,CAAC,eAAe;QACtD,iBAAiB,EAAE,CAAC,CAAC,qBAAqB,CAAC,iBAAiB;KAC7D,CAAC;AAAA,CACH"}
package/streaming.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { CallAIOptions, Message, SchemaStrategy } from "./types.js";
2
+ declare function createStreamingGenerator(response: Response, options: CallAIOptions, schemaStrategy: SchemaStrategy, model: string): AsyncGenerator<string, string, unknown>;
3
+ declare function callAIStreaming(prompt: string | Message[], options?: CallAIOptions, isRetry?: boolean): AsyncGenerator<string, string, unknown>;
4
+ export { createStreamingGenerator, callAIStreaming };
@@ -1,22 +1,9 @@
1
- "use strict";
2
- /**
3
- * Streaming response handling for call-ai
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createStreamingGenerator = createStreamingGenerator;
7
- exports.callAIStreaming = callAIStreaming;
8
- const key_management_1 = require("./key-management");
9
- const response_metadata_1 = require("./response-metadata");
10
- const error_handling_1 = require("./error-handling");
11
- const non_streaming_1 = require("./non-streaming");
12
- // Generator factory function for streaming API calls
13
- // This is called after the fetch is made and response is validated
14
- //
15
- // Note: Even though we checked response.ok before creating this generator,
16
- // we need to be prepared for errors that may occur during streaming. Some APIs
17
- // return a 200 OK initially but then deliver error information in the stream.
1
+ import { CallAIError } from "./types.js";
2
+ import { globalDebug } from "./key-management.js";
3
+ import { responseMetadata, boxString } from "./response-metadata.js";
4
+ import { checkForInvalidModelError } from "./error-handling.js";
5
+ import { PACKAGE_VERSION, FALLBACK_MODEL } from "./non-streaming.js";
18
6
  async function* createStreamingGenerator(response, options, schemaStrategy, model) {
19
- // Create a metadata object for this streaming response
20
7
  const meta = {
21
8
  model,
22
9
  endpoint: options.endpoint || "https://openrouter.ai/api/v1",
@@ -26,140 +13,106 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
26
13
  duration: 0,
27
14
  },
28
15
  };
29
- // Tool calls assembly (for Claude/Anthropic)
30
16
  let toolCallsAssembled = "";
31
17
  let completeText = "";
32
18
  let chunkCount = 0;
33
- if (options.debug || key_management_1.globalDebug) {
34
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Starting streaming generator with model: ${model}`);
19
+ if (options.debug || globalDebug) {
20
+ console.log(`[callAi:${PACKAGE_VERSION}] Starting streaming generator with model: ${model}`);
35
21
  }
36
22
  try {
37
- // Handle streaming response
38
23
  const reader = response.body?.getReader();
39
24
  if (!reader) {
40
25
  throw new Error("Response body is undefined - API endpoint may not support streaming");
41
26
  }
42
27
  const textDecoder = new TextDecoder();
43
- let buffer = ""; // Buffer to accumulate partial SSE messages
28
+ let buffer = "";
44
29
  while (true) {
45
30
  const { done, value } = await reader.read();
46
31
  if (done) {
47
- if (options.debug || key_management_1.globalDebug) {
48
- console.log(`[callAi-streaming:complete v${non_streaming_1.PACKAGE_VERSION}] Stream finished after ${chunkCount} chunks`);
32
+ if (options.debug || globalDebug) {
33
+ console.log(`[callAi-streaming:complete v${PACKAGE_VERSION}] Stream finished after ${chunkCount} chunks`);
49
34
  }
50
35
  break;
51
36
  }
52
- // Convert bytes to text
53
37
  const chunk = textDecoder.decode(value, { stream: true });
54
38
  buffer += chunk;
55
- // Split on double newlines to find complete SSE messages
56
- let messages = buffer.split(/\n\n/);
57
- buffer = messages.pop() || ""; // Keep the last incomplete chunk in the buffer
39
+ const messages = buffer.split(/\n\n/);
40
+ buffer = messages.pop() || "";
58
41
  for (const message of messages) {
59
42
  if (!message.trim() || !message.startsWith("data: ")) {
60
- continue; // Skip empty lines or non-data messages
43
+ continue;
61
44
  }
62
- // Extract the JSON payload
63
- let jsonStr = message.slice(6); // Remove 'data: ' prefix
45
+ const jsonStr = message.slice(6);
64
46
  if (jsonStr === "[DONE]") {
65
- if (options.debug || key_management_1.globalDebug) {
66
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Received [DONE] signal`);
47
+ if (options.debug || globalDebug) {
48
+ console.log(`[callAi:${PACKAGE_VERSION}] Received [DONE] signal`);
67
49
  }
68
50
  continue;
69
51
  }
70
52
  chunkCount++;
71
- // Try to parse the JSON
72
53
  try {
73
54
  const json = JSON.parse(jsonStr);
74
- // Check for error responses in the stream
75
55
  if (json.error ||
76
56
  json.type === "error" ||
77
- (json.choices &&
78
- json.choices.length > 0 &&
79
- json.choices[0].finish_reason === "error")) {
80
- // Extract error message
81
- const errorMessage = json.error?.message ||
82
- json.error ||
83
- json.choices?.[0]?.message?.content ||
84
- "Unknown streaming error";
85
- if (options.debug || key_management_1.globalDebug) {
86
- console.error(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Detected error in streaming response:`, json);
57
+ (json.choices && json.choices.length > 0 && json.choices[0].finish_reason === "error")) {
58
+ const errorMessage = json.error?.message || json.error || json.choices?.[0]?.message?.content || "Unknown streaming error";
59
+ if (options.debug || globalDebug) {
60
+ console.error(`[callAi:${PACKAGE_VERSION}] Detected error in streaming response:`, json);
87
61
  }
88
- // Create a detailed error to throw
89
- const detailedError = new Error(`API streaming error: ${errorMessage}`);
90
- // Add error metadata
91
- detailedError.status = json.error?.status || 400;
92
- detailedError.statusText =
93
- json.error?.type || "Bad Request";
94
- detailedError.details = JSON.stringify(json.error || json);
95
- console.error(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Throwing stream error:`, detailedError);
62
+ const detailedError = new CallAIError({
63
+ message: `API streaming error: ${errorMessage}`,
64
+ status: json.error?.status || 400,
65
+ statusText: json.error?.type || "Bad Request",
66
+ details: JSON.stringify(json.error || json),
67
+ contentType: "application/json",
68
+ });
69
+ console.error(`[callAi:${PACKAGE_VERSION}] Throwing stream error:`, detailedError);
96
70
  throw detailedError;
97
71
  }
98
- // Handle tool use response - Claude with schema cases
99
72
  const isClaudeWithSchema = /claude/i.test(model) && schemaStrategy.strategy === "tool_mode";
100
73
  if (isClaudeWithSchema) {
101
- // Claude streaming tool calls - need to assemble arguments
102
74
  if (json.choices && json.choices.length > 0) {
103
75
  const choice = json.choices[0];
104
- // Handle finish reason tool_calls - this is where we know the tool call is complete
105
76
  if (choice.finish_reason === "tool_calls") {
106
77
  if (options.debug) {
107
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Received tool_calls finish reason. Assembled JSON:`, toolCallsAssembled);
78
+ console.log(`[callAi:${PACKAGE_VERSION}] Received tool_calls finish reason. Assembled JSON:`, toolCallsAssembled);
108
79
  }
109
- // Full JSON collected, construct a proper object with it
110
80
  try {
111
- // Try to fix any malformed JSON that might have resulted from chunking
112
- // This happens when property names get split across chunks
113
81
  if (toolCallsAssembled) {
114
82
  try {
115
- // First try parsing as-is
116
83
  JSON.parse(toolCallsAssembled);
117
84
  }
118
85
  catch (parseError) {
119
86
  if (options.debug) {
120
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Attempting to fix malformed JSON in tool call:`, toolCallsAssembled);
87
+ console.log(`[callAi:${PACKAGE_VERSION}] Attempting to fix malformed JSON in tool call:`, toolCallsAssembled);
121
88
  }
122
- // Apply comprehensive fixes for Claude's JSON property splitting
123
89
  let fixedJson = toolCallsAssembled;
124
- // 1. Remove trailing commas
125
90
  fixedJson = fixedJson.replace(/,\s*([\}\]])/, "$1");
126
- // 2. Ensure proper JSON structure
127
- // Add closing braces if missing
128
91
  const openBraces = (fixedJson.match(/\{/g) || []).length;
129
92
  const closeBraces = (fixedJson.match(/\}/g) || []).length;
130
93
  if (openBraces > closeBraces) {
131
94
  fixedJson += "}".repeat(openBraces - closeBraces);
132
95
  }
133
- // Add opening brace if missing
134
96
  if (!fixedJson.trim().startsWith("{")) {
135
97
  fixedJson = "{" + fixedJson.trim();
136
98
  }
137
- // Ensure it ends with a closing brace
138
99
  if (!fixedJson.trim().endsWith("}")) {
139
100
  fixedJson += "}";
140
101
  }
141
- // 3. Fix various property name/value split issues
142
- // Fix dangling property names without values
143
102
  fixedJson = fixedJson.replace(/"(\w+)"\s*:\s*$/g, '"$1":null');
144
- // Fix missing property values
145
103
  fixedJson = fixedJson.replace(/"(\w+)"\s*:\s*,/g, '"$1":null,');
146
- // Fix incomplete property names (when split across chunks)
147
104
  fixedJson = fixedJson.replace(/"(\w+)"\s*:\s*"(\w+)$/g, '"$1$2"');
148
- // Balance brackets
149
- const openBrackets = (fixedJson.match(/\[/g) || [])
150
- .length;
151
- const closeBrackets = (fixedJson.match(/\]/g) || [])
152
- .length;
105
+ const openBrackets = (fixedJson.match(/\[/g) || []).length;
106
+ const closeBrackets = (fixedJson.match(/\]/g) || []).length;
153
107
  if (openBrackets > closeBrackets) {
154
108
  fixedJson += "]".repeat(openBrackets - closeBrackets);
155
109
  }
156
110
  if (options.debug) {
157
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Applied comprehensive JSON fixes:`, `\nBefore: ${toolCallsAssembled}`, `\nAfter: ${fixedJson}`);
111
+ console.log(`[callAi:${PACKAGE_VERSION}] Applied comprehensive JSON fixes:`, `\nBefore: ${toolCallsAssembled}`, `\nAfter: ${fixedJson}`);
158
112
  }
159
113
  toolCallsAssembled = fixedJson;
160
114
  }
161
115
  }
162
- // Return the assembled tool call
163
116
  completeText = toolCallsAssembled;
164
117
  yield completeText;
165
118
  continue;
@@ -168,31 +121,23 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
168
121
  console.error("[callAIStreaming] Error handling assembled tool call:", e);
169
122
  }
170
123
  }
171
- // Assemble tool_calls arguments from delta
172
- // Simply accumulate the raw strings without trying to parse them
173
124
  if (choice && choice.delta && choice.delta.tool_calls) {
174
125
  const toolCall = choice.delta.tool_calls[0];
175
- if (toolCall &&
176
- toolCall.function &&
177
- toolCall.function.arguments !== undefined) {
126
+ if (toolCall && toolCall.function && toolCall.function.arguments !== undefined) {
178
127
  toolCallsAssembled += toolCall.function.arguments;
179
128
  if (options.debug) {
180
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Accumulated tool call chunk:`, toolCall.function.arguments);
129
+ console.log(`[callAi:${PACKAGE_VERSION}] Accumulated tool call chunk:`, toolCall.function.arguments);
181
130
  }
182
131
  }
183
132
  }
184
133
  }
185
134
  }
186
- // Handle tool use response - old format
187
- if (isClaudeWithSchema &&
188
- (json.stop_reason === "tool_use" || json.type === "tool_use")) {
189
- // First try direct tool use object format
135
+ if (isClaudeWithSchema && (json.stop_reason === "tool_use" || json.type === "tool_use")) {
190
136
  if (json.type === "tool_use") {
191
137
  completeText = schemaStrategy.processResponse(json);
192
138
  yield completeText;
193
139
  continue;
194
140
  }
195
- // Extract the tool use content
196
141
  if (json.content && Array.isArray(json.content)) {
197
142
  const toolUseBlock = json.content.find((block) => block.type === "tool_use");
198
143
  if (toolUseBlock) {
@@ -201,7 +146,6 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
201
146
  continue;
202
147
  }
203
148
  }
204
- // Find tool_use in assistant's content blocks
205
149
  if (json.choices && Array.isArray(json.choices)) {
206
150
  const choice = json.choices[0];
207
151
  if (choice.message && Array.isArray(choice.message.content)) {
@@ -212,7 +156,6 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
212
156
  continue;
213
157
  }
214
158
  }
215
- // Handle case where the tool use is in the delta
216
159
  if (choice.delta && Array.isArray(choice.delta.content)) {
217
160
  const toolUseBlock = choice.delta.content.find((block) => block.type === "tool_use");
218
161
  if (toolUseBlock) {
@@ -223,10 +166,8 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
223
166
  }
224
167
  }
225
168
  }
226
- // Extract content from the delta
227
169
  if (json.choices?.[0]?.delta?.content !== undefined) {
228
170
  const content = json.choices[0].delta.content || "";
229
- // Treat all models the same - yield as content arrives
230
171
  completeText += content;
231
172
  yield schemaStrategy.processResponse(completeText);
232
173
  }
@@ -237,32 +178,24 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
237
178
  yield schemaStrategy.processResponse(completeText);
238
179
  }
239
180
  // Handle content blocks for Claude/Anthropic response format
240
- else if (json.choices?.[0]?.message?.content &&
241
- Array.isArray(json.choices[0].message.content)) {
181
+ else if (json.choices?.[0]?.message?.content && Array.isArray(json.choices[0].message.content)) {
242
182
  const contentBlocks = json.choices[0].message.content;
243
- // Find text or tool_use blocks
244
183
  for (const block of contentBlocks) {
245
184
  if (block.type === "text") {
246
185
  completeText += block.text || "";
247
186
  }
248
187
  else if (isClaudeWithSchema && block.type === "tool_use") {
249
188
  completeText = schemaStrategy.processResponse(block);
250
- break; // We found what we need
189
+ break;
251
190
  }
252
191
  }
253
192
  yield schemaStrategy.processResponse(completeText);
254
193
  }
255
- // Find text delta for content blocks (Claude format)
256
- if (json.type === "content_block_delta" &&
257
- json.delta &&
258
- json.delta.type === "text_delta" &&
259
- json.delta.text) {
194
+ if (json.type === "content_block_delta" && json.delta && json.delta.type === "text_delta" && json.delta.text) {
260
195
  if (options.debug) {
261
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Received text delta:`, json.delta.text);
196
+ console.log(`[callAi:${PACKAGE_VERSION}] Received text delta:`, json.delta.text);
262
197
  }
263
198
  completeText += json.delta.text;
264
- // In some models like Claude, don't yield partial results as they can be malformed JSON
265
- // Only yield what we've seen so far if it's not a Claude model with schema
266
199
  if (!isClaudeWithSchema) {
267
200
  yield schemaStrategy.processResponse(completeText);
268
201
  }
@@ -275,115 +208,77 @@ async function* createStreamingGenerator(response, options, schemaStrategy, mode
275
208
  }
276
209
  }
277
210
  }
278
- // We no longer need special error handling here as errors are thrown immediately
279
- // No extra error handling needed here - errors are thrown immediately
280
- // If we have assembled tool calls but haven't yielded them yet
281
211
  if (toolCallsAssembled && (!completeText || completeText.length === 0)) {
282
- // Try to fix any remaining JSON issues before returning
283
212
  let result = toolCallsAssembled;
284
213
  try {
285
- // Try to parse as-is first
286
214
  JSON.parse(result);
287
215
  }
288
216
  catch (e) {
289
217
  if (options.debug) {
290
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Final JSON validation failed:`, e, `\nAttempting to fix JSON:`, result);
218
+ console.log(`[callAi:${PACKAGE_VERSION}] Final JSON validation failed:`, e, `\nAttempting to fix JSON:`, result);
291
219
  }
292
- // Apply more robust fixes for Claude's streaming JSON issues
293
- // 1. Remove trailing commas (common in malformed JSON)
294
220
  result = result.replace(/,\s*([\}\]])/, "$1");
295
- // 2. Ensure we have proper JSON structure
296
- // Add closing braces if missing
297
221
  const openBraces = (result.match(/\{/g) || []).length;
298
222
  const closeBraces = (result.match(/\}/g) || []).length;
299
223
  if (openBraces > closeBraces) {
300
224
  result += "}".repeat(openBraces - closeBraces);
301
225
  }
302
- // Add opening brace if missing
303
226
  if (!result.trim().startsWith("{")) {
304
227
  result = "{" + result.trim();
305
228
  }
306
- // Ensure it ends with a closing brace
307
229
  if (!result.trim().endsWith("}")) {
308
230
  result += "}";
309
231
  }
310
- // Fix dangling property names without values
311
232
  result = result.replace(/"(\w+)"\s*:\s*$/g, '"$1":null');
312
- // Fix missing property values
313
233
  result = result.replace(/"(\w+)"\s*:\s*,/g, '"$1":null,');
314
- // Balance brackets
315
234
  const openBrackets = (result.match(/\[/g) || []).length;
316
235
  const closeBrackets = (result.match(/\]/g) || []).length;
317
236
  if (openBrackets > closeBrackets) {
318
237
  result += "]".repeat(openBrackets - closeBrackets);
319
238
  }
320
239
  if (options.debug) {
321
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Applied final JSON fixes:`, result);
240
+ console.log(`[callAi:${PACKAGE_VERSION}] Applied final JSON fixes:`, result);
322
241
  }
323
242
  }
324
- // Return the assembled tool call
325
243
  completeText = result;
326
- // Try one more time to validate
327
244
  try {
328
245
  JSON.parse(completeText);
329
246
  }
330
247
  catch (finalParseError) {
331
248
  if (options.debug) {
332
- console.error(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Final JSON validation still failed:`, finalParseError);
249
+ console.error(`[callAi:${PACKAGE_VERSION}] Final JSON validation still failed:`, finalParseError);
333
250
  }
334
251
  }
335
252
  yield completeText;
336
253
  }
337
- // Record streaming completion in metadata
338
254
  const endTime = Date.now();
339
255
  meta.timing.endTime = endTime;
340
256
  meta.timing.duration = endTime - meta.timing.startTime;
341
- // Add the rawResponse field to match non-streaming behavior
342
- // For streaming, we use the final complete text as the raw response
343
257
  meta.rawResponse = completeText;
344
- // Store metadata for this response
345
- const boxed = (0, response_metadata_1.boxString)(completeText);
346
- response_metadata_1.responseMetadata.set(boxed, meta);
347
- // Return the complete text as the final value
258
+ const boxed = boxString(completeText);
259
+ responseMetadata.set(boxed, meta);
348
260
  return completeText;
349
261
  }
350
262
  catch (error) {
351
- // Streaming generators must properly handle errors
352
- if (options.debug || key_management_1.globalDebug) {
353
- console.error(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Streaming error:`, error);
263
+ if (options.debug || globalDebug) {
264
+ console.error(`[callAi:${PACKAGE_VERSION}] Streaming error:`, error);
354
265
  }
355
- // This error will be caught in the caller's try/catch block
356
266
  throw error;
357
267
  }
358
268
  }
359
- // Simplified generator for accessing streaming results
360
- // Returns an async generator that yields blocks of text
361
- // This is a higher-level function that prepares the request
362
- // and handles model fallback
363
269
  async function* callAIStreaming(prompt, options = {}, isRetry = false) {
364
- // Convert simple string prompts to message array format
365
- const messages = Array.isArray(prompt)
366
- ? prompt
367
- : [{ role: "user", content: prompt }];
368
- // API key should be provided by options (validation happens in callAi)
270
+ const messages = Array.isArray(prompt) ? prompt : [{ role: "user", content: prompt }];
369
271
  const apiKey = options.apiKey;
370
272
  const model = options.model || "openai/gpt-3.5-turbo";
371
- // Default endpoint compatible with OpenAI API
372
273
  const endpoint = options.endpoint || "https://openrouter.ai/api/v1";
373
- // Build the endpoint URL
374
274
  const url = `${endpoint}/chat/completions`;
375
- // Choose a schema strategy based on model
376
275
  const schemaStrategy = options.schemaStrategy;
377
- // Default to JSON response for certain models
378
- const responseFormat = options.responseFormat || /gpt-4/.test(model) || /gpt-3.5/.test(model)
379
- ? "json"
380
- : undefined;
381
- const debug = options.debug === undefined ? key_management_1.globalDebug : options.debug;
276
+ const responseFormat = options.responseFormat || /gpt-4/.test(model) || /gpt-3.5/.test(model) ? "json" : undefined;
277
+ const debug = options.debug === undefined ? globalDebug : options.debug;
382
278
  if (debug) {
383
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Making streaming request to: ${url}`);
384
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] With model: ${model}`);
279
+ console.log(`[callAi:${PACKAGE_VERSION}] Making streaming request to: ${url}`);
280
+ console.log(`[callAi:${PACKAGE_VERSION}] With model: ${model}`);
385
281
  }
386
- // Build request body
387
282
  const requestBody = {
388
283
  model,
389
284
  messages,
@@ -392,26 +287,21 @@ async function* callAIStreaming(prompt, options = {}, isRetry = false) {
392
287
  top_p: options.topP !== undefined ? options.topP : 1,
393
288
  stream: true,
394
289
  };
395
- // Add response_format if specified or for JSON handling
396
290
  if (responseFormat === "json") {
397
291
  requestBody.response_format = { type: "json_object" };
398
292
  }
399
- // Add schema-specific parameters (if schema is provided)
400
293
  if (options.schema) {
401
- Object.assign(requestBody, schemaStrategy.prepareRequest(options.schema, messages));
294
+ Object.assign(requestBody, schemaStrategy?.prepareRequest(options.schema, messages));
402
295
  }
403
- // Add HTTP referer and other options to help with abuse prevention
404
296
  const headers = {
405
297
  Authorization: `Bearer ${apiKey}`,
406
298
  "HTTP-Referer": options.referer || "https://vibes.diy",
407
299
  "X-Title": options.title || "Vibes",
408
300
  "Content-Type": "application/json",
409
301
  };
410
- // Add any additional headers
411
302
  if (options.headers) {
412
303
  Object.assign(headers, options.headers);
413
304
  }
414
- // Copy any other options not explicitly handled above
415
305
  Object.keys(options).forEach((key) => {
416
306
  if (![
417
307
  "apiKey",
@@ -433,51 +323,43 @@ async function* callAIStreaming(prompt, options = {}, isRetry = false) {
433
323
  }
434
324
  });
435
325
  if (debug) {
436
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Request headers:`, headers);
437
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Request body:`, requestBody);
326
+ console.log(`[callAi:${PACKAGE_VERSION}] Request headers:`, headers);
327
+ console.log(`[callAi:${PACKAGE_VERSION}] Request body:`, requestBody);
438
328
  }
439
329
  let response;
440
330
  try {
441
- // Make the API request
442
331
  response = await fetch(url, {
443
332
  method: "POST",
444
333
  headers,
445
334
  body: JSON.stringify(requestBody),
446
335
  });
447
- // Handle HTTP errors
448
336
  if (!response.ok) {
449
- // Check if this is an invalid model error that we can handle with a fallback
450
- const { isInvalidModel, errorData } = await (0, error_handling_1.checkForInvalidModelError)(response, model, debug);
337
+ const { isInvalidModel, errorData } = await checkForInvalidModelError(response, model, debug);
451
338
  if (isInvalidModel && !isRetry && !options.skipRetry) {
452
339
  if (debug) {
453
- console.log(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Invalid model "${model}", falling back to "${non_streaming_1.FALLBACK_MODEL}"`);
340
+ console.log(`[callAi:${PACKAGE_VERSION}] Invalid model "${model}", falling back to "${FALLBACK_MODEL}"`);
454
341
  }
455
- // Retry with the fallback model using yield* to delegate to the other generator
456
342
  yield* callAIStreaming(prompt, {
457
343
  ...options,
458
- model: non_streaming_1.FALLBACK_MODEL,
344
+ model: FALLBACK_MODEL,
459
345
  }, true);
460
- // Generator delegation handles returning the final value
461
346
  return "";
462
347
  }
463
- // For other errors, throw with details
464
- const errorText = errorData
465
- ? JSON.stringify(errorData)
466
- : `HTTP error! Status: ${response.status}`;
348
+ const errorText = errorData ? JSON.stringify(errorData) : `HTTP error! Status: ${response.status}`;
467
349
  throw new Error(errorText);
468
350
  }
469
- // Yield streaming results through the generator
351
+ if (!schemaStrategy) {
352
+ throw new Error("Schema strategy is required for streaming");
353
+ }
470
354
  yield* createStreamingGenerator(response, options, schemaStrategy, model);
471
- // The createStreamingGenerator will return the final assembled string
472
- return ""; // This is never reached due to yield*
355
+ return "";
473
356
  }
474
357
  catch (fetchError) {
475
- // Network errors must be directly re-thrown without modification
476
- // This is exactly how the original implementation handles it
477
358
  if (debug) {
478
- console.error(`[callAi:${non_streaming_1.PACKAGE_VERSION}] Network error during fetch:`, fetchError);
359
+ console.error(`[callAi:${PACKAGE_VERSION}] Network error during fetch:`, fetchError);
479
360
  }
480
- // Critical: throw the exact same error object without any wrapping
481
361
  throw fetchError;
482
362
  }
483
363
  }
364
+ export { createStreamingGenerator, callAIStreaming };
365
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../jsr/streaming.ts"],"names":[],"mappings":"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"}