@aws-amplify/ui-react-ai 0.3.2 → 1.0.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 (71) hide show
  1. package/dist/esm/components/AIConversation/AIConversation.mjs +21 -33
  2. package/dist/esm/components/AIConversation/AIConversationProvider.mjs +22 -16
  3. package/dist/esm/components/AIConversation/context/AIContextContext.mjs +8 -0
  4. package/dist/esm/components/AIConversation/context/FallbackComponentContext.mjs +8 -0
  5. package/dist/esm/components/AIConversation/context/MessageRenderContext.mjs +9 -0
  6. package/dist/esm/components/AIConversation/context/ResponseComponentsContext.mjs +6 -2
  7. package/dist/esm/components/AIConversation/context/WelcomeMessageContext.mjs +8 -0
  8. package/dist/esm/components/AIConversation/createAIConversation.mjs +18 -22
  9. package/dist/esm/components/AIConversation/views/Controls/ActionsBarControl.mjs +6 -2
  10. package/dist/esm/components/AIConversation/views/Controls/AttachFileControl.mjs +5 -0
  11. package/dist/esm/components/AIConversation/views/Controls/AttachmentListControl.mjs +5 -0
  12. package/dist/esm/components/AIConversation/views/Controls/AvatarControl.mjs +5 -0
  13. package/dist/esm/components/AIConversation/views/Controls/DefaultMessageControl.mjs +31 -0
  14. package/dist/esm/components/AIConversation/views/Controls/{FieldControl.mjs → FormControl.mjs} +22 -13
  15. package/dist/esm/components/AIConversation/views/Controls/MessagesControl.mjs +42 -42
  16. package/dist/esm/components/AIConversation/views/Controls/PromptControl.mjs +9 -36
  17. package/dist/esm/components/AIConversation/views/default/Form.mjs +4 -5
  18. package/dist/esm/components/AIConversation/views/default/MessageList.mjs +34 -16
  19. package/dist/esm/components/AIConversation/views/default/PromptList.mjs +1 -1
  20. package/dist/esm/hooks/contentFromEvents.mjs +22 -0
  21. package/dist/esm/hooks/createAIHooks.mjs +0 -3
  22. package/dist/esm/hooks/exhaustivelyListMessages.mjs +19 -0
  23. package/dist/esm/hooks/shared.mjs +14 -0
  24. package/dist/esm/hooks/useAIConversation.mjs +246 -106
  25. package/dist/esm/hooks/useAIGeneration.mjs +1 -8
  26. package/dist/esm/index.mjs +0 -1
  27. package/dist/esm/version.mjs +3 -0
  28. package/dist/index.js +569 -444
  29. package/dist/types/components/AIConversation/AIConversation.d.ts +2 -19
  30. package/dist/types/components/AIConversation/AIConversationProvider.d.ts +2 -3
  31. package/dist/types/components/AIConversation/context/AIContextContext.d.ts +6 -0
  32. package/dist/types/components/AIConversation/context/ControlsContext.d.ts +1 -0
  33. package/dist/types/components/AIConversation/context/FallbackComponentContext.d.ts +7 -0
  34. package/dist/types/components/AIConversation/context/MessageRenderContext.d.ts +5 -0
  35. package/dist/types/components/AIConversation/context/ResponseComponentsContext.d.ts +2 -2
  36. package/dist/types/components/AIConversation/context/WelcomeMessageContext.d.ts +8 -0
  37. package/dist/types/components/AIConversation/context/elements/definitions.d.ts +1 -1
  38. package/dist/types/components/AIConversation/context/index.d.ts +5 -0
  39. package/dist/types/components/AIConversation/createAIConversation.d.ts +0 -3
  40. package/dist/types/components/AIConversation/index.d.ts +2 -1
  41. package/dist/types/components/AIConversation/types.d.ts +24 -36
  42. package/dist/types/components/AIConversation/utils.d.ts +2 -2
  43. package/dist/types/components/AIConversation/views/Controls/DefaultMessageControl.d.ts +2 -0
  44. package/dist/types/components/AIConversation/views/Controls/{FieldControl.d.ts → FormControl.d.ts} +2 -2
  45. package/dist/types/components/AIConversation/views/Controls/MessagesControl.d.ts +3 -9
  46. package/dist/types/components/AIConversation/views/Controls/PromptControl.d.ts +0 -3
  47. package/dist/types/components/AIConversation/views/Controls/index.d.ts +3 -4
  48. package/dist/types/components/AIConversation/views/default/Form.d.ts +1 -1
  49. package/dist/types/components/AIConversation/views/default/MessageList.d.ts +1 -1
  50. package/dist/types/components/AIConversation/views/default/PromptList.d.ts +1 -1
  51. package/dist/types/components/AIConversation/views/index.d.ts +2 -3
  52. package/dist/types/hooks/contentFromEvents.d.ts +2 -0
  53. package/dist/types/hooks/createAIHooks.d.ts +0 -3
  54. package/dist/types/hooks/exhaustivelyListMessages.d.ts +8 -0
  55. package/dist/types/hooks/index.d.ts +1 -2
  56. package/dist/types/hooks/shared.d.ts +23 -0
  57. package/dist/types/hooks/useAIConversation.d.ts +6 -4
  58. package/dist/types/hooks/useAIGeneration.d.ts +3 -13
  59. package/dist/types/index.d.ts +1 -1
  60. package/dist/types/types.d.ts +38 -7
  61. package/dist/types/version.d.ts +1 -0
  62. package/package.json +20 -6
  63. package/dist/ai-conversation-styles.css +0 -195
  64. package/dist/ai-conversation-styles.js +0 -2
  65. package/dist/esm/components/AIConversation/views/Controls/HeaderControl.mjs +0 -34
  66. package/dist/esm/components/AIConversation/views/ConversationView.mjs +0 -20
  67. package/dist/esm/hooks/AIContextProvider.mjs +0 -20
  68. package/dist/types/ai-conversation-styles.d.ts +0 -1
  69. package/dist/types/components/AIConversation/views/Controls/HeaderControl.d.ts +0 -9
  70. package/dist/types/components/AIConversation/views/ConversationView.d.ts +0 -2
  71. package/dist/types/hooks/AIContextProvider.d.ts +0 -17
@@ -1,22 +1,5 @@
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
- /**
7
- * @experimental
8
- */
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
- };
4
+ export declare const AIConversation: AIConversationType<AIConversationBaseProps>;
22
5
  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: ({ aiContext, actions, allowAttachments, avatars, children, controls, displayText, handleSendMessage, isLoading, messages, messageRenderer, responseComponents, suggestedPrompts, variant, welcomeMessage, FallbackResponseComponent, }: AIConversationProviderProps) => React.JSX.Element;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare const AIContextContext: React.Context<(() => object) | undefined>;
3
+ export declare const AIContextProvider: ({ children, aiContext, }: {
4
+ children?: React.ReactNode;
5
+ aiContext?: (() => object) | undefined;
6
+ }) => JSX.Element;
@@ -6,6 +6,7 @@ export interface ControlsContextProps {
6
6
  Form?: React.ComponentType<{
7
7
  handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;
8
8
  allowAttachments?: boolean;
9
+ isLoading?: boolean;
9
10
  } & Required<ConversationInputContext>>;
10
11
  MessageList?: React.ComponentType<{
11
12
  messages: ConversationMessage[];
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { AIConversationInput } from '../types';
3
+ export declare const FallbackComponentContext: React.Context<React.ComponentType<any> | undefined>;
4
+ export declare const FallbackComponentProvider: ({ children, FallbackComponent, }: {
5
+ children?: React.ReactNode;
6
+ FallbackComponent?: AIConversationInput['FallbackResponseComponent'];
7
+ }) => 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;
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
- import { ResponseComponents } from '../types';
3
- import { ToolConfiguration } from '../../../types';
2
+ import { ToolConfiguration, ResponseComponents } from '../../../types';
4
3
  type ResponseComponentsContextProps = ResponseComponents | undefined;
5
4
  export declare const RESPONSE_COMPONENT_PREFIX = "AMPLIFY_UI_";
6
5
  export declare const ResponseComponentsContext: React.Context<ResponseComponentsContextProps>;
6
+ export declare const prependResponseComponents: (responseComponents?: ResponseComponents) => ResponseComponents | undefined;
7
7
  export declare const ResponseComponentsProvider: ({ children, responseComponents, }: {
8
8
  children?: React.ReactNode;
9
9
  responseComponents?: ResponseComponents | undefined;
@@ -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 {};
@@ -29,7 +29,7 @@ export declare const ButtonElement: import("@aws-amplify/ui-react-core/dist/type
29
29
  type ViewElementProps = 'onFocus' | 'tabIndex' | 'onKeyDown';
30
30
  export declare const ViewElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<ViewElementProps, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>>, HTMLDivElement>;
31
31
  export declare const SpanElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<never, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>>, HTMLSpanElement>;
32
- type TextAreaElementProps = 'id' | 'name' | 'onChange' | 'placeholder' | 'autoFocus' | 'onKeyDown';
32
+ type TextAreaElementProps = 'id' | 'name' | 'onChange' | 'placeholder' | 'autoFocus' | 'onCompositionStart' | 'onCompositionEnd' | 'onKeyDown';
33
33
  export declare const TextAreaElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<TextAreaElementProps, string, import("react").DetailedHTMLProps<import("react").TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>>, HTMLTextAreaElement>;
34
34
  export declare const AIConversationElements: AIConversationElements;
35
35
  export {};
@@ -1,3 +1,4 @@
1
+ export { AIContextContext, AIContextProvider } from './AIContextContext';
1
2
  export { ActionsContext, ActionsProvider } from './ActionsContext';
2
3
  export { AvatarsContext, AvatarsProvider } from './AvatarsContext';
3
4
  export { ConversationInputContext, ConversationInput, ConversationInputContextProvider, } from './ConversationInputContext';
@@ -9,4 +10,8 @@ export { ControlsContext, ControlsContextProps, ControlsProvider, } from './Cont
9
10
  export { LoadingContextProvider } from './LoadingContext';
10
11
  export { ResponseComponentsProvider, RESPONSE_COMPONENT_PREFIX, } from './ResponseComponentsContext';
11
12
  export { SendMessageContextProvider } from './SendMessageContext';
13
+ export { MessageRendererProvider, MessageRendererContext, useMessageRenderer, } from './MessageRenderContext';
14
+ export { AttachmentProvider, AttachmentContext } from './AttachmentContext';
15
+ export { WelcomeMessageContext, WelcomeMessageProvider, } from './WelcomeMessageContext';
16
+ export { FallbackComponentContext, FallbackComponentProvider, } from './FallbackComponentContext';
12
17
  export * from './elements';
@@ -1,7 +1,4 @@
1
1
  import { AIConversationInput, AIConversation } from './types';
2
- /**
3
- * @experimental
4
- */
5
2
  export declare function createAIConversation(input?: AIConversationInput): {
6
3
  AIConversation: AIConversation;
7
4
  };
@@ -1,4 +1,5 @@
1
1
  import { createAIConversation } from './createAIConversation';
2
2
  import { AIConversation } from './AIConversation';
3
- import { Avatars, CustomAction, ResponseComponent, SuggestedPrompt } from './types';
3
+ import { Avatars, CustomAction, SuggestedPrompt } from './types';
4
+ import { ResponseComponent } from '../../types';
4
5
  export { createAIConversation, AIConversation, Avatars, CustomAction, ResponseComponent, SuggestedPrompt, };
@@ -1,43 +1,52 @@
1
1
  import React from 'react';
2
- import { AIConversationElements } from './context/elements';
3
- import { ActionsBarControl, AvatarControl, FieldControl, HeaderControl, MessagesControl, PromptControl } from './views';
2
+ import { ActionsBarControl, AvatarControl, FormControl, MessagesControl, PromptControl } from './views';
4
3
  import { DisplayTextTemplate } from '@aws-amplify/ui';
5
4
  import { AIConversationDisplayText } from './displayText';
6
- import { ConversationMessage, SendMessage } from '../../types';
5
+ import { ConversationMessage, SendMessage, ResponseComponents, TextContentBlock, ImageContentBlock } from '../../types';
7
6
  import { ControlsContextProps } from './context/ControlsContext';
7
+ import { AIConversationProviderProps } from './AIConversationProvider';
8
8
  export interface Controls {
9
9
  Avatars: AvatarControl;
10
10
  ActionsBar: ActionsBarControl;
11
- Field: FieldControl;
12
- Header: HeaderControl;
11
+ Form: FormControl;
13
12
  Messages: MessagesControl;
14
13
  SuggestedPrompts: PromptControl;
15
14
  }
16
15
  export interface AIConversationInput {
17
- elements?: Partial<AIConversationElements>;
18
16
  displayText?: DisplayTextTemplate<AIConversationDisplayText>;
17
+ welcomeMessage?: React.ReactNode;
19
18
  suggestedPrompts?: SuggestedPrompt[];
20
19
  actions?: CustomAction[];
21
20
  responseComponents?: ResponseComponents;
21
+ FallbackResponseComponent?: React.ComponentType<any>;
22
22
  variant?: MessageVariant;
23
23
  controls?: ControlsContextProps;
24
24
  allowAttachments?: boolean;
25
+ messageRenderer?: MessageRenderer;
25
26
  }
26
27
  export interface AIConversationProps {
27
28
  messages: ConversationMessage[];
28
29
  handleSendMessage: SendMessage;
29
30
  avatars?: Avatars;
30
31
  isLoading?: boolean;
32
+ aiContext?: () => object;
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;
@@ -47,31 +56,10 @@ export interface Avatars {
47
56
  ai?: Avatar;
48
57
  }
49
58
  export interface CustomAction {
50
- displayName: string;
51
59
  handler: (message: ConversationMessage) => void;
52
- icon: React.ReactNode;
60
+ component?: React.ReactNode;
53
61
  }
54
62
  export interface SuggestedPrompt {
55
- icon?: React.ReactNode;
56
- header: string;
63
+ component?: React.ReactNode;
57
64
  inputText: string;
58
65
  }
59
- type JSONType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null' | 'any';
60
- interface ResponseComponentProp {
61
- type: JSONType;
62
- enum?: string[];
63
- description?: string;
64
- required?: boolean;
65
- }
66
- interface ResponseComponentPropMap {
67
- [key: string]: ResponseComponentProp;
68
- }
69
- export interface ResponseComponent {
70
- component: React.ComponentType<any>;
71
- description?: string;
72
- props: ResponseComponentPropMap;
73
- }
74
- export interface ResponseComponents {
75
- [key: string]: ResponseComponent;
76
- }
77
- export {};
@@ -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,28 +1,22 @@
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';
5
5
  import { ConversationMessage } from '../../../../types';
6
6
  export declare const MessageControl: MessageControl;
7
- interface MessageControl<T extends Partial<AIConversationElements> = AIConversationElements> {
7
+ interface MessageControl {
8
8
  (props: {
9
9
  message: ConversationMessage;
10
10
  }): JSX.Element;
11
- Container: T['View'];
12
- MediaContent: T['Image'];
13
- TextContent: T['Text'];
14
11
  }
15
12
  export declare const MessagesControl: MessagesControl;
16
13
  export interface MessagesControl {
17
- (props: {
18
- renderMessage?: (message: ConversationMessage) => React.ReactNode;
19
- }): JSX.Element;
14
+ (): JSX.Element;
20
15
  ActionsBar: ActionsBarControl;
21
16
  Avatar: AvatarControl;
22
17
  Container: AIConversationElements['View'];
23
18
  HeaderContainer: AIConversationElements['View'];
24
19
  Layout: AIConversationElements['View'];
25
20
  Message: MessageControl;
26
- Separator: AIConversationElements['Span'];
27
21
  }
28
22
  export {};
@@ -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,2 +1,2 @@
1
1
  import { ControlsContextProps } from '../../context/ControlsContext';
2
- export declare const Form: NonNullable<ControlsContextProps['Form']>;
2
+ export declare const Form: Required<ControlsContextProps>['Form'];
@@ -1,2 +1,2 @@
1
1
  import { ControlsContextProps } from '../../context/ControlsContext';
2
- export declare const MessageList: ControlsContextProps['MessageList'];
2
+ export declare const MessageList: Required<ControlsContextProps>['MessageList'];
@@ -1,2 +1,2 @@
1
1
  import { ControlsContextProps } from '../../context/ControlsContext';
2
- export declare const PromptList: ControlsContextProps['PromptList'];
2
+ export declare const PromptList: Required<ControlsContextProps>['PromptList'];
@@ -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, };
@@ -0,0 +1,2 @@
1
+ import { ConversationMessage, ConversationStreamEvent } from '../types';
2
+ export declare const contentFromEvents: (contentBlocks?: ConversationStreamEvent[][]) => ConversationMessage['content'];
@@ -4,8 +4,5 @@ import { getSchema } from '../types';
4
4
  type UseAIHooks<Client extends Record<'generations' | 'conversations', Record<string, any>>, Schema extends Record<any, any>> = {
5
5
  useAIConversation: UseAIConversationHook<Extract<keyof Client['conversations'], string>>;
6
6
  } & UseAIGenerationHookWrapper<keyof Client['generations'], Schema>;
7
- /**
8
- * @experimental
9
- */
10
7
  export declare function createAIHooks<Client extends Record<'generations' | 'conversations', Record<string, any>>, Schema extends getSchema<Client>>(_client: Client): UseAIHooks<Client, Schema>;
11
8
  export {};
@@ -0,0 +1,8 @@
1
+ import { Conversation, ConversationMessage } from '../types';
2
+ interface ExhaustivelyListMessagesParams {
3
+ conversation: Conversation;
4
+ messages?: ConversationMessage[];
5
+ nextToken?: string;
6
+ }
7
+ export declare function exhaustivelyListMessages({ conversation, messages, nextToken, }: ExhaustivelyListMessagesParams): ReturnType<Conversation['listMessages']>;
8
+ export {};
@@ -1,3 +1,2 @@
1
- import { AIContextProvider, AIContext } from './AIContextProvider';
2
1
  import { createAIHooks } from './createAIHooks';
3
- export { AIContextProvider, AIContext, createAIHooks };
2
+ export { createAIHooks };
@@ -0,0 +1,23 @@
1
+ import { DataState } from '@aws-amplify/ui-react-core';
2
+ import { GraphQLFormattedError } from '../types';
3
+ export type DataClientState<T> = Omit<DataState<T>, 'message'> & {
4
+ messages?: GraphQLFormattedError[];
5
+ };
6
+ export type DataClientResponse<T> = {
7
+ data: T | null;
8
+ errors?: GraphQLFormattedError[];
9
+ };
10
+ export declare const INITIAL_STATE: {
11
+ hasError: boolean;
12
+ isLoading: boolean;
13
+ messages: undefined;
14
+ };
15
+ export declare const LOADING_STATE: {
16
+ hasError: boolean;
17
+ isLoading: boolean;
18
+ messages: undefined;
19
+ };
20
+ export declare const ERROR_STATE: {
21
+ hasError: boolean;
22
+ isLoading: boolean;
23
+ };
@@ -1,12 +1,14 @@
1
- import { DataState } from '@aws-amplify/ui-react-core';
2
- import { ConversationMessage, ConversationRoute, SendMessage } from '../types';
1
+ import { Conversation, ConversationMessage, ConversationRoute, SendMessage } from '../types';
2
+ import { DataClientState } from './shared';
3
3
  interface UseAIConversationInput {
4
4
  id?: string;
5
- onResponse?: (message: ConversationMessage) => void;
5
+ onMessage?: (message: ConversationMessage) => void;
6
+ onInitialize?: (conversation: Conversation) => void;
6
7
  }
7
8
  interface AIConversationState {
8
9
  messages: ConversationMessage[];
10
+ conversation?: Conversation;
9
11
  }
10
- export type UseAIConversationHook<T extends string> = (routeName: T, input?: UseAIConversationInput) => [DataState<AIConversationState>, SendMessage];
12
+ export type UseAIConversationHook<T extends string> = (routeName: T, input?: UseAIConversationInput) => [DataClientState<AIConversationState>, SendMessage];
11
13
  export declare function createUseAIConversation<T extends Record<'conversations', Record<string, ConversationRoute>>>(client: T): UseAIConversationHook<Extract<keyof T['conversations'], string>>;
12
14
  export {};
@@ -1,26 +1,16 @@
1
- import { DataState } from '@aws-amplify/ui-react-core';
2
1
  import { V6Client } from '@aws-amplify/api-graphql';
3
2
  import { getSchema } from '../types';
3
+ import { DataClientState } from './shared';
4
4
  export interface UseAIGenerationHookWrapper<Key extends keyof AIGenerationClient<Schema>['generations'], Schema extends Record<any, any>> {
5
5
  useAIGeneration: <U extends Key>(routeName: U) => [
6
- Awaited<GenerationState<Schema[U]['returnType']>>,
6
+ Awaited<DataClientState<Schema[U]['returnType']>>,
7
7
  (input: Schema[U]['args']) => void
8
8
  ];
9
9
  }
10
10
  export type UseAIGenerationHook<Key extends keyof AIGenerationClient<Schema>['generations'], Schema extends Record<any, any>> = (routeName: Key) => [
11
- Awaited<GenerationState<Schema[Key]['returnType']>>,
11
+ Awaited<DataClientState<Schema[Key]['returnType']>>,
12
12
  (input: Schema[Key]['args']) => void
13
13
  ];
14
14
  type AIGenerationClient<T extends Record<any, any>> = Pick<V6Client<T>, 'generations'>;
15
- interface GraphQLFormattedError {
16
- readonly message: string;
17
- readonly errorType: string;
18
- readonly errorInfo: null | {
19
- [key: string]: unknown;
20
- };
21
- }
22
- type GenerationState<T> = Omit<DataState<T>, 'message'> & {
23
- messages?: GraphQLFormattedError[];
24
- };
25
15
  export declare function createUseAIGeneration<Client extends Record<'generations' | 'conversations', Record<string, any>>, Schema extends getSchema<Client>>(client: Client): UseAIGenerationHook<keyof Client['generations'], Client>;
26
16
  export {};
@@ -1,3 +1,3 @@
1
1
  export { createAIConversation, AIConversation, Avatars, CustomAction, ResponseComponent, SuggestedPrompt, } from './components';
2
- export { createAIHooks, AIContextProvider } from './hooks';
2
+ export { createAIHooks } from './hooks';
3
3
  export { ConversationMessage, ConversationMessageContent, SendMessage, SendMesageParameters, } from './types';
@@ -1,14 +1,20 @@
1
+ /// <reference types="react" />
1
2
  import { V6Client } from '@aws-amplify/api-graphql';
2
3
  export type ConversationRoute = V6Client<any>['conversations'][string];
3
4
  export type Conversation = NonNullable<Awaited<ReturnType<ConversationRoute['create']>>['data']>;
4
- export type ConversationMessage = NonNullable<Awaited<ReturnType<Conversation['sendMessage']>>['data']>;
5
+ export type ConversationStreamEvent = Parameters<Parameters<Conversation['onStreamEvent']>[0]['next']>[0];
6
+ export type ConversationMessage = NonNullable<Awaited<ReturnType<Conversation['sendMessage']>>['data']> & {
7
+ isLoading?: boolean;
8
+ };
5
9
  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']>;
10
+ export type TextContentBlock = NonNullable<ConversationMessageContent['text']>;
11
+ export type ImageContentBlock = NonNullable<ConversationMessageContent['image']>;
12
+ export type ToolUseContent = NonNullable<ConversationMessageContent['toolUse']>;
13
+ export type ToolResultContent = NonNullable<ConversationMessageContent['toolResult']>;
14
+ export type InputContent = Exclude<Parameters<Conversation['sendMessage']>[0], string>['content'][number];
15
+ export type SendMessageContent = Exclude<Parameters<Conversation['sendMessage']>[0], string>['content'];
16
+ export type SendMessageContext = Exclude<Parameters<Conversation['sendMessage']>[0], string>['aiContext'];
17
+ export type ToolConfiguration = NonNullable<Exclude<Parameters<Conversation['sendMessage']>[0], string>['toolConfiguration']>;
12
18
  export interface SendMesageParameters {
13
19
  content: SendMessageContent;
14
20
  aiContext?: SendMessageContext;
@@ -17,4 +23,29 @@ export interface SendMesageParameters {
17
23
  export type SendMessage = (input: SendMesageParameters) => void;
18
24
  type AIClient<T extends Record<any, any>> = Pick<V6Client<T>, 'generations' | 'conversations'>;
19
25
  export type getSchema<T> = T extends AIClient<infer Schema> ? Schema : never;
26
+ export interface GraphQLFormattedError {
27
+ readonly message: string;
28
+ readonly errorType: string;
29
+ readonly errorInfo?: null | {
30
+ [key: string]: unknown;
31
+ };
32
+ }
33
+ type JSONType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null' | 'any';
34
+ interface ResponseComponentProp {
35
+ type: JSONType;
36
+ enum?: string[];
37
+ description?: string;
38
+ required?: boolean;
39
+ }
40
+ interface ResponseComponentPropMap {
41
+ [key: string]: ResponseComponentProp;
42
+ }
43
+ export interface ResponseComponent {
44
+ component: React.ComponentType<any>;
45
+ description?: string;
46
+ props: ResponseComponentPropMap;
47
+ }
48
+ export interface ResponseComponents {
49
+ [key: string]: ResponseComponent;
50
+ }
20
51
  export {};
@@ -0,0 +1 @@
1
+ export declare const VERSION = "1.0.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": "1.0.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.6",
52
+ "@aws-amplify/ui-react": "^6.6.0",
53
+ "@aws-amplify/ui-react-core": "^3.0.30"
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
  }