@dremio/js-sdk 0.35.0 → 0.36.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/enterprise/ai/AIResource.d.ts +2 -0
- package/dist/enterprise/ai/AIResource.js +8 -1
- package/dist/enterprise/ai/AIResource.js.map +1 -1
- package/dist/enterprise/ai/chat/ChatSessionClient.d.ts +21 -0
- package/dist/enterprise/ai/chat/ChatSessionClient.js +58 -0
- package/dist/enterprise/ai/chat/ChatSessionClient.js.map +1 -0
- package/dist/enterprise/ai/chat/eventWrappers/AgentChatExchange.d.ts +1 -1
- package/dist/enterprise/ai/chat/eventWrappers/AgentChatExchange.js +1 -1
- package/dist/enterprise/ai/chat/eventWrappers/AgentChatExchange.js.map +1 -1
- package/dist/enterprise/ai/chat/index.d.ts +2 -0
- package/dist/enterprise/ai/chat/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ import { Err, Ok } from "ts-results-es";
|
|
|
11
11
|
import type { HttpError } from "../../common/HttpError.ts";
|
|
12
12
|
import { Problem } from "../../common/Problem.ts";
|
|
13
13
|
import { AgentChatExchange } from "./chat/eventWrappers/AgentChatExchange.ts";
|
|
14
|
+
import { ChatSessionClient } from "./chat/ChatSessionClient.ts";
|
|
14
15
|
export declare class AIResource {
|
|
15
16
|
#private;
|
|
16
17
|
constructor(config: Logger & V4Config & SonarV4Config);
|
|
@@ -114,6 +115,7 @@ export declare class AIResource {
|
|
|
114
115
|
* with events from the Agent.
|
|
115
116
|
*/
|
|
116
117
|
createAgentChatExchange$(chatSession: ChatSession, userChatMessage: UserChatMessage): import("rxjs").Observable<AgentChatExchange>;
|
|
118
|
+
createChatSessionClient(chatSession: ChatSession): ChatSessionClient;
|
|
117
119
|
/**
|
|
118
120
|
* Sends a chat message to the Dremio AI Agent and returns an Observable containing
|
|
119
121
|
* Agent replies.
|
|
@@ -25,6 +25,7 @@ import { Err, Ok } from "ts-results-es";
|
|
|
25
25
|
import { Problem } from "../../common/Problem.js";
|
|
26
26
|
import { AgentChatExchange } from "./chat/eventWrappers/AgentChatExchange.js";
|
|
27
27
|
import { AgentEndTurn } from "../interfaces.js";
|
|
28
|
+
import { ChatSessionClient } from "./chat/ChatSessionClient.js";
|
|
28
29
|
export class AIResource {
|
|
29
30
|
#config;
|
|
30
31
|
constructor(config) {
|
|
@@ -96,7 +97,13 @@ export class AIResource {
|
|
|
96
97
|
*/
|
|
97
98
|
createAgentChatExchange$(chatSession, userChatMessage) {
|
|
98
99
|
const initialAgentChatExchange = new AgentChatExchange(userChatMessage, []);
|
|
99
|
-
return this.sendChatMessage(chatSession)(userChatMessage).pipe(map((eventResult) => eventResult.unwrap()), endWith(new AgentEndTurn({ type: "reply_finished" })), catchError((error) => of(new AgentEndTurn({ error, type: "error" }))), scan((agentChatExchange, agentChatEvent) => agentChatExchange.
|
|
100
|
+
return this.sendChatMessage(chatSession)(userChatMessage).pipe(map((eventResult) => eventResult.unwrap()), endWith(new AgentEndTurn({ type: "reply_finished" })), catchError((error) => of(new AgentEndTurn({ error, type: "error" }))), scan((agentChatExchange, agentChatEvent) => agentChatExchange._addChatEvent(agentChatEvent), initialAgentChatExchange), startWith(initialAgentChatExchange), share());
|
|
101
|
+
}
|
|
102
|
+
createChatSessionClient(chatSession) {
|
|
103
|
+
return new ChatSessionClient({
|
|
104
|
+
chatSession,
|
|
105
|
+
createAgentChatExchange$: this.createAgentChatExchange$.bind(this),
|
|
106
|
+
});
|
|
100
107
|
}
|
|
101
108
|
/**
|
|
102
109
|
* Sends a chat message to the Dremio AI Agent and returns an Observable containing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIResource.js","sourceRoot":"","sources":["../../../src/enterprise/ai/AIResource.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { catchError, endWith, map, of, scan, share, startWith, tap } from \"rxjs\";\nimport { ChatSession } from \"./chat/ChatSession.ts\";\nimport type { UserChatMessage } from \"./chat/UserChatMessage.ts\";\nimport { AgentChatResponse } from \"./chat/AgentChatResponse.ts\";\nimport type { Logger, SonarV4Config, V4Config } from \"../../common/Config.ts\";\nimport { fromTextEventStream } from \"../../common/fromTextEventStream.ts\";\nimport { ModelProvider } from \"./ModelProvider.ts\";\n\nimport * as z from \"zod/mini\";\nimport { modelProviderCreateCodec, modelProviderRetrieveCodec } from \"./modelProviderCodec.js\";\nimport type { SignalParam } from \"../../common/Params.ts\";\nimport { safeParseResultToResult } from \"../../common/safeParseResultToResult.ts\";\nimport type { listModelsPropertiesSchema } from \"./modelProviderConfigSchemas.ts\";\nimport { Err, Ok } from \"ts-results-es\";\nimport type { HttpError } from \"../../common/HttpError.ts\";\nimport { Problem } from \"../../common/Problem.ts\";\nimport { AgentChatExchange } from \"./chat/eventWrappers/AgentChatExchange.ts\";\nimport { AgentEndTurn } from \"../interfaces.ts\";\nexport class AIResource {\n #config: Logger & V4Config & SonarV4Config;\n\n constructor(config: Logger & V4Config & SonarV4Config) {\n this.#config = config;\n }\n\n createModelProvider(properties: z.output<typeof modelProviderCreateCodec>) {\n const body = z.encode(modelProviderCreateCodec, properties);\n return this.#config\n .v4Request(`model-provider/config`, {\n body: JSON.stringify(body),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n keepalive: true,\n method: \"POST\",\n })\n .map((res) => res.json() as Promise<z.input<typeof modelProviderRetrieveCodec>>)\n .map(\n (entity) => new ModelProvider(this.#config, z.decode(modelProviderRetrieveCodec, entity)),\n );\n }\n\n listModelProviders() {\n const getPage = ({ signal }: SignalParam = {}) => {\n return this.#config\n .v4Request(\"model-provider/config\", {\n headers: {\n Accept: \"application/json\",\n },\n signal,\n })\n .map(\n (res) => res.json() as Promise<{ configs: z.input<typeof modelProviderRetrieveCodec>[] }>,\n )\n .map((response) => ({\n data: response.configs.map((entity) =>\n safeParseResultToResult(z.safeDecode(modelProviderRetrieveCodec, entity)).map(\n (properties) => new ModelProvider(this.#config, properties),\n ),\n ),\n }));\n };\n return {\n async *data({ signal }: SignalParam = {}) {\n yield* (await getPage({ signal }).promise).map((response) => response.data).unwrap();\n },\n getPage,\n };\n }\n\n listAvailableModels(properties: z.infer<typeof listModelsPropertiesSchema>) {\n return this.#config\n .v4Request(\"model-provider:listModels\", {\n body: JSON.stringify({ access: properties }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n })\n .map((res) => res.json() as Promise<{ models: string[] }>)\n .map((result) => new Set(result.models));\n }\n\n retrieveModelProvider(id: string, { signal }: SignalParam = {}) {\n return this.#config\n .v4Request(`model-provider/config/${id}`, {\n headers: {\n Accept: \"application/json\",\n },\n signal,\n })\n .map((res) => res.json() as Promise<z.input<typeof modelProviderRetrieveCodec>>)\n .map(\n (entity) => new ModelProvider(this.#config, z.decode(modelProviderRetrieveCodec, entity)),\n );\n }\n\n /**\n * Creates an Observable that emits each time the `AgentChatExchange` is updated\n * with events from the Agent.\n */\n createAgentChatExchange$(chatSession: ChatSession, userChatMessage: UserChatMessage) {\n const initialAgentChatExchange = new AgentChatExchange(userChatMessage, []);\n\n return this.sendChatMessage(chatSession)(userChatMessage).pipe(\n map((eventResult) => eventResult.unwrap()),\n endWith(new AgentEndTurn({ type: \"reply_finished\" })),\n catchError((error: unknown) => of(new AgentEndTurn({ error, type: \"error\" }))),\n scan(\n (agentChatExchange, agentChatEvent) => agentChatExchange.addChatEvent(agentChatEvent),\n initialAgentChatExchange,\n ),\n startWith(initialAgentChatExchange),\n share(),\n );\n }\n\n /**\n * Sends a chat message to the Dremio AI Agent and returns an Observable containing\n * Agent replies.\n */\n sendChatMessage(chatSession: ChatSession) {\n return (chatMessage: UserChatMessage) =>\n fromTextEventStream(({ signal }) =>\n this.#config\n .sonarV4Request(\"agent\", {\n body: JSON.stringify({\n message: chatMessage.toString(),\n sessionId: chatSession.sessionId,\n } satisfies {\n message: string;\n modelProviderId?: string;\n sessionId?: string;\n }),\n headers: {\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal,\n })\n .promise.then((result) => {\n if (result.isErr()) {\n throw result.error;\n }\n return result.value;\n }),\n ).pipe(\n map((event) => Ok(AgentChatResponse.fromJSON(JSON.parse(event.data)))),\n tap((agentChatResponse) => {\n if (agentChatResponse.isOk()) {\n chatSession.assign(agentChatResponse.value.session);\n }\n }),\n catchError((e: HttpError) => of(Err(refineChatErrors(e)))),\n share(),\n );\n }\n}\n\ntype SendChatMessageProblemCodes =\n | \"https://api.dremio.dev/problems/ai-agent/chat/agent-disabled\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/input-too-large\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/model-provider-not-found\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/no-default-model-provider\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/no-model-provider-privilege\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/preview-disabled\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/rate-limit-exceeded\";\n\nfunction refineChatErrors(e: HttpError) {\n if (e.body instanceof Problem) {\n return e.body as Problem<SendChatMessageProblemCodes>;\n }\n return e;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AIResource.js","sourceRoot":"","sources":["../../../src/enterprise/ai/AIResource.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { catchError, endWith, map, of, scan, share, startWith, tap } from \"rxjs\";\nimport { ChatSession } from \"./chat/ChatSession.ts\";\nimport type { UserChatMessage } from \"./chat/UserChatMessage.ts\";\nimport { AgentChatResponse } from \"./chat/AgentChatResponse.ts\";\nimport type { Logger, SonarV4Config, V4Config } from \"../../common/Config.ts\";\nimport { fromTextEventStream } from \"../../common/fromTextEventStream.ts\";\nimport { ModelProvider } from \"./ModelProvider.ts\";\n\nimport * as z from \"zod/mini\";\nimport { modelProviderCreateCodec, modelProviderRetrieveCodec } from \"./modelProviderCodec.js\";\nimport type { SignalParam } from \"../../common/Params.ts\";\nimport { safeParseResultToResult } from \"../../common/safeParseResultToResult.ts\";\nimport type { listModelsPropertiesSchema } from \"./modelProviderConfigSchemas.ts\";\nimport { Err, Ok } from \"ts-results-es\";\nimport type { HttpError } from \"../../common/HttpError.ts\";\nimport { Problem } from \"../../common/Problem.ts\";\nimport { AgentChatExchange } from \"./chat/eventWrappers/AgentChatExchange.ts\";\nimport { AgentEndTurn } from \"../interfaces.ts\";\nimport { ChatSessionClient } from \"./chat/ChatSessionClient.ts\";\nexport class AIResource {\n #config: Logger & V4Config & SonarV4Config;\n\n constructor(config: Logger & V4Config & SonarV4Config) {\n this.#config = config;\n }\n\n createModelProvider(properties: z.output<typeof modelProviderCreateCodec>) {\n const body = z.encode(modelProviderCreateCodec, properties);\n return this.#config\n .v4Request(`model-provider/config`, {\n body: JSON.stringify(body),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n keepalive: true,\n method: \"POST\",\n })\n .map((res) => res.json() as Promise<z.input<typeof modelProviderRetrieveCodec>>)\n .map(\n (entity) => new ModelProvider(this.#config, z.decode(modelProviderRetrieveCodec, entity)),\n );\n }\n\n listModelProviders() {\n const getPage = ({ signal }: SignalParam = {}) => {\n return this.#config\n .v4Request(\"model-provider/config\", {\n headers: {\n Accept: \"application/json\",\n },\n signal,\n })\n .map(\n (res) => res.json() as Promise<{ configs: z.input<typeof modelProviderRetrieveCodec>[] }>,\n )\n .map((response) => ({\n data: response.configs.map((entity) =>\n safeParseResultToResult(z.safeDecode(modelProviderRetrieveCodec, entity)).map(\n (properties) => new ModelProvider(this.#config, properties),\n ),\n ),\n }));\n };\n return {\n async *data({ signal }: SignalParam = {}) {\n yield* (await getPage({ signal }).promise).map((response) => response.data).unwrap();\n },\n getPage,\n };\n }\n\n listAvailableModels(properties: z.infer<typeof listModelsPropertiesSchema>) {\n return this.#config\n .v4Request(\"model-provider:listModels\", {\n body: JSON.stringify({ access: properties }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n })\n .map((res) => res.json() as Promise<{ models: string[] }>)\n .map((result) => new Set(result.models));\n }\n\n retrieveModelProvider(id: string, { signal }: SignalParam = {}) {\n return this.#config\n .v4Request(`model-provider/config/${id}`, {\n headers: {\n Accept: \"application/json\",\n },\n signal,\n })\n .map((res) => res.json() as Promise<z.input<typeof modelProviderRetrieveCodec>>)\n .map(\n (entity) => new ModelProvider(this.#config, z.decode(modelProviderRetrieveCodec, entity)),\n );\n }\n\n /**\n * Creates an Observable that emits each time the `AgentChatExchange` is updated\n * with events from the Agent.\n */\n createAgentChatExchange$(chatSession: ChatSession, userChatMessage: UserChatMessage) {\n const initialAgentChatExchange = new AgentChatExchange(userChatMessage, []);\n\n return this.sendChatMessage(chatSession)(userChatMessage).pipe(\n map((eventResult) => eventResult.unwrap()),\n endWith(new AgentEndTurn({ type: \"reply_finished\" })),\n catchError((error: unknown) => of(new AgentEndTurn({ error, type: \"error\" }))),\n scan(\n (agentChatExchange, agentChatEvent) => agentChatExchange._addChatEvent(agentChatEvent),\n initialAgentChatExchange,\n ),\n startWith(initialAgentChatExchange),\n share(),\n );\n }\n\n createChatSessionClient(chatSession: ChatSession) {\n return new ChatSessionClient({\n chatSession,\n createAgentChatExchange$: this.createAgentChatExchange$.bind(this),\n });\n }\n\n /**\n * Sends a chat message to the Dremio AI Agent and returns an Observable containing\n * Agent replies.\n */\n sendChatMessage(chatSession: ChatSession) {\n return (chatMessage: UserChatMessage) =>\n fromTextEventStream(({ signal }) =>\n this.#config\n .sonarV4Request(\"agent\", {\n body: JSON.stringify({\n message: chatMessage.toString(),\n sessionId: chatSession.sessionId,\n } satisfies {\n message: string;\n modelProviderId?: string;\n sessionId?: string;\n }),\n headers: {\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n signal,\n })\n .promise.then((result) => {\n if (result.isErr()) {\n throw result.error;\n }\n return result.value;\n }),\n ).pipe(\n map((event) => Ok(AgentChatResponse.fromJSON(JSON.parse(event.data)))),\n tap((agentChatResponse) => {\n if (agentChatResponse.isOk()) {\n chatSession.assign(agentChatResponse.value.session);\n }\n }),\n catchError((e: HttpError) => of(Err(refineChatErrors(e)))),\n share(),\n );\n }\n}\n\ntype SendChatMessageProblemCodes =\n | \"https://api.dremio.dev/problems/ai-agent/chat/agent-disabled\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/input-too-large\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/model-provider-not-found\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/no-default-model-provider\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/no-model-provider-privilege\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/preview-disabled\"\n | \"https://api.dremio.dev/problems/ai-agent/chat/rate-limit-exceeded\";\n\nfunction refineChatErrors(e: HttpError) {\n if (e.body instanceof Problem) {\n return e.body as Problem<SendChatMessageProblemCodes>;\n }\n return e;\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Observable } from "rxjs";
|
|
2
|
+
import type { ChatSession } from "./ChatSession.ts";
|
|
3
|
+
import type { UserChatMessage } from "./UserChatMessage.ts";
|
|
4
|
+
import type { AgentChatExchange } from "./eventWrappers/AgentChatExchange.ts";
|
|
5
|
+
export declare class ChatSessionClient {
|
|
6
|
+
private readonly createAgentChatExchange$;
|
|
7
|
+
private readonly cancelEvents$;
|
|
8
|
+
private readonly userChatMessages$;
|
|
9
|
+
readonly chatSession: ChatSession;
|
|
10
|
+
readonly agentChatExchanges$: Observable<AgentChatExchange[]>;
|
|
11
|
+
readonly agentIsReplying$: Observable<boolean>;
|
|
12
|
+
constructor({ chatSession, createAgentChatExchange$, }: {
|
|
13
|
+
chatSession: ChatSession;
|
|
14
|
+
createAgentChatExchange$: (chatSession: ChatSession, userChatMessage: UserChatMessage) => Observable<AgentChatExchange>;
|
|
15
|
+
});
|
|
16
|
+
get sessionId(): string | undefined;
|
|
17
|
+
startChatExchange(message: UserChatMessage): void;
|
|
18
|
+
cancelChatExchange(): void;
|
|
19
|
+
agentChatExchanges(): Promise<AgentChatExchange[]>;
|
|
20
|
+
agentIsReplying(): Promise<boolean>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2024-2025 Dremio Corporation
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { firstValueFrom, map, merge, Observable, scan, shareReplay, Subject, switchMap, takeUntil, takeWhile, withLatestFrom, } from "rxjs";
|
|
17
|
+
import { AgentEndTurn } from "./eventWrappers/AgentEndTurn.js";
|
|
18
|
+
export class ChatSessionClient {
|
|
19
|
+
createAgentChatExchange$;
|
|
20
|
+
cancelEvents$ = new Subject();
|
|
21
|
+
userChatMessages$ = new Subject();
|
|
22
|
+
chatSession;
|
|
23
|
+
agentChatExchanges$ = this.userChatMessages$.pipe(switchMap((userChatMessage) => {
|
|
24
|
+
const agentChatExchange$ = this.createAgentChatExchange$(this.chatSession, userChatMessage).pipe(takeUntil(this.cancelEvents$), shareReplay({ bufferSize: 1, refCount: true }));
|
|
25
|
+
return merge(agentChatExchange$, this.cancelEvents$.pipe(withLatestFrom(agentChatExchange$), map(([, agentChatExchange]) => {
|
|
26
|
+
return agentChatExchange._addChatEvent(new AgentEndTurn({ type: "user_canceled" }));
|
|
27
|
+
}))).pipe(takeWhile((chatExchange) => !chatExchange.isComplete, true));
|
|
28
|
+
}), scan((acc, curr) => {
|
|
29
|
+
if (acc.at(-1)?.id === curr.id) {
|
|
30
|
+
return [...acc.slice(0, -1), curr];
|
|
31
|
+
}
|
|
32
|
+
return [...acc, curr];
|
|
33
|
+
}, []), shareReplay({ bufferSize: 1, refCount: true }));
|
|
34
|
+
agentIsReplying$ = this.agentChatExchanges$.pipe(map((chatExchanges) => {
|
|
35
|
+
const lastChatExchange = chatExchanges.at(-1);
|
|
36
|
+
return !!lastChatExchange && !lastChatExchange.isComplete;
|
|
37
|
+
}));
|
|
38
|
+
constructor({ chatSession, createAgentChatExchange$, }) {
|
|
39
|
+
this.chatSession = chatSession;
|
|
40
|
+
this.createAgentChatExchange$ = createAgentChatExchange$;
|
|
41
|
+
}
|
|
42
|
+
get sessionId() {
|
|
43
|
+
return this.chatSession.sessionId;
|
|
44
|
+
}
|
|
45
|
+
startChatExchange(message) {
|
|
46
|
+
this.userChatMessages$.next(message);
|
|
47
|
+
}
|
|
48
|
+
cancelChatExchange() {
|
|
49
|
+
this.cancelEvents$.next();
|
|
50
|
+
}
|
|
51
|
+
agentChatExchanges() {
|
|
52
|
+
return firstValueFrom(this.agentChatExchanges$);
|
|
53
|
+
}
|
|
54
|
+
agentIsReplying() {
|
|
55
|
+
return firstValueFrom(this.agentIsReplying$);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ChatSessionClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatSessionClient.js","sourceRoot":"","sources":["../../../../src/enterprise/ai/chat/ChatSessionClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EACd,GAAG,EACH,KAAK,EACL,UAAU,EACV,IAAI,EACJ,WAAW,EACX,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,cAAc,GACf,MAAM,MAAM,CAAC;AAGd,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,OAAO,iBAAiB;IACX,wBAAwB,CAGN;IAClB,aAAa,GAAG,IAAI,OAAO,EAAQ,CAAC;IACpC,iBAAiB,GAAG,IAAI,OAAO,EAAmB,CAAC;IAE3D,WAAW,CAAc;IAEzB,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACxD,SAAS,CAAC,CAAC,eAAe,EAAE,EAAE;QAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,wBAAwB,CACtD,IAAI,CAAC,WAAW,EAChB,eAAe,CAChB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEtF,OAAO,KAAK,CACV,kBAAkB,EAClB,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,cAAc,CAAC,kBAAkB,CAAC,EAClC,GAAG,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,EAAE;YAC5B,OAAO,iBAAiB,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CACH,CACF,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,EACF,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACjB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC,EAAE,EAAyB,CAAC,EAC7B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;IAEO,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACvD,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;QACpB,MAAM,gBAAgB,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;IAC5D,CAAC,CAAC,CACH,CAAC;IAEF,YAAY,EACV,WAAW,EACX,wBAAwB,GAOzB;QACC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;IAC3D,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,iBAAiB,CAAC,OAAwB;QACxC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,kBAAkB;QAChB,OAAO,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClD,CAAC;IAED,eAAe;QACb,OAAO,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC;CACF","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n firstValueFrom,\n map,\n merge,\n Observable,\n scan,\n shareReplay,\n Subject,\n switchMap,\n takeUntil,\n takeWhile,\n withLatestFrom,\n} from \"rxjs\";\nimport type { ChatSession } from \"./ChatSession.ts\";\nimport type { UserChatMessage } from \"./UserChatMessage.ts\";\nimport { AgentEndTurn } from \"./eventWrappers/AgentEndTurn.ts\";\nimport type { AgentChatExchange } from \"./eventWrappers/AgentChatExchange.ts\";\n\nexport class ChatSessionClient {\n private readonly createAgentChatExchange$: (\n chatSession: ChatSession,\n userChatMessage: UserChatMessage,\n ) => Observable<AgentChatExchange>;\n private readonly cancelEvents$ = new Subject<void>();\n private readonly userChatMessages$ = new Subject<UserChatMessage>();\n\n readonly chatSession: ChatSession;\n\n readonly agentChatExchanges$ = this.userChatMessages$.pipe(\n switchMap((userChatMessage) => {\n const agentChatExchange$ = this.createAgentChatExchange$(\n this.chatSession,\n userChatMessage,\n ).pipe(takeUntil(this.cancelEvents$), shareReplay({ bufferSize: 1, refCount: true }));\n\n return merge(\n agentChatExchange$,\n this.cancelEvents$.pipe(\n withLatestFrom(agentChatExchange$),\n map(([, agentChatExchange]) => {\n return agentChatExchange._addChatEvent(new AgentEndTurn({ type: \"user_canceled\" }));\n }),\n ),\n ).pipe(takeWhile((chatExchange) => !chatExchange.isComplete, true));\n }),\n scan((acc, curr) => {\n if (acc.at(-1)?.id === curr.id) {\n return [...acc.slice(0, -1), curr];\n }\n return [...acc, curr];\n }, [] as AgentChatExchange[]),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n readonly agentIsReplying$ = this.agentChatExchanges$.pipe(\n map((chatExchanges) => {\n const lastChatExchange = chatExchanges.at(-1);\n return !!lastChatExchange && !lastChatExchange.isComplete;\n }),\n );\n\n constructor({\n chatSession,\n createAgentChatExchange$,\n }: {\n chatSession: ChatSession;\n createAgentChatExchange$: (\n chatSession: ChatSession,\n userChatMessage: UserChatMessage,\n ) => Observable<AgentChatExchange>;\n }) {\n this.chatSession = chatSession;\n this.createAgentChatExchange$ = createAgentChatExchange$;\n }\n\n get sessionId() {\n return this.chatSession.sessionId;\n }\n\n startChatExchange(message: UserChatMessage) {\n this.userChatMessages$.next(message);\n }\n\n cancelChatExchange() {\n this.cancelEvents$.next();\n }\n\n agentChatExchanges() {\n return firstValueFrom(this.agentChatExchanges$);\n }\n\n agentIsReplying() {\n return firstValueFrom(this.agentIsReplying$);\n }\n}\n"]}
|
|
@@ -17,6 +17,6 @@ export declare class AgentChatExchange {
|
|
|
17
17
|
constructor(userChatMessage: AgentChatExchange["userChatMessage"], agentChatEvents: AgentChatExchange["agentChatEvents"], agentToolCallGroup?: AgentToolCallGroup, id?: string);
|
|
18
18
|
get isComplete(): boolean;
|
|
19
19
|
get completeReason(): Option<AgentEndTurn["reason"]>;
|
|
20
|
-
|
|
20
|
+
_addChatEvent(agentChatEvent: AgentChatExchangeEvent): AgentChatExchange;
|
|
21
21
|
}
|
|
22
22
|
export type AgentChatExchangeEvent = AgentChatResponse<AgentResponseContent> | AgentEndTurn | AgentToolCall | AgentToolCallGroup;
|
|
@@ -44,7 +44,7 @@ export class AgentChatExchange {
|
|
|
44
44
|
}
|
|
45
45
|
return None;
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
_addChatEvent(agentChatEvent) {
|
|
48
48
|
if (isToolRequest(agentChatEvent)) {
|
|
49
49
|
return new AgentChatExchange(this.userChatMessage, this.agentChatEvents, this.agentToolCallGroup.addRequest(agentChatEvent), this.id);
|
|
50
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentChatExchange.js","sourceRoot":"","sources":["../../../../../src/enterprise/ai/chat/eventWrappers/AgentChatExchange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKjE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACnB,eAAe,CAA2B;IAC1C,kBAAkB,CAAqB;IACvC,EAAE,CAAS;IACX,eAAe,CAAkB;IAE1C,YACE,eAAqD,EACrD,eAAqD,EACrD,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAC/C,EAAE,GAAG,MAAM,EAAE;QAEb,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC;IAC7D,CAAC;IAED,IAAI,cAAc;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,IAAI,SAAS,YAAY,YAAY,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"AgentChatExchange.js","sourceRoot":"","sources":["../../../../../src/enterprise/ai/chat/eventWrappers/AgentChatExchange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKjE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACnB,eAAe,CAA2B;IAC1C,kBAAkB,CAAqB;IACvC,EAAE,CAAS;IACX,eAAe,CAAkB;IAE1C,YACE,eAAqD,EACrD,eAAqD,EACrD,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAC/C,EAAE,GAAG,MAAM,EAAE;QAEb,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC;IAC7D,CAAC;IAED,IAAI,cAAc;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,IAAI,SAAS,YAAY,YAAY,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,cAAsC;QAClD,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,iBAAiB,CAC1B,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,cAAc,CAAC,EAClD,IAAI,CAAC,EAAE,CACR,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,iBAAiB,CAC1B,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,cAAc,CAAC,EACjD,IAAI,CAAC,EAAE,CACR,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,iBAAiB,CAC1B,IAAI,CAAC,eAAe,EACpB,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,EACzC,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,EAAE,CACR,CAAC;IACJ,CAAC;CACF","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { nanoid } from \"nanoid/non-secure\";\nimport { AgentEndTurn } from \"./AgentEndTurn.ts\";\nimport { None, Some, type Option } from \"ts-results-es\";\nimport { AgentToolCallGroup } from \"./AgentToolCallGroup.ts\";\nimport { isToolRequest, isToolResult } from \"./AgentToolCall.ts\";\nimport type { AgentToolCall } from \"./AgentToolCall.ts\";\nimport type { UserChatMessage } from \"../UserChatMessage.ts\";\nimport type { AgentChatResponse, AgentResponseContent } from \"../AgentChatResponse.ts\";\n\n/**\n * Represents a single chat exchange, starting with a `UserChatMessage` and followed by\n * 0 or more agent chat events. As chat events stream in, this class is updated\n * immutably but maintains a stable `.id` property.\n */\nexport class AgentChatExchange {\n readonly agentChatEvents: AgentChatExchangeEvent[];\n readonly agentToolCallGroup: AgentToolCallGroup;\n readonly id: string;\n readonly userChatMessage: UserChatMessage;\n\n constructor(\n userChatMessage: AgentChatExchange[\"userChatMessage\"],\n agentChatEvents: AgentChatExchange[\"agentChatEvents\"],\n agentToolCallGroup = new AgentToolCallGroup([]),\n id = nanoid(),\n ) {\n this.agentChatEvents = agentChatEvents;\n this.agentToolCallGroup = agentToolCallGroup;\n this.id = id;\n this.userChatMessage = userChatMessage;\n }\n\n get isComplete() {\n return this.agentChatEvents.at(-1) instanceof AgentEndTurn;\n }\n\n get completeReason(): Option<AgentEndTurn[\"reason\"]> {\n const lastEvent = this.agentChatEvents.at(-1);\n\n if (lastEvent instanceof AgentEndTurn) {\n return Some(lastEvent.reason);\n }\n\n return None;\n }\n\n _addChatEvent(agentChatEvent: AgentChatExchangeEvent) {\n if (isToolRequest(agentChatEvent)) {\n return new AgentChatExchange(\n this.userChatMessage,\n this.agentChatEvents,\n this.agentToolCallGroup.addRequest(agentChatEvent),\n this.id,\n );\n }\n if (isToolResult(agentChatEvent)) {\n return new AgentChatExchange(\n this.userChatMessage,\n this.agentChatEvents,\n this.agentToolCallGroup.addResult(agentChatEvent),\n this.id,\n );\n }\n return new AgentChatExchange(\n this.userChatMessage,\n [...this.agentChatEvents, agentChatEvent],\n this.agentToolCallGroup,\n this.id,\n );\n }\n}\n\nexport type AgentChatExchangeEvent =\n | AgentChatResponse<AgentResponseContent>\n | AgentEndTurn\n | AgentToolCall\n | AgentToolCallGroup;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/enterprise/ai/chat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/enterprise/ai/chat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC","sourcesContent":["/*\n * Copyright (C) 2024-2025 Dremio Corporation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ChatSessionClient } from \"./ChatSessionClient.ts\";\nexport type { ChatSessionClient };\n\nexport * from \"./AgentErrorResponseContent.ts\";\nexport * from \"./AgentModelResponseContent.ts\";\nexport * from \"./AgentChatPartialResponse.ts\";\nexport * from \"./AgentChatResponse.ts\";\nexport * from \"./AgentToolRequestResponseContent.ts\";\nexport * from \"./AgentToolResultResponseContent.ts\";\nexport * from \"./ChatSession.ts\";\nexport * from \"./UserChatMessage.ts\";\nexport * from \"./UserChatMessageContent.ts\";\nexport * from \"./eventWrappers/AgentChatExchange.ts\";\nexport * from \"./eventWrappers/AgentEndTurn.ts\";\nexport * from \"./eventWrappers/AgentToolCall.ts\";\nexport * from \"./eventWrappers/AgentToolCallGroup.ts\";\n"]}
|