@redhat-cloud-services/ai-client-common 0.4.1 → 0.6.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/README.md
CHANGED
|
@@ -33,10 +33,10 @@ interface IAIClient<AP extends Record<string, unknown> = Record<string, unknown>
|
|
|
33
33
|
initialConversationId: string;
|
|
34
34
|
conversations: IConversation[];
|
|
35
35
|
}>;
|
|
36
|
-
sendMessage<TChunk = unknown>(
|
|
36
|
+
sendMessage<TChunk = unknown, T extends Record<string, unknown> = Record<string, unknown>>(
|
|
37
37
|
conversationId: string,
|
|
38
38
|
message: string,
|
|
39
|
-
options?: ISendMessageOptions<
|
|
39
|
+
options?: ISendMessageOptions<T>
|
|
40
40
|
): Promise<TChunk | IMessageResponse<AP> | void>;
|
|
41
41
|
getDefaultStreamingHandler?<TChunk = unknown>(): IStreamingHandler<TChunk> | undefined;
|
|
42
42
|
getConversationHistory(conversationId: string, options?: IRequestOptions): Promise<IConversationHistoryResponse<AP>>;
|
|
@@ -84,17 +84,34 @@ const config: IBaseClientConfig = {
|
|
|
84
84
|
|
|
85
85
|
### Streaming Support
|
|
86
86
|
|
|
87
|
+
The streaming interface has been updated to standardize chunk handling across all AI clients. The `afterChunk` callback now receives an `IStreamChunk` object with standardized structure.
|
|
88
|
+
|
|
89
|
+
#### IStreamChunk Interface
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { IStreamChunk } from '@redhat-cloud-services/ai-client-common';
|
|
93
|
+
|
|
94
|
+
interface IStreamChunk<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
95
|
+
answer: string;
|
|
96
|
+
additionalAttributes: T;
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
87
100
|
#### Implementing a Custom Streaming Handler
|
|
88
101
|
|
|
89
102
|
```typescript
|
|
90
|
-
import { IStreamingHandler } from '@redhat-cloud-services/ai-client-common';
|
|
103
|
+
import { IStreamingHandler, AfterChunkCallback, IStreamChunk } from '@redhat-cloud-services/ai-client-common';
|
|
91
104
|
|
|
92
|
-
class CustomStreamingHandler implements IStreamingHandler<
|
|
93
|
-
onChunk(chunk:
|
|
105
|
+
class CustomStreamingHandler<TChunk = unknown> implements IStreamingHandler<TChunk> {
|
|
106
|
+
onChunk(chunk: TChunk, afterChunk?: AfterChunkCallback): void {
|
|
94
107
|
console.log('Received chunk:', chunk);
|
|
95
|
-
|
|
108
|
+
|
|
109
|
+
// Process the chunk and call afterChunk with standardized format
|
|
96
110
|
if (afterChunk) {
|
|
97
|
-
afterChunk(
|
|
111
|
+
afterChunk({
|
|
112
|
+
answer: extractAnswer(chunk), // Extract answer from chunk
|
|
113
|
+
additionalAttributes: extractAttributes(chunk) // Extract additional data
|
|
114
|
+
});
|
|
98
115
|
}
|
|
99
116
|
}
|
|
100
117
|
|
|
@@ -102,7 +119,7 @@ class CustomStreamingHandler implements IStreamingHandler<string> {
|
|
|
102
119
|
console.log('Stream started', { conversationId, messageId });
|
|
103
120
|
}
|
|
104
121
|
|
|
105
|
-
onComplete?(finalChunk:
|
|
122
|
+
onComplete?(finalChunk: TChunk): void {
|
|
106
123
|
console.log('Stream completed:', finalChunk);
|
|
107
124
|
}
|
|
108
125
|
|
|
@@ -119,15 +136,17 @@ class CustomStreamingHandler implements IStreamingHandler<string> {
|
|
|
119
136
|
#### Streaming Request Options
|
|
120
137
|
|
|
121
138
|
```typescript
|
|
122
|
-
import { ISendMessageOptions } from '@redhat-cloud-services/ai-client-common';
|
|
139
|
+
import { ISendMessageOptions, IStreamChunk } from '@redhat-cloud-services/ai-client-common';
|
|
123
140
|
|
|
124
|
-
const streamingOptions: ISendMessageOptions
|
|
141
|
+
const streamingOptions: ISendMessageOptions = {
|
|
125
142
|
stream: true,
|
|
126
143
|
headers: { 'Custom-Header': 'value' },
|
|
127
144
|
signal: abortController.signal,
|
|
128
|
-
afterChunk: (chunk) => {
|
|
129
|
-
// Process each chunk as it arrives
|
|
130
|
-
|
|
145
|
+
afterChunk: (chunk: IStreamChunk) => {
|
|
146
|
+
// Process each standardized chunk as it arrives
|
|
147
|
+
console.log('Answer:', chunk.answer);
|
|
148
|
+
console.log('Additional data:', chunk.additionalAttributes);
|
|
149
|
+
updateUI(chunk.answer);
|
|
131
150
|
}
|
|
132
151
|
};
|
|
133
152
|
```
|
package/package.json
CHANGED
|
@@ -38,6 +38,11 @@ export interface IRequestOptions {
|
|
|
38
38
|
*/
|
|
39
39
|
signal?: AbortSignal;
|
|
40
40
|
}
|
|
41
|
+
export interface IInitErrorResponse {
|
|
42
|
+
message: string;
|
|
43
|
+
status: number;
|
|
44
|
+
}
|
|
45
|
+
export declare function isInitErrorResponse(obj: unknown): obj is IInitErrorResponse;
|
|
41
46
|
/**
|
|
42
47
|
* Common interface that all AI clients must implement
|
|
43
48
|
* Provides a standardized way to interact with different AI services
|
|
@@ -51,6 +56,7 @@ export interface IAIClient<AP extends Record<string, unknown> = Record<string, u
|
|
|
51
56
|
init(): Promise<{
|
|
52
57
|
initialConversationId: string;
|
|
53
58
|
conversations: IConversation[];
|
|
59
|
+
error?: IInitErrorResponse;
|
|
54
60
|
}>;
|
|
55
61
|
/**
|
|
56
62
|
* Send a message to the AI service
|
|
@@ -59,7 +65,7 @@ export interface IAIClient<AP extends Record<string, unknown> = Record<string, u
|
|
|
59
65
|
* @param options - Optional configuration for the request
|
|
60
66
|
* @returns Promise that resolves to the AI's response
|
|
61
67
|
*/
|
|
62
|
-
sendMessage<TChunk = unknown>(conversationId: string, message: string, options?: ISendMessageOptions<
|
|
68
|
+
sendMessage<TChunk = unknown, T extends Record<string, unknown> = Record<string, unknown>>(conversationId: string, message: string, options?: ISendMessageOptions<T>): Promise<TChunk | IMessageResponse<AP> | void>;
|
|
63
69
|
/**
|
|
64
70
|
* Get the default streaming handler for this client (if any)
|
|
65
71
|
* @returns The default streaming handler or undefined if not configured
|
|
@@ -130,7 +136,7 @@ export interface IStreamingHandler<TChunk = unknown> {
|
|
|
130
136
|
/**
|
|
131
137
|
* Handle a single chunk of streaming data
|
|
132
138
|
*/
|
|
133
|
-
onChunk(chunk: TChunk, afterChunk?: (chunk:
|
|
139
|
+
onChunk(chunk: TChunk, afterChunk?: (chunk: IStreamChunk) => void): void;
|
|
134
140
|
/**
|
|
135
141
|
* Called when the stream starts
|
|
136
142
|
*/
|
|
@@ -208,7 +214,7 @@ export interface IConversationMessage<T extends Record<string, unknown> = Record
|
|
|
208
214
|
answer: string;
|
|
209
215
|
role: 'user' | 'bot';
|
|
210
216
|
input: string;
|
|
211
|
-
|
|
217
|
+
additionalAttributes?: T;
|
|
212
218
|
}
|
|
213
219
|
/**
|
|
214
220
|
* Response type for conversation history requests
|
|
@@ -222,15 +228,20 @@ export interface IConversation {
|
|
|
222
228
|
export interface IErrorMessageResponse {
|
|
223
229
|
error: any;
|
|
224
230
|
}
|
|
231
|
+
export interface IStreamChunk<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
232
|
+
answer: string;
|
|
233
|
+
additionalAttributes: T;
|
|
234
|
+
}
|
|
235
|
+
export type AfterChunkCallback<T extends Record<string, unknown> = Record<string, unknown>> = (chunk: IStreamChunk<T>) => void;
|
|
225
236
|
/**
|
|
226
237
|
* Options for sending messages, supporting both streaming and non-streaming modes
|
|
227
238
|
*/
|
|
228
|
-
export interface ISendMessageOptions<
|
|
239
|
+
export interface ISendMessageOptions<T extends Record<string, unknown> = Record<string, unknown>> extends IRequestOptions {
|
|
229
240
|
/**
|
|
230
241
|
* Whether to use streaming mode for the response
|
|
231
242
|
* When true, the client's default streaming handler will be used
|
|
232
243
|
*/
|
|
233
244
|
stream?: boolean;
|
|
234
|
-
afterChunk?:
|
|
245
|
+
afterChunk?: AfterChunkCallback<T>;
|
|
235
246
|
}
|
|
236
247
|
//# sourceMappingURL=ai-client-common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-client-common.d.ts","sourceRoot":"","sources":["../../../../../packages/ai-client-common/src/lib/ai-client-common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,MAAM,GAAG,OAAO;IACjD;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,aAAa,EAAE,cAAc,CAAC;IAE9B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrF;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC;QACd,qBAAqB,EAAE,MAAM,CAAC;QAC9B,aAAa,EAAE,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-client-common.d.ts","sourceRoot":"","sources":["../../../../../packages/ai-client-common/src/lib/ai-client-common.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AIClientValidationError = exports.AIClientError = void 0;
|
|
4
|
+
exports.isInitErrorResponse = isInitErrorResponse;
|
|
5
|
+
function isInitErrorResponse(obj) {
|
|
6
|
+
return (typeof obj === 'object' &&
|
|
7
|
+
obj !== null &&
|
|
8
|
+
'message' in obj &&
|
|
9
|
+
typeof obj.message === 'string' &&
|
|
10
|
+
'status' in obj &&
|
|
11
|
+
typeof obj.status === 'number');
|
|
12
|
+
}
|
|
4
13
|
/**
|
|
5
14
|
* Base error class for all AI client errors
|
|
6
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-client-common.js","sourceRoot":"","sources":["../../../../../packages/ai-client-common/src/lib/ai-client-common.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ai-client-common.js","sourceRoot":"","sources":["../../../../../packages/ai-client-common/src/lib/ai-client-common.ts"],"names":[],"mappings":";;;AAoDA,kDASC;AATD,SAAgB,mBAAmB,CAAC,GAAY;IAC9C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAA0B,CAAC,OAAO,KAAK,QAAQ;QACvD,QAAQ,IAAI,GAAG;QACf,OAAQ,GAA0B,CAAC,MAAM,KAAK,QAAQ,CACvD,CAAC;AACJ,CAAC;AAqED;;GAEG;AACH,MAAa,aAAc,SAAQ,KAAK;IACtC,YACS,MAAc,EACd,UAAkB,EACzB,OAAe,EACR,IAAc;QAErB,KAAK,CAAC,OAAO,CAAC,CAAC;QALR,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAElB,SAAI,GAAJ,IAAI,CAAU;QAGrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAVD,sCAUC;AAWD,MAAa,uBAAwB,SAAQ,aAAa;IACxD,YAAmB,gBAAoC;QACrD,KAAK,CAAC,GAAG,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;QAD7D,qBAAgB,GAAhB,gBAAgB,CAAoB;QAErD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC"}
|