MessageStream.mjs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. var _MessageStream_instances, _MessageStream_currentMessageSnapshot, _MessageStream_params, _MessageStream_connectedPromise, _MessageStream_resolveConnectedPromise, _MessageStream_rejectConnectedPromise, _MessageStream_endPromise, _MessageStream_resolveEndPromise, _MessageStream_rejectEndPromise, _MessageStream_listeners, _MessageStream_ended, _MessageStream_errored, _MessageStream_aborted, _MessageStream_catchingPromiseCreated, _MessageStream_response, _MessageStream_request_id, _MessageStream_logger, _MessageStream_getFinalMessage, _MessageStream_getFinalText, _MessageStream_handleError, _MessageStream_beginRequest, _MessageStream_addStreamEvent, _MessageStream_endRequest, _MessageStream_accumulateMessage;
  2. import { __classPrivateFieldGet, __classPrivateFieldSet } from "../internal/tslib.mjs";
  3. import { isAbortError } from "../internal/errors.mjs";
  4. import { AnthropicError, APIUserAbortError } from "../error.mjs";
  5. import { Stream } from "../streaming.mjs";
  6. import { partialParse } from "../_vendor/partial-json-parser/parser.mjs";
  7. import { maybeParseMessage } from "./parser.mjs";
  8. const JSON_BUF_PROPERTY = '__json_buf';
  9. function tracksToolInput(content) {
  10. return content.type === 'tool_use' || content.type === 'server_tool_use';
  11. }
  12. export class MessageStream {
  13. constructor(params, opts) {
  14. _MessageStream_instances.add(this);
  15. this.messages = [];
  16. this.receivedMessages = [];
  17. _MessageStream_currentMessageSnapshot.set(this, void 0);
  18. _MessageStream_params.set(this, null);
  19. this.controller = new AbortController();
  20. _MessageStream_connectedPromise.set(this, void 0);
  21. _MessageStream_resolveConnectedPromise.set(this, () => { });
  22. _MessageStream_rejectConnectedPromise.set(this, () => { });
  23. _MessageStream_endPromise.set(this, void 0);
  24. _MessageStream_resolveEndPromise.set(this, () => { });
  25. _MessageStream_rejectEndPromise.set(this, () => { });
  26. _MessageStream_listeners.set(this, {});
  27. _MessageStream_ended.set(this, false);
  28. _MessageStream_errored.set(this, false);
  29. _MessageStream_aborted.set(this, false);
  30. _MessageStream_catchingPromiseCreated.set(this, false);
  31. _MessageStream_response.set(this, void 0);
  32. _MessageStream_request_id.set(this, void 0);
  33. _MessageStream_logger.set(this, void 0);
  34. _MessageStream_handleError.set(this, (error) => {
  35. __classPrivateFieldSet(this, _MessageStream_errored, true, "f");
  36. if (isAbortError(error)) {
  37. error = new APIUserAbortError();
  38. }
  39. if (error instanceof APIUserAbortError) {
  40. __classPrivateFieldSet(this, _MessageStream_aborted, true, "f");
  41. return this._emit('abort', error);
  42. }
  43. if (error instanceof AnthropicError) {
  44. return this._emit('error', error);
  45. }
  46. if (error instanceof Error) {
  47. const anthropicError = new AnthropicError(error.message);
  48. // @ts-ignore
  49. anthropicError.cause = error;
  50. return this._emit('error', anthropicError);
  51. }
  52. return this._emit('error', new AnthropicError(String(error)));
  53. });
  54. __classPrivateFieldSet(this, _MessageStream_connectedPromise, new Promise((resolve, reject) => {
  55. __classPrivateFieldSet(this, _MessageStream_resolveConnectedPromise, resolve, "f");
  56. __classPrivateFieldSet(this, _MessageStream_rejectConnectedPromise, reject, "f");
  57. }), "f");
  58. __classPrivateFieldSet(this, _MessageStream_endPromise, new Promise((resolve, reject) => {
  59. __classPrivateFieldSet(this, _MessageStream_resolveEndPromise, resolve, "f");
  60. __classPrivateFieldSet(this, _MessageStream_rejectEndPromise, reject, "f");
  61. }), "f");
  62. // Don't let these promises cause unhandled rejection errors.
  63. // we will manually cause an unhandled rejection error later
  64. // if the user hasn't registered any error listener or called
  65. // any promise-returning method.
  66. __classPrivateFieldGet(this, _MessageStream_connectedPromise, "f").catch(() => { });
  67. __classPrivateFieldGet(this, _MessageStream_endPromise, "f").catch(() => { });
  68. __classPrivateFieldSet(this, _MessageStream_params, params, "f");
  69. __classPrivateFieldSet(this, _MessageStream_logger, opts?.logger ?? console, "f");
  70. }
  71. get response() {
  72. return __classPrivateFieldGet(this, _MessageStream_response, "f");
  73. }
  74. get request_id() {
  75. return __classPrivateFieldGet(this, _MessageStream_request_id, "f");
  76. }
  77. /**
  78. * Returns the `MessageStream` data, the raw `Response` instance and the ID of the request,
  79. * returned vie the `request-id` header which is useful for debugging requests and resporting
  80. * issues to Anthropic.
  81. *
  82. * This is the same as the `APIPromise.withResponse()` method.
  83. *
  84. * This method will raise an error if you created the stream using `MessageStream.fromReadableStream`
  85. * as no `Response` is available.
  86. */
  87. async withResponse() {
  88. __classPrivateFieldSet(this, _MessageStream_catchingPromiseCreated, true, "f");
  89. const response = await __classPrivateFieldGet(this, _MessageStream_connectedPromise, "f");
  90. if (!response) {
  91. throw new Error('Could not resolve a `Response` object');
  92. }
  93. return {
  94. data: this,
  95. response,
  96. request_id: response.headers.get('request-id'),
  97. };
  98. }
  99. /**
  100. * Intended for use on the frontend, consuming a stream produced with
  101. * `.toReadableStream()` on the backend.
  102. *
  103. * Note that messages sent to the model do not appear in `.on('message')`
  104. * in this context.
  105. */
  106. static fromReadableStream(stream) {
  107. const runner = new MessageStream(null);
  108. runner._run(() => runner._fromReadableStream(stream));
  109. return runner;
  110. }
  111. static createMessage(messages, params, options, { logger } = {}) {
  112. const runner = new MessageStream(params, { logger });
  113. for (const message of params.messages) {
  114. runner._addMessageParam(message);
  115. }
  116. __classPrivateFieldSet(runner, _MessageStream_params, { ...params, stream: true }, "f");
  117. runner._run(() => runner._createMessage(messages, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } }));
  118. return runner;
  119. }
  120. _run(executor) {
  121. executor().then(() => {
  122. this._emitFinal();
  123. this._emit('end');
  124. }, __classPrivateFieldGet(this, _MessageStream_handleError, "f"));
  125. }
  126. _addMessageParam(message) {
  127. this.messages.push(message);
  128. }
  129. _addMessage(message, emit = true) {
  130. this.receivedMessages.push(message);
  131. if (emit) {
  132. this._emit('message', message);
  133. }
  134. }
  135. async _createMessage(messages, params, options) {
  136. const signal = options?.signal;
  137. let abortHandler;
  138. if (signal) {
  139. if (signal.aborted)
  140. this.controller.abort();
  141. abortHandler = this.controller.abort.bind(this.controller);
  142. signal.addEventListener('abort', abortHandler);
  143. }
  144. try {
  145. __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_beginRequest).call(this);
  146. const { response, data: stream } = await messages
  147. .create({ ...params, stream: true }, { ...options, signal: this.controller.signal })
  148. .withResponse();
  149. this._connected(response);
  150. for await (const event of stream) {
  151. __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_addStreamEvent).call(this, event);
  152. }
  153. if (stream.controller.signal?.aborted) {
  154. throw new APIUserAbortError();
  155. }
  156. __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_endRequest).call(this);
  157. }
  158. finally {
  159. if (signal && abortHandler) {
  160. signal.removeEventListener('abort', abortHandler);
  161. }
  162. }
  163. }
  164. _connected(response) {
  165. if (this.ended)
  166. return;
  167. __classPrivateFieldSet(this, _MessageStream_response, response, "f");
  168. __classPrivateFieldSet(this, _MessageStream_request_id, response?.headers.get('request-id'), "f");
  169. __classPrivateFieldGet(this, _MessageStream_resolveConnectedPromise, "f").call(this, response);
  170. this._emit('connect');
  171. }
  172. get ended() {
  173. return __classPrivateFieldGet(this, _MessageStream_ended, "f");
  174. }
  175. get errored() {
  176. return __classPrivateFieldGet(this, _MessageStream_errored, "f");
  177. }
  178. get aborted() {
  179. return __classPrivateFieldGet(this, _MessageStream_aborted, "f");
  180. }
  181. abort() {
  182. this.controller.abort();
  183. }
  184. /**
  185. * Adds the listener function to the end of the listeners array for the event.
  186. * No checks are made to see if the listener has already been added. Multiple calls passing
  187. * the same combination of event and listener will result in the listener being added, and
  188. * called, multiple times.
  189. * @returns this MessageStream, so that calls can be chained
  190. */
  191. on(event, listener) {
  192. const listeners = __classPrivateFieldGet(this, _MessageStream_listeners, "f")[event] || (__classPrivateFieldGet(this, _MessageStream_listeners, "f")[event] = []);
  193. listeners.push({ listener });
  194. return this;
  195. }
  196. /**
  197. * Removes the specified listener from the listener array for the event.
  198. * off() will remove, at most, one instance of a listener from the listener array. If any single
  199. * listener has been added multiple times to the listener array for the specified event, then
  200. * off() must be called multiple times to remove each instance.
  201. * @returns this MessageStream, so that calls can be chained
  202. */
  203. off(event, listener) {
  204. const listeners = __classPrivateFieldGet(this, _MessageStream_listeners, "f")[event];
  205. if (!listeners)
  206. return this;
  207. const index = listeners.findIndex((l) => l.listener === listener);
  208. if (index >= 0)
  209. listeners.splice(index, 1);
  210. return this;
  211. }
  212. /**
  213. * Adds a one-time listener function for the event. The next time the event is triggered,
  214. * this listener is removed and then invoked.
  215. * @returns this MessageStream, so that calls can be chained
  216. */
  217. once(event, listener) {
  218. const listeners = __classPrivateFieldGet(this, _MessageStream_listeners, "f")[event] || (__classPrivateFieldGet(this, _MessageStream_listeners, "f")[event] = []);
  219. listeners.push({ listener, once: true });
  220. return this;
  221. }
  222. /**
  223. * This is similar to `.once()`, but returns a Promise that resolves the next time
  224. * the event is triggered, instead of calling a listener callback.
  225. * @returns a Promise that resolves the next time given event is triggered,
  226. * or rejects if an error is emitted. (If you request the 'error' event,
  227. * returns a promise that resolves with the error).
  228. *
  229. * Example:
  230. *
  231. * const message = await stream.emitted('message') // rejects if the stream errors
  232. */
  233. emitted(event) {
  234. return new Promise((resolve, reject) => {
  235. __classPrivateFieldSet(this, _MessageStream_catchingPromiseCreated, true, "f");
  236. if (event !== 'error')
  237. this.once('error', reject);
  238. this.once(event, resolve);
  239. });
  240. }
  241. async done() {
  242. __classPrivateFieldSet(this, _MessageStream_catchingPromiseCreated, true, "f");
  243. await __classPrivateFieldGet(this, _MessageStream_endPromise, "f");
  244. }
  245. get currentMessage() {
  246. return __classPrivateFieldGet(this, _MessageStream_currentMessageSnapshot, "f");
  247. }
  248. /**
  249. * @returns a promise that resolves with the the final assistant Message response,
  250. * or rejects if an error occurred or the stream ended prematurely without producing a Message.
  251. * If structured outputs were used, this will be a ParsedMessage with a `parsed_output` field.
  252. */
  253. async finalMessage() {
  254. await this.done();
  255. return __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_getFinalMessage).call(this);
  256. }
  257. /**
  258. * @returns a promise that resolves with the the final assistant Message's text response, concatenated
  259. * together if there are more than one text blocks.
  260. * Rejects if an error occurred or the stream ended prematurely without producing a Message.
  261. */
  262. async finalText() {
  263. await this.done();
  264. return __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_getFinalText).call(this);
  265. }
  266. _emit(event, ...args) {
  267. // make sure we don't emit any MessageStreamEvents after end
  268. if (__classPrivateFieldGet(this, _MessageStream_ended, "f"))
  269. return;
  270. if (event === 'end') {
  271. __classPrivateFieldSet(this, _MessageStream_ended, true, "f");
  272. __classPrivateFieldGet(this, _MessageStream_resolveEndPromise, "f").call(this);
  273. }
  274. const listeners = __classPrivateFieldGet(this, _MessageStream_listeners, "f")[event];
  275. if (listeners) {
  276. __classPrivateFieldGet(this, _MessageStream_listeners, "f")[event] = listeners.filter((l) => !l.once);
  277. listeners.forEach(({ listener }) => listener(...args));
  278. }
  279. if (event === 'abort') {
  280. const error = args[0];
  281. if (!__classPrivateFieldGet(this, _MessageStream_catchingPromiseCreated, "f") && !listeners?.length) {
  282. Promise.reject(error);
  283. }
  284. __classPrivateFieldGet(this, _MessageStream_rejectConnectedPromise, "f").call(this, error);
  285. __classPrivateFieldGet(this, _MessageStream_rejectEndPromise, "f").call(this, error);
  286. this._emit('end');
  287. return;
  288. }
  289. if (event === 'error') {
  290. // NOTE: _emit('error', error) should only be called from #handleError().
  291. const error = args[0];
  292. if (!__classPrivateFieldGet(this, _MessageStream_catchingPromiseCreated, "f") && !listeners?.length) {
  293. // Trigger an unhandled rejection if the user hasn't registered any error handlers.
  294. // If you are seeing stack traces here, make sure to handle errors via either:
  295. // - runner.on('error', () => ...)
  296. // - await runner.done()
  297. // - await runner.final...()
  298. // - etc.
  299. Promise.reject(error);
  300. }
  301. __classPrivateFieldGet(this, _MessageStream_rejectConnectedPromise, "f").call(this, error);
  302. __classPrivateFieldGet(this, _MessageStream_rejectEndPromise, "f").call(this, error);
  303. this._emit('end');
  304. }
  305. }
  306. _emitFinal() {
  307. const finalMessage = this.receivedMessages.at(-1);
  308. if (finalMessage) {
  309. this._emit('finalMessage', __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_getFinalMessage).call(this));
  310. }
  311. }
  312. async _fromReadableStream(readableStream, options) {
  313. const signal = options?.signal;
  314. let abortHandler;
  315. if (signal) {
  316. if (signal.aborted)
  317. this.controller.abort();
  318. abortHandler = this.controller.abort.bind(this.controller);
  319. signal.addEventListener('abort', abortHandler);
  320. }
  321. try {
  322. __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_beginRequest).call(this);
  323. this._connected(null);
  324. const stream = Stream.fromReadableStream(readableStream, this.controller);
  325. for await (const event of stream) {
  326. __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_addStreamEvent).call(this, event);
  327. }
  328. if (stream.controller.signal?.aborted) {
  329. throw new APIUserAbortError();
  330. }
  331. __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_endRequest).call(this);
  332. }
  333. finally {
  334. if (signal && abortHandler) {
  335. signal.removeEventListener('abort', abortHandler);
  336. }
  337. }
  338. }
  339. [(_MessageStream_currentMessageSnapshot = new WeakMap(), _MessageStream_params = new WeakMap(), _MessageStream_connectedPromise = new WeakMap(), _MessageStream_resolveConnectedPromise = new WeakMap(), _MessageStream_rejectConnectedPromise = new WeakMap(), _MessageStream_endPromise = new WeakMap(), _MessageStream_resolveEndPromise = new WeakMap(), _MessageStream_rejectEndPromise = new WeakMap(), _MessageStream_listeners = new WeakMap(), _MessageStream_ended = new WeakMap(), _MessageStream_errored = new WeakMap(), _MessageStream_aborted = new WeakMap(), _MessageStream_catchingPromiseCreated = new WeakMap(), _MessageStream_response = new WeakMap(), _MessageStream_request_id = new WeakMap(), _MessageStream_logger = new WeakMap(), _MessageStream_handleError = new WeakMap(), _MessageStream_instances = new WeakSet(), _MessageStream_getFinalMessage = function _MessageStream_getFinalMessage() {
  340. if (this.receivedMessages.length === 0) {
  341. throw new AnthropicError('stream ended without producing a Message with role=assistant');
  342. }
  343. return this.receivedMessages.at(-1);
  344. }, _MessageStream_getFinalText = function _MessageStream_getFinalText() {
  345. if (this.receivedMessages.length === 0) {
  346. throw new AnthropicError('stream ended without producing a Message with role=assistant');
  347. }
  348. const textBlocks = this.receivedMessages
  349. .at(-1)
  350. .content.filter((block) => block.type === 'text')
  351. .map((block) => block.text);
  352. if (textBlocks.length === 0) {
  353. throw new AnthropicError('stream ended without producing a content block with type=text');
  354. }
  355. return textBlocks.join(' ');
  356. }, _MessageStream_beginRequest = function _MessageStream_beginRequest() {
  357. if (this.ended)
  358. return;
  359. __classPrivateFieldSet(this, _MessageStream_currentMessageSnapshot, undefined, "f");
  360. }, _MessageStream_addStreamEvent = function _MessageStream_addStreamEvent(event) {
  361. if (this.ended)
  362. return;
  363. const messageSnapshot = __classPrivateFieldGet(this, _MessageStream_instances, "m", _MessageStream_accumulateMessage).call(this, event);
  364. this._emit('streamEvent', event, messageSnapshot);
  365. switch (event.type) {
  366. case 'content_block_delta': {
  367. const content = messageSnapshot.content.at(-1);
  368. switch (event.delta.type) {
  369. case 'text_delta': {
  370. if (content.type === 'text') {
  371. this._emit('text', event.delta.text, content.text || '');
  372. }
  373. break;
  374. }
  375. case 'citations_delta': {
  376. if (content.type === 'text') {
  377. this._emit('citation', event.delta.citation, content.citations ?? []);
  378. }
  379. break;
  380. }
  381. case 'input_json_delta': {
  382. if (tracksToolInput(content) && content.input) {
  383. this._emit('inputJson', event.delta.partial_json, content.input);
  384. }
  385. break;
  386. }
  387. case 'thinking_delta': {
  388. if (content.type === 'thinking') {
  389. this._emit('thinking', event.delta.thinking, content.thinking);
  390. }
  391. break;
  392. }
  393. case 'signature_delta': {
  394. if (content.type === 'thinking') {
  395. this._emit('signature', content.signature);
  396. }
  397. break;
  398. }
  399. default:
  400. checkNever(event.delta);
  401. }
  402. break;
  403. }
  404. case 'message_stop': {
  405. this._addMessageParam(messageSnapshot);
  406. this._addMessage(maybeParseMessage(messageSnapshot, __classPrivateFieldGet(this, _MessageStream_params, "f"), { logger: __classPrivateFieldGet(this, _MessageStream_logger, "f") }), true);
  407. break;
  408. }
  409. case 'content_block_stop': {
  410. this._emit('contentBlock', messageSnapshot.content.at(-1));
  411. break;
  412. }
  413. case 'message_start': {
  414. __classPrivateFieldSet(this, _MessageStream_currentMessageSnapshot, messageSnapshot, "f");
  415. break;
  416. }
  417. case 'content_block_start':
  418. case 'message_delta':
  419. break;
  420. }
  421. }, _MessageStream_endRequest = function _MessageStream_endRequest() {
  422. if (this.ended) {
  423. throw new AnthropicError(`stream has ended, this shouldn't happen`);
  424. }
  425. const snapshot = __classPrivateFieldGet(this, _MessageStream_currentMessageSnapshot, "f");
  426. if (!snapshot) {
  427. throw new AnthropicError(`request ended without sending any chunks`);
  428. }
  429. __classPrivateFieldSet(this, _MessageStream_currentMessageSnapshot, undefined, "f");
  430. return maybeParseMessage(snapshot, __classPrivateFieldGet(this, _MessageStream_params, "f"), { logger: __classPrivateFieldGet(this, _MessageStream_logger, "f") });
  431. }, _MessageStream_accumulateMessage = function _MessageStream_accumulateMessage(event) {
  432. let snapshot = __classPrivateFieldGet(this, _MessageStream_currentMessageSnapshot, "f");
  433. if (event.type === 'message_start') {
  434. if (snapshot) {
  435. throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving "message_stop"`);
  436. }
  437. return event.message;
  438. }
  439. if (!snapshot) {
  440. throw new AnthropicError(`Unexpected event order, got ${event.type} before "message_start"`);
  441. }
  442. switch (event.type) {
  443. case 'message_stop':
  444. return snapshot;
  445. case 'message_delta':
  446. snapshot.stop_reason = event.delta.stop_reason;
  447. snapshot.stop_sequence = event.delta.stop_sequence;
  448. snapshot.usage.output_tokens = event.usage.output_tokens;
  449. // Update other usage fields if they exist in the event
  450. if (event.usage.input_tokens != null) {
  451. snapshot.usage.input_tokens = event.usage.input_tokens;
  452. }
  453. if (event.usage.cache_creation_input_tokens != null) {
  454. snapshot.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens;
  455. }
  456. if (event.usage.cache_read_input_tokens != null) {
  457. snapshot.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens;
  458. }
  459. if (event.usage.server_tool_use != null) {
  460. snapshot.usage.server_tool_use = event.usage.server_tool_use;
  461. }
  462. return snapshot;
  463. case 'content_block_start':
  464. snapshot.content.push({ ...event.content_block });
  465. return snapshot;
  466. case 'content_block_delta': {
  467. const snapshotContent = snapshot.content.at(event.index);
  468. switch (event.delta.type) {
  469. case 'text_delta': {
  470. if (snapshotContent?.type === 'text') {
  471. snapshot.content[event.index] = {
  472. ...snapshotContent,
  473. text: (snapshotContent.text || '') + event.delta.text,
  474. };
  475. }
  476. break;
  477. }
  478. case 'citations_delta': {
  479. if (snapshotContent?.type === 'text') {
  480. snapshot.content[event.index] = {
  481. ...snapshotContent,
  482. citations: [...(snapshotContent.citations ?? []), event.delta.citation],
  483. };
  484. }
  485. break;
  486. }
  487. case 'input_json_delta': {
  488. if (snapshotContent && tracksToolInput(snapshotContent)) {
  489. // we need to keep track of the raw JSON string as well so that we can
  490. // re-parse it for each delta, for now we just store it as an untyped
  491. // non-enumerable property on the snapshot
  492. let jsonBuf = snapshotContent[JSON_BUF_PROPERTY] || '';
  493. jsonBuf += event.delta.partial_json;
  494. const newContent = { ...snapshotContent };
  495. Object.defineProperty(newContent, JSON_BUF_PROPERTY, {
  496. value: jsonBuf,
  497. enumerable: false,
  498. writable: true,
  499. });
  500. if (jsonBuf) {
  501. newContent.input = partialParse(jsonBuf);
  502. }
  503. snapshot.content[event.index] = newContent;
  504. }
  505. break;
  506. }
  507. case 'thinking_delta': {
  508. if (snapshotContent?.type === 'thinking') {
  509. snapshot.content[event.index] = {
  510. ...snapshotContent,
  511. thinking: snapshotContent.thinking + event.delta.thinking,
  512. };
  513. }
  514. break;
  515. }
  516. case 'signature_delta': {
  517. if (snapshotContent?.type === 'thinking') {
  518. snapshot.content[event.index] = {
  519. ...snapshotContent,
  520. signature: event.delta.signature,
  521. };
  522. }
  523. break;
  524. }
  525. default:
  526. checkNever(event.delta);
  527. }
  528. return snapshot;
  529. }
  530. case 'content_block_stop':
  531. return snapshot;
  532. }
  533. }, Symbol.asyncIterator)]() {
  534. const pushQueue = [];
  535. const readQueue = [];
  536. let done = false;
  537. this.on('streamEvent', (event) => {
  538. const reader = readQueue.shift();
  539. if (reader) {
  540. reader.resolve(event);
  541. }
  542. else {
  543. pushQueue.push(event);
  544. }
  545. });
  546. this.on('end', () => {
  547. done = true;
  548. for (const reader of readQueue) {
  549. reader.resolve(undefined);
  550. }
  551. readQueue.length = 0;
  552. });
  553. this.on('abort', (err) => {
  554. done = true;
  555. for (const reader of readQueue) {
  556. reader.reject(err);
  557. }
  558. readQueue.length = 0;
  559. });
  560. this.on('error', (err) => {
  561. done = true;
  562. for (const reader of readQueue) {
  563. reader.reject(err);
  564. }
  565. readQueue.length = 0;
  566. });
  567. return {
  568. next: async () => {
  569. if (!pushQueue.length) {
  570. if (done) {
  571. return { value: undefined, done: true };
  572. }
  573. return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));
  574. }
  575. const chunk = pushQueue.shift();
  576. return { value: chunk, done: false };
  577. },
  578. return: async () => {
  579. this.abort();
  580. return { value: undefined, done: true };
  581. },
  582. };
  583. }
  584. toReadableStream() {
  585. const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);
  586. return stream.toReadableStream();
  587. }
  588. }
  589. // used to ensure exhaustive case matching without throwing a runtime error
  590. function checkNever(x) { }
  591. //# sourceMappingURL=MessageStream.mjs.map