@aws-amplify/ui-react-ai 0.4.0 → 1.1.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 (70) hide show
  1. package/dist/esm/components/AIConversation/AIConversation.mjs +8 -26
  2. package/dist/esm/components/AIConversation/AIConversationProvider.mjs +20 -17
  3. package/dist/esm/components/AIConversation/context/AIContextContext.mjs +8 -0
  4. package/dist/esm/components/AIConversation/context/AttachmentContext.mjs +12 -3
  5. package/dist/esm/components/AIConversation/context/ConversationInputContext.mjs +2 -1
  6. package/dist/esm/components/AIConversation/context/FallbackComponentContext.mjs +8 -0
  7. package/dist/esm/components/AIConversation/context/ResponseComponentsContext.mjs +6 -2
  8. package/dist/esm/components/AIConversation/context/elements/IconElement.mjs +2 -2
  9. package/dist/esm/components/AIConversation/context/elements/definitions.mjs +12 -12
  10. package/dist/esm/components/AIConversation/createAIConversation.mjs +2 -5
  11. package/dist/esm/components/AIConversation/displayText.mjs +6 -0
  12. package/dist/esm/components/AIConversation/utils.mjs +42 -13
  13. package/dist/esm/components/AIConversation/views/Controls/ActionsBarControl.mjs +3 -2
  14. package/dist/esm/components/AIConversation/views/Controls/AttachFileControl.mjs +2 -0
  15. package/dist/esm/components/AIConversation/views/Controls/AttachmentListControl.mjs +2 -0
  16. package/dist/esm/components/AIConversation/views/Controls/AvatarControl.mjs +2 -0
  17. package/dist/esm/components/AIConversation/views/Controls/DefaultMessageControl.mjs +2 -0
  18. package/dist/esm/components/AIConversation/views/Controls/FormControl.mjs +44 -8
  19. package/dist/esm/components/AIConversation/views/Controls/MessagesControl.mjs +24 -31
  20. package/dist/esm/components/AIConversation/views/Controls/PromptControl.mjs +2 -0
  21. package/dist/esm/components/AIConversation/views/default/Form.mjs +13 -20
  22. package/dist/esm/components/AIConversation/views/default/MessageList.mjs +31 -16
  23. package/dist/esm/hooks/contentFromEvents.mjs +22 -0
  24. package/dist/esm/hooks/createAIHooks.mjs +0 -3
  25. package/dist/esm/hooks/exhaustivelyListMessages.mjs +19 -0
  26. package/dist/esm/hooks/shared.mjs +14 -0
  27. package/dist/esm/hooks/useAIConversation.mjs +246 -106
  28. package/dist/esm/hooks/useAIGeneration.mjs +1 -8
  29. package/dist/esm/index.mjs +0 -1
  30. package/dist/esm/version.mjs +1 -1
  31. package/dist/index.js +508 -280
  32. package/dist/types/components/AIConversation/AIConversation.d.ts +0 -3
  33. package/dist/types/components/AIConversation/AIConversationProvider.d.ts +1 -1
  34. package/dist/types/components/AIConversation/context/AIContextContext.d.ts +6 -0
  35. package/dist/types/components/AIConversation/context/AttachmentContext.d.ts +5 -5
  36. package/dist/types/components/AIConversation/context/ControlsContext.d.ts +5 -3
  37. package/dist/types/components/AIConversation/context/ConversationInputContext.d.ts +4 -2
  38. package/dist/types/components/AIConversation/context/DisplayTextContext.d.ts +1 -1
  39. package/dist/types/components/AIConversation/context/FallbackComponentContext.d.ts +7 -0
  40. package/dist/types/components/AIConversation/context/MessageRenderContext.d.ts +1 -1
  41. package/dist/types/components/AIConversation/context/ResponseComponentsContext.d.ts +2 -2
  42. package/dist/types/components/AIConversation/context/elements/IconElement.d.ts +2 -2
  43. package/dist/types/components/AIConversation/context/elements/definitions.d.ts +12 -12
  44. package/dist/types/components/AIConversation/context/index.d.ts +4 -2
  45. package/dist/types/components/AIConversation/createAIConversation.d.ts +0 -3
  46. package/dist/types/components/AIConversation/displayText.d.ts +2 -0
  47. package/dist/types/components/AIConversation/index.d.ts +2 -1
  48. package/dist/types/components/AIConversation/types.d.ts +6 -24
  49. package/dist/types/components/AIConversation/utils.d.ts +10 -0
  50. package/dist/types/components/AIConversation/views/Controls/MessagesControl.d.ts +1 -5
  51. package/dist/types/components/AIConversation/views/default/Attachments.d.ts +2 -2
  52. package/dist/types/components/AIConversation/views/default/Form.d.ts +1 -1
  53. package/dist/types/components/AIConversation/views/default/MessageList.d.ts +1 -1
  54. package/dist/types/components/AIConversation/views/default/PromptList.d.ts +1 -1
  55. package/dist/types/hooks/contentFromEvents.d.ts +2 -0
  56. package/dist/types/hooks/createAIHooks.d.ts +0 -3
  57. package/dist/types/hooks/exhaustivelyListMessages.d.ts +8 -0
  58. package/dist/types/hooks/index.d.ts +1 -2
  59. package/dist/types/hooks/shared.d.ts +23 -0
  60. package/dist/types/hooks/useAIConversation.d.ts +6 -4
  61. package/dist/types/hooks/useAIGeneration.d.ts +3 -13
  62. package/dist/types/index.d.ts +1 -1
  63. package/dist/types/types.d.ts +32 -1
  64. package/dist/types/version.d.ts +1 -1
  65. package/package.json +6 -6
  66. package/dist/ai-conversation-styles.css +0 -195
  67. package/dist/ai-conversation-styles.js +0 -2
  68. package/dist/esm/hooks/AIContextProvider.mjs +0 -20
  69. package/dist/types/ai-conversation-styles.d.ts +0 -1
  70. package/dist/types/hooks/AIContextProvider.d.ts +0 -17
@@ -1,8 +1,5 @@
1
1
  import { AIConversation as AIConversationType, AIConversationInput, AIConversationProps } from './types';
2
2
  interface AIConversationBaseProps extends AIConversationProps, AIConversationInput {
3
3
  }
4
- /**
5
- * @experimental
6
- */
7
4
  export declare const AIConversation: AIConversationType<AIConversationBaseProps>;
8
5
  export {};
@@ -3,4 +3,4 @@ import { AIConversationInput, AIConversationProps } from './types';
3
3
  export interface AIConversationProviderProps extends AIConversationInput, AIConversationProps {
4
4
  children?: React.ReactNode;
5
5
  }
6
- export declare const AIConversationProvider: ({ actions, allowAttachments, avatars, children, controls, displayText, elements, handleSendMessage, isLoading, messages, responseComponents, suggestedPrompts, variant, welcomeMessage, }: AIConversationProviderProps) => React.JSX.Element;
6
+ export declare const AIConversationProvider: ({ aiContext, actions, allowAttachments, avatars, children, controls, displayText, handleSendMessage, isLoading, maxAttachmentSize, maxAttachments, 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;
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
- export declare const AttachmentContext: React.Context<boolean>;
3
- export declare const AttachmentProvider: ({ children, allowAttachments, }: {
4
- children?: React.ReactNode;
5
- allowAttachments?: boolean | undefined;
6
- }) => JSX.Element;
2
+ import { AIConversationInput } from '../types';
3
+ export interface AttachmentContextProps extends Pick<AIConversationInput, 'allowAttachments' | 'maxAttachments' | 'maxAttachmentSize'> {
4
+ }
5
+ export declare const AttachmentContext: React.Context<Required<AttachmentContextProps>>;
6
+ export declare const AttachmentProvider: ({ children, allowAttachments, maxAttachmentSize, maxAttachments, }: React.PropsWithChildren<AttachmentContextProps>) => JSX.Element;
@@ -1,18 +1,20 @@
1
1
  import React from 'react';
2
- import { ConversationInputContext } from './ConversationInputContext';
2
+ import { ConversationInputContextProps } from './ConversationInputContext';
3
3
  import { SuggestedPrompt } from '../types';
4
4
  import { ConversationMessage } from '../../../types';
5
5
  export interface ControlsContextProps {
6
6
  Form?: React.ComponentType<{
7
7
  handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;
8
8
  allowAttachments?: boolean;
9
- } & Required<ConversationInputContext>>;
9
+ isLoading?: boolean;
10
+ onValidate: (files: File[]) => Promise<void>;
11
+ } & ConversationInputContextProps>;
10
12
  MessageList?: React.ComponentType<{
11
13
  messages: ConversationMessage[];
12
14
  }>;
13
15
  PromptList?: React.ComponentType<{
14
16
  suggestedPrompts?: SuggestedPrompt[];
15
- setInput: ConversationInputContext['setInput'];
17
+ setInput: ConversationInputContextProps['setInput'];
16
18
  }>;
17
19
  }
18
20
  export declare const ControlsContext: React.Context<ControlsContextProps | undefined>;
@@ -3,11 +3,13 @@ export interface ConversationInput {
3
3
  text?: string;
4
4
  files?: File[];
5
5
  }
6
- export interface ConversationInputContext {
6
+ export interface ConversationInputContextProps {
7
7
  input?: ConversationInput;
8
8
  setInput?: React.Dispatch<React.SetStateAction<ConversationInput | undefined>>;
9
+ error?: string;
10
+ setError?: React.Dispatch<React.SetStateAction<string | undefined>>;
9
11
  }
10
- export declare const ConversationInputContext: React.Context<ConversationInputContext>;
12
+ export declare const ConversationInputContext: React.Context<ConversationInputContextProps>;
11
13
  export declare const ConversationInputContextProvider: ({ children, }: {
12
14
  children?: React.ReactNode;
13
15
  }) => JSX.Element;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { ConversationDisplayText } from '../displayText';
3
- export declare const ConversationDisplayTextContext: import("react").Context<Required<ConversationDisplayText> | undefined>, ConversationDisplayTextProvider: import("react").ComponentType<import("react").PropsWithChildren<Required<ConversationDisplayText>>>, useConversationDisplayText: (params?: {
3
+ export declare const ConversationDisplayTextContext: import("react").Context<Required<ConversationDisplayText>>, ConversationDisplayTextProvider: import("react").ComponentType<import("react").PropsWithChildren<Required<ConversationDisplayText>>>, useConversationDisplayText: (params?: {
4
4
  errorMessage?: string | undefined;
5
5
  } | undefined) => Required<ConversationDisplayText>;
@@ -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;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
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?: {
3
+ export declare const MessageRendererContext: import("react").Context<MessageRenderer>, MessageRendererProvider: import("react").ComponentType<import("react").PropsWithChildren<MessageRenderer>>, useMessageRenderer: (params?: {
4
4
  errorMessage?: string | undefined;
5
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;
@@ -2,5 +2,5 @@ import React from 'react';
2
2
  export type IconElementProps = React.ComponentProps<typeof BaseIconElement>;
3
3
  export type IconVariant = 'attach' | 'close' | 'image' | 'send-message' | 'user-avatar';
4
4
  export declare const DEFAULT_ICON_PATHS: Record<IconVariant, string>;
5
- export declare const BaseIconElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<never, IconVariant, React.SVGProps<SVGSVGElement>>, SVGSVGElement>;
6
- export declare const IconElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<Omit<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<never, IconVariant, React.SVGProps<SVGSVGElement>>, "ref"> & React.RefAttributes<SVGSVGElement>, SVGSVGElement>;
5
+ export declare const BaseIconElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, IconVariant, React.SVGProps<SVGSVGElement>>, SVGSVGElement>;
6
+ export declare const IconElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<Omit<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, IconVariant, React.SVGProps<SVGSVGElement>>, "ref"> & React.RefAttributes<SVGSVGElement>, SVGSVGElement>;
@@ -14,22 +14,22 @@ export interface AIConversationElements {
14
14
  UnorderedList: typeof UnorderedListElement;
15
15
  View: typeof ViewElement;
16
16
  }
17
- export declare const LabelElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<"htmlFor", string, import("react").DetailedHTMLProps<import("react").LabelHTMLAttributes<HTMLLabelElement>, HTMLLabelElement>>, HTMLLabelElement>;
18
- export declare const TextElement: 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<HTMLParagraphElement>, HTMLParagraphElement>>, HTMLParagraphElement>;
19
- export declare const UnorderedListElement: 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<HTMLUListElement>, HTMLUListElement>>, HTMLUListElement>;
20
- export declare const ListItemElement: 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").LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>>, HTMLLIElement>;
21
- export declare const HeadingElement: 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<HTMLHeadingElement>, HTMLHeadingElement>>, HTMLHeadingElement>;
17
+ export declare const LabelElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<"htmlFor", string, import("react").DetailedHTMLProps<import("react").LabelHTMLAttributes<HTMLLabelElement>, HTMLLabelElement>>, HTMLLabelElement>;
18
+ export declare const TextElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>>, HTMLParagraphElement>;
19
+ export declare const UnorderedListElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLUListElement>, HTMLUListElement>>, HTMLUListElement>;
20
+ export declare const ListItemElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, string, import("react").DetailedHTMLProps<import("react").LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>>, HTMLLIElement>;
21
+ export declare const HeadingElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>>, HTMLHeadingElement>;
22
22
  export type IconElementProps = React.ComponentProps<typeof IconElement>;
23
23
  type ImageElementProps = 'src' | 'alt';
24
- export declare const ImageElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<ImageElementProps, string, import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>>, HTMLImageElement>;
25
- export declare const InputElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<"type", string, import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>>, HTMLInputElement>;
24
+ export declare const ImageElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<ImageElementProps, string, import("react").DetailedHTMLProps<import("react").ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>>, HTMLImageElement>;
25
+ export declare const InputElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<"type", string, import("react").DetailedHTMLProps<import("react").InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>>, HTMLInputElement>;
26
26
  type ButtonElementProps = 'disabled' | 'onClick' | 'type' | 'tabIndex';
27
27
  type ButtonElementVariant = 'attach' | 'remove' | 'send-message';
28
- export declare const ButtonElement: import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElement<import("@aws-amplify/ui-react-core/dist/types/elements/types").BaseElementProps<ButtonElementProps, ButtonElementVariant, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>>, HTMLButtonElement>;
28
+ export declare const ButtonElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<ButtonElementProps, ButtonElementVariant, import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>>, HTMLButtonElement>;
29
29
  type ViewElementProps = 'onFocus' | 'tabIndex' | 'onKeyDown';
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
- 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';
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>;
30
+ export declare const ViewElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<ViewElementProps, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>>, HTMLDivElement>;
31
+ export declare const SpanElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<never, string, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>>, HTMLSpanElement>;
32
+ type TextAreaElementProps = 'id' | 'name' | 'onChange' | 'placeholder' | 'autoFocus' | 'onCompositionStart' | 'onCompositionEnd' | 'onKeyDown';
33
+ export declare const TextAreaElement: import("@aws-amplify/ui-react-core/elements").BaseElementWithRef<import("@aws-amplify/ui-react-core/elements").BaseElementWithRefProps<TextAreaElementProps, string, import("react").DetailedHTMLProps<import("react").TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>>, HTMLTextAreaElement>;
34
34
  export declare const AIConversationElements: AIConversationElements;
35
35
  export {};
@@ -1,6 +1,7 @@
1
+ export { AIContextContext, AIContextProvider } from './AIContextContext';
1
2
  export { ActionsContext, ActionsProvider } from './ActionsContext';
2
3
  export { AvatarsContext, AvatarsProvider } from './AvatarsContext';
3
- export { ConversationInputContext, ConversationInput, ConversationInputContextProvider, } from './ConversationInputContext';
4
+ export { ConversationInputContextProps, ConversationInputContext, ConversationInput, ConversationInputContextProvider, } from './ConversationInputContext';
4
5
  export { MessagesContext, RoleContext, MessagesProvider, } from './MessagesContext';
5
6
  export { SuggestedPromptsContext, SuggestedPromptProvider, } from './SuggestedPromptsContext';
6
7
  export { MessageVariantContext, MessageVariantProvider, } from './MessageVariantContext';
@@ -10,6 +11,7 @@ export { LoadingContextProvider } from './LoadingContext';
10
11
  export { ResponseComponentsProvider, RESPONSE_COMPONENT_PREFIX, } from './ResponseComponentsContext';
11
12
  export { SendMessageContextProvider } from './SendMessageContext';
12
13
  export { MessageRendererProvider, MessageRendererContext, useMessageRenderer, } from './MessageRenderContext';
13
- export { AttachmentProvider, AttachmentContext } from './AttachmentContext';
14
+ export { AttachmentProvider, AttachmentContext, AttachmentContextProps, } from './AttachmentContext';
14
15
  export { WelcomeMessageContext, WelcomeMessageProvider, } from './WelcomeMessageContext';
16
+ export { FallbackComponentContext, FallbackComponentProvider, } from './FallbackComponentContext';
15
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,6 +1,8 @@
1
1
  import { DisplayTextTemplate } from '@aws-amplify/ui';
2
2
  export type ConversationDisplayText = {
3
3
  getMessageTimestampText?: (date: Date) => string;
4
+ getMaxAttachmentErrorText?: (count: number) => string;
5
+ getAttachmentSizeErrorText?: (sizeText: string) => string;
4
6
  };
5
7
  export declare const defaultAIConversationDisplayTextEn: Required<AIConversationDisplayText>;
6
8
  export type AIConversationDisplayText = DisplayTextTemplate<ConversationDisplayText>;
@@ -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,9 +1,8 @@
1
1
  import React from 'react';
2
- import { AIConversationElements } from './context/elements';
3
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, ImageContentBlock, SendMessage, TextContentBlock } from '../../types';
5
+ import { ConversationMessage, SendMessage, ResponseComponents, TextContentBlock, ImageContentBlock } from '../../types';
7
6
  import { ControlsContextProps } from './context/ControlsContext';
8
7
  import { AIConversationProviderProps } from './AIConversationProvider';
9
8
  export interface Controls {
@@ -14,15 +13,17 @@ export interface Controls {
14
13
  SuggestedPrompts: PromptControl;
15
14
  }
16
15
  export interface AIConversationInput {
17
- elements?: Partial<AIConversationElements>;
18
16
  displayText?: DisplayTextTemplate<AIConversationDisplayText>;
19
17
  welcomeMessage?: React.ReactNode;
20
18
  suggestedPrompts?: SuggestedPrompt[];
21
19
  actions?: CustomAction[];
22
20
  responseComponents?: ResponseComponents;
21
+ FallbackResponseComponent?: React.ComponentType<any>;
23
22
  variant?: MessageVariant;
24
23
  controls?: ControlsContextProps;
25
24
  allowAttachments?: boolean;
25
+ maxAttachments?: number;
26
+ maxAttachmentSize?: number;
26
27
  messageRenderer?: MessageRenderer;
27
28
  }
28
29
  export interface AIConversationProps {
@@ -30,6 +31,7 @@ export interface AIConversationProps {
30
31
  handleSendMessage: SendMessage;
31
32
  avatars?: Avatars;
32
33
  isLoading?: boolean;
34
+ aiContext?: () => object;
33
35
  }
34
36
  export interface AIConversation<PropsType extends AIConversationProps = AIConversationProps> {
35
37
  (props: PropsType): JSX.Element;
@@ -56,30 +58,10 @@ export interface Avatars {
56
58
  ai?: Avatar;
57
59
  }
58
60
  export interface CustomAction {
59
- displayName: string;
60
61
  handler: (message: ConversationMessage) => void;
61
- icon: React.ReactNode;
62
+ component?: React.ReactNode;
62
63
  }
63
64
  export interface SuggestedPrompt {
64
65
  component?: React.ReactNode;
65
66
  inputText: string;
66
67
  }
67
- type JSONType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null' | 'any';
68
- interface ResponseComponentProp {
69
- type: JSONType;
70
- enum?: string[];
71
- description?: string;
72
- required?: boolean;
73
- }
74
- interface ResponseComponentPropMap {
75
- [key: string]: ResponseComponentProp;
76
- }
77
- export interface ResponseComponent {
78
- component: React.ComponentType<any>;
79
- description?: string;
80
- props: ResponseComponentPropMap;
81
- }
82
- export interface ResponseComponents {
83
- [key: string]: ResponseComponent;
84
- }
85
- export {};
@@ -2,3 +2,13 @@ import { ImageContentBlock } from '../../types';
2
2
  export declare function formatDate(date: Date): string;
3
3
  export declare function convertBufferToBase64(buffer: ArrayBuffer, format: ImageContentBlock['format']): string;
4
4
  export declare function getImageTypeFromMimeType(mimeType: string): 'png' | 'jpeg' | 'gif' | 'webp';
5
+ export declare function attachmentsValidator({ files, maxAttachments, maxAttachmentSize, }: {
6
+ files: File[];
7
+ maxAttachments: number;
8
+ maxAttachmentSize: number;
9
+ }): Promise<{
10
+ acceptedFiles: File[];
11
+ rejectedFiles: File[];
12
+ hasMaxAttachmentSizeError: boolean;
13
+ hasMaxAttachmentsError: boolean;
14
+ }>;
@@ -4,13 +4,10 @@ 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 {
@@ -21,6 +18,5 @@ export interface MessagesControl {
21
18
  HeaderContainer: AIConversationElements['View'];
22
19
  Layout: AIConversationElements['View'];
23
20
  Message: MessageControl;
24
- Separator: AIConversationElements['Span'];
25
21
  }
26
22
  export {};
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
- import { ConversationInputContext } from '../../context';
2
+ import { ConversationInputContextProps } from '../../context';
3
3
  export declare const Attachments: ({ files, setInput, }: {
4
4
  files?: File[] | undefined;
5
- setInput: ConversationInputContext['setInput'];
5
+ setInput: ConversationInputContextProps['setInput'];
6
6
  }) => JSX.Element | null;
@@ -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'];
@@ -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,10 +1,16 @@
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
10
  export type TextContentBlock = NonNullable<ConversationMessageContent['text']>;
7
11
  export type ImageContentBlock = NonNullable<ConversationMessageContent['image']>;
12
+ export type ToolUseContent = NonNullable<ConversationMessageContent['toolUse']>;
13
+ export type ToolResultContent = NonNullable<ConversationMessageContent['toolResult']>;
8
14
  export type InputContent = Exclude<Parameters<Conversation['sendMessage']>[0], string>['content'][number];
9
15
  export type SendMessageContent = Exclude<Parameters<Conversation['sendMessage']>[0], string>['content'];
10
16
  export type SendMessageContext = Exclude<Parameters<Conversation['sendMessage']>[0], string>['aiContext'];
@@ -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 {};
@@ -1 +1 @@
1
- export declare const VERSION = "0.4.0";
1
+ export declare const VERSION = "1.1.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-amplify/ui-react-ai",
3
- "version": "0.4.0",
3
+ "version": "1.1.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/esm/index.mjs",
6
6
  "exports": {
@@ -42,15 +42,15 @@
42
42
  "typecheck": "tsc --noEmit"
43
43
  },
44
44
  "peerDependencies": {
45
- "@aws-amplify/api-graphql": "^4.3.0",
46
- "aws-amplify": "^6.6.5",
45
+ "@aws-amplify/api-graphql": "unstable",
46
+ "aws-amplify": "^6.9.0",
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.5",
52
- "@aws-amplify/ui-react": "^6.5.5",
53
- "@aws-amplify/ui-react-core": "^3.0.29"
51
+ "@aws-amplify/ui": "^6.7.1",
52
+ "@aws-amplify/ui-react": "^6.7.1",
53
+ "@aws-amplify/ui-react-core": "^3.1.1"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@types/jest-when": "^3.5.0",