UNPKG

@lucidcms/core

Version:

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

2 lines 4.71 kB
import{copy as e}from"../../../libs/i18n/copy.mjs";import t from"../../../constants/constants.mjs";import n from"../../../libs/logger/index.mjs";import{tenantAccessAllowed as r}from"../../../utils/helpers/tenants.mjs";import i from"../checks/check-feature-enabled.mjs";import a from"../../../libs/lucid-remote/services/generate-cms-ai.mjs";import{getCmsAiGenerateFailedMessage as o,isCmsAiGenerateAcceptedData as s,isCmsAiGenerateCompletedData as c,isCmsAiGenerateFailedData as l}from"../../../libs/lucid-remote/utils.mjs";import u from"../../options/get-license-key.mjs";import d from"../helpers/get-translated-field-details.mjs";import f,{formatCustomFieldCollectionDefinition as p,getTranslatedBrickDetails as m}from"../helpers/format-custom-field-document-context.mjs";import h from"../helpers/format-custom-field-output.mjs";import g from"../helpers/get-translated-collection-details.mjs";import _ from"../helpers/normalize-custom-field-generation-locale.mjs";import v from"../storage/store-failed-generation.mjs";import y from"../storage/store-generation.mjs";const b=async(b,x)=>{let S=await i(b,{feature:`customFieldGeneration`});if(S.error)return S;let C=Date.now(),w=await u(b);if(w.error)return w;let T=b.config.collections.find(e=>e.key===x.target.collectionKey);if(!T||!r(T.getData.tenants,b.request.tenantKey))return{error:{type:`basic`,status:404,message:e(`server:core.collections.not.found.message`)},data:void 0};let E=x.target.brickKey?T.brickInstances.find(e=>e.key===x.target.brickKey):void 0;if(x.target.brickKey&&(!E||!r(E.config.tenants,b.request.tenantKey)))return{error:{type:`basic`,status:404,message:e(`server:core.ai.custom.field.input.target.not.found`)},data:void 0};let D=(E??T).fields.get(x.target.fieldKey);if(!D)return{error:{type:`basic`,status:404,message:e(`server:core.ai.custom.field.input.target.not.found`)},data:void 0};if(!D.aiConfig.enabled)return{error:{type:`basic`,status:400,message:e(`server:core.ai.custom.field.input.no.supported.field`)},data:void 0};let O=T.getData.localized===!0&&D.localizedEnabled===!0,k=_({defaultLocale:b.config.localization.defaultLocale,fieldIsLocalized:O,locale:x.locale,value:x.value}),A=[];if(x.instruction?.trim()&&A.push({type:`text`,role:`user-instruction`,value:x.instruction}),D.aiConfig.instructions?.trim()&&A.push({type:`text`,role:`field-instruction`,value:D.aiConfig.instructions}),x.guidance){let t=D.aiConfig.guidance.find(e=>e.key===x.guidance);if(!t)return{error:{type:`basic`,status:400,message:e(`server:core.ai.custom.field.input.guidance.not.found`)},data:void 0};A.push({type:`text`,role:`guidance`,value:t.instructions})}let j=[];if(D.aiConfig.context)try{j=await D.aiConfig.context({collection:T,brick:E,field:D,locale:k.locale})}catch(e){n.error({error:e,event:`ai.field-context.failed`,scope:t.logScopes.ai,message:`Failed to resolve AI field context`,data:{errorMessage:e instanceof Error?e.message:String(e)}})}let M=g(b,T),N=d(b,D),P=E?m(b,E):void 0,F=p({context:b,collection:T}),I={feature:{key:`custom-field.input.generate`,version:`v1`},input:A,outputSchema:D.jsonSchema,context:{locale:k.locale,target:{collection:{key:x.target.collectionKey,...M??{}},...E?{brick:{key:E.key,...P??{}}}:{},field:{key:D.key,type:D.type,...N??{},value:k.value}},collection:{key:x.target.collectionKey,...M??{},...F},items:j,document:f({context:b,collection:T,document:x.document})}},L=await a(b,{licenseKey:w.data,request:I});if(L.error)return L;let R=L.data.json.data,z=l(R);if(s(R)||z){let t=z?o(R,b.translate(`server:core.routes.ai.generate.error.message`)):b.translate(`server:core.routes.ai.generate.error.message`),n=await v(b,{userId:x.userId,requestId:R.requestId,feature:R.feature,targetType:`custom-field`,target:{collectionKey:x.target.collectionKey,brickKey:x.target.brickKey,fieldKey:x.target.fieldKey,guidance:x.guidance??null,locale:x.locale},requestStartedAt:C,errorMessage:t,usage:z?R.usage:void 0});return n.error?n:{error:{type:`basic`,status:502,message:z?e.literal(t):e(`server:core.routes.ai.generate.error.message`)},data:void 0}}if(!c(R))return{error:{type:`basic`,status:502,message:e(`server:core.routes.ai.generate.error.message`)},data:void 0};let B=R,V=h({field:D,output:B.output}),H=V.error===void 0?{...B,output:V.data}:B,U=V.error===void 0?null:b.translate(V.error.message),W=await y(b,{userId:x.userId,response:H,targetType:`custom-field`,requestStartedAt:C,status:V.error===void 0?`success`:`failed`,errorMessage:U,target:{collectionKey:x.target.collectionKey,brickKey:x.target.brickKey,fieldKey:x.target.fieldKey,guidance:x.guidance??null,locale:x.locale}});return W.error?W:V.error?V:{error:void 0,data:H}};export{b as default}; //# sourceMappingURL=custom-field-input-generate.mjs.map