UNPKG

@ai-stack/payloadcms

Version:

<p align="center"> <img alt="Payload AI Plugin" src="assets/payload-ai-intro.gif" width="100%" /> </p>

165 lines (164 loc) 5.52 kB
import type { JSONSchema } from 'openai/lib/jsonschema'; import type { ImageGenerateParams } from 'openai/resources/images'; import type { CollectionSlug, DataFromCollectionSlug, Endpoint, Field, File, GlobalConfig, GroupField, PayloadRequest } from 'payload'; import type { CSSProperties, MouseEventHandler } from 'react'; export interface PluginConfigAccess { /** * Control access to AI generation features (generate text, images, audio) * @default () => !!req.user (requires authentication) */ generate?: ({ req }: { req: PayloadRequest; }) => Promise<boolean> | boolean; /** * Control access to AI settings/configuration * @default () => !!req.user (requires authentication) */ settings?: ({ req }: { req: PayloadRequest; }) => Promise<boolean> | boolean; } export interface PluginOptions { /** * Provide local tags to filter language options from the Translate Menu * Check for the available local tags, * visit: https://www.npmjs.com/package/locale-codes * Example: ["en-US", "zh-SG", "zh-CN", "en"] */ enabledLanguages?: string[]; } export type PluginConfigMediaUploadFunction = (result: { data: Record<any, any>; file: File; }, { collection, request, }: { collection: CollectionSlug; request: PayloadRequest; }) => Promise<DataFromCollectionSlug<CollectionSlug>>; export interface PluginConfig { /** * Access control configuration for AI features * By default, all AI features require authentication */ access?: PluginConfigAccess; collections: { [key: CollectionSlug]: boolean; }; debugging?: boolean; disableSponsorMessage?: boolean; editorConfig?: { nodes: JSONSchema[]; }; fields?: Field[]; generatePromptOnInit?: boolean; generationModels?: ((defaultModels: GenerationModel[]) => GenerationModel[]) | GenerationModel[]; globals?: { [key: GlobalConfig['slug']]: boolean; }; interfaceName?: string; mediaUpload?: PluginConfigMediaUploadFunction; options?: PluginOptions; promptFields?: PromptField[]; /** * Custom action prompts for AI text generation * If not provided, uses default prompts * You can access default prompts by importing { defaultPrompts } from '@ai-stack/payloadcms' */ prompts?: ActionPrompt[]; /** * Custom seed prompt function for generating field-specific prompts * If not provided, uses default seed prompt function * You can access default seed prompts by importing { defaultSeedPrompts } from '@ai-stack/payloadcms' */ seedPrompts?: SeedPromptFunction; uploadCollectionSlug?: CollectionSlug; } export interface GenerationModel { fields: string[]; generateText?: (prompt: string, system: string) => Promise<string>; handler?: (prompt: string, options: any) => Promise<any> | Response; id: string; name: string; output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video'; settings?: GroupField; supportsPromptOptimization?: boolean; } export interface GenerationConfig { models: GenerationModel[]; provider: string; } export type GenerateTextarea<T = any> = (args: { collectionSlug: CollectionSlug; doc: T; documentId?: number | string; locale?: string; options?: any; }) => Promise<string> | string; export interface Endpoints { textarea: Omit<Endpoint, 'root'>; upload: Omit<Endpoint, 'root'>; } export type ActionMenuItems = 'Compose' | 'Expand' | 'Proofread' | 'Rephrase' | 'Settings' | 'Simplify' | 'Summarize' | 'Tone' | 'Translate'; export type ActionPromptOptions = { layout?: string; locale?: string; prompt?: string; systemPrompt?: string; }; export type ActionPrompt = { layout?: (options?: ActionPromptOptions) => string; name: ActionMenuItems; system: (options: ActionPromptOptions) => string; }; export type SeedPromptOptions = { fieldLabel: string; fieldSchemaPaths: Record<string, any>; fieldType: string; path: string; }; export type SeedPromptFunction = (options: SeedPromptOptions) => { prompt: string; system: string; }; export type ActionMenuEvents = 'onCompose' | 'onExpand' | 'onProofread' | 'onRephrase' | 'onSettings' | 'onSimplify' | 'onSummarize' | 'onTone' | 'onTranslate'; export type UseMenuEvents = { [key in ActionMenuEvents]?: (data?: unknown) => void; }; export type UseMenuOptions = { isConfigAllowed: boolean; }; export type BaseItemProps<T = any> = { children?: React.ReactNode; disabled?: boolean; hideIcon?: boolean; isActive?: boolean; isMenu?: boolean; onClick: (data?: unknown) => void; onMouseEnter?: MouseEventHandler<T> | undefined; onMouseLeave?: MouseEventHandler<T> | undefined; style?: CSSProperties | undefined; title?: string; }; export type ImageReference = { data: Blob; name: string; size: number; type: string; url: string; }; export type GenerateImageParams = { images?: ImageReference[]; size?: ImageGenerateParams['size']; style?: ImageGenerateParams['style']; version?: ImageGenerateParams['model']; }; export type SerializedPromptField = { collections?: (CollectionSlug)[]; name: string; }; export type PromptFieldGetterContext = { collection: CollectionSlug; type: string; }; export type PromptField = { getter?: (data: object, ctx: PromptFieldGetterContext) => Promise<string> | string; } & SerializedPromptField;