@gravity-ui/aikit 2.2.1-beta.c34166a0895bc049a23b2ba68f233d0ea0e55a8b.0 → 2.3.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 +2 -0
- package/build/cjs/hooks/index.d.ts +0 -1
- package/build/cjs/hooks/index.js +0 -1
- package/build/cjs/hooks/index.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/utils/index.d.ts +0 -1
- package/build/cjs/utils/index.js +0 -1
- package/build/cjs/utils/index.js.map +1 -1
- package/build/cjs/utils/messageTypeRegistry.js +0 -5
- package/build/cjs/utils/messageTypeRegistry.js.map +1 -1
- package/build/esm/hooks/index.d.ts +0 -1
- package/build/esm/hooks/index.js +0 -1
- package/build/esm/hooks/index.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/utils/index.d.ts +0 -1
- package/build/esm/utils/index.js +0 -1
- package/build/esm/utils/index.js.map +1 -1
- package/build/esm/utils/messageTypeRegistry.js +0 -5
- package/build/esm/utils/messageTypeRegistry.js.map +1 -1
- package/docs/HOOKS.md +11 -41
- package/docs/assets/aikit_example.png +0 -0
- package/llms.txt +0 -1
- package/package.json +1 -11
- package/build/cjs/hooks/useToolset.d.ts +0 -28
- package/build/cjs/hooks/useToolset.js +0 -41
- package/build/cjs/hooks/useToolset.js.map +0 -1
- package/build/cjs/utils/toolset/i18n/en.json +0 -3
- package/build/cjs/utils/toolset/i18n/index.d.ts +0 -13
- package/build/cjs/utils/toolset/i18n/index.js +0 -10
- package/build/cjs/utils/toolset/i18n/index.js.map +0 -1
- package/build/cjs/utils/toolset/i18n/ru.json +0 -3
- package/build/cjs/utils/toolset/index.d.ts +0 -142
- package/build/cjs/utils/toolset/index.js +0 -172
- package/build/cjs/utils/toolset/index.js.map +0 -1
- package/build/esm/hooks/useToolset.d.ts +0 -28
- package/build/esm/hooks/useToolset.js +0 -38
- package/build/esm/hooks/useToolset.js.map +0 -1
- package/build/esm/utils/toolset/i18n/en.json +0 -3
- package/build/esm/utils/toolset/i18n/index.d.ts +0 -13
- package/build/esm/utils/toolset/i18n/index.js +0 -6
- package/build/esm/utils/toolset/i18n/index.js.map +0 -1
- package/build/esm/utils/toolset/i18n/ru.json +0 -3
- package/build/esm/utils/toolset/index.d.ts +0 -142
- package/build/esm/utils/toolset/index.js +0 -165
- package/build/esm/utils/toolset/index.js.map +0 -1
- package/docs/GENUI.md +0 -613
- package/docs/review-genui-phase-1.md +0 -99
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@ UI component library for AI chats built with Atomic Design principles.
|
|
|
6
6
|
|
|
7
7
|

|
|
8
8
|
|
|
9
|
+

|
|
10
|
+
|
|
9
11
|
## Resources
|
|
10
12
|
|
|
11
13
|
###   [Website](https://gravity-ui.com/libraries/aikit)
|
package/build/cjs/hooks/index.js
CHANGED
|
@@ -8,5 +8,4 @@ tslib_1.__exportStar(require("./useScrollPreservation.js"), exports);
|
|
|
8
8
|
tslib_1.__exportStar(require("./useAutoCollapseOnSuccess.js"), exports);
|
|
9
9
|
tslib_1.__exportStar(require("./useAutoCollapseOnCancelled.js"), exports);
|
|
10
10
|
tslib_1.__exportStar(require("./useFileUploadStore.js"), exports);
|
|
11
|
-
tslib_1.__exportStar(require("./useToolset.js"), exports);
|
|
12
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["hooks/index.ts"],"names":[],"mappings":";;;AAAA,sEAAmC;AACnC,8DAAiC;AACjC,8DAAiC;AACjC,qEAAwC;AACxC,wEAA2C;AAC3C,0EAA6C;AAC7C,kEAAqC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["hooks/index.ts"],"names":[],"mappings":";;;AAAA,sEAAmC;AACnC,8DAAiC;AACjC,8DAAiC;AACjC,qEAAwC;AACxC,wEAA2C;AAC3C,0EAA6C;AAC7C,kEAAqC","sourcesContent":["export * from './useDateFormatter';\nexport * from './useToolMessage';\nexport * from './useSmartScroll';\nexport * from './useScrollPreservation';\nexport * from './useAutoCollapseOnSuccess';\nexport * from './useAutoCollapseOnCancelled';\nexport * from './useFileUploadStore';\n"]}
|
package/build/cjs/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"2.
|
|
1
|
+
{"version":"2.3.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
|
package/build/cjs/utils/index.js
CHANGED
|
@@ -7,5 +7,4 @@ tslib_1.__exportStar(require("./messageUtils.js"), exports);
|
|
|
7
7
|
tslib_1.__exportStar(require("./validation.js"), exports);
|
|
8
8
|
tslib_1.__exportStar(require("./messageTypeRegistry.js"), exports);
|
|
9
9
|
tslib_1.__exportStar(require("./clipboardUtils.js"), exports);
|
|
10
|
-
tslib_1.__exportStar(require("./toolset/index.js"), exports);
|
|
11
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["utils/index.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,yDAA4B;AAC5B,4DAA+B;AAC/B,0DAA6B;AAC7B,mEAAsC;AACtC,8DAAiC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["utils/index.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,yDAA4B;AAC5B,4DAA+B;AAC/B,0DAA6B;AAC7B,mEAAsC;AACtC,8DAAiC","sourcesContent":["// Export utilities\nexport * from './chatUtils';\nexport * from './messageUtils';\nexport * from './validation';\nexport * from './messageTypeRegistry';\nexport * from './clipboardUtils';\n"]}
|
|
@@ -8,11 +8,6 @@ function createMessageRendererRegistry() {
|
|
|
8
8
|
return {};
|
|
9
9
|
}
|
|
10
10
|
function registerMessageRenderer(registry, contentType, renderer) {
|
|
11
|
-
if (process.env.NODE_ENV !== 'production' &&
|
|
12
|
-
Object.prototype.hasOwnProperty.call(registry, contentType)) {
|
|
13
|
-
// eslint-disable-next-line no-console
|
|
14
|
-
console.warn(`registerMessageRenderer: overwriting existing renderer for content type "${contentType}"`);
|
|
15
|
-
}
|
|
16
11
|
Object.assign(registry, {
|
|
17
12
|
[contentType]: renderer,
|
|
18
13
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageTypeRegistry.js","sourceRoot":"../../../src","sources":["utils/messageTypeRegistry.ts"],"names":[],"mappings":";;AAcA,sEAEC;AAED,
|
|
1
|
+
{"version":3,"file":"messageTypeRegistry.js","sourceRoot":"../../../src","sources":["utils/messageTypeRegistry.ts"],"names":[],"mappings":";;AAcA,sEAEC;AAED,0DASC;AAED,gDAKC;AAED,wEAQC;AA9BD,SAAgB,6BAA6B;IACzC,OAAO,EAAE,CAAC;AACd,CAAC;AAED,SAAgB,uBAAuB,CACnC,QAAiC,EACjC,WAA6B,EAC7B,QAAmC;IAEnC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpB,CAAC,WAAW,CAAC,EAAE,QAAsC;KACxD,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,kBAAkB,CAC9B,QAAiC,EACjC,WAAmB;;IAEnB,OAAO,MAAA,QAAQ,CAAC,WAAW,CAAC,0CAAE,SAAS,CAAC;AAC5C,CAAC;AAED,SAAgB,8BAA8B,CAC1C,eAAwC,EACxC,cAAuC;IAEvC,uCACO,eAAe,GACf,cAAc,EACnB;AACN,CAAC","sourcesContent":["import type React from 'react';\n\nimport type {TMessageContent} from '../types/messages';\n\nexport type MessageContentComponentProps<TContent extends TMessageContent = TMessageContent> = {\n part: TContent;\n};\n\nexport type MessageRenderer<TContent extends TMessageContent = TMessageContent> = {\n component: React.ComponentType<MessageContentComponentProps<TContent>>;\n};\n\nexport type MessageRendererRegistry = Record<string, MessageRenderer>;\n\nexport function createMessageRendererRegistry(): MessageRendererRegistry {\n return {};\n}\n\nexport function registerMessageRenderer<TContent extends TMessageContent>(\n registry: MessageRendererRegistry,\n contentType: TContent['type'],\n renderer: MessageRenderer<TContent>,\n): MessageRendererRegistry {\n Object.assign(registry, {\n [contentType]: renderer as unknown as MessageRenderer,\n });\n return registry;\n}\n\nexport function getMessageRenderer(\n registry: MessageRendererRegistry,\n contentType: string,\n): React.ComponentType<MessageContentComponentProps> | undefined {\n return registry[contentType]?.component;\n}\n\nexport function mergeMessageRendererRegistries(\n defaultRegistry: MessageRendererRegistry,\n customRegistry: MessageRendererRegistry,\n): MessageRendererRegistry {\n return {\n ...defaultRegistry,\n ...customRegistry,\n };\n}\n"]}
|
package/build/esm/hooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["hooks/index.ts"],"names":[],"mappings":"AAAA,4CAAmC;AACnC,oCAAiC;AACjC,oCAAiC;AACjC,2CAAwC;AACxC,8CAA2C;AAC3C,gDAA6C;AAC7C,wCAAqC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["hooks/index.ts"],"names":[],"mappings":"AAAA,4CAAmC;AACnC,oCAAiC;AACjC,oCAAiC;AACjC,2CAAwC;AACxC,8CAA2C;AAC3C,gDAA6C;AAC7C,wCAAqC","sourcesContent":["export * from './useDateFormatter';\nexport * from './useToolMessage';\nexport * from './useSmartScroll';\nexport * from './useScrollPreservation';\nexport * from './useAutoCollapseOnSuccess';\nexport * from './useAutoCollapseOnCancelled';\nexport * from './useFileUploadStore';\n"]}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"2.
|
|
1
|
+
{"version":"2.3.0","type":"module","sideEffects":["*.css","*.scss"]}
|
package/build/esm/utils/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["utils/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,+BAA4B;AAC5B,kCAA+B;AAC/B,gCAA6B;AAC7B,yCAAsC;AACtC,oCAAiC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["utils/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,+BAA4B;AAC5B,kCAA+B;AAC/B,gCAA6B;AAC7B,yCAAsC;AACtC,oCAAiC","sourcesContent":["// Export utilities\nexport * from './chatUtils';\nexport * from './messageUtils';\nexport * from './validation';\nexport * from './messageTypeRegistry';\nexport * from './clipboardUtils';\n"]}
|
|
@@ -2,11 +2,6 @@ export function createMessageRendererRegistry() {
|
|
|
2
2
|
return {};
|
|
3
3
|
}
|
|
4
4
|
export function registerMessageRenderer(registry, contentType, renderer) {
|
|
5
|
-
if (process.env.NODE_ENV !== 'production' &&
|
|
6
|
-
Object.prototype.hasOwnProperty.call(registry, contentType)) {
|
|
7
|
-
// eslint-disable-next-line no-console
|
|
8
|
-
console.warn(`registerMessageRenderer: overwriting existing renderer for content type "${contentType}"`);
|
|
9
|
-
}
|
|
10
5
|
Object.assign(registry, {
|
|
11
6
|
[contentType]: renderer,
|
|
12
7
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageTypeRegistry.js","sourceRoot":"../../../src","sources":["utils/messageTypeRegistry.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,6BAA6B;IACzC,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACnC,QAAiC,EACjC,WAA6B,EAC7B,QAAmC;IAEnC,
|
|
1
|
+
{"version":3,"file":"messageTypeRegistry.js","sourceRoot":"../../../src","sources":["utils/messageTypeRegistry.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,6BAA6B;IACzC,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACnC,QAAiC,EACjC,WAA6B,EAC7B,QAAmC;IAEnC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpB,CAAC,WAAW,CAAC,EAAE,QAAsC;KACxD,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,QAAiC,EACjC,WAAmB;;IAEnB,OAAO,MAAA,QAAQ,CAAC,WAAW,CAAC,0CAAE,SAAS,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC1C,eAAwC,EACxC,cAAuC;IAEvC,uCACO,eAAe,GACf,cAAc,EACnB;AACN,CAAC","sourcesContent":["import type React from 'react';\n\nimport type {TMessageContent} from '../types/messages';\n\nexport type MessageContentComponentProps<TContent extends TMessageContent = TMessageContent> = {\n part: TContent;\n};\n\nexport type MessageRenderer<TContent extends TMessageContent = TMessageContent> = {\n component: React.ComponentType<MessageContentComponentProps<TContent>>;\n};\n\nexport type MessageRendererRegistry = Record<string, MessageRenderer>;\n\nexport function createMessageRendererRegistry(): MessageRendererRegistry {\n return {};\n}\n\nexport function registerMessageRenderer<TContent extends TMessageContent>(\n registry: MessageRendererRegistry,\n contentType: TContent['type'],\n renderer: MessageRenderer<TContent>,\n): MessageRendererRegistry {\n Object.assign(registry, {\n [contentType]: renderer as unknown as MessageRenderer,\n });\n return registry;\n}\n\nexport function getMessageRenderer(\n registry: MessageRendererRegistry,\n contentType: string,\n): React.ComponentType<MessageContentComponentProps> | undefined {\n return registry[contentType]?.component;\n}\n\nexport function mergeMessageRendererRegistries(\n defaultRegistry: MessageRendererRegistry,\n customRegistry: MessageRendererRegistry,\n): MessageRendererRegistry {\n return {\n ...defaultRegistry,\n ...customRegistry,\n };\n}\n"]}
|
package/docs/HOOKS.md
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
# Hooks
|
|
2
2
|
|
|
3
|
-
AIKit exports
|
|
4
|
-
|
|
5
|
-
| Hook | Purpose
|
|
6
|
-
| ----------------------------------------------------------- |
|
|
7
|
-
| [`useDateFormatter`](#usedateformatter) | Format chat timestamps with locale and relative-date logic
|
|
8
|
-
| [`useToolMessage`](#usetoolmessage) | Tool-message state machine (expand/collapse based on status)
|
|
9
|
-
| [`useSmartScroll`](#usesmartscroll) | Auto-scroll to bottom while respecting user scroll-up
|
|
10
|
-
| [`useScrollPreservation`](#usescrollpreservation) | Preserve scroll position when items are prepended
|
|
11
|
-
| [`useAutoCollapseOnSuccess`](#useautocollapseonsuccess) | Collapse a section when its async operation succeeds
|
|
12
|
-
| [`useAutoCollapseOnCancelled`](#useautocollapseoncancelled) | Collapse a section when its async operation is cancelled
|
|
13
|
-
| [`useFileUploadStore`](#usefileuploadstore) | Standalone file-upload store with progress/error states
|
|
14
|
-
| [`useToolset`](#usetoolset) | Wire a toolset into the chat: renderer registry + history merge for tool calls |
|
|
3
|
+
AIKit exports 7 public hooks. All are re-exported from the package root and from the `@gravity-ui/aikit/hooks` subpath.
|
|
4
|
+
|
|
5
|
+
| Hook | Purpose |
|
|
6
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------ |
|
|
7
|
+
| [`useDateFormatter`](#usedateformatter) | Format chat timestamps with locale and relative-date logic |
|
|
8
|
+
| [`useToolMessage`](#usetoolmessage) | Tool-message state machine (expand/collapse based on status) |
|
|
9
|
+
| [`useSmartScroll`](#usesmartscroll) | Auto-scroll to bottom while respecting user scroll-up |
|
|
10
|
+
| [`useScrollPreservation`](#usescrollpreservation) | Preserve scroll position when items are prepended |
|
|
11
|
+
| [`useAutoCollapseOnSuccess`](#useautocollapseonsuccess) | Collapse a section when its async operation succeeds |
|
|
12
|
+
| [`useAutoCollapseOnCancelled`](#useautocollapseoncancelled) | Collapse a section when its async operation is cancelled |
|
|
13
|
+
| [`useFileUploadStore`](#usefileuploadstore) | Standalone file-upload store with progress/error states |
|
|
15
14
|
|
|
16
15
|
## `useDateFormatter`
|
|
17
16
|
|
|
@@ -130,32 +129,3 @@ type UseFileUploadStoreReturn<Meta> = {
|
|
|
130
129
|
```
|
|
131
130
|
|
|
132
131
|
See `src/hooks/useFileUploadStore.ts` for the complete type signature.
|
|
133
|
-
|
|
134
|
-
## `useToolset`
|
|
135
|
-
|
|
136
|
-
Wires a `Toolset` into the chat: returns a `MessageRendererRegistry` whose `tool`
|
|
137
|
-
dispatcher renders your tool components, and a `handleToolResult` callback that
|
|
138
|
-
merges results into history via `applyToolResult` and forwards the updated
|
|
139
|
-
transcript to `onAfterResult` (typical use: re-sending the conversation to the
|
|
140
|
-
model). The callback is deferred to a microtask so it never fires inside a React
|
|
141
|
-
reducer pass.
|
|
142
|
-
|
|
143
|
-
```typescript
|
|
144
|
-
function useToolset<TCustom extends TMessageContent = never>(
|
|
145
|
-
options: UseToolsetOptions<TCustom>,
|
|
146
|
-
): UseToolsetReturn;
|
|
147
|
-
|
|
148
|
-
type UseToolsetOptions<TCustom> = {
|
|
149
|
-
toolset: Toolset;
|
|
150
|
-
setMessages: Dispatch<SetStateAction<TChatMessage<TCustom>[]>>;
|
|
151
|
-
onAfterResult?: (messages: TChatMessage<TCustom>[]) => void;
|
|
152
|
-
registry?: MessageRendererRegistry;
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
type UseToolsetReturn = {
|
|
156
|
-
messageRendererRegistry: MessageRendererRegistry;
|
|
157
|
-
handleToolResult: (event: ToolsetResultEvent) => void;
|
|
158
|
-
};
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
See [GENUI.md](./GENUI.md) for an end-to-end example with a live model adapter.
|
|
Binary file
|
package/llms.txt
CHANGED
|
@@ -88,7 +88,6 @@ Tree-shaken imports: `@gravity-ui/aikit/PromptInput`, `/Header`, `/MessageList`,
|
|
|
88
88
|
- [useAutoCollapseOnSuccess](https://github.com/gravity-ui/aikit/blob/main/src/hooks/useAutoCollapseOnSuccess.ts): auto-collapse a section on success status
|
|
89
89
|
- [useAutoCollapseOnCancelled](https://github.com/gravity-ui/aikit/blob/main/src/hooks/useAutoCollapseOnCancelled.ts): auto-collapse a section on cancelled status
|
|
90
90
|
- [useFileUploadStore](https://github.com/gravity-ui/aikit/blob/main/src/hooks/useFileUploadStore.ts): headless file-upload store with progress/error states
|
|
91
|
-
- [useToolset](https://github.com/gravity-ui/aikit/blob/main/src/hooks/useToolset.ts): wire a toolset into the chat — renderer registry + history merge for tool calls
|
|
92
91
|
|
|
93
92
|
## Theming & i18n
|
|
94
93
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravity-ui/aikit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Gravity UI base kit for building ai assistant chats",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -98,16 +98,6 @@
|
|
|
98
98
|
"default": "./build/cjs/utils/clipboardUtils.js"
|
|
99
99
|
}
|
|
100
100
|
},
|
|
101
|
-
"./utils/toolset": {
|
|
102
|
-
"import": {
|
|
103
|
-
"types": "./build/esm/utils/toolset/index.d.ts",
|
|
104
|
-
"default": "./build/esm/utils/toolset/index.js"
|
|
105
|
-
},
|
|
106
|
-
"require": {
|
|
107
|
-
"types": "./build/cjs/utils/toolset/index.d.ts",
|
|
108
|
-
"default": "./build/cjs/utils/toolset/index.js"
|
|
109
|
-
}
|
|
110
|
-
},
|
|
111
101
|
"./adapters": {
|
|
112
102
|
"import": {
|
|
113
103
|
"types": "./build/esm/adapters/index.d.ts",
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { Dispatch, SetStateAction } from 'react';
|
|
2
|
-
import type { TChatMessage, TMessageContent } from "../types/messages.js";
|
|
3
|
-
import type { MessageRendererRegistry } from "../utils/messageTypeRegistry.js";
|
|
4
|
-
import { type Toolset, type ToolsetResultEvent } from "../utils/toolset/index.js";
|
|
5
|
-
export type UseToolsetOptions<TCustom extends TMessageContent = never> = {
|
|
6
|
-
toolset: Toolset;
|
|
7
|
-
setMessages: Dispatch<SetStateAction<TChatMessage<TCustom>[]>>;
|
|
8
|
-
/**
|
|
9
|
-
* Called after the tool result has been merged into history.
|
|
10
|
-
* Typical use: forward the updated transcript to the model.
|
|
11
|
-
*/
|
|
12
|
-
onAfterResult?: (messages: TChatMessage<TCustom>[]) => void;
|
|
13
|
-
/** Existing registry to extend instead of starting from a fresh one. */
|
|
14
|
-
registry?: MessageRendererRegistry;
|
|
15
|
-
};
|
|
16
|
-
export type UseToolsetReturn = {
|
|
17
|
-
messageRendererRegistry: MessageRendererRegistry;
|
|
18
|
-
handleToolResult: (event: ToolsetResultEvent) => void;
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Wire a toolset into the chat: returns a `MessageRendererRegistry` that
|
|
22
|
-
* renders tool parts via the toolset and a `handleToolResult` callback that
|
|
23
|
-
* merges results into history and notifies via `onAfterResult`.
|
|
24
|
-
*
|
|
25
|
-
* Pass the same `toolset` reference across renders (e.g. via `useMemo` or
|
|
26
|
-
* `createToolset`) so the registry stays stable.
|
|
27
|
-
*/
|
|
28
|
-
export declare function useToolset<TCustom extends TMessageContent = never>(options: UseToolsetOptions<TCustom>): UseToolsetReturn;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useToolset = useToolset;
|
|
4
|
-
const react_1 = require("react");
|
|
5
|
-
const toolset_1 = require("../utils/toolset/index.js");
|
|
6
|
-
/**
|
|
7
|
-
* Wire a toolset into the chat: returns a `MessageRendererRegistry` that
|
|
8
|
-
* renders tool parts via the toolset and a `handleToolResult` callback that
|
|
9
|
-
* merges results into history and notifies via `onAfterResult`.
|
|
10
|
-
*
|
|
11
|
-
* Pass the same `toolset` reference across renders (e.g. via `useMemo` or
|
|
12
|
-
* `createToolset`) so the registry stays stable.
|
|
13
|
-
*/
|
|
14
|
-
function useToolset(options) {
|
|
15
|
-
const { toolset, setMessages, onAfterResult, registry } = options;
|
|
16
|
-
const onAfterResultRef = (0, react_1.useRef)(onAfterResult);
|
|
17
|
-
// Mirror the latest onAfterResult into a ref every render so the
|
|
18
|
-
// registry memo below doesn't need to depend on it (which would
|
|
19
|
-
// rebuild the registry on every parent rerender).
|
|
20
|
-
(0, react_1.useEffect)(() => {
|
|
21
|
-
onAfterResultRef.current = onAfterResult;
|
|
22
|
-
});
|
|
23
|
-
const handleToolResult = (0, react_1.useCallback)((event) => {
|
|
24
|
-
setMessages((prev) => {
|
|
25
|
-
const updated = (0, toolset_1.applyToolResult)(prev, event);
|
|
26
|
-
if (updated !== prev) {
|
|
27
|
-
// Defer to a microtask: never call onAfterResult while
|
|
28
|
-
// React is still inside the setState reducer. Re-entrant
|
|
29
|
-
// setState is illegal in concurrent mode.
|
|
30
|
-
queueMicrotask(() => { var _a; return (_a = onAfterResultRef.current) === null || _a === void 0 ? void 0 : _a.call(onAfterResultRef, updated); });
|
|
31
|
-
}
|
|
32
|
-
return updated;
|
|
33
|
-
});
|
|
34
|
-
}, [setMessages]);
|
|
35
|
-
const messageRendererRegistry = (0, react_1.useMemo)(() => (0, toolset_1.createToolsetRenderer)(toolset, {
|
|
36
|
-
onToolResult: handleToolResult,
|
|
37
|
-
registry,
|
|
38
|
-
}), [toolset, handleToolResult, registry]);
|
|
39
|
-
return { messageRendererRegistry, handleToolResult };
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=useToolset.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useToolset.js","sourceRoot":"../../../src","sources":["hooks/useToolset.ts"],"names":[],"mappings":";;AAqCA,gCAuCC;AA5ED,iCAA8D;AAK9D,uDAK0B;AAmB1B;;;;;;;GAOG;AACH,SAAgB,UAAU,CACtB,OAAmC;IAEnC,MAAM,EAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC;IAEhE,MAAM,gBAAgB,GAAG,IAAA,cAAM,EAAC,aAAa,CAAC,CAAC;IAC/C,iEAAiE;IACjE,gEAAgE;IAChE,kDAAkD;IAClD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,IAAA,mBAAW,EAChC,CAAC,KAAyB,EAAE,EAAE;QAC1B,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,IAAA,yBAAe,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACnB,uDAAuD;gBACvD,yDAAyD;gBACzD,0CAA0C;gBAC1C,cAAc,CAAC,GAAG,EAAE,WAAC,OAAA,MAAA,gBAAgB,CAAC,OAAO,iEAAG,OAAO,CAAC,CAAA,EAAA,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,OAAO,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,MAAM,uBAAuB,GAAG,IAAA,eAAO,EACnC,GAAG,EAAE,CACD,IAAA,+BAAqB,EAAC,OAAO,EAAE;QAC3B,YAAY,EAAE,gBAAgB;QAC9B,QAAQ;KACX,CAAC,EACN,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CACxC,CAAC;IAEF,OAAO,EAAC,uBAAuB,EAAE,gBAAgB,EAAC,CAAC;AACvD,CAAC","sourcesContent":["import {useCallback, useEffect, useMemo, useRef} from 'react';\nimport type {Dispatch, SetStateAction} from 'react';\n\nimport type {TChatMessage, TMessageContent} from '../types/messages';\nimport type {MessageRendererRegistry} from '../utils/messageTypeRegistry';\nimport {\n type Toolset,\n type ToolsetResultEvent,\n applyToolResult,\n createToolsetRenderer,\n} from '../utils/toolset';\n\nexport type UseToolsetOptions<TCustom extends TMessageContent = never> = {\n toolset: Toolset;\n setMessages: Dispatch<SetStateAction<TChatMessage<TCustom>[]>>;\n /**\n * Called after the tool result has been merged into history.\n * Typical use: forward the updated transcript to the model.\n */\n onAfterResult?: (messages: TChatMessage<TCustom>[]) => void;\n /** Existing registry to extend instead of starting from a fresh one. */\n registry?: MessageRendererRegistry;\n};\n\nexport type UseToolsetReturn = {\n messageRendererRegistry: MessageRendererRegistry;\n handleToolResult: (event: ToolsetResultEvent) => void;\n};\n\n/**\n * Wire a toolset into the chat: returns a `MessageRendererRegistry` that\n * renders tool parts via the toolset and a `handleToolResult` callback that\n * merges results into history and notifies via `onAfterResult`.\n *\n * Pass the same `toolset` reference across renders (e.g. via `useMemo` or\n * `createToolset`) so the registry stays stable.\n */\nexport function useToolset<TCustom extends TMessageContent = never>(\n options: UseToolsetOptions<TCustom>,\n): UseToolsetReturn {\n const {toolset, setMessages, onAfterResult, registry} = options;\n\n const onAfterResultRef = useRef(onAfterResult);\n // Mirror the latest onAfterResult into a ref every render so the\n // registry memo below doesn't need to depend on it (which would\n // rebuild the registry on every parent rerender).\n useEffect(() => {\n onAfterResultRef.current = onAfterResult;\n });\n\n const handleToolResult = useCallback(\n (event: ToolsetResultEvent) => {\n setMessages((prev) => {\n const updated = applyToolResult(prev, event);\n if (updated !== prev) {\n // Defer to a microtask: never call onAfterResult while\n // React is still inside the setState reducer. Re-entrant\n // setState is illegal in concurrent mode.\n queueMicrotask(() => onAfterResultRef.current?.(updated));\n }\n return updated;\n });\n },\n [setMessages],\n );\n\n const messageRendererRegistry = useMemo(\n () =>\n createToolsetRenderer(toolset, {\n onToolResult: handleToolResult,\n registry,\n }),\n [toolset, handleToolResult, registry],\n );\n\n return {messageRendererRegistry, handleToolResult};\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export declare const i18n: ((key: "fallback-unknown-tool", params?: import("@gravity-ui/i18n").Params) => string) & {
|
|
2
|
-
Translation: import("react").ComponentType<{
|
|
3
|
-
children: (props: {
|
|
4
|
-
t: (key: "fallback-unknown-tool", params?: import("@gravity-ui/i18n").Params) => string;
|
|
5
|
-
}) => React.ReactNode;
|
|
6
|
-
}>;
|
|
7
|
-
useTranslation: () => {
|
|
8
|
-
t: (key: "fallback-unknown-tool", params?: import("@gravity-ui/i18n").Params) => string;
|
|
9
|
-
};
|
|
10
|
-
keysetData: {
|
|
11
|
-
"g-aikit-Toolset": Record<"fallback-unknown-tool", import("@gravity-ui/i18n").KeyData>;
|
|
12
|
-
};
|
|
13
|
-
};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.i18n = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const i18n_1 = require("@gravity-ui/uikit/i18n");
|
|
6
|
-
const cn_1 = require("../../cn.js");
|
|
7
|
-
const en_json_1 = tslib_1.__importDefault(require("./en.json"));
|
|
8
|
-
const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
|
|
9
|
-
exports.i18n = (0, i18n_1.addComponentKeysets)({ en: en_json_1.default, ru: ru_json_1.default }, `${cn_1.NAMESPACE}Toolset`);
|
|
10
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["utils/toolset/i18n/index.ts"],"names":[],"mappings":";;;;AAAA,iDAA2D;AAE3D,oCAAmC;AAEnC,gEAA2B;AAC3B,gEAA2B;AAEd,QAAA,IAAI,GAAG,IAAA,0BAAmB,EAAC,EAAC,EAAE,EAAF,iBAAE,EAAE,EAAE,EAAF,iBAAE,EAAC,EAAE,GAAG,cAAS,SAAS,CAAC,CAAC","sourcesContent":["import {addComponentKeysets} from '@gravity-ui/uikit/i18n';\n\nimport {NAMESPACE} from '../../cn';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nexport const i18n = addComponentKeysets({en, ru}, `${NAMESPACE}Toolset`);\n"]}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from 'react';
|
|
2
|
-
import type { TChatMessage, TMessageContent, ToolMessageContentData } from "../../types/messages.js";
|
|
3
|
-
import { type MessageRendererRegistry } from "../messageTypeRegistry.js";
|
|
4
|
-
export type ToolSchemaResult<TArgs> = {
|
|
5
|
-
success: true;
|
|
6
|
-
data: TArgs;
|
|
7
|
-
} | {
|
|
8
|
-
success: false;
|
|
9
|
-
error: {
|
|
10
|
-
message: string;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
export type ToolSchema<TArgs> = {
|
|
14
|
-
validate: (input: unknown) => ToolSchemaResult<TArgs>;
|
|
15
|
-
};
|
|
16
|
-
export type ToolComponentProps<TArgs, TResult> = {
|
|
17
|
-
args: TArgs;
|
|
18
|
-
result?: TResult;
|
|
19
|
-
submitResult: (result: TResult) => void;
|
|
20
|
-
};
|
|
21
|
-
export type ToolExecutionStatus = 'success' | 'error' | 'cancelled';
|
|
22
|
-
/**
|
|
23
|
-
* Discriminated outcome returned by a tool's `execute` callback.
|
|
24
|
-
* A tool may also return a bare `TResult`; it is then treated as
|
|
25
|
-
* `{status: 'success', result}` to keep simple cases boilerplate-free.
|
|
26
|
-
*/
|
|
27
|
-
export type ToolExecutionOutcome<TResult> = {
|
|
28
|
-
status: 'success';
|
|
29
|
-
result: TResult;
|
|
30
|
-
} | {
|
|
31
|
-
status: 'error';
|
|
32
|
-
result?: TResult;
|
|
33
|
-
error?: {
|
|
34
|
-
message: string;
|
|
35
|
-
};
|
|
36
|
-
} | {
|
|
37
|
-
status: 'cancelled';
|
|
38
|
-
result?: TResult;
|
|
39
|
-
};
|
|
40
|
-
export type ToolDefinition<TArgs, TResult, TName extends string = string> = {
|
|
41
|
-
name: TName;
|
|
42
|
-
description: string;
|
|
43
|
-
parameters: Record<string, unknown>;
|
|
44
|
-
schema: ToolSchema<TArgs>;
|
|
45
|
-
component: ComponentType<ToolComponentProps<TArgs, TResult>>;
|
|
46
|
-
/**
|
|
47
|
-
* Run after the user submits a result inside the tool component.
|
|
48
|
-
* Return:
|
|
49
|
-
* - `TResult` (or a Promise of one) for a successful execution;
|
|
50
|
-
* - a `ToolExecutionOutcome<TResult>` to explicitly report `error`
|
|
51
|
-
* or `cancelled`. A thrown error is surfaced as `{status: 'error'}`.
|
|
52
|
-
*/
|
|
53
|
-
execute?: (params: {
|
|
54
|
-
args: TArgs;
|
|
55
|
-
result: TResult;
|
|
56
|
-
toolCallId: string;
|
|
57
|
-
}) => TResult | ToolExecutionOutcome<TResult> | Promise<TResult | ToolExecutionOutcome<TResult>>;
|
|
58
|
-
};
|
|
59
|
-
export type RuntimeToolDefinition<TName extends string = string> = {
|
|
60
|
-
name: TName;
|
|
61
|
-
description: string;
|
|
62
|
-
parameters: Record<string, unknown>;
|
|
63
|
-
validate: (input: unknown) => ToolSchemaResult<unknown>;
|
|
64
|
-
/**
|
|
65
|
-
* Rendered as `<Renderer ... />` JSX. Hooks placed at the top of this
|
|
66
|
-
* component work normally because it is a real React component, not a
|
|
67
|
-
* function called inside another render path.
|
|
68
|
-
*/
|
|
69
|
-
Renderer: ComponentType<ToolComponentProps<unknown, unknown>>;
|
|
70
|
-
execute: (params: {
|
|
71
|
-
args: unknown;
|
|
72
|
-
result: unknown;
|
|
73
|
-
toolCallId: string;
|
|
74
|
-
}) => unknown | ToolExecutionOutcome<unknown> | Promise<unknown | ToolExecutionOutcome<unknown>>;
|
|
75
|
-
};
|
|
76
|
-
export type Toolset = Record<string, RuntimeToolDefinition>;
|
|
77
|
-
export type ToolPartContentData<TArgs = unknown, TResult = unknown> = ToolMessageContentData & {
|
|
78
|
-
toolCallId: string;
|
|
79
|
-
args?: TArgs;
|
|
80
|
-
result?: TResult;
|
|
81
|
-
};
|
|
82
|
-
export type ToolPartContent<TArgs = unknown, TResult = unknown> = TMessageContent<'tool', ToolPartContentData<TArgs, TResult>>;
|
|
83
|
-
export type ToolsetResultEvent = {
|
|
84
|
-
toolCallId: string;
|
|
85
|
-
toolName: string;
|
|
86
|
-
status: ToolExecutionStatus;
|
|
87
|
-
result: unknown;
|
|
88
|
-
error?: {
|
|
89
|
-
message: string;
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Wrap a typed tool definition into an erased runtime entry that the
|
|
94
|
-
* toolset renderer can dispatch by `toolName`. The literal `name` is
|
|
95
|
-
* preserved as a type parameter so `createToolset` can derive its keys.
|
|
96
|
-
*/
|
|
97
|
-
export declare function defineTool<TArgs, TResult, const TName extends string>(definition: ToolDefinition<TArgs, TResult, TName>): RuntimeToolDefinition<TName>;
|
|
98
|
-
/**
|
|
99
|
-
* Build a `Toolset` from a list of `defineTool(...)` results. Keys are
|
|
100
|
-
* derived from `definition.name`, so the call site cannot drift between
|
|
101
|
-
* a literal-object key and the embedded `name`. The return type narrows
|
|
102
|
-
* its keys to the union of literal tool names, giving name-autocomplete
|
|
103
|
-
* on lookups. Throws on duplicates.
|
|
104
|
-
*/
|
|
105
|
-
export declare function createToolset<const T extends readonly RuntimeToolDefinition<string>[]>(...tools: T): {
|
|
106
|
-
[K in T[number]['name']]: RuntimeToolDefinition<T[number]['name']>;
|
|
107
|
-
};
|
|
108
|
-
/**
|
|
109
|
-
* Map a `Toolset` to the OpenAI `tools[]` shape so chat clients can pass
|
|
110
|
-
* tool definitions to the model without reimplementing the conversion.
|
|
111
|
-
*/
|
|
112
|
-
export declare function toolsetToOpenAIDefinitions(toolset: Toolset): Array<{
|
|
113
|
-
type: 'function';
|
|
114
|
-
function: {
|
|
115
|
-
name: string;
|
|
116
|
-
description: string;
|
|
117
|
-
parameters: Record<string, unknown>;
|
|
118
|
-
};
|
|
119
|
-
}>;
|
|
120
|
-
export type CreateToolsetRendererOptions = {
|
|
121
|
-
onToolResult: (event: ToolsetResultEvent) => void;
|
|
122
|
-
/**
|
|
123
|
-
* Existing registry whose entries should be preserved. A shallow copy
|
|
124
|
-
* is taken; the input reference is never mutated.
|
|
125
|
-
*/
|
|
126
|
-
registry?: MessageRendererRegistry;
|
|
127
|
-
};
|
|
128
|
-
/**
|
|
129
|
-
* Build a `MessageRendererRegistry` whose `tool` renderer dispatches
|
|
130
|
-
* by `toolName` into the provided toolset. Unknown tools and invalid
|
|
131
|
-
* args fall back to a generic `<ToolMessage status="error" />`. Errors
|
|
132
|
-
* thrown inside `execute` are surfaced via an `error` outcome.
|
|
133
|
-
*/
|
|
134
|
-
export declare function createToolsetRenderer(toolset: Toolset, options: CreateToolsetRendererOptions): MessageRendererRegistry;
|
|
135
|
-
/**
|
|
136
|
-
* Merge a tool result into the matching `tool` part of the chat history.
|
|
137
|
-
* Honors `event.status` so the part reflects success / error / cancelled.
|
|
138
|
-
* For backward compatibility, a missing `status` is treated as `'success'`.
|
|
139
|
-
* Returns the original array reference when nothing matched, so React state
|
|
140
|
-
* setters can skip needless updates.
|
|
141
|
-
*/
|
|
142
|
-
export declare function applyToolResult<TCustom extends TMessageContent = never>(messages: TChatMessage<TCustom>[], event: ToolsetResultEvent): TChatMessage<TCustom>[];
|