@xsai/stream-text 0.4.0-beta.1 → 0.4.0-beta.2

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 (2) hide show
  1. package/dist/index.js +66 -64
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -102,7 +102,14 @@ const streamText = async (options) => {
102
102
  steps.push(step);
103
103
  void options.onStepFinish?.(step);
104
104
  };
105
- const startStream = async () => {
105
+ const startStream = async () => chat({
106
+ ...options,
107
+ maxSteps: void 0,
108
+ messages,
109
+ stream: true,
110
+ streamOptions: options.streamOptions != null ? objCamelToSnake(options.streamOptions) : void 0
111
+ }).then((res) => res.body);
112
+ const handleStream = async (stream2) => {
106
113
  const pushUsage = (u) => {
107
114
  usage = u;
108
115
  };
@@ -115,55 +122,47 @@ const streamText = async (options) => {
115
122
  const toolCalls = [];
116
123
  const toolResults = [];
117
124
  let finishReason = "other";
118
- await chat({
119
- ...options,
120
- maxSteps: void 0,
121
- messages,
122
- stream: true,
123
- streamOptions: options.streamOptions != null ? objCamelToSnake(options.streamOptions) : void 0
124
- }).then(
125
- async (res) => res.body.pipeThrough(transformChunk()).pipeTo(new WritableStream({
126
- abort: (reason) => {
127
- eventCtrl?.error(reason);
128
- textCtrl?.error(reason);
129
- },
130
- close: () => {
131
- },
132
- // eslint-disable-next-line sonarjs/cognitive-complexity
133
- write: (chunk) => {
134
- if (chunk.usage)
135
- pushUsage(chunk.usage);
136
- if (chunk.choices == null || chunk.choices.length === 0)
137
- return;
138
- const choice = chunk.choices[0];
139
- if (choice.delta.reasoning_content != null)
140
- pushEvent({ text: choice.delta.reasoning_content, type: "reasoning-delta" });
141
- if (choice.finish_reason != null)
142
- finishReason = choice.finish_reason;
143
- if (choice.delta.tool_calls?.length === 0 || choice.delta.tool_calls == null) {
144
- if (choice.delta.content != null) {
145
- pushEvent({ text: choice.delta.content, type: "text-delta" });
146
- pushText(choice.delta.content);
147
- } else if (choice.delta.refusal != null) {
148
- pushEvent({ error: choice.delta.refusal, type: "error" });
149
- } else if (choice.finish_reason != null) {
150
- pushEvent({ finishReason: choice.finish_reason, type: "finish", usage });
151
- }
152
- } else {
153
- for (const toolCall of choice.delta.tool_calls) {
154
- const { index } = toolCall;
155
- if (!tool_calls.at(index)) {
156
- tool_calls[index] = toolCall;
157
- pushEvent({ toolCallId: toolCall.id, toolName: toolCall.function.name, type: "tool-call-streaming-start" });
158
- } else {
159
- tool_calls[index].function.arguments += toolCall.function.arguments;
160
- pushEvent({ argsTextDelta: toolCall.function.arguments, toolCallId: toolCall.id, toolName: toolCall.function.name, type: "tool-call-delta" });
161
- }
125
+ await stream2.pipeThrough(transformChunk()).pipeTo(new WritableStream({
126
+ abort: (reason) => {
127
+ eventCtrl?.error(reason);
128
+ textCtrl?.error(reason);
129
+ },
130
+ close: () => {
131
+ },
132
+ // eslint-disable-next-line sonarjs/cognitive-complexity
133
+ write: (chunk) => {
134
+ if (chunk.usage)
135
+ pushUsage(chunk.usage);
136
+ if (chunk.choices == null || chunk.choices.length === 0)
137
+ return;
138
+ const choice = chunk.choices[0];
139
+ if (choice.delta.reasoning_content != null)
140
+ pushEvent({ text: choice.delta.reasoning_content, type: "reasoning-delta" });
141
+ if (choice.finish_reason != null)
142
+ finishReason = choice.finish_reason;
143
+ if (choice.delta.tool_calls?.length === 0 || choice.delta.tool_calls == null) {
144
+ if (choice.delta.content != null) {
145
+ pushEvent({ text: choice.delta.content, type: "text-delta" });
146
+ pushText(choice.delta.content);
147
+ } else if (choice.delta.refusal != null) {
148
+ pushEvent({ error: choice.delta.refusal, type: "error" });
149
+ } else if (choice.finish_reason != null) {
150
+ pushEvent({ finishReason: choice.finish_reason, type: "finish", usage });
151
+ }
152
+ } else {
153
+ for (const toolCall of choice.delta.tool_calls) {
154
+ const { index } = toolCall;
155
+ if (!tool_calls.at(index)) {
156
+ tool_calls[index] = toolCall;
157
+ pushEvent({ toolCallId: toolCall.id, toolName: toolCall.function.name, type: "tool-call-streaming-start" });
158
+ } else {
159
+ tool_calls[index].function.arguments += toolCall.function.arguments;
160
+ pushEvent({ argsTextDelta: toolCall.function.arguments, toolCallId: toolCall.id, toolName: toolCall.function.name, type: "tool-call-delta" });
162
161
  }
163
162
  }
164
163
  }
165
- }))
166
- );
164
+ }
165
+ }));
167
166
  messages.push({ content: text, role: "assistant", tool_calls });
168
167
  if (tool_calls.length !== 0) {
169
168
  for (const toolCall of tool_calls) {
@@ -195,24 +194,27 @@ const streamText = async (options) => {
195
194
  usage
196
195
  });
197
196
  if (toolCalls.length !== 0 && steps.length < maxSteps)
198
- return async () => startStream();
197
+ return async () => handleStream(await startStream());
199
198
  };
200
- try {
201
- await trampoline(async () => startStream());
202
- eventCtrl?.close();
203
- textCtrl?.close();
204
- } catch (err) {
205
- eventCtrl?.error(err);
206
- textCtrl?.error(err);
207
- resultSteps.reject(err);
208
- resultMessages.reject(err);
209
- resultUsage.reject(err);
210
- } finally {
211
- resultSteps.resolve(steps);
212
- resultMessages.resolve(messages);
213
- resultUsage.resolve(usage);
214
- void options.onFinish?.(steps.at(-1));
215
- }
199
+ const stream = await startStream();
200
+ void (async () => {
201
+ try {
202
+ await trampoline(async () => handleStream(stream));
203
+ eventCtrl?.close();
204
+ textCtrl?.close();
205
+ } catch (err) {
206
+ eventCtrl?.error(err);
207
+ textCtrl?.error(err);
208
+ resultSteps.reject(err);
209
+ resultMessages.reject(err);
210
+ resultUsage.reject(err);
211
+ } finally {
212
+ resultSteps.resolve(steps);
213
+ resultMessages.resolve(messages);
214
+ resultUsage.resolve(usage);
215
+ void options.onFinish?.(steps.at(-1));
216
+ }
217
+ })();
216
218
  return {
217
219
  fullStream: eventStream,
218
220
  messages: resultMessages.promise,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xsai/stream-text",
3
3
  "type": "module",
4
- "version": "0.4.0-beta.1",
4
+ "version": "0.4.0-beta.2",
5
5
  "description": "extra-small AI SDK.",
6
6
  "author": "Moeru AI",
7
7
  "license": "MIT",
@@ -29,12 +29,12 @@
29
29
  "dist"
30
30
  ],
31
31
  "dependencies": {
32
- "@xsai/shared-chat": "~0.4.0-beta.1"
32
+ "@xsai/shared-chat": "~0.4.0-beta.2"
33
33
  },
34
34
  "devDependencies": {
35
35
  "valibot": "^1.0.0",
36
- "@xsai/tool": "~0.4.0-beta.1",
37
- "@xsai/shared": "~0.4.0-beta.1"
36
+ "@xsai/shared": "~0.4.0-beta.2",
37
+ "@xsai/tool": "~0.4.0-beta.2"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "pkgroll",