@gravity-ui/aikit 1.6.0 → 1.7.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/adapters/openai/helpers/mapOpenAIConversationsToChats.d.ts +3 -0
- package/dist/adapters/openai/helpers/mapOpenAIConversationsToChats.js +22 -0
- package/dist/adapters/openai/index.d.ts +5 -2
- package/dist/adapters/openai/index.js +2 -0
- package/dist/adapters/openai/types/index.d.ts +4 -1
- package/dist/adapters/openai/types/openAiTypes.d.ts +6 -0
- package/dist/adapters/openai/useOpenAIConversationsAdapter.d.ts +9 -0
- package/dist/adapters/openai/useOpenAIConversationsAdapter.js +15 -0
- package/dist/adapters/openai/useOpenAIResponsesAdapter.d.ts +1 -1
- package/dist/adapters/openai/useOpenAIResponsesAdapter.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const DEFAULT_CHAT_NAME = 'Chat';
|
|
2
|
+
function getConversationName(metadata) {
|
|
3
|
+
var _a;
|
|
4
|
+
const title = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.title) !== null && _a !== void 0 ? _a : metadata === null || metadata === void 0 ? void 0 : metadata.name;
|
|
5
|
+
return title && title.trim() ? title.trim() : DEFAULT_CHAT_NAME;
|
|
6
|
+
}
|
|
7
|
+
export function mapOpenAIConversationsToChats(conversations) {
|
|
8
|
+
if (!Array.isArray(conversations)) {
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
return conversations.map((conv) => {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
const createTime = conv.created_at ? new Date(conv.created_at * 1000).toISOString() : null;
|
|
14
|
+
return {
|
|
15
|
+
id: conv.id,
|
|
16
|
+
name: getConversationName(conv.metadata),
|
|
17
|
+
createTime,
|
|
18
|
+
lastMessage: ((_a = conv.metadata) === null || _a === void 0 ? void 0 : _a.last_message) || undefined,
|
|
19
|
+
metadata: (_b = conv.metadata) !== null && _b !== void 0 ? _b : undefined,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
export { fetchResponseToStreamEvents } from './helpers/fetchResponseToStreamEvents';
|
|
2
2
|
export { getTextDeltaFromStreamEvent } from './helpers/getTextDeltaFromStreamEvent';
|
|
3
3
|
export { isFetchResponse } from './helpers/isFetchResponse';
|
|
4
|
+
export { mapOpenAIConversationsToChats } from './helpers/mapOpenAIConversationsToChats';
|
|
4
5
|
export { isOutputItemDoneEvent } from './helpers/isOutputItemDoneEvent';
|
|
5
6
|
export { isStreamEndOrErrorEvent } from './helpers/isStreamEndOrErrorEvent';
|
|
6
7
|
export { openAIResponseToMessages } from './helpers/openAIResponseToMessages';
|
|
8
|
+
export { useOpenAIConversationsAdapter } from './useOpenAIConversationsAdapter';
|
|
7
9
|
export { useOpenAIResponsesAdapter, useOpenAIStreamAdapter } from './useOpenAIResponsesAdapter';
|
|
8
|
-
export type { OpenAIStreamAdapterOptions, OpenAIStreamAdapterResult, OpenAIStreamSource, } from './types';
|
|
10
|
+
export type { OpenAIStreamAdapterOptions, OpenAIStreamAdapterResult, OpenAIStreamAdapterStatus, OpenAIStreamSource, } from './types';
|
|
9
11
|
export type { FetchResponseLike, OpenAIStreamEventLike } from './types';
|
|
10
|
-
export type { OpenAIResponseLike } from './types/openAiTypes';
|
|
12
|
+
export type { OpenAIResponseLike, OpenAIConversationLike } from './types/openAiTypes';
|
|
13
|
+
export type { OpenAIConversationsListResponseLike, UseOpenAIConversationsAdapterResult, } from './useOpenAIConversationsAdapter';
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { fetchResponseToStreamEvents } from './helpers/fetchResponseToStreamEvents';
|
|
2
2
|
export { getTextDeltaFromStreamEvent } from './helpers/getTextDeltaFromStreamEvent';
|
|
3
3
|
export { isFetchResponse } from './helpers/isFetchResponse';
|
|
4
|
+
export { mapOpenAIConversationsToChats } from './helpers/mapOpenAIConversationsToChats';
|
|
4
5
|
export { isOutputItemDoneEvent } from './helpers/isOutputItemDoneEvent';
|
|
5
6
|
export { isStreamEndOrErrorEvent } from './helpers/isStreamEndOrErrorEvent';
|
|
6
7
|
export { openAIResponseToMessages } from './helpers/openAIResponseToMessages';
|
|
8
|
+
export { useOpenAIConversationsAdapter } from './useOpenAIConversationsAdapter';
|
|
7
9
|
export { useOpenAIResponsesAdapter, useOpenAIStreamAdapter } from './useOpenAIResponsesAdapter';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TChatMessage } from '../../../types';
|
|
2
|
+
import type { ChatStatus } from '../../../types/chat';
|
|
2
3
|
import type { OpenAIStreamEventLike } from './openAiTypes';
|
|
3
4
|
export type FetchResponseLike = {
|
|
4
5
|
body?: ReadableStream<Uint8Array> | null;
|
|
@@ -12,9 +13,11 @@ export type OpenAIStreamAdapterOptions = {
|
|
|
12
13
|
assistantMessageId?: string;
|
|
13
14
|
onStreamEnd?: (messages: TChatMessage[]) => void;
|
|
14
15
|
};
|
|
16
|
+
/** Status from useOpenAIStreamAdapter. Subset of ChatStatus (no 'submitted'); safe to pass to ChatContainer. */
|
|
17
|
+
export type OpenAIStreamAdapterStatus = Exclude<ChatStatus, 'submitted'>;
|
|
15
18
|
export type OpenAIStreamAdapterResult = {
|
|
16
19
|
messages: TChatMessage[];
|
|
17
|
-
status:
|
|
20
|
+
status: OpenAIStreamAdapterStatus;
|
|
18
21
|
error: Error | null;
|
|
19
22
|
};
|
|
20
23
|
export type OpenAIStreamSource = AsyncIterable<OpenAIStreamEventLike> | FetchResponseLike;
|
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
* raw SSE and partial API responses.
|
|
7
7
|
*/
|
|
8
8
|
import type { ResponseOutputRefusal, ResponseOutputText } from 'openai/resources/responses/responses';
|
|
9
|
+
export type OpenAIConversationLike = {
|
|
10
|
+
id: string;
|
|
11
|
+
created_at: number;
|
|
12
|
+
metadata?: Record<string, string> | null;
|
|
13
|
+
object?: 'conversation';
|
|
14
|
+
};
|
|
9
15
|
/** Minimal response shape (Response subset); all optional for partial/SSE. */
|
|
10
16
|
export type OpenAIResponseLike = {
|
|
11
17
|
id?: string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ChatType } from '../../types';
|
|
2
|
+
import type { OpenAIConversationLike } from './types/openAiTypes';
|
|
3
|
+
export type OpenAIConversationsListResponseLike = {
|
|
4
|
+
data?: OpenAIConversationLike[] | null;
|
|
5
|
+
};
|
|
6
|
+
export type UseOpenAIConversationsAdapterResult = {
|
|
7
|
+
chats: ChatType[];
|
|
8
|
+
};
|
|
9
|
+
export declare function useOpenAIConversationsAdapter(conversations: OpenAIConversationLike[] | OpenAIConversationsListResponseLike | null | undefined): UseOpenAIConversationsAdapterResult;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { mapOpenAIConversationsToChats } from './helpers/mapOpenAIConversationsToChats';
|
|
3
|
+
function getConversationsList(input) {
|
|
4
|
+
var _a;
|
|
5
|
+
if (!input || Array.isArray(input))
|
|
6
|
+
return input;
|
|
7
|
+
if (typeof input === 'object' && 'data' in input)
|
|
8
|
+
return (_a = input.data) !== null && _a !== void 0 ? _a : null;
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
export function useOpenAIConversationsAdapter(conversations) {
|
|
12
|
+
const list = getConversationsList(conversations);
|
|
13
|
+
const chats = useMemo(() => mapOpenAIConversationsToChats(list), [list]);
|
|
14
|
+
return { chats };
|
|
15
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { TChatMessage } from '../../types';
|
|
2
2
|
import type { OpenAIStreamAdapterOptions, OpenAIStreamAdapterResult, OpenAIStreamSource } from './types';
|
|
3
3
|
import { OpenAIResponseLike } from './types/openAiTypes';
|
|
4
|
-
export type { OpenAIStreamAdapterOptions, OpenAIStreamAdapterResult, OpenAIStreamSource, } from './types';
|
|
4
|
+
export type { OpenAIStreamAdapterOptions, OpenAIStreamAdapterResult, OpenAIStreamAdapterStatus, OpenAIStreamSource, } from './types';
|
|
5
5
|
/** Single non-streaming response → TChatMessage[]. For streaming use useOpenAIStreamAdapter. */
|
|
6
6
|
export declare function useOpenAIResponsesAdapter(response: OpenAIResponseLike | null): TChatMessage[];
|
|
7
7
|
/**
|
|
@@ -19,12 +19,12 @@ export function useOpenAIStreamAdapter(stream, options = {}) {
|
|
|
19
19
|
const initialMessagesRef = useRef(initialMessages);
|
|
20
20
|
initialMessagesRef.current = initialMessages;
|
|
21
21
|
const [messages, setMessages] = useState(initialMessages);
|
|
22
|
-
const [status, setStatus] = useState('
|
|
22
|
+
const [status, setStatus] = useState('ready');
|
|
23
23
|
const [error, setError] = useState(null);
|
|
24
24
|
const assistantMessageId = useMemo(() => optionId !== null && optionId !== void 0 ? optionId : `assistant-${Date.now()}`, [optionId]);
|
|
25
25
|
useEffect(() => {
|
|
26
26
|
if (!stream) {
|
|
27
|
-
setStatus('
|
|
27
|
+
setStatus('ready');
|
|
28
28
|
setError(null);
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
@@ -68,7 +68,7 @@ export function useOpenAIStreamAdapter(stream, options = {}) {
|
|
|
68
68
|
},
|
|
69
69
|
onEnd: (finalMessages, s, err) => {
|
|
70
70
|
var _a;
|
|
71
|
-
setStatus(s);
|
|
71
|
+
setStatus(s === 'done' ? 'ready' : s);
|
|
72
72
|
setError(err !== null && err !== void 0 ? err : null);
|
|
73
73
|
(_a = onStreamEndRef.current) === null || _a === void 0 ? void 0 : _a.call(onStreamEndRef, finalMessages);
|
|
74
74
|
},
|