@aws-amplify/ui-react-ai 0.3.2 → 0.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.
Files changed (37) hide show
  1. package/dist/esm/components/AIConversation/AIConversation.mjs +22 -16
  2. package/dist/esm/components/AIConversation/AIConversationProvider.mjs +15 -12
  3. package/dist/esm/components/AIConversation/context/MessageRenderContext.mjs +9 -0
  4. package/dist/esm/components/AIConversation/context/WelcomeMessageContext.mjs +8 -0
  5. package/dist/esm/components/AIConversation/createAIConversation.mjs +17 -18
  6. package/dist/esm/components/AIConversation/views/Controls/ActionsBarControl.mjs +3 -0
  7. package/dist/esm/components/AIConversation/views/Controls/AttachFileControl.mjs +3 -0
  8. package/dist/esm/components/AIConversation/views/Controls/AttachmentListControl.mjs +3 -0
  9. package/dist/esm/components/AIConversation/views/Controls/AvatarControl.mjs +3 -0
  10. package/dist/esm/components/AIConversation/views/Controls/DefaultMessageControl.mjs +29 -0
  11. package/dist/esm/components/AIConversation/views/Controls/{FieldControl.mjs → FormControl.mjs} +11 -9
  12. package/dist/esm/components/AIConversation/views/Controls/MessagesControl.mjs +25 -18
  13. package/dist/esm/components/AIConversation/views/Controls/PromptControl.mjs +7 -36
  14. package/dist/esm/components/AIConversation/views/default/MessageList.mjs +3 -0
  15. package/dist/esm/components/AIConversation/views/default/PromptList.mjs +1 -1
  16. package/dist/esm/version.mjs +3 -0
  17. package/dist/index.js +212 -247
  18. package/dist/types/components/AIConversation/AIConversation.d.ts +2 -16
  19. package/dist/types/components/AIConversation/AIConversationProvider.d.ts +2 -3
  20. package/dist/types/components/AIConversation/context/MessageRenderContext.d.ts +5 -0
  21. package/dist/types/components/AIConversation/context/WelcomeMessageContext.d.ts +8 -0
  22. package/dist/types/components/AIConversation/context/index.d.ts +3 -0
  23. package/dist/types/components/AIConversation/types.d.ts +21 -13
  24. package/dist/types/components/AIConversation/utils.d.ts +2 -2
  25. package/dist/types/components/AIConversation/views/Controls/DefaultMessageControl.d.ts +2 -0
  26. package/dist/types/components/AIConversation/views/Controls/{FieldControl.d.ts → FormControl.d.ts} +2 -2
  27. package/dist/types/components/AIConversation/views/Controls/MessagesControl.d.ts +2 -4
  28. package/dist/types/components/AIConversation/views/Controls/PromptControl.d.ts +0 -3
  29. package/dist/types/components/AIConversation/views/Controls/index.d.ts +3 -4
  30. package/dist/types/components/AIConversation/views/index.d.ts +2 -3
  31. package/dist/types/types.d.ts +6 -6
  32. package/dist/types/version.d.ts +1 -0
  33. package/package.json +20 -6
  34. package/dist/esm/components/AIConversation/views/Controls/HeaderControl.mjs +0 -34
  35. package/dist/esm/components/AIConversation/views/ConversationView.mjs +0 -20
  36. package/dist/types/components/AIConversation/views/Controls/HeaderControl.d.ts +0 -9
  37. package/dist/types/components/AIConversation/views/ConversationView.d.ts +0 -2
@@ -1,22 +1,8 @@
1
- import * as React from 'react';
2
- import { AIConversationInput, AIConversationProps } from './types';
1
+ import { AIConversation as AIConversationType, AIConversationInput, AIConversationProps } from './types';
3
2
  interface AIConversationBaseProps extends AIConversationProps, AIConversationInput {
4
3
  }
5
- declare function AIConversationBase({ actions, avatars, controls, handleSendMessage, messages, responseComponents, suggestedPrompts, variant, isLoading, displayText, allowAttachments, }: AIConversationBaseProps): JSX.Element;
6
4
  /**
7
5
  * @experimental
8
6
  */
9
- export declare const AIConversation: typeof AIConversationBase & {
10
- MessageList: React.ComponentType<{
11
- messages: import("@aws-amplify/data-schema/dist/esm/ai/ConversationType").ConversationMessage[];
12
- }> | undefined;
13
- PromptList: React.ComponentType<{
14
- suggestedPrompts?: import("./types").SuggestedPrompt[] | undefined;
15
- setInput: React.Dispatch<React.SetStateAction<import("./context").ConversationInput | undefined>> | undefined;
16
- }> | undefined;
17
- Form: NonNullable<React.ComponentType<{
18
- handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;
19
- allowAttachments?: boolean | undefined;
20
- } & Required<import("./context").ConversationInputContext>> | undefined>;
21
- };
7
+ export declare const AIConversation: AIConversationType<AIConversationBaseProps>;
22
8
  export {};
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { AIConversationInput, AIConversationProps } from './types';
3
- interface AIConversationProviderProps extends AIConversationInput, AIConversationProps {
3
+ export interface AIConversationProviderProps extends AIConversationInput, AIConversationProps {
4
4
  children?: React.ReactNode;
5
5
  }
6
- export declare const AIConversationProvider: ({ elements, actions, suggestedPrompts, responseComponents, variant, controls, displayText, allowAttachments, messages, handleSendMessage, avatars, isLoading, children, }: AIConversationProviderProps) => React.JSX.Element;
7
- export {};
6
+ export declare const AIConversationProvider: ({ actions, allowAttachments, avatars, children, controls, displayText, elements, handleSendMessage, isLoading, messages, responseComponents, suggestedPrompts, variant, welcomeMessage, }: AIConversationProviderProps) => React.JSX.Element;
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { MessageRenderer } from '../types';
3
+ export declare const MessageRendererContext: import("react").Context<MessageRenderer | undefined>, MessageRendererProvider: import("react").ComponentType<import("react").PropsWithChildren<MessageRenderer>>, useMessageRenderer: (params?: {
4
+ errorMessage?: string | undefined;
5
+ } | undefined) => MessageRenderer;
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ type WelcomeMessageContextProps = React.ReactNode | undefined;
3
+ export declare const WelcomeMessageContext: React.Context<WelcomeMessageContextProps>;
4
+ export declare const WelcomeMessageProvider: ({ children, welcomeMessage, }: {
5
+ children?: React.ReactNode;
6
+ welcomeMessage?: React.ReactNode;
7
+ }) => JSX.Element;
8
+ export {};
@@ -9,4 +9,7 @@ export { ControlsContext, ControlsContextProps, ControlsProvider, } from './Cont
9
9
  export { LoadingContextProvider } from './LoadingContext';
10
10
  export { ResponseComponentsProvider, RESPONSE_COMPONENT_PREFIX, } from './ResponseComponentsContext';
11
11
  export { SendMessageContextProvider } from './SendMessageContext';
12
+ export { MessageRendererProvider, MessageRendererContext, useMessageRenderer, } from './MessageRenderContext';
13
+ export { AttachmentProvider, AttachmentContext } from './AttachmentContext';
14
+ export { WelcomeMessageContext, WelcomeMessageProvider, } from './WelcomeMessageContext';
12
15
  export * from './elements';
@@ -1,27 +1,29 @@
1
1
  import React from 'react';
2
2
  import { AIConversationElements } from './context/elements';
3
- import { ActionsBarControl, AvatarControl, FieldControl, HeaderControl, MessagesControl, PromptControl } from './views';
3
+ import { ActionsBarControl, AvatarControl, FormControl, MessagesControl, PromptControl } from './views';
4
4
  import { DisplayTextTemplate } from '@aws-amplify/ui';
5
5
  import { AIConversationDisplayText } from './displayText';
6
- import { ConversationMessage, SendMessage } from '../../types';
6
+ import { ConversationMessage, ImageContentBlock, SendMessage, TextContentBlock } from '../../types';
7
7
  import { ControlsContextProps } from './context/ControlsContext';
8
+ import { AIConversationProviderProps } from './AIConversationProvider';
8
9
  export interface Controls {
9
10
  Avatars: AvatarControl;
10
11
  ActionsBar: ActionsBarControl;
11
- Field: FieldControl;
12
- Header: HeaderControl;
12
+ Form: FormControl;
13
13
  Messages: MessagesControl;
14
14
  SuggestedPrompts: PromptControl;
15
15
  }
16
16
  export interface AIConversationInput {
17
17
  elements?: Partial<AIConversationElements>;
18
18
  displayText?: DisplayTextTemplate<AIConversationDisplayText>;
19
+ welcomeMessage?: React.ReactNode;
19
20
  suggestedPrompts?: SuggestedPrompt[];
20
21
  actions?: CustomAction[];
21
22
  responseComponents?: ResponseComponents;
22
23
  variant?: MessageVariant;
23
24
  controls?: ControlsContextProps;
24
25
  allowAttachments?: boolean;
26
+ messageRenderer?: MessageRenderer;
25
27
  }
26
28
  export interface AIConversationProps {
27
29
  messages: ConversationMessage[];
@@ -29,15 +31,22 @@ export interface AIConversationProps {
29
31
  avatars?: Avatars;
30
32
  isLoading?: boolean;
31
33
  }
32
- export interface AIConversation {
33
- (props: AIConversationProps): JSX.Element;
34
- Conversation: () => React.JSX.Element;
35
- Controls: Controls;
36
- Provider: (props: {
37
- children?: React.ReactNode;
38
- } & Pick<AIConversationProps, 'messages' | 'avatars' | 'handleSendMessage'>) => React.JSX.Element;
34
+ export interface AIConversation<PropsType extends AIConversationProps = AIConversationProps> {
35
+ (props: PropsType): JSX.Element;
36
+ DefaultMessage: () => JSX.Element | undefined;
37
+ Messages: () => JSX.Element;
38
+ Form: () => JSX.Element;
39
+ Provider: (props: AIConversationProviderProps) => React.JSX.Element;
39
40
  }
40
41
  export type MessageVariant = 'bubble' | 'default';
42
+ export interface MessageRenderer {
43
+ text?: (input: {
44
+ text: TextContentBlock;
45
+ }) => React.JSX.Element;
46
+ image?: (input: {
47
+ image: ImageContentBlock;
48
+ }) => React.JSX.Element;
49
+ }
41
50
  export interface Avatar {
42
51
  username?: string;
43
52
  avatar?: React.ReactNode;
@@ -52,8 +61,7 @@ export interface CustomAction {
52
61
  icon: React.ReactNode;
53
62
  }
54
63
  export interface SuggestedPrompt {
55
- icon?: React.ReactNode;
56
- header: string;
64
+ component?: React.ReactNode;
57
65
  inputText: string;
58
66
  }
59
67
  type JSONType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null' | 'any';
@@ -1,4 +1,4 @@
1
- import { ImageContent } from '../../types';
1
+ import { ImageContentBlock } from '../../types';
2
2
  export declare function formatDate(date: Date): string;
3
- export declare function convertBufferToBase64(buffer: ArrayBuffer, format: ImageContent['format']): string;
3
+ export declare function convertBufferToBase64(buffer: ArrayBuffer, format: ImageContentBlock['format']): string;
4
4
  export declare function getImageTypeFromMimeType(mimeType: string): 'png' | 'jpeg' | 'gif' | 'webp';
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare const DefaultMessageControl: () => JSX.Element | undefined;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { AIConversationElements } from '../../context/elements';
3
3
  import { AttachFileControl } from './AttachFileControl';
4
- export declare const FieldControl: FieldControl;
5
- export interface FieldControl {
4
+ export declare const FormControl: FormControl;
5
+ export interface FormControl {
6
6
  (): React.JSX.Element;
7
7
  AttachFile: AttachFileControl;
8
8
  InputContainer: AIConversationElements['View'];
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ /// <reference types="react" />
2
2
  import { AIConversationElements } from '../../context/elements';
3
3
  import { ActionsBarControl } from './ActionsBarControl';
4
4
  import { AvatarControl } from './AvatarControl';
@@ -14,9 +14,7 @@ interface MessageControl<T extends Partial<AIConversationElements> = AIConversat
14
14
  }
15
15
  export declare const MessagesControl: MessagesControl;
16
16
  export interface MessagesControl {
17
- (props: {
18
- renderMessage?: (message: ConversationMessage) => React.ReactNode;
19
- }): JSX.Element;
17
+ (): JSX.Element;
20
18
  ActionsBar: ActionsBarControl;
21
19
  Avatar: AvatarControl;
22
20
  Container: AIConversationElements['View'];
@@ -1,12 +1,9 @@
1
1
  import React from 'react';
2
2
  import { AIConversationElements } from '../../context';
3
3
  export declare const PromptControl: PromptControl;
4
- export declare const AutoHidablePromptControl: () => JSX.Element | undefined;
5
4
  export interface PromptControl {
6
5
  (): React.JSX.Element;
7
6
  Container: AIConversationElements['View'];
8
- Header: AIConversationElements['Heading'];
9
- Icon: AIConversationElements['Icon'];
10
7
  PromptGroup: AIConversationElements['View'];
11
8
  PromptCard: AIConversationElements['Button'];
12
9
  }
@@ -1,7 +1,6 @@
1
1
  import { ActionsBarControl } from './ActionsBarControl';
2
2
  import { AvatarControl } from './AvatarControl';
3
- import { HeaderControl } from './HeaderControl';
4
- import { FieldControl } from './FieldControl';
3
+ import { FormControl } from './FormControl';
5
4
  import { MessagesControl } from './MessagesControl';
6
- import { AutoHidablePromptControl, PromptControl } from './PromptControl';
7
- export { ActionsBarControl, AvatarControl, HeaderControl, FieldControl, MessagesControl, PromptControl, AutoHidablePromptControl, };
5
+ import { PromptControl } from './PromptControl';
6
+ export { ActionsBarControl, AvatarControl, FormControl, MessagesControl, PromptControl, };
@@ -1,3 +1,2 @@
1
- import Conversation from './ConversationView';
2
- import { ActionsBarControl, AvatarControl, FieldControl, HeaderControl, MessagesControl, PromptControl } from './Controls';
3
- export { ActionsBarControl, AvatarControl, Conversation, FieldControl, HeaderControl, MessagesControl, PromptControl, };
1
+ import { ActionsBarControl, AvatarControl, FormControl, MessagesControl, PromptControl } from './Controls';
2
+ export { ActionsBarControl, AvatarControl, FormControl, MessagesControl, PromptControl, };
@@ -3,12 +3,12 @@ export type ConversationRoute = V6Client<any>['conversations'][string];
3
3
  export type Conversation = NonNullable<Awaited<ReturnType<ConversationRoute['create']>>['data']>;
4
4
  export type ConversationMessage = NonNullable<Awaited<ReturnType<Conversation['sendMessage']>>['data']>;
5
5
  export type ConversationMessageContent = ConversationMessage['content'][number];
6
- export type TextContent = NonNullable<ConversationMessageContent['text']>;
7
- export type ImageContent = NonNullable<ConversationMessageContent['image']>;
8
- export type InputContent = Parameters<Conversation['sendMessage']>[0]['content'][number];
9
- export type SendMessageContent = Parameters<Conversation['sendMessage']>[0]['content'];
10
- export type SendMessageContext = Parameters<Conversation['sendMessage']>[0]['aiContext'];
11
- export type ToolConfiguration = NonNullable<Parameters<Conversation['sendMessage']>[0]['toolConfiguration']>;
6
+ export type TextContentBlock = NonNullable<ConversationMessageContent['text']>;
7
+ export type ImageContentBlock = NonNullable<ConversationMessageContent['image']>;
8
+ export type InputContent = Exclude<Parameters<Conversation['sendMessage']>[0], string>['content'][number];
9
+ export type SendMessageContent = Exclude<Parameters<Conversation['sendMessage']>[0], string>['content'];
10
+ export type SendMessageContext = Exclude<Parameters<Conversation['sendMessage']>[0], string>['aiContext'];
11
+ export type ToolConfiguration = NonNullable<Exclude<Parameters<Conversation['sendMessage']>[0], string>['toolConfiguration']>;
12
12
  export interface SendMesageParameters {
13
13
  content: SendMessageContent;
14
14
  aiContext?: SendMessageContext;
@@ -0,0 +1 @@
1
+ export declare const VERSION = "0.4.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-amplify/ui-react-ai",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/esm/index.mjs",
6
6
  "exports": {
@@ -43,17 +43,31 @@
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@aws-amplify/api-graphql": "^4.3.0",
46
- "aws-amplify": "^6.6.0",
46
+ "aws-amplify": "^6.6.5",
47
47
  "react": "^16.14.0 || ^17.0 || ^18.0",
48
48
  "react-dom": "^16.14.0 || ^17.0 || ^18.0"
49
49
  },
50
50
  "dependencies": {
51
- "@aws-amplify/ui": "^6.6.4",
52
- "@aws-amplify/ui-react": "^6.5.4",
53
- "@aws-amplify/ui-react-core": "^3.0.28"
51
+ "@aws-amplify/ui": "^6.6.5",
52
+ "@aws-amplify/ui-react": "^6.5.5",
53
+ "@aws-amplify/ui-react-core": "^3.0.29"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@types/jest-when": "^3.5.0",
57
57
  "jest-when": "^3.5.1"
58
- }
58
+ },
59
+ "size-limit": [
60
+ {
61
+ "name": "AIConversation",
62
+ "path": "dist/esm/index.mjs",
63
+ "import": "{ AIConversation }",
64
+ "limit": "25 kB"
65
+ },
66
+ {
67
+ "name": "createAIConversation",
68
+ "path": "dist/esm/index.mjs",
69
+ "import": "{ createAIConversation }",
70
+ "limit": "7 kB"
71
+ }
72
+ ]
59
73
  }
@@ -1,34 +0,0 @@
1
- import React__default from 'react';
2
- import { withBaseElementProps } from '@aws-amplify/ui-react-core/elements';
3
- import { AIConversationElements } from '../../context/elements/definitions.mjs';
4
-
5
- const { View, Button, Icon, Text } = AIConversationElements;
6
- const HEADER_BLOCK = 'ai-header';
7
- const HeaderTextBase = withBaseElementProps(Text, {
8
- className: `${HEADER_BLOCK}__text`,
9
- });
10
- const HeaderText = React__default.forwardRef(function HeaderText(props, ref) {
11
- return React__default.createElement(HeaderTextBase, { ...props, ref: ref });
12
- });
13
- const CloseIcon = withBaseElementProps(Icon, {
14
- className: `${HEADER_BLOCK}__icon`,
15
- variant: 'close',
16
- });
17
- const CloseButtonBase = withBaseElementProps(Button, {
18
- className: `${HEADER_BLOCK}__button`,
19
- });
20
- const CloseButton = React__default.forwardRef(function CloseButton(props, ref) {
21
- return React__default.createElement(CloseButtonBase, { ...props, ref: ref });
22
- });
23
- const Container = withBaseElementProps(View, {
24
- className: `${HEADER_BLOCK}__container`,
25
- });
26
- const HeaderControl = () => (React__default.createElement(Container, null,
27
- React__default.createElement(HeaderText, null, "Raven Chat"),
28
- React__default.createElement(CloseButton, null,
29
- React__default.createElement(CloseIcon, null))));
30
- HeaderControl.Container = Container;
31
- HeaderControl.Text = HeaderText;
32
- HeaderControl.Button = CloseButton;
33
-
34
- export { HeaderControl };
@@ -1,20 +0,0 @@
1
- import React__default from 'react';
2
- import { ViewElement } from '../context/elements/definitions.mjs';
3
- import './Controls/ActionsBarControl.mjs';
4
- import './Controls/AvatarControl.mjs';
5
- import { HeaderControl } from './Controls/HeaderControl.mjs';
6
- import { FieldControl } from './Controls/FieldControl.mjs';
7
- import { MessagesControl } from './Controls/MessagesControl.mjs';
8
- import { AutoHidablePromptControl } from './Controls/PromptControl.mjs';
9
-
10
- function Conversation() {
11
- return (React__default.createElement(ViewElement, null,
12
- React__default.createElement(HeaderControl, null),
13
- React__default.createElement(ViewElement, null,
14
- React__default.createElement(AutoHidablePromptControl, null),
15
- React__default.createElement(MessagesControl, null)),
16
- React__default.createElement(ViewElement, null,
17
- React__default.createElement(FieldControl, null))));
18
- }
19
-
20
- export { Conversation as default };
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import { AIConversationElements } from '../../context/elements';
3
- export declare const HeaderControl: HeaderControl;
4
- export interface HeaderControl {
5
- (): React.JSX.Element;
6
- Container: AIConversationElements['View'];
7
- Button: AIConversationElements['Button'];
8
- Text: AIConversationElements['Text'];
9
- }
@@ -1,2 +0,0 @@
1
- /// <reference types="react" />
2
- export default function Conversation(): JSX.Element;