UNPKG

@lucidcms/core

Version:

The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.

1 lines 7.42 kB
{"version":3,"file":"generate-cms-ai.mjs","names":[],"sources":["../../../../src/libs/lucid-remote/services/generate-cms-ai.ts"],"sourcesContent":["import type { AiGenerateMode, AiGenerateUsage } from \"@lucidcms/types\";\nimport type { ServiceFn } from \"../../../utils/services/types.js\";\nimport { getLucidRemoteClient } from \"../client.js\";\nimport { lucidRemotePaths } from \"../constants.js\";\nimport type { LucidRemoteRequestData } from \"../types.js\";\n\nexport type CmsAiGenerateRequestInputText<TRole extends string = string> = {\n\ttype: \"text\";\n\trole: TRole;\n\tvalue: string;\n};\n\nexport type CmsAiGenerateRequestInputImage<\n\tTRole extends string = string,\n\tTMimeType extends string = string,\n> = {\n\ttype: \"image\";\n\trole: TRole;\n\timage:\n\t\t| {\n\t\t\t\ttype: \"url\";\n\t\t\t\turl: string;\n\t\t\t\tdetail?: \"low\" | \"high\" | \"auto\";\n\t\t\t\tfilename?: string;\n\t\t\t\tmimeType?: TMimeType;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"base64\";\n\t\t\t\tdata: string;\n\t\t\t\tmimeType: TMimeType;\n\t\t\t\tdetail?: \"low\" | \"high\" | \"auto\";\n\t\t\t\tfilename?: string;\n\t\t };\n};\n\nexport type CmsAiGenerateRequestInput =\n\t| CmsAiGenerateRequestInputText\n\t| CmsAiGenerateRequestInputImage;\n\nexport type CmsAiGenerateRequestItem =\n\t| {\n\t\t\ttype: \"text\";\n\t\t\tlabel: string;\n\t\t\tvalue: string;\n\t }\n\t| {\n\t\t\ttype: \"json\";\n\t\t\tlabel: string;\n\t\t\tvalue: unknown;\n\t };\n\ntype CmsAiGenerateBaseRequest<\n\tTFeature extends {\n\t\tkey: string;\n\t\tversion: string;\n\t},\n\tTInput extends CmsAiGenerateRequestInput,\n\tTContext,\n> = {\n\tfeature: TFeature;\n\tinput: TInput[];\n\tcontext: TContext;\n};\n\nexport type CustomFieldInputDocumentContextFields = Record<string, unknown>;\n\nexport type CustomFieldInputDocumentContext = {\n\tfields: CustomFieldInputDocumentContextFields;\n\tbricks: Array<{\n\t\tkey: string;\n\t\ttype: \"builder\" | \"fixed\";\n\t\tfields: CustomFieldInputDocumentContextFields;\n\t}>;\n};\n\nexport type CustomFieldInputDefinitionField = {\n\ttype: string;\n\tlabel?: string;\n\tsummary?: string;\n\tlocalized: boolean;\n\tcollection?: string | string[];\n\tmultiple?: boolean;\n\toptions?: Array<{\n\t\tvalue: string;\n\t\tlabel?: string;\n\t}>;\n\tfields?: Record<string, CustomFieldInputDefinitionField>;\n};\n\nexport type CustomFieldInputDefinitionBrick = {\n\tname?: string;\n\tsummary?: string;\n\tfields: Record<string, CustomFieldInputDefinitionField>;\n};\n\nexport type CustomFieldInputCollectionContext = {\n\tkey: string;\n\tname?: string;\n\tsingularName?: string;\n\tsummary?: string;\n\tfields: Record<string, CustomFieldInputDefinitionField>;\n\tfixedBricks: Record<string, CustomFieldInputDefinitionBrick>;\n\tbuilderBricks: Record<string, CustomFieldInputDefinitionBrick>;\n};\n\nexport type CustomFieldInputTargetCollectionContext = {\n\tkey: string;\n\tname?: string;\n\tsingularName?: string;\n\tsummary?: string;\n};\n\nexport type CustomFieldInputTargetBrickContext = {\n\tkey: string;\n\tname?: string;\n\tsummary?: string;\n};\n\nexport type CustomFieldInputTargetFieldContext = {\n\tkey: string;\n\ttype: string;\n\tlabel?: string;\n\tsummary?: string;\n\tvalue: Record<string, unknown>;\n};\n\nexport type CustomFieldInputTargetContext = {\n\tcollection: CustomFieldInputTargetCollectionContext;\n\tbrick?: CustomFieldInputTargetBrickContext;\n\tfield: CustomFieldInputTargetFieldContext;\n};\n\nexport type CustomFieldInputV1Context = {\n\tlocale: {\n\t\tsource?: string;\n\t\ttarget: string | string[];\n\t};\n\ttarget: CustomFieldInputTargetContext;\n\tcollection: CustomFieldInputCollectionContext;\n\titems: CmsAiGenerateRequestItem[];\n\tdocument?: CustomFieldInputDocumentContext;\n};\n\nexport type CustomFieldInputV1Request = CmsAiGenerateBaseRequest<\n\t{\n\t\tkey: \"custom-field.input.generate\";\n\t\tversion: \"v1\";\n\t},\n\tCmsAiGenerateRequestInputText<\n\t\t\"user-instruction\" | \"field-instruction\" | \"guidance\"\n\t>,\n\tCustomFieldInputV1Context\n> & {\n\toutputSchema: unknown;\n};\n\nexport type MediaAltGenerateV1Request = CmsAiGenerateBaseRequest<\n\t{\n\t\tkey: \"media.alt.generate\";\n\t\tversion: \"v1\";\n\t},\n\t| CmsAiGenerateRequestInputText<\"user-instruction\">\n\t| CmsAiGenerateRequestInputImage<\"source-image\">,\n\t{\n\t\tlocale: {\n\t\t\tsource?: string;\n\t\t\ttarget: string | string[];\n\t\t};\n\t\tmedia: {\n\t\t\tid?: string | number;\n\t\t\tname?: Record<string, string>;\n\t\t\talt?: Record<string, string>;\n\t\t};\n\t\tpreviousResponses?: {\n\t\t\tinstruction?: string;\n\t\t\toutput: Record<string, string>;\n\t\t}[];\n\t}\n>;\n\nexport type MediaImageGenerateV1Request = {\n\tfeature: {\n\t\tkey: \"media.image.generate\";\n\t\tversion: \"v1\";\n\t};\n\tinput: (\n\t\t| CmsAiGenerateRequestInputText<\"user-instruction\" | \"guidance\">\n\t\t| CmsAiGenerateRequestInputImage<\n\t\t\t\t\"source-image\",\n\t\t\t\t\"image/webp\" | \"image/png\" | \"image/jpeg\"\n\t\t >\n\t)[];\n\tcontext: {\n\t\tpreviousInstructions?: string[];\n\t};\n\tgeneration: {\n\t\tsize:\n\t\t\t| \"auto\"\n\t\t\t| \"1024x1024\"\n\t\t\t| \"1536x1024\"\n\t\t\t| \"1024x1536\"\n\t\t\t| \"2048x2048\"\n\t\t\t| \"2048x1152\"\n\t\t\t| \"3840x2160\"\n\t\t\t| \"2160x3840\"\n\t\t\t| [number, number];\n\t\tquality: \"auto\" | \"low\" | \"medium\" | \"high\";\n\t\toutputFormat: \"webp\" | \"png\" | \"jpeg\";\n\t};\n};\n\nexport type CmsAiGenerateRequest =\n\t| CustomFieldInputV1Request\n\t| MediaAltGenerateV1Request\n\t| MediaImageGenerateV1Request;\n\nexport type CmsAiGenerateRequestFeature = CmsAiGenerateRequest[\"feature\"];\n\ntype GenerateCmsAiProps = {\n\tlicenseKey: string;\n\trequest: CmsAiGenerateRequest;\n\tidempotencyKey?: string;\n};\n\nexport type CmsAiGenerateCompletedData = {\n\tmode: AiGenerateMode;\n\tstatus?: \"complete\";\n\trequestId: string;\n\tfeature: CmsAiGenerateRequest[\"feature\"];\n\toutput: unknown;\n\tusage: AiGenerateUsage;\n};\n\nexport type CmsAiGenerateAcceptedData = {\n\tmode: \"async\";\n\trequestId: string;\n\tfeature: CmsAiGenerateRequest[\"feature\"];\n\tstatus: \"queued\" | \"processing\";\n};\n\nexport type CmsAiGenerateFailedData = {\n\tmode: AiGenerateMode;\n\trequestId: string;\n\tfeature: CmsAiGenerateRequest[\"feature\"];\n\tstatus: \"failed\";\n\tusage?: AiGenerateUsage;\n\terror?: {\n\t\tmessage?: string | null;\n\t} | null;\n\terrorMessage?: string;\n\tmessage?: string;\n};\n\nexport type CmsAiGenerateData =\n\t| CmsAiGenerateCompletedData\n\t| CmsAiGenerateAcceptedData\n\t| CmsAiGenerateFailedData;\n\n/**\n * Runs a CMS AI feature against Lucid's remote AI API.\n */\nconst generateCmsAi: ServiceFn<\n\t[GenerateCmsAiProps],\n\tLucidRemoteRequestData<CmsAiGenerateData>\n> = async (context, props) => {\n\tconst client = getLucidRemoteClient(context);\n\tconst headers = new Headers();\n\n\theaders.append(\"Authorization\", `Bearer ${props.licenseKey}`);\n\theaders.append(\"idempotency-key\", props.idempotencyKey ?? \"\");\n\n\treturn client.request<CmsAiGenerateData>(lucidRemotePaths.generateCmsAi, {\n\t\tretries: 0,\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: props.request,\n\t});\n};\n\nexport default generateCmsAi;\n"],"mappings":"yGAqQA,MAAM,EAGF,MAAO,EAAS,IAAU,CAC7B,IAAM,EAAS,EAAqB,CAAO,EACrC,EAAU,IAAI,QAKpB,OAHA,EAAQ,OAAO,gBAAiB,UAAU,EAAM,YAAY,EAC5D,EAAQ,OAAO,kBAAmB,EAAM,gBAAkB,EAAE,EAErD,EAAO,QAA2B,EAAiB,cAAe,CACxE,QAAS,EACT,OAAQ,OACR,UACA,KAAM,EAAM,OACb,CAAC,CACF"}