BetaMessageStream.mjs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. var _BetaMessageStream_instances, _BetaMessageStream_currentMessageSnapshot, _BetaMessageStream_params, _BetaMessageStream_connectedPromise, _BetaMessageStream_resolveConnectedPromise, _BetaMessageStream_rejectConnectedPromise, _BetaMessageStream_endPromise, _BetaMessageStream_resolveEndPromise, _BetaMessageStream_rejectEndPromise, _BetaMessageStream_listeners, _BetaMessageStream_ended, _BetaMessageStream_errored, _BetaMessageStream_aborted, _BetaMessageStream_catchingPromiseCreated, _BetaMessageStream_response, _BetaMessageStream_request_id, _BetaMessageStream_logger, _BetaMessageStream_getFinalMessage, _BetaMessageStream_getFinalText, _BetaMessageStream_handleError, _BetaMessageStream_beginRequest, _BetaMessageStream_addStreamEvent, _BetaMessageStream_endRequest, _BetaMessageStream_accumulateMessage;
  2. import { __classPrivateFieldGet, __classPrivateFieldSet } from "../internal/tslib.mjs";
  3. import { partialParse } from "../_vendor/partial-json-parser/parser.mjs";
  4. import { AnthropicError, APIUserAbortError } from "../error.mjs";
  5. import { isAbortError } from "../internal/errors.mjs";
  6. import { Stream } from "../streaming.mjs";
  7. import { maybeParseBetaMessage } from "./beta-parser.mjs";
  8. const JSON_BUF_PROPERTY = '__json_buf';
  9. function tracksToolInput(content) {
  10. return content.type === 'tool_use' || content.type === 'server_tool_use' || content.type === 'mcp_tool_use';
  11. }
  12. export class BetaMessageStream {
  13. constructor(params, opts) {
  14. _BetaMessageStream_instances.add(this);
  15. this.messages = [];
  16. this.receivedMessages = [];
  17. _BetaMessageStream_currentMessageSnapshot.set(this, void 0);
  18. _BetaMessageStream_params.set(this, null);
  19. this.controller = new AbortController();
  20. _BetaMessageStream_connectedPromise.set(this, void 0);
  21. _BetaMessageStream_resolveConnectedPromise.set(this, () => { });
  22. _BetaMessageStream_rejectConnectedPromise.set(this, () => { });
  23. _BetaMessageStream_endPromise.set(this, void 0);
  24. _BetaMessageStream_resolveEndPromise.set(this, () => { });
  25. _BetaMessageStream_rejectEndPromise.set(this, () => { });
  26. _BetaMessageStream_listeners.set(this, {});
  27. _BetaMessageStream_ended.set(this, false);
  28. _BetaMessageStream_errored.set(this, false);
  29. _BetaMessageStream_aborted.set(this, false);
  30. _BetaMessageStream_catchingPromiseCreated.set(this, false);
  31. _BetaMessageStream_response.set(this, void 0);
  32. _BetaMessageStream_request_id.set(this, void 0);
  33. _BetaMessageStream_logger.set(this, void 0);
  34. _BetaMessageStream_handleError.set(this, (error) => {
  35. __classPrivateFieldSet(this, _BetaMessageStream_errored, true, "f");
  36. if (isAbortError(error)) {
  37. error = new APIUserAbortError();
  38. }
  39. if (error instanceof APIUserAbortError) {
  40. __classPrivateFieldSet(this, _BetaMessageStream_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, _BetaMessageStream_connectedPromise, new Promise((resolve, reject) => {
  55. __classPrivateFieldSet(this, _BetaMessageStream_resolveConnectedPromise, resolve, "f");
  56. __classPrivateFieldSet(this, _BetaMessageStream_rejectConnectedPromise, reject, "f");
  57. }), "f");
  58. __classPrivateFieldSet(this, _BetaMessageStream_endPromise, new Promise((resolve, reject) => {
  59. __classPrivateFieldSet(this, _BetaMessageStream_resolveEndPromise, resolve, "f");
  60. __classPrivateFieldSet(this, _BetaMessageStream_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, _BetaMessageStream_connectedPromise, "f").catch(() => { });
  67. __classPrivateFieldGet(this, _BetaMessageStream_endPromise, "f").catch(() => { });
  68. __classPrivateFieldSet(this, _BetaMessageStream_params, params, "f");
  69. __classPrivateFieldSet(this, _BetaMessageStream_logger, opts?.logger ?? console, "f");
  70. }
  71. get response() {
  72. return __classPrivateFieldGet(this, _BetaMessageStream_response, "f");
  73. }
  74. get request_id() {
  75. return __classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_catchingPromiseCreated, true, "f");
  89. const response = await __classPrivateFieldGet(this, _BetaMessageStream_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 BetaMessageStream(null);
  108. runner._run(() => runner._fromReadableStream(stream));
  109. return runner;
  110. }
  111. static createMessage(messages, params, options, { logger } = {}) {
  112. const runner = new BetaMessageStream(params, { logger });
  113. for (const message of params.messages) {
  114. runner._addMessageParam(message);
  115. }
  116. __classPrivateFieldSet(runner, _BetaMessageStream_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, _BetaMessageStream_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, _BetaMessageStream_instances, "m", _BetaMessageStream_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, _BetaMessageStream_instances, "m", _BetaMessageStream_addStreamEvent).call(this, event);
  152. }
  153. if (stream.controller.signal?.aborted) {
  154. throw new APIUserAbortError();
  155. }
  156. __classPrivateFieldGet(this, _BetaMessageStream_instances, "m", _BetaMessageStream_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, _BetaMessageStream_response, response, "f");
  168. __classPrivateFieldSet(this, _BetaMessageStream_request_id, response?.headers.get('request-id'), "f");
  169. __classPrivateFieldGet(this, _BetaMessageStream_resolveConnectedPromise, "f").call(this, response);
  170. this._emit('connect');
  171. }
  172. get ended() {
  173. return __classPrivateFieldGet(this, _BetaMessageStream_ended, "f");
  174. }
  175. get errored() {
  176. return __classPrivateFieldGet(this, _BetaMessageStream_errored, "f");
  177. }
  178. get aborted() {
  179. return __classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_listeners, "f")[event] || (__classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_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, _BetaMessageStream_listeners, "f")[event] || (__classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_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, _BetaMessageStream_catchingPromiseCreated, true, "f");
  243. await __classPrivateFieldGet(this, _BetaMessageStream_endPromise, "f");
  244. }
  245. get currentMessage() {
  246. return __classPrivateFieldGet(this, _BetaMessageStream_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` field.
  252. */
  253. async finalMessage() {
  254. await this.done();
  255. return __classPrivateFieldGet(this, _BetaMessageStream_instances, "m", _BetaMessageStream_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, _BetaMessageStream_instances, "m", _BetaMessageStream_getFinalText).call(this);
  265. }
  266. _emit(event, ...args) {
  267. // make sure we don't emit any MessageStreamEvents after end
  268. if (__classPrivateFieldGet(this, _BetaMessageStream_ended, "f"))
  269. return;
  270. if (event === 'end') {
  271. __classPrivateFieldSet(this, _BetaMessageStream_ended, true, "f");
  272. __classPrivateFieldGet(this, _BetaMessageStream_resolveEndPromise, "f").call(this);
  273. }
  274. const listeners = __classPrivateFieldGet(this, _BetaMessageStream_listeners, "f")[event];
  275. if (listeners) {
  276. __classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_catchingPromiseCreated, "f") && !listeners?.length) {
  282. Promise.reject(error);
  283. }
  284. __classPrivateFieldGet(this, _BetaMessageStream_rejectConnectedPromise, "f").call(this, error);
  285. __classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_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, _BetaMessageStream_rejectConnectedPromise, "f").call(this, error);
  302. __classPrivateFieldGet(this, _BetaMessageStream_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, _BetaMessageStream_instances, "m", _BetaMessageStream_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, _BetaMessageStream_instances, "m", _BetaMessageStream_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, _BetaMessageStream_instances, "m", _BetaMessageStream_addStreamEvent).call(this, event);
  327. }
  328. if (stream.controller.signal?.aborted) {
  329. throw new APIUserAbortError();
  330. }
  331. __classPrivateFieldGet(this, _BetaMessageStream_instances, "m", _BetaMessageStream_endRequest).call(this);
  332. }
  333. finally {
  334. if (signal && abortHandler) {
  335. signal.removeEventListener('abort', abortHandler);
  336. }
  337. }
  338. }
  339. [(_BetaMessageStream_currentMessageSnapshot = new WeakMap(), _BetaMessageStream_params = new WeakMap(), _BetaMessageStream_connectedPromise = new WeakMap(), _BetaMessageStream_resolveConnectedPromise = new WeakMap(), _BetaMessageStream_rejectConnectedPromise = new WeakMap(), _BetaMessageStream_endPromise = new WeakMap(), _BetaMessageStream_resolveEndPromise = new WeakMap(), _BetaMessageStream_rejectEndPromise = new WeakMap(), _BetaMessageStream_listeners = new WeakMap(), _BetaMessageStream_ended = new WeakMap(), _BetaMessageStream_errored = new WeakMap(), _BetaMessageStream_aborted = new WeakMap(), _BetaMessageStream_catchingPromiseCreated = new WeakMap(), _BetaMessageStream_response = new WeakMap(), _BetaMessageStream_request_id = new WeakMap(), _BetaMessageStream_logger = new WeakMap(), _BetaMessageStream_handleError = new WeakMap(), _BetaMessageStream_instances = new WeakSet(), _BetaMessageStream_getFinalMessage = function _BetaMessageStream_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. }, _BetaMessageStream_getFinalText = function _BetaMessageStream_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. }, _BetaMessageStream_beginRequest = function _BetaMessageStream_beginRequest() {
  357. if (this.ended)
  358. return;
  359. __classPrivateFieldSet(this, _BetaMessageStream_currentMessageSnapshot, undefined, "f");
  360. }, _BetaMessageStream_addStreamEvent = function _BetaMessageStream_addStreamEvent(event) {
  361. if (this.ended)
  362. return;
  363. const messageSnapshot = __classPrivateFieldGet(this, _BetaMessageStream_instances, "m", _BetaMessageStream_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. case 'compaction_delta': {
  400. if (content.type === 'compaction' && content.content) {
  401. this._emit('compaction', content.content);
  402. }
  403. break;
  404. }
  405. default:
  406. checkNever(event.delta);
  407. }
  408. break;
  409. }
  410. case 'message_stop': {
  411. this._addMessageParam(messageSnapshot);
  412. this._addMessage(maybeParseBetaMessage(messageSnapshot, __classPrivateFieldGet(this, _BetaMessageStream_params, "f"), { logger: __classPrivateFieldGet(this, _BetaMessageStream_logger, "f") }), true);
  413. break;
  414. }
  415. case 'content_block_stop': {
  416. this._emit('contentBlock', messageSnapshot.content.at(-1));
  417. break;
  418. }
  419. case 'message_start': {
  420. __classPrivateFieldSet(this, _BetaMessageStream_currentMessageSnapshot, messageSnapshot, "f");
  421. break;
  422. }
  423. case 'content_block_start':
  424. case 'message_delta':
  425. break;
  426. }
  427. }, _BetaMessageStream_endRequest = function _BetaMessageStream_endRequest() {
  428. if (this.ended) {
  429. throw new AnthropicError(`stream has ended, this shouldn't happen`);
  430. }
  431. const snapshot = __classPrivateFieldGet(this, _BetaMessageStream_currentMessageSnapshot, "f");
  432. if (!snapshot) {
  433. throw new AnthropicError(`request ended without sending any chunks`);
  434. }
  435. __classPrivateFieldSet(this, _BetaMessageStream_currentMessageSnapshot, undefined, "f");
  436. return maybeParseBetaMessage(snapshot, __classPrivateFieldGet(this, _BetaMessageStream_params, "f"), { logger: __classPrivateFieldGet(this, _BetaMessageStream_logger, "f") });
  437. }, _BetaMessageStream_accumulateMessage = function _BetaMessageStream_accumulateMessage(event) {
  438. let snapshot = __classPrivateFieldGet(this, _BetaMessageStream_currentMessageSnapshot, "f");
  439. if (event.type === 'message_start') {
  440. if (snapshot) {
  441. throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving "message_stop"`);
  442. }
  443. return event.message;
  444. }
  445. if (!snapshot) {
  446. throw new AnthropicError(`Unexpected event order, got ${event.type} before "message_start"`);
  447. }
  448. switch (event.type) {
  449. case 'message_stop':
  450. return snapshot;
  451. case 'message_delta':
  452. snapshot.container = event.delta.container;
  453. snapshot.stop_reason = event.delta.stop_reason;
  454. snapshot.stop_sequence = event.delta.stop_sequence;
  455. snapshot.usage.output_tokens = event.usage.output_tokens;
  456. snapshot.context_management = event.context_management;
  457. if (event.usage.input_tokens != null) {
  458. snapshot.usage.input_tokens = event.usage.input_tokens;
  459. }
  460. if (event.usage.cache_creation_input_tokens != null) {
  461. snapshot.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens;
  462. }
  463. if (event.usage.cache_read_input_tokens != null) {
  464. snapshot.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens;
  465. }
  466. if (event.usage.server_tool_use != null) {
  467. snapshot.usage.server_tool_use = event.usage.server_tool_use;
  468. }
  469. if (event.usage.iterations != null) {
  470. snapshot.usage.iterations = event.usage.iterations;
  471. }
  472. return snapshot;
  473. case 'content_block_start':
  474. snapshot.content.push(event.content_block);
  475. return snapshot;
  476. case 'content_block_delta': {
  477. const snapshotContent = snapshot.content.at(event.index);
  478. switch (event.delta.type) {
  479. case 'text_delta': {
  480. if (snapshotContent?.type === 'text') {
  481. snapshot.content[event.index] = {
  482. ...snapshotContent,
  483. text: (snapshotContent.text || '') + event.delta.text,
  484. };
  485. }
  486. break;
  487. }
  488. case 'citations_delta': {
  489. if (snapshotContent?.type === 'text') {
  490. snapshot.content[event.index] = {
  491. ...snapshotContent,
  492. citations: [...(snapshotContent.citations ?? []), event.delta.citation],
  493. };
  494. }
  495. break;
  496. }
  497. case 'input_json_delta': {
  498. if (snapshotContent && tracksToolInput(snapshotContent)) {
  499. // we need to keep track of the raw JSON string as well so that we can
  500. // re-parse it for each delta, for now we just store it as an untyped
  501. // non-enumerable property on the snapshot
  502. let jsonBuf = snapshotContent[JSON_BUF_PROPERTY] || '';
  503. jsonBuf += event.delta.partial_json;
  504. const newContent = { ...snapshotContent };
  505. Object.defineProperty(newContent, JSON_BUF_PROPERTY, {
  506. value: jsonBuf,
  507. enumerable: false,
  508. writable: true,
  509. });
  510. if (jsonBuf) {
  511. try {
  512. newContent.input = partialParse(jsonBuf);
  513. }
  514. catch (err) {
  515. const error = new AnthropicError(`Unable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: ${err}. JSON: ${jsonBuf}`);
  516. __classPrivateFieldGet(this, _BetaMessageStream_handleError, "f").call(this, error);
  517. }
  518. }
  519. snapshot.content[event.index] = newContent;
  520. }
  521. break;
  522. }
  523. case 'thinking_delta': {
  524. if (snapshotContent?.type === 'thinking') {
  525. snapshot.content[event.index] = {
  526. ...snapshotContent,
  527. thinking: snapshotContent.thinking + event.delta.thinking,
  528. };
  529. }
  530. break;
  531. }
  532. case 'signature_delta': {
  533. if (snapshotContent?.type === 'thinking') {
  534. snapshot.content[event.index] = {
  535. ...snapshotContent,
  536. signature: event.delta.signature,
  537. };
  538. }
  539. break;
  540. }
  541. case 'compaction_delta': {
  542. if (snapshotContent?.type === 'compaction') {
  543. snapshot.content[event.index] = {
  544. ...snapshotContent,
  545. content: (snapshotContent.content || '') + event.delta.content,
  546. };
  547. }
  548. break;
  549. }
  550. default:
  551. checkNever(event.delta);
  552. }
  553. return snapshot;
  554. }
  555. case 'content_block_stop':
  556. return snapshot;
  557. }
  558. }, Symbol.asyncIterator)]() {
  559. const pushQueue = [];
  560. const readQueue = [];
  561. let done = false;
  562. this.on('streamEvent', (event) => {
  563. const reader = readQueue.shift();
  564. if (reader) {
  565. reader.resolve(event);
  566. }
  567. else {
  568. pushQueue.push(event);
  569. }
  570. });
  571. this.on('end', () => {
  572. done = true;
  573. for (const reader of readQueue) {
  574. reader.resolve(undefined);
  575. }
  576. readQueue.length = 0;
  577. });
  578. this.on('abort', (err) => {
  579. done = true;
  580. for (const reader of readQueue) {
  581. reader.reject(err);
  582. }
  583. readQueue.length = 0;
  584. });
  585. this.on('error', (err) => {
  586. done = true;
  587. for (const reader of readQueue) {
  588. reader.reject(err);
  589. }
  590. readQueue.length = 0;
  591. });
  592. return {
  593. next: async () => {
  594. if (!pushQueue.length) {
  595. if (done) {
  596. return { value: undefined, done: true };
  597. }
  598. return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));
  599. }
  600. const chunk = pushQueue.shift();
  601. return { value: chunk, done: false };
  602. },
  603. return: async () => {
  604. this.abort();
  605. return { value: undefined, done: true };
  606. },
  607. };
  608. }
  609. toReadableStream() {
  610. const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);
  611. return stream.toReadableStream();
  612. }
  613. }
  614. // used to ensure exhaustive case matching without throwing a runtime error
  615. function checkNever(x) { }
  616. //# sourceMappingURL=BetaMessageStream.mjs.map