phenoml 6.3.1 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/cjs/Client.js +2 -2
  2. package/dist/cjs/api/resources/agent/client/Client.d.ts +8 -1
  3. package/dist/cjs/api/resources/agent/client/Client.js +82 -1
  4. package/dist/cjs/api/resources/agent/client/requests/AgentStreamChatRequest.d.ts +31 -0
  5. package/dist/cjs/api/resources/agent/client/requests/AgentStreamChatRequest.js +3 -0
  6. package/dist/cjs/api/resources/agent/client/requests/index.d.ts +1 -0
  7. package/dist/cjs/api/resources/agent/types/AgentChatStreamEvent.d.ts +36 -0
  8. package/dist/cjs/api/resources/agent/types/AgentChatStreamEvent.js +16 -0
  9. package/dist/cjs/api/resources/agent/types/index.d.ts +1 -0
  10. package/dist/cjs/api/resources/agent/types/index.js +1 -0
  11. package/dist/cjs/api/resources/fhirProvider/types/Provider.d.ts +1 -0
  12. package/dist/cjs/api/resources/fhirProvider/types/Provider.js +1 -0
  13. package/dist/cjs/core/fetcher/Fetcher.js +1 -1
  14. package/dist/cjs/core/index.d.ts +1 -0
  15. package/dist/cjs/core/index.js +1 -0
  16. package/dist/cjs/core/stream/Stream.d.ts +47 -0
  17. package/dist/cjs/core/stream/Stream.js +175 -0
  18. package/dist/cjs/core/stream/index.d.ts +1 -0
  19. package/dist/cjs/core/stream/index.js +5 -0
  20. package/dist/cjs/version.d.ts +1 -1
  21. package/dist/cjs/version.js +1 -1
  22. package/dist/esm/Client.mjs +2 -2
  23. package/dist/esm/api/resources/agent/client/Client.d.mts +8 -1
  24. package/dist/esm/api/resources/agent/client/Client.mjs +82 -1
  25. package/dist/esm/api/resources/agent/client/requests/AgentStreamChatRequest.d.mts +31 -0
  26. package/dist/esm/api/resources/agent/client/requests/AgentStreamChatRequest.mjs +2 -0
  27. package/dist/esm/api/resources/agent/client/requests/index.d.mts +1 -0
  28. package/dist/esm/api/resources/agent/types/AgentChatStreamEvent.d.mts +36 -0
  29. package/dist/esm/api/resources/agent/types/AgentChatStreamEvent.mjs +13 -0
  30. package/dist/esm/api/resources/agent/types/index.d.mts +1 -0
  31. package/dist/esm/api/resources/agent/types/index.mjs +1 -0
  32. package/dist/esm/api/resources/fhirProvider/types/Provider.d.mts +1 -0
  33. package/dist/esm/api/resources/fhirProvider/types/Provider.mjs +1 -0
  34. package/dist/esm/core/fetcher/Fetcher.mjs +1 -1
  35. package/dist/esm/core/index.d.mts +1 -0
  36. package/dist/esm/core/index.mjs +1 -0
  37. package/dist/esm/core/stream/Stream.d.mts +47 -0
  38. package/dist/esm/core/stream/Stream.mjs +170 -0
  39. package/dist/esm/core/stream/index.d.mts +1 -0
  40. package/dist/esm/core/stream/index.mjs +1 -0
  41. package/dist/esm/version.d.mts +1 -1
  42. package/dist/esm/version.mjs +1 -1
  43. package/package.json +1 -1
  44. package/reference.md +74 -1
@@ -52,8 +52,8 @@ class phenomlClient {
52
52
  this._options = Object.assign(Object.assign({}, _options), { logging: core.logging.createLogger(_options === null || _options === void 0 ? void 0 : _options.logging), headers: (0, headers_js_1.mergeHeaders)({
53
53
  "X-Fern-Language": "JavaScript",
54
54
  "X-Fern-SDK-Name": "phenoml",
55
- "X-Fern-SDK-Version": "6.3.1",
56
- "User-Agent": "phenoml/6.3.1",
55
+ "X-Fern-SDK-Version": "6.4.0",
56
+ "User-Agent": "phenoml/6.4.0",
57
57
  "X-Fern-Runtime": core.RUNTIME.type,
58
58
  "X-Fern-Runtime-Version": core.RUNTIME.version,
59
59
  }, _options === null || _options === void 0 ? void 0 : _options.headers) });
@@ -134,7 +134,7 @@ export declare class Agent {
134
134
  patch(id: string, request: phenoml.agent.JsonPatch, requestOptions?: Agent.RequestOptions): core.HttpResponsePromise<phenoml.agent.AgentResponse>;
135
135
  private __patch;
136
136
  /**
137
- * Send a message to an agent and receive a response
137
+ * Send a message to an agent and receive a JSON response.
138
138
  *
139
139
  * @param {phenoml.agent.AgentChatRequest} request
140
140
  * @param {Agent.RequestOptions} requestOptions - Request-specific configuration.
@@ -154,6 +154,13 @@ export declare class Agent {
154
154
  */
155
155
  chat(request: phenoml.agent.AgentChatRequest, requestOptions?: Agent.RequestOptions): core.HttpResponsePromise<phenoml.agent.AgentChatResponse>;
156
156
  private __chat;
157
+ /**
158
+ * Send a message to an agent and receive the response as a Server-Sent Events
159
+ * (SSE) stream. Events include message_start, content_delta, tool_use,
160
+ * tool_result, message_end, and error.
161
+ */
162
+ streamChat(request: phenoml.agent.AgentStreamChatRequest, requestOptions?: Agent.RequestOptions): core.HttpResponsePromise<core.Stream<phenoml.agent.AgentChatStreamEvent>>;
163
+ private __streamChat;
157
164
  /**
158
165
  * Retrieves a list of chat messages for a given chat session
159
166
  *
@@ -530,7 +530,7 @@ class Agent {
530
530
  });
531
531
  }
532
532
  /**
533
- * Send a message to an agent and receive a response
533
+ * Send a message to an agent and receive a JSON response.
534
534
  *
535
535
  * @param {phenoml.agent.AgentChatRequest} request
536
536
  * @param {Agent.RequestOptions} requestOptions - Request-specific configuration.
@@ -612,6 +612,87 @@ class Agent {
612
612
  }
613
613
  });
614
614
  }
615
+ /**
616
+ * Send a message to an agent and receive the response as a Server-Sent Events
617
+ * (SSE) stream. Events include message_start, content_delta, tool_use,
618
+ * tool_result, message_end, and error.
619
+ */
620
+ streamChat(request, requestOptions) {
621
+ return core.HttpResponsePromise.fromPromise(this.__streamChat(request, requestOptions));
622
+ }
623
+ __streamChat(request, requestOptions) {
624
+ return __awaiter(this, void 0, void 0, function* () {
625
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
626
+ const { "X-Phenoml-On-Behalf-Of": phenomlOnBehalfOf, "X-Phenoml-Fhir-Provider": phenomlFhirProvider } = request, _body = __rest(request, ["X-Phenoml-On-Behalf-Of", "X-Phenoml-Fhir-Provider"]);
627
+ const _headers = (0, headers_js_1.mergeHeaders)((_a = this._options) === null || _a === void 0 ? void 0 : _a.headers, (0, headers_js_1.mergeOnlyDefinedHeaders)({
628
+ Authorization: yield this._getAuthorizationHeader(),
629
+ "X-Phenoml-On-Behalf-Of": phenomlOnBehalfOf != null ? phenomlOnBehalfOf : undefined,
630
+ "X-Phenoml-Fhir-Provider": phenomlFhirProvider != null ? phenomlFhirProvider : undefined,
631
+ }), requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.headers);
632
+ const _response = yield ((_b = this._options.fetcher) !== null && _b !== void 0 ? _b : core.fetcher)({
633
+ url: core.url.join((_d = (_c = (yield core.Supplier.get(this._options.baseUrl))) !== null && _c !== void 0 ? _c : (yield core.Supplier.get(this._options.environment))) !== null && _d !== void 0 ? _d : environments.phenomlEnvironment.Default, "agent/stream-chat"),
634
+ method: "POST",
635
+ headers: _headers,
636
+ contentType: "application/json",
637
+ queryParameters: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.queryParams,
638
+ requestType: "json",
639
+ body: _body,
640
+ responseType: "sse",
641
+ timeoutMs: ((_g = (_e = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.timeoutInSeconds) !== null && _e !== void 0 ? _e : (_f = this._options) === null || _f === void 0 ? void 0 : _f.timeoutInSeconds) !== null && _g !== void 0 ? _g : 60) * 1000,
642
+ maxRetries: (_h = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.maxRetries) !== null && _h !== void 0 ? _h : (_j = this._options) === null || _j === void 0 ? void 0 : _j.maxRetries,
643
+ abortSignal: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.abortSignal,
644
+ fetchFn: (_k = this._options) === null || _k === void 0 ? void 0 : _k.fetch,
645
+ logging: this._options.logging,
646
+ });
647
+ if (_response.ok) {
648
+ return {
649
+ data: new core.Stream({
650
+ stream: _response.body,
651
+ parse: (data) => data,
652
+ signal: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.abortSignal,
653
+ eventShape: {
654
+ type: "sse",
655
+ streamTerminator: "[DONE]",
656
+ },
657
+ }),
658
+ rawResponse: _response.rawResponse,
659
+ };
660
+ }
661
+ if (_response.error.reason === "status-code") {
662
+ switch (_response.error.statusCode) {
663
+ case 400:
664
+ throw new phenoml.agent.BadRequestError(_response.error.body, _response.rawResponse);
665
+ case 401:
666
+ throw new phenoml.agent.UnauthorizedError(_response.error.body, _response.rawResponse);
667
+ case 403:
668
+ throw new phenoml.agent.ForbiddenError(_response.error.body, _response.rawResponse);
669
+ case 500:
670
+ throw new phenoml.agent.InternalServerError(_response.error.body, _response.rawResponse);
671
+ default:
672
+ throw new errors.phenomlError({
673
+ statusCode: _response.error.statusCode,
674
+ body: _response.error.body,
675
+ rawResponse: _response.rawResponse,
676
+ });
677
+ }
678
+ }
679
+ switch (_response.error.reason) {
680
+ case "non-json":
681
+ throw new errors.phenomlError({
682
+ statusCode: _response.error.statusCode,
683
+ body: _response.error.rawBody,
684
+ rawResponse: _response.rawResponse,
685
+ });
686
+ case "timeout":
687
+ throw new errors.phenomlTimeoutError("Timeout exceeded when calling POST /agent/stream-chat.");
688
+ case "unknown":
689
+ throw new errors.phenomlError({
690
+ message: _response.error.errorMessage,
691
+ rawResponse: _response.rawResponse,
692
+ });
693
+ }
694
+ });
695
+ }
615
696
  /**
616
697
  * Retrieves a list of chat messages for a given chat session
617
698
  *
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @example
3
+ * {
4
+ * "X-Phenoml-On-Behalf-Of": "Patient/550e8400-e29b-41d4-a716-446655440000",
5
+ * "X-Phenoml-Fhir-Provider": "550e8400-e29b-41d4-a716-446655440000:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c...",
6
+ * message: "What is the patient's current condition?",
7
+ * agent_id: "agent-123"
8
+ * }
9
+ */
10
+ export interface AgentStreamChatRequest {
11
+ /**
12
+ * Optional header for on-behalf-of authentication. Used when making requests on behalf of another user or entity.
13
+ * Must be in the format: Patient/{uuid} or Practitioner/{uuid}
14
+ */
15
+ "X-Phenoml-On-Behalf-Of"?: string;
16
+ /**
17
+ * Optional header for FHIR provider authentication. Contains credentials in the format {fhir_provider_id}:{oauth2_token}.
18
+ * Multiple FHIR provider integrations can be provided as comma-separated values.
19
+ */
20
+ "X-Phenoml-Fhir-Provider"?: string;
21
+ /** The message to send to the agent */
22
+ message: string;
23
+ /** Optional context for the conversation */
24
+ context?: string;
25
+ /** Optional session ID for conversation continuity */
26
+ session_id?: string;
27
+ /** The ID of the agent to chat with */
28
+ agent_id: string;
29
+ /** Enable enhanced reasoning capabilities, will increase latency but will also improve response quality and reliability. */
30
+ enhanced_reasoning?: boolean;
31
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ // This file was auto-generated by Fern from our API Definition.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +1,4 @@
1
1
  export type { AgentChatRequest } from "./AgentChatRequest.js";
2
2
  export type { AgentGetChatMessagesRequest } from "./AgentGetChatMessagesRequest.js";
3
3
  export type { AgentListRequest } from "./AgentListRequest.js";
4
+ export type { AgentStreamChatRequest } from "./AgentStreamChatRequest.js";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JSON payload sent in the `data:` line of a Server-Sent Event (SSE) frame for streaming chat responses.
3
+ * Each SSE frame uses the standard `event:` and `data:` lines; this schema describes the JSON object
4
+ * in the `data:` line. The event type is encoded in the top-level `type` property.
5
+ * Event types: message_start, content_delta, tool_use, tool_result, message_end, error.
6
+ */
7
+ export interface AgentChatStreamEvent {
8
+ /** The event type */
9
+ type?: AgentChatStreamEvent.Type;
10
+ /** Chat session ID */
11
+ session_id?: string;
12
+ /** Incremental text content (present in content_delta events) */
13
+ content?: string;
14
+ /** Whether the operation was successful */
15
+ success?: boolean;
16
+ /** Status message */
17
+ message?: string;
18
+ /** Tool/function name (present in tool_use and tool_result events) */
19
+ function_name?: string;
20
+ /** Tool arguments (present in tool_use events) */
21
+ function_args?: Record<string, unknown>;
22
+ /** Tool execution result (present in tool_result events) */
23
+ function_result?: Record<string, unknown>;
24
+ }
25
+ export declare namespace AgentChatStreamEvent {
26
+ /** The event type */
27
+ const Type: {
28
+ readonly MessageStart: "message_start";
29
+ readonly ContentDelta: "content_delta";
30
+ readonly ToolUse: "tool_use";
31
+ readonly ToolResult: "tool_result";
32
+ readonly MessageEnd: "message_end";
33
+ readonly Error: "error";
34
+ };
35
+ type Type = (typeof Type)[keyof typeof Type];
36
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ // This file was auto-generated by Fern from our API Definition.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AgentChatStreamEvent = void 0;
5
+ var AgentChatStreamEvent;
6
+ (function (AgentChatStreamEvent) {
7
+ /** The event type */
8
+ AgentChatStreamEvent.Type = {
9
+ MessageStart: "message_start",
10
+ ContentDelta: "content_delta",
11
+ ToolUse: "tool_use",
12
+ ToolResult: "tool_result",
13
+ MessageEnd: "message_end",
14
+ Error: "error",
15
+ };
16
+ })(AgentChatStreamEvent || (exports.AgentChatStreamEvent = AgentChatStreamEvent = {}));
@@ -1,4 +1,5 @@
1
1
  export * from "./AgentChatResponse.js";
2
+ export * from "./AgentChatStreamEvent.js";
2
3
  export * from "./AgentCreateRequest.js";
3
4
  export * from "./AgentDeleteResponse.js";
4
5
  export * from "./AgentGetChatMessagesRequestOrder.js";
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./AgentChatResponse.js"), exports);
18
+ __exportStar(require("./AgentChatStreamEvent.js"), exports);
18
19
  __exportStar(require("./AgentCreateRequest.js"), exports);
19
20
  __exportStar(require("./AgentDeleteResponse.js"), exports);
20
21
  __exportStar(require("./AgentGetChatMessagesRequestOrder.js"), exports);
@@ -13,6 +13,7 @@ export declare const Provider: {
13
13
  readonly GoogleHealthcare: "google_healthcare";
14
14
  readonly Hapi: "hapi";
15
15
  readonly Medplum: "medplum";
16
+ readonly Phenostore: "phenostore";
16
17
  readonly Sandbox: "sandbox";
17
18
  };
18
19
  export type Provider = (typeof Provider)[keyof typeof Provider];
@@ -17,5 +17,6 @@ exports.Provider = {
17
17
  GoogleHealthcare: "google_healthcare",
18
18
  Hapi: "hapi",
19
19
  Medplum: "medplum",
20
+ Phenostore: "phenostore",
20
21
  Sandbox: "sandbox",
21
22
  };
@@ -229,7 +229,7 @@ function fetcherImpl(args) {
229
229
  method: args.method,
230
230
  url: redactUrl(url),
231
231
  statusCode: response.status,
232
- responseHeaders: redactHeaders(response.headers),
232
+ responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())),
233
233
  };
234
234
  logger.error("HTTP request failed with error status", metadata);
235
235
  }
@@ -3,4 +3,5 @@ export * from "./base64.js";
3
3
  export * from "./fetcher/index.js";
4
4
  export * as logging from "./logging/index.js";
5
5
  export * from "./runtime/index.js";
6
+ export * from "./stream/index.js";
6
7
  export * as url from "./url/index.js";
@@ -42,4 +42,5 @@ __exportStar(require("./base64.js"), exports);
42
42
  __exportStar(require("./fetcher/index.js"), exports);
43
43
  exports.logging = __importStar(require("./logging/index.js"));
44
44
  __exportStar(require("./runtime/index.js"), exports);
45
+ __exportStar(require("./stream/index.js"), exports);
45
46
  exports.url = __importStar(require("./url/index.js"));
@@ -0,0 +1,47 @@
1
+ export declare namespace Stream {
2
+ interface Args {
3
+ /**
4
+ * The HTTP response stream to read from.
5
+ */
6
+ stream: ReadableStream;
7
+ /**
8
+ * The event shape to use for parsing the stream data.
9
+ */
10
+ eventShape: JsonEvent | SseEvent;
11
+ /**
12
+ * An abort signal to stop the stream.
13
+ */
14
+ signal?: AbortSignal;
15
+ }
16
+ interface JsonEvent {
17
+ type: "json";
18
+ messageTerminator: string;
19
+ }
20
+ interface SseEvent {
21
+ type: "sse";
22
+ streamTerminator?: string;
23
+ }
24
+ }
25
+ export declare class Stream<T> implements AsyncIterable<T> {
26
+ private stream;
27
+ private parse;
28
+ /**
29
+ * The prefix to use for each message. For example,
30
+ * for SSE, the prefix is "data: ".
31
+ */
32
+ private prefix;
33
+ private messageTerminator;
34
+ private streamTerminator;
35
+ private controller;
36
+ private decoder;
37
+ constructor({ stream, parse, eventShape, signal }: Stream.Args & {
38
+ parse: (val: unknown) => Promise<T>;
39
+ });
40
+ private iterMessages;
41
+ [Symbol.asyncIterator](): AsyncIterator<T, void, unknown>;
42
+ private decodeChunk;
43
+ }
44
+ /**
45
+ * Browser polyfill for ReadableStream
46
+ */
47
+ export declare function readableStreamAsyncIterable<T>(stream: any): AsyncIterableIterator<T>;
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
19
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
20
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
21
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
22
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
23
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
24
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
25
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
26
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
27
+ function fulfill(value) { resume("next", value); }
28
+ function reject(value) { resume("throw", value); }
29
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.Stream = void 0;
33
+ exports.readableStreamAsyncIterable = readableStreamAsyncIterable;
34
+ const index_js_1 = require("../runtime/index.js");
35
+ const DATA_PREFIX = "data:";
36
+ class Stream {
37
+ constructor({ stream, parse, eventShape, signal }) {
38
+ this.controller = new AbortController();
39
+ this.stream = stream;
40
+ this.parse = parse;
41
+ if (eventShape.type === "sse") {
42
+ this.prefix = DATA_PREFIX;
43
+ this.messageTerminator = "\n";
44
+ this.streamTerminator = eventShape.streamTerminator;
45
+ }
46
+ else {
47
+ this.messageTerminator = eventShape.messageTerminator;
48
+ }
49
+ signal === null || signal === void 0 ? void 0 : signal.addEventListener("abort", () => this.controller.abort());
50
+ // Initialize shared TextDecoder
51
+ if (typeof TextDecoder !== "undefined") {
52
+ this.decoder = new TextDecoder("utf-8");
53
+ }
54
+ }
55
+ iterMessages() {
56
+ return __asyncGenerator(this, arguments, function* iterMessages_1() {
57
+ var _a, e_1, _b, _c;
58
+ const signal = this.controller.signal;
59
+ const stream = readableStreamAsyncIterable(this.stream);
60
+ let buf = "";
61
+ let prefixSeen = false;
62
+ try {
63
+ for (var _d = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield __await(stream_1.next()), _a = stream_1_1.done, !_a; _d = true) {
64
+ _c = stream_1_1.value;
65
+ _d = false;
66
+ const chunk = _c;
67
+ if (signal.aborted) {
68
+ break;
69
+ }
70
+ buf += this.decodeChunk(chunk);
71
+ let terminatorIndex;
72
+ while ((terminatorIndex = buf.indexOf(this.messageTerminator)) >= 0) {
73
+ let line = buf.slice(0, terminatorIndex);
74
+ buf = buf.slice(terminatorIndex + this.messageTerminator.length);
75
+ if (!line.trim()) {
76
+ continue;
77
+ }
78
+ if (!prefixSeen && this.prefix != null) {
79
+ const prefixIndex = line.indexOf(this.prefix);
80
+ if (prefixIndex === -1) {
81
+ continue;
82
+ }
83
+ prefixSeen = true;
84
+ line = line.slice(prefixIndex + this.prefix.length);
85
+ }
86
+ if (this.streamTerminator != null && line.includes(this.streamTerminator)) {
87
+ return yield __await(void 0);
88
+ }
89
+ const message = yield __await(this.parse(JSON.parse(line)));
90
+ yield yield __await(message);
91
+ prefixSeen = false;
92
+ }
93
+ }
94
+ }
95
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
96
+ finally {
97
+ try {
98
+ if (!_d && !_a && (_b = stream_1.return)) yield __await(_b.call(stream_1));
99
+ }
100
+ finally { if (e_1) throw e_1.error; }
101
+ }
102
+ });
103
+ }
104
+ [Symbol.asyncIterator]() {
105
+ return __asyncGenerator(this, arguments, function* _a() {
106
+ var _b, e_2, _c, _d;
107
+ try {
108
+ for (var _e = true, _f = __asyncValues(this.iterMessages()), _g; _g = yield __await(_f.next()), _b = _g.done, !_b; _e = true) {
109
+ _d = _g.value;
110
+ _e = false;
111
+ const message = _d;
112
+ yield yield __await(message);
113
+ }
114
+ }
115
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
116
+ finally {
117
+ try {
118
+ if (!_e && !_b && (_c = _f.return)) yield __await(_c.call(_f));
119
+ }
120
+ finally { if (e_2) throw e_2.error; }
121
+ }
122
+ });
123
+ }
124
+ decodeChunk(chunk) {
125
+ let decoded = "";
126
+ // If TextDecoder is available, use the streaming decoder instance
127
+ if (this.decoder != null) {
128
+ decoded += this.decoder.decode(chunk, { stream: true });
129
+ }
130
+ // Buffer is present in Node.js environment
131
+ else if (index_js_1.RUNTIME.type === "node" && typeof chunk !== "undefined") {
132
+ decoded += Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
133
+ }
134
+ return decoded;
135
+ }
136
+ }
137
+ exports.Stream = Stream;
138
+ /**
139
+ * Browser polyfill for ReadableStream
140
+ */
141
+ // biome-ignore lint/suspicious/noExplicitAny: allow explicit any
142
+ function readableStreamAsyncIterable(stream) {
143
+ if (stream[Symbol.asyncIterator]) {
144
+ return stream;
145
+ }
146
+ const reader = stream.getReader();
147
+ return {
148
+ next() {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ try {
151
+ const result = yield reader.read();
152
+ if (result === null || result === void 0 ? void 0 : result.done) {
153
+ reader.releaseLock();
154
+ } // release lock when stream becomes closed
155
+ return result;
156
+ }
157
+ catch (e) {
158
+ reader.releaseLock(); // release lock when stream becomes errored
159
+ throw e;
160
+ }
161
+ });
162
+ },
163
+ return() {
164
+ return __awaiter(this, void 0, void 0, function* () {
165
+ const cancelPromise = reader.cancel();
166
+ reader.releaseLock();
167
+ yield cancelPromise;
168
+ return { done: true, value: undefined };
169
+ });
170
+ },
171
+ [Symbol.asyncIterator]() {
172
+ return this;
173
+ },
174
+ };
175
+ }
@@ -0,0 +1 @@
1
+ export { Stream } from "./Stream.js";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Stream = void 0;
4
+ var Stream_js_1 = require("./Stream.js");
5
+ Object.defineProperty(exports, "Stream", { enumerable: true, get: function () { return Stream_js_1.Stream; } });
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "6.3.1";
1
+ export declare const SDK_VERSION = "6.4.0";
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SDK_VERSION = void 0;
4
- exports.SDK_VERSION = "6.3.1";
4
+ exports.SDK_VERSION = "6.4.0";
@@ -16,8 +16,8 @@ export class phenomlClient {
16
16
  this._options = Object.assign(Object.assign({}, _options), { logging: core.logging.createLogger(_options === null || _options === void 0 ? void 0 : _options.logging), headers: mergeHeaders({
17
17
  "X-Fern-Language": "JavaScript",
18
18
  "X-Fern-SDK-Name": "phenoml",
19
- "X-Fern-SDK-Version": "6.3.1",
20
- "User-Agent": "phenoml/6.3.1",
19
+ "X-Fern-SDK-Version": "6.4.0",
20
+ "User-Agent": "phenoml/6.4.0",
21
21
  "X-Fern-Runtime": core.RUNTIME.type,
22
22
  "X-Fern-Runtime-Version": core.RUNTIME.version,
23
23
  }, _options === null || _options === void 0 ? void 0 : _options.headers) });
@@ -134,7 +134,7 @@ export declare class Agent {
134
134
  patch(id: string, request: phenoml.agent.JsonPatch, requestOptions?: Agent.RequestOptions): core.HttpResponsePromise<phenoml.agent.AgentResponse>;
135
135
  private __patch;
136
136
  /**
137
- * Send a message to an agent and receive a response
137
+ * Send a message to an agent and receive a JSON response.
138
138
  *
139
139
  * @param {phenoml.agent.AgentChatRequest} request
140
140
  * @param {Agent.RequestOptions} requestOptions - Request-specific configuration.
@@ -154,6 +154,13 @@ export declare class Agent {
154
154
  */
155
155
  chat(request: phenoml.agent.AgentChatRequest, requestOptions?: Agent.RequestOptions): core.HttpResponsePromise<phenoml.agent.AgentChatResponse>;
156
156
  private __chat;
157
+ /**
158
+ * Send a message to an agent and receive the response as a Server-Sent Events
159
+ * (SSE) stream. Events include message_start, content_delta, tool_use,
160
+ * tool_result, message_end, and error.
161
+ */
162
+ streamChat(request: phenoml.agent.AgentStreamChatRequest, requestOptions?: Agent.RequestOptions): core.HttpResponsePromise<core.Stream<phenoml.agent.AgentChatStreamEvent>>;
163
+ private __streamChat;
157
164
  /**
158
165
  * Retrieves a list of chat messages for a given chat session
159
166
  *
@@ -494,7 +494,7 @@ export class Agent {
494
494
  });
495
495
  }
496
496
  /**
497
- * Send a message to an agent and receive a response
497
+ * Send a message to an agent and receive a JSON response.
498
498
  *
499
499
  * @param {phenoml.agent.AgentChatRequest} request
500
500
  * @param {Agent.RequestOptions} requestOptions - Request-specific configuration.
@@ -576,6 +576,87 @@ export class Agent {
576
576
  }
577
577
  });
578
578
  }
579
+ /**
580
+ * Send a message to an agent and receive the response as a Server-Sent Events
581
+ * (SSE) stream. Events include message_start, content_delta, tool_use,
582
+ * tool_result, message_end, and error.
583
+ */
584
+ streamChat(request, requestOptions) {
585
+ return core.HttpResponsePromise.fromPromise(this.__streamChat(request, requestOptions));
586
+ }
587
+ __streamChat(request, requestOptions) {
588
+ return __awaiter(this, void 0, void 0, function* () {
589
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
590
+ const { "X-Phenoml-On-Behalf-Of": phenomlOnBehalfOf, "X-Phenoml-Fhir-Provider": phenomlFhirProvider } = request, _body = __rest(request, ["X-Phenoml-On-Behalf-Of", "X-Phenoml-Fhir-Provider"]);
591
+ const _headers = mergeHeaders((_a = this._options) === null || _a === void 0 ? void 0 : _a.headers, mergeOnlyDefinedHeaders({
592
+ Authorization: yield this._getAuthorizationHeader(),
593
+ "X-Phenoml-On-Behalf-Of": phenomlOnBehalfOf != null ? phenomlOnBehalfOf : undefined,
594
+ "X-Phenoml-Fhir-Provider": phenomlFhirProvider != null ? phenomlFhirProvider : undefined,
595
+ }), requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.headers);
596
+ const _response = yield ((_b = this._options.fetcher) !== null && _b !== void 0 ? _b : core.fetcher)({
597
+ url: core.url.join((_d = (_c = (yield core.Supplier.get(this._options.baseUrl))) !== null && _c !== void 0 ? _c : (yield core.Supplier.get(this._options.environment))) !== null && _d !== void 0 ? _d : environments.phenomlEnvironment.Default, "agent/stream-chat"),
598
+ method: "POST",
599
+ headers: _headers,
600
+ contentType: "application/json",
601
+ queryParameters: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.queryParams,
602
+ requestType: "json",
603
+ body: _body,
604
+ responseType: "sse",
605
+ timeoutMs: ((_g = (_e = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.timeoutInSeconds) !== null && _e !== void 0 ? _e : (_f = this._options) === null || _f === void 0 ? void 0 : _f.timeoutInSeconds) !== null && _g !== void 0 ? _g : 60) * 1000,
606
+ maxRetries: (_h = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.maxRetries) !== null && _h !== void 0 ? _h : (_j = this._options) === null || _j === void 0 ? void 0 : _j.maxRetries,
607
+ abortSignal: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.abortSignal,
608
+ fetchFn: (_k = this._options) === null || _k === void 0 ? void 0 : _k.fetch,
609
+ logging: this._options.logging,
610
+ });
611
+ if (_response.ok) {
612
+ return {
613
+ data: new core.Stream({
614
+ stream: _response.body,
615
+ parse: (data) => data,
616
+ signal: requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.abortSignal,
617
+ eventShape: {
618
+ type: "sse",
619
+ streamTerminator: "[DONE]",
620
+ },
621
+ }),
622
+ rawResponse: _response.rawResponse,
623
+ };
624
+ }
625
+ if (_response.error.reason === "status-code") {
626
+ switch (_response.error.statusCode) {
627
+ case 400:
628
+ throw new phenoml.agent.BadRequestError(_response.error.body, _response.rawResponse);
629
+ case 401:
630
+ throw new phenoml.agent.UnauthorizedError(_response.error.body, _response.rawResponse);
631
+ case 403:
632
+ throw new phenoml.agent.ForbiddenError(_response.error.body, _response.rawResponse);
633
+ case 500:
634
+ throw new phenoml.agent.InternalServerError(_response.error.body, _response.rawResponse);
635
+ default:
636
+ throw new errors.phenomlError({
637
+ statusCode: _response.error.statusCode,
638
+ body: _response.error.body,
639
+ rawResponse: _response.rawResponse,
640
+ });
641
+ }
642
+ }
643
+ switch (_response.error.reason) {
644
+ case "non-json":
645
+ throw new errors.phenomlError({
646
+ statusCode: _response.error.statusCode,
647
+ body: _response.error.rawBody,
648
+ rawResponse: _response.rawResponse,
649
+ });
650
+ case "timeout":
651
+ throw new errors.phenomlTimeoutError("Timeout exceeded when calling POST /agent/stream-chat.");
652
+ case "unknown":
653
+ throw new errors.phenomlError({
654
+ message: _response.error.errorMessage,
655
+ rawResponse: _response.rawResponse,
656
+ });
657
+ }
658
+ });
659
+ }
579
660
  /**
580
661
  * Retrieves a list of chat messages for a given chat session
581
662
  *
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @example
3
+ * {
4
+ * "X-Phenoml-On-Behalf-Of": "Patient/550e8400-e29b-41d4-a716-446655440000",
5
+ * "X-Phenoml-Fhir-Provider": "550e8400-e29b-41d4-a716-446655440000:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c...",
6
+ * message: "What is the patient's current condition?",
7
+ * agent_id: "agent-123"
8
+ * }
9
+ */
10
+ export interface AgentStreamChatRequest {
11
+ /**
12
+ * Optional header for on-behalf-of authentication. Used when making requests on behalf of another user or entity.
13
+ * Must be in the format: Patient/{uuid} or Practitioner/{uuid}
14
+ */
15
+ "X-Phenoml-On-Behalf-Of"?: string;
16
+ /**
17
+ * Optional header for FHIR provider authentication. Contains credentials in the format {fhir_provider_id}:{oauth2_token}.
18
+ * Multiple FHIR provider integrations can be provided as comma-separated values.
19
+ */
20
+ "X-Phenoml-Fhir-Provider"?: string;
21
+ /** The message to send to the agent */
22
+ message: string;
23
+ /** Optional context for the conversation */
24
+ context?: string;
25
+ /** Optional session ID for conversation continuity */
26
+ session_id?: string;
27
+ /** The ID of the agent to chat with */
28
+ agent_id: string;
29
+ /** Enable enhanced reasoning capabilities, will increase latency but will also improve response quality and reliability. */
30
+ enhanced_reasoning?: boolean;
31
+ }
@@ -0,0 +1,2 @@
1
+ // This file was auto-generated by Fern from our API Definition.
2
+ export {};
@@ -1,3 +1,4 @@
1
1
  export type { AgentChatRequest } from "./AgentChatRequest.mjs";
2
2
  export type { AgentGetChatMessagesRequest } from "./AgentGetChatMessagesRequest.mjs";
3
3
  export type { AgentListRequest } from "./AgentListRequest.mjs";
4
+ export type { AgentStreamChatRequest } from "./AgentStreamChatRequest.mjs";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JSON payload sent in the `data:` line of a Server-Sent Event (SSE) frame for streaming chat responses.
3
+ * Each SSE frame uses the standard `event:` and `data:` lines; this schema describes the JSON object
4
+ * in the `data:` line. The event type is encoded in the top-level `type` property.
5
+ * Event types: message_start, content_delta, tool_use, tool_result, message_end, error.
6
+ */
7
+ export interface AgentChatStreamEvent {
8
+ /** The event type */
9
+ type?: AgentChatStreamEvent.Type;
10
+ /** Chat session ID */
11
+ session_id?: string;
12
+ /** Incremental text content (present in content_delta events) */
13
+ content?: string;
14
+ /** Whether the operation was successful */
15
+ success?: boolean;
16
+ /** Status message */
17
+ message?: string;
18
+ /** Tool/function name (present in tool_use and tool_result events) */
19
+ function_name?: string;
20
+ /** Tool arguments (present in tool_use events) */
21
+ function_args?: Record<string, unknown>;
22
+ /** Tool execution result (present in tool_result events) */
23
+ function_result?: Record<string, unknown>;
24
+ }
25
+ export declare namespace AgentChatStreamEvent {
26
+ /** The event type */
27
+ const Type: {
28
+ readonly MessageStart: "message_start";
29
+ readonly ContentDelta: "content_delta";
30
+ readonly ToolUse: "tool_use";
31
+ readonly ToolResult: "tool_result";
32
+ readonly MessageEnd: "message_end";
33
+ readonly Error: "error";
34
+ };
35
+ type Type = (typeof Type)[keyof typeof Type];
36
+ }
@@ -0,0 +1,13 @@
1
+ // This file was auto-generated by Fern from our API Definition.
2
+ export var AgentChatStreamEvent;
3
+ (function (AgentChatStreamEvent) {
4
+ /** The event type */
5
+ AgentChatStreamEvent.Type = {
6
+ MessageStart: "message_start",
7
+ ContentDelta: "content_delta",
8
+ ToolUse: "tool_use",
9
+ ToolResult: "tool_result",
10
+ MessageEnd: "message_end",
11
+ Error: "error",
12
+ };
13
+ })(AgentChatStreamEvent || (AgentChatStreamEvent = {}));
@@ -1,4 +1,5 @@
1
1
  export * from "./AgentChatResponse.mjs";
2
+ export * from "./AgentChatStreamEvent.mjs";
2
3
  export * from "./AgentCreateRequest.mjs";
3
4
  export * from "./AgentDeleteResponse.mjs";
4
5
  export * from "./AgentGetChatMessagesRequestOrder.mjs";
@@ -1,4 +1,5 @@
1
1
  export * from "./AgentChatResponse.mjs";
2
+ export * from "./AgentChatStreamEvent.mjs";
2
3
  export * from "./AgentCreateRequest.mjs";
3
4
  export * from "./AgentDeleteResponse.mjs";
4
5
  export * from "./AgentGetChatMessagesRequestOrder.mjs";
@@ -13,6 +13,7 @@ export declare const Provider: {
13
13
  readonly GoogleHealthcare: "google_healthcare";
14
14
  readonly Hapi: "hapi";
15
15
  readonly Medplum: "medplum";
16
+ readonly Phenostore: "phenostore";
16
17
  readonly Sandbox: "sandbox";
17
18
  };
18
19
  export type Provider = (typeof Provider)[keyof typeof Provider];
@@ -14,5 +14,6 @@ export const Provider = {
14
14
  GoogleHealthcare: "google_healthcare",
15
15
  Hapi: "hapi",
16
16
  Medplum: "medplum",
17
+ Phenostore: "phenostore",
17
18
  Sandbox: "sandbox",
18
19
  };
@@ -225,7 +225,7 @@ export function fetcherImpl(args) {
225
225
  method: args.method,
226
226
  url: redactUrl(url),
227
227
  statusCode: response.status,
228
- responseHeaders: redactHeaders(response.headers),
228
+ responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())),
229
229
  };
230
230
  logger.error("HTTP request failed with error status", metadata);
231
231
  }
@@ -3,4 +3,5 @@ export * from "./base64.mjs";
3
3
  export * from "./fetcher/index.mjs";
4
4
  export * as logging from "./logging/index.mjs";
5
5
  export * from "./runtime/index.mjs";
6
+ export * from "./stream/index.mjs";
6
7
  export * as url from "./url/index.mjs";
@@ -3,4 +3,5 @@ export * from "./base64.mjs";
3
3
  export * from "./fetcher/index.mjs";
4
4
  export * as logging from "./logging/index.mjs";
5
5
  export * from "./runtime/index.mjs";
6
+ export * from "./stream/index.mjs";
6
7
  export * as url from "./url/index.mjs";
@@ -0,0 +1,47 @@
1
+ export declare namespace Stream {
2
+ interface Args {
3
+ /**
4
+ * The HTTP response stream to read from.
5
+ */
6
+ stream: ReadableStream;
7
+ /**
8
+ * The event shape to use for parsing the stream data.
9
+ */
10
+ eventShape: JsonEvent | SseEvent;
11
+ /**
12
+ * An abort signal to stop the stream.
13
+ */
14
+ signal?: AbortSignal;
15
+ }
16
+ interface JsonEvent {
17
+ type: "json";
18
+ messageTerminator: string;
19
+ }
20
+ interface SseEvent {
21
+ type: "sse";
22
+ streamTerminator?: string;
23
+ }
24
+ }
25
+ export declare class Stream<T> implements AsyncIterable<T> {
26
+ private stream;
27
+ private parse;
28
+ /**
29
+ * The prefix to use for each message. For example,
30
+ * for SSE, the prefix is "data: ".
31
+ */
32
+ private prefix;
33
+ private messageTerminator;
34
+ private streamTerminator;
35
+ private controller;
36
+ private decoder;
37
+ constructor({ stream, parse, eventShape, signal }: Stream.Args & {
38
+ parse: (val: unknown) => Promise<T>;
39
+ });
40
+ private iterMessages;
41
+ [Symbol.asyncIterator](): AsyncIterator<T, void, unknown>;
42
+ private decodeChunk;
43
+ }
44
+ /**
45
+ * Browser polyfill for ReadableStream
46
+ */
47
+ export declare function readableStreamAsyncIterable<T>(stream: any): AsyncIterableIterator<T>;
@@ -0,0 +1,170 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
11
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
12
+ var m = o[Symbol.asyncIterator], i;
13
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
14
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
15
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
16
+ };
17
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
18
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
19
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
20
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
21
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
22
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
23
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
24
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
25
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
26
+ function fulfill(value) { resume("next", value); }
27
+ function reject(value) { resume("throw", value); }
28
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
29
+ };
30
+ import { RUNTIME } from "../runtime/index.mjs";
31
+ const DATA_PREFIX = "data:";
32
+ export class Stream {
33
+ constructor({ stream, parse, eventShape, signal }) {
34
+ this.controller = new AbortController();
35
+ this.stream = stream;
36
+ this.parse = parse;
37
+ if (eventShape.type === "sse") {
38
+ this.prefix = DATA_PREFIX;
39
+ this.messageTerminator = "\n";
40
+ this.streamTerminator = eventShape.streamTerminator;
41
+ }
42
+ else {
43
+ this.messageTerminator = eventShape.messageTerminator;
44
+ }
45
+ signal === null || signal === void 0 ? void 0 : signal.addEventListener("abort", () => this.controller.abort());
46
+ // Initialize shared TextDecoder
47
+ if (typeof TextDecoder !== "undefined") {
48
+ this.decoder = new TextDecoder("utf-8");
49
+ }
50
+ }
51
+ iterMessages() {
52
+ return __asyncGenerator(this, arguments, function* iterMessages_1() {
53
+ var _a, e_1, _b, _c;
54
+ const signal = this.controller.signal;
55
+ const stream = readableStreamAsyncIterable(this.stream);
56
+ let buf = "";
57
+ let prefixSeen = false;
58
+ try {
59
+ for (var _d = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield __await(stream_1.next()), _a = stream_1_1.done, !_a; _d = true) {
60
+ _c = stream_1_1.value;
61
+ _d = false;
62
+ const chunk = _c;
63
+ if (signal.aborted) {
64
+ break;
65
+ }
66
+ buf += this.decodeChunk(chunk);
67
+ let terminatorIndex;
68
+ while ((terminatorIndex = buf.indexOf(this.messageTerminator)) >= 0) {
69
+ let line = buf.slice(0, terminatorIndex);
70
+ buf = buf.slice(terminatorIndex + this.messageTerminator.length);
71
+ if (!line.trim()) {
72
+ continue;
73
+ }
74
+ if (!prefixSeen && this.prefix != null) {
75
+ const prefixIndex = line.indexOf(this.prefix);
76
+ if (prefixIndex === -1) {
77
+ continue;
78
+ }
79
+ prefixSeen = true;
80
+ line = line.slice(prefixIndex + this.prefix.length);
81
+ }
82
+ if (this.streamTerminator != null && line.includes(this.streamTerminator)) {
83
+ return yield __await(void 0);
84
+ }
85
+ const message = yield __await(this.parse(JSON.parse(line)));
86
+ yield yield __await(message);
87
+ prefixSeen = false;
88
+ }
89
+ }
90
+ }
91
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
92
+ finally {
93
+ try {
94
+ if (!_d && !_a && (_b = stream_1.return)) yield __await(_b.call(stream_1));
95
+ }
96
+ finally { if (e_1) throw e_1.error; }
97
+ }
98
+ });
99
+ }
100
+ [Symbol.asyncIterator]() {
101
+ return __asyncGenerator(this, arguments, function* _a() {
102
+ var _b, e_2, _c, _d;
103
+ try {
104
+ for (var _e = true, _f = __asyncValues(this.iterMessages()), _g; _g = yield __await(_f.next()), _b = _g.done, !_b; _e = true) {
105
+ _d = _g.value;
106
+ _e = false;
107
+ const message = _d;
108
+ yield yield __await(message);
109
+ }
110
+ }
111
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
112
+ finally {
113
+ try {
114
+ if (!_e && !_b && (_c = _f.return)) yield __await(_c.call(_f));
115
+ }
116
+ finally { if (e_2) throw e_2.error; }
117
+ }
118
+ });
119
+ }
120
+ decodeChunk(chunk) {
121
+ let decoded = "";
122
+ // If TextDecoder is available, use the streaming decoder instance
123
+ if (this.decoder != null) {
124
+ decoded += this.decoder.decode(chunk, { stream: true });
125
+ }
126
+ // Buffer is present in Node.js environment
127
+ else if (RUNTIME.type === "node" && typeof chunk !== "undefined") {
128
+ decoded += Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
129
+ }
130
+ return decoded;
131
+ }
132
+ }
133
+ /**
134
+ * Browser polyfill for ReadableStream
135
+ */
136
+ // biome-ignore lint/suspicious/noExplicitAny: allow explicit any
137
+ export function readableStreamAsyncIterable(stream) {
138
+ if (stream[Symbol.asyncIterator]) {
139
+ return stream;
140
+ }
141
+ const reader = stream.getReader();
142
+ return {
143
+ next() {
144
+ return __awaiter(this, void 0, void 0, function* () {
145
+ try {
146
+ const result = yield reader.read();
147
+ if (result === null || result === void 0 ? void 0 : result.done) {
148
+ reader.releaseLock();
149
+ } // release lock when stream becomes closed
150
+ return result;
151
+ }
152
+ catch (e) {
153
+ reader.releaseLock(); // release lock when stream becomes errored
154
+ throw e;
155
+ }
156
+ });
157
+ },
158
+ return() {
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ const cancelPromise = reader.cancel();
161
+ reader.releaseLock();
162
+ yield cancelPromise;
163
+ return { done: true, value: undefined };
164
+ });
165
+ },
166
+ [Symbol.asyncIterator]() {
167
+ return this;
168
+ },
169
+ };
170
+ }
@@ -0,0 +1 @@
1
+ export { Stream } from "./Stream.mjs";
@@ -0,0 +1 @@
1
+ export { Stream } from "./Stream.mjs";
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "6.3.1";
1
+ export declare const SDK_VERSION = "6.4.0";
@@ -1 +1 @@
1
- export const SDK_VERSION = "6.3.1";
1
+ export const SDK_VERSION = "6.4.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phenoml",
3
- "version": "6.3.1",
3
+ "version": "6.4.0",
4
4
  "private": false,
5
5
  "repository": "github:PhenoML/phenoml-ts-sdk",
6
6
  "type": "commonjs",
package/reference.md CHANGED
@@ -427,7 +427,7 @@ await client.agent.patch("id", [{
427
427
  <dl>
428
428
  <dd>
429
429
 
430
- Send a message to an agent and receive a response
430
+ Send a message to an agent and receive a JSON response.
431
431
  </dd>
432
432
  </dl>
433
433
  </dd>
@@ -479,6 +479,79 @@ await client.agent.chat({
479
479
  </dl>
480
480
 
481
481
 
482
+ </dd>
483
+ </dl>
484
+ </details>
485
+
486
+ <details><summary><code>client.agent.<a href="/src/api/resources/agent/client/Client.ts">streamChat</a>({ ...params }) -> core.Stream<phenoml.AgentChatStreamEvent></code></summary>
487
+ <dl>
488
+ <dd>
489
+
490
+ #### 📝 Description
491
+
492
+ <dl>
493
+ <dd>
494
+
495
+ <dl>
496
+ <dd>
497
+
498
+ Send a message to an agent and receive the response as a Server-Sent Events
499
+ (SSE) stream. Events include message_start, content_delta, tool_use,
500
+ tool_result, message_end, and error.
501
+ </dd>
502
+ </dl>
503
+ </dd>
504
+ </dl>
505
+
506
+ #### 🔌 Usage
507
+
508
+ <dl>
509
+ <dd>
510
+
511
+ <dl>
512
+ <dd>
513
+
514
+ ```typescript
515
+ const response = await client.agent.streamChat({
516
+ "X-Phenoml-On-Behalf-Of": "Patient/550e8400-e29b-41d4-a716-446655440000",
517
+ "X-Phenoml-Fhir-Provider": "550e8400-e29b-41d4-a716-446655440000:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c...",
518
+ message: "What is the patient's current condition?",
519
+ agent_id: "agent-123"
520
+ });
521
+ for await (const item of response) {
522
+ console.log(item);
523
+ }
524
+
525
+ ```
526
+ </dd>
527
+ </dl>
528
+ </dd>
529
+ </dl>
530
+
531
+ #### ⚙️ Parameters
532
+
533
+ <dl>
534
+ <dd>
535
+
536
+ <dl>
537
+ <dd>
538
+
539
+ **request:** `phenoml.agent.AgentStreamChatRequest`
540
+
541
+ </dd>
542
+ </dl>
543
+
544
+ <dl>
545
+ <dd>
546
+
547
+ **requestOptions:** `Agent.RequestOptions`
548
+
549
+ </dd>
550
+ </dl>
551
+ </dd>
552
+ </dl>
553
+
554
+
482
555
  </dd>
483
556
  </dl>
484
557
  </details>