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.
- package/dist/cjs/Client.js +2 -2
- package/dist/cjs/api/resources/agent/client/Client.d.ts +8 -1
- package/dist/cjs/api/resources/agent/client/Client.js +82 -1
- package/dist/cjs/api/resources/agent/client/requests/AgentStreamChatRequest.d.ts +31 -0
- package/dist/cjs/api/resources/agent/client/requests/AgentStreamChatRequest.js +3 -0
- package/dist/cjs/api/resources/agent/client/requests/index.d.ts +1 -0
- package/dist/cjs/api/resources/agent/types/AgentChatStreamEvent.d.ts +36 -0
- package/dist/cjs/api/resources/agent/types/AgentChatStreamEvent.js +16 -0
- package/dist/cjs/api/resources/agent/types/index.d.ts +1 -0
- package/dist/cjs/api/resources/agent/types/index.js +1 -0
- package/dist/cjs/api/resources/fhirProvider/types/Provider.d.ts +1 -0
- package/dist/cjs/api/resources/fhirProvider/types/Provider.js +1 -0
- package/dist/cjs/core/fetcher/Fetcher.js +1 -1
- package/dist/cjs/core/index.d.ts +1 -0
- package/dist/cjs/core/index.js +1 -0
- package/dist/cjs/core/stream/Stream.d.ts +47 -0
- package/dist/cjs/core/stream/Stream.js +175 -0
- package/dist/cjs/core/stream/index.d.ts +1 -0
- package/dist/cjs/core/stream/index.js +5 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/Client.mjs +2 -2
- package/dist/esm/api/resources/agent/client/Client.d.mts +8 -1
- package/dist/esm/api/resources/agent/client/Client.mjs +82 -1
- package/dist/esm/api/resources/agent/client/requests/AgentStreamChatRequest.d.mts +31 -0
- package/dist/esm/api/resources/agent/client/requests/AgentStreamChatRequest.mjs +2 -0
- package/dist/esm/api/resources/agent/client/requests/index.d.mts +1 -0
- package/dist/esm/api/resources/agent/types/AgentChatStreamEvent.d.mts +36 -0
- package/dist/esm/api/resources/agent/types/AgentChatStreamEvent.mjs +13 -0
- package/dist/esm/api/resources/agent/types/index.d.mts +1 -0
- package/dist/esm/api/resources/agent/types/index.mjs +1 -0
- package/dist/esm/api/resources/fhirProvider/types/Provider.d.mts +1 -0
- package/dist/esm/api/resources/fhirProvider/types/Provider.mjs +1 -0
- package/dist/esm/core/fetcher/Fetcher.mjs +1 -1
- package/dist/esm/core/index.d.mts +1 -0
- package/dist/esm/core/index.mjs +1 -0
- package/dist/esm/core/stream/Stream.d.mts +47 -0
- package/dist/esm/core/stream/Stream.mjs +170 -0
- package/dist/esm/core/stream/index.d.mts +1 -0
- package/dist/esm/core/stream/index.mjs +1 -0
- package/dist/esm/version.d.mts +1 -1
- package/dist/esm/version.mjs +1 -1
- package/package.json +1 -1
- package/reference.md +74 -1
package/dist/cjs/Client.js
CHANGED
|
@@ -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.
|
|
56
|
-
"User-Agent": "phenoml/6.
|
|
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
|
+
}
|
|
@@ -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 = {}));
|
|
@@ -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];
|
|
@@ -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
|
}
|
package/dist/cjs/core/index.d.ts
CHANGED
package/dist/cjs/core/index.js
CHANGED
|
@@ -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";
|
package/dist/cjs/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "6.
|
|
1
|
+
export declare const SDK_VERSION = "6.4.0";
|
package/dist/cjs/version.js
CHANGED
package/dist/esm/Client.mjs
CHANGED
|
@@ -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.
|
|
20
|
-
"User-Agent": "phenoml/6.
|
|
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
|
+
}
|
|
@@ -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 = {}));
|
|
@@ -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];
|
|
@@ -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
|
}
|
package/dist/esm/core/index.mjs
CHANGED
|
@@ -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";
|
package/dist/esm/version.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "6.
|
|
1
|
+
export declare const SDK_VERSION = "6.4.0";
|
package/dist/esm/version.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SDK_VERSION = "6.
|
|
1
|
+
export const SDK_VERSION = "6.4.0";
|
package/package.json
CHANGED
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>
|