@webiny/ai-powerups 6.5.0 → 6.5.1-beta.1

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.
package/api/Extension.js CHANGED
@@ -42,7 +42,7 @@ const Extension = createFeature({
42
42
  const wcp = container.resolve(WcpContext);
43
43
  if (wcp.canUseAiImageEnrichment()) AiImageEnrichmentFeature.register(container);
44
44
  CmsCompareEntryRevisionsFeature.register(container);
45
- WbTranslatePageFeature.register(container);
45
+ if (wcp.canUseAiPageTranslation()) WbTranslatePageFeature.register(container);
46
46
  container.register(AiPowerUpsSettingsGraphQLMapper).inSingletonScope();
47
47
  container.register(BaseGraphQLSchema);
48
48
  container.register(CmsCompareEntryRevisionsSchema);
@@ -1 +1 @@
1
- {"version":3,"file":"api/Extension.js","sources":["../../src/api/Extension.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { BaseGraphQLSchema } from \"./graphql/BaseGraphQLSchema.js\";\nimport AiPowerUpsSettingsGraphQLMapperImpl from \"./graphql/AiPowerUpsSettingsGraphQLMapper.js\";\nimport { AiPowerUpsSettingsCache } from \"./features/shared/SettingsCache.js\";\nimport { GetSettingsFeature } from \"./features/GetSettings/feature.js\";\nimport { UpdateSettingsFeature } from \"./features/UpdateSettings/feature.js\";\nimport { WbGeneratePageContentFeature } from \"./features/WbGeneratePageContent/feature.js\";\nimport { ProvidersFeature } from \"./features/Providers/feature.js\";\nimport { ConnectionsFeature } from \"./features/Connections/feature.js\";\nimport { ModelRolesFeature } from \"./features/ModelRoles/feature.js\";\nimport { CapabilitiesFeature } from \"./features/Capabilities/feature.js\";\nimport { ReaderPersonasFeature } from \"./features/ReaderPersonas/feature.js\";\nimport { WriterPersonasFeature } from \"./features/WriterPersonas/feature.js\";\nimport { ProjectsFeature } from \"./features/Projects/feature.js\";\nimport { AiPromptContextFeature } from \"./features/AiPromptContext/feature.js\";\nimport { AiImageEnrichmentFeature } from \"./features/AiImageEnrichment/feature.js\";\nimport { ExtractFrontmatterFeature } from \"./features/ExtractFrontmatter/feature.js\";\nimport { CmsGenerateEntryContentFeature } from \"./features/CmsGenerateEntryContent/feature.js\";\nimport { CmsResolveImageToolFeature } from \"./features/CmsResolveImageTool/feature.js\";\nimport { CmsCompareEntryRevisionsFeature } from \"./features/CmsCompareEntryRevisions/feature.js\";\nimport { WbTranslatePageFeature } from \"./features/WbTranslatePage/feature.js\";\nimport { CmsCompareEntryRevisionsSchema } from \"./graphql/CmsCompareEntryRevisionsSchema.js\";\n\nexport const Extension = createFeature({\n name: \"AiPowerUps\",\n register(container) {\n container.register(AiPowerUpsSettingsCache).inSingletonScope();\n\n GetSettingsFeature.register(container);\n UpdateSettingsFeature.register(container);\n /*\n * `ProvidersFeature` is still registered so the legacy `providers` section keeps round-\n * tripping through storage. `Connections` and `ModelRoles` read it once to seed\n * themselves; nothing else does. It goes away with the next breaking release.\n */\n ProvidersFeature.register(container);\n ConnectionsFeature.register(container);\n ModelRolesFeature.register(container);\n CapabilitiesFeature.register(container);\n ReaderPersonasFeature.register(container);\n WriterPersonasFeature.register(container);\n ProjectsFeature.register(container);\n AiPromptContextFeature.register(container);\n WbGeneratePageContentFeature.register(container);\n CmsGenerateEntryContentFeature.register(container);\n CmsResolveImageToolFeature.register(container);\n ExtractFrontmatterFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseAiImageEnrichment()) {\n AiImageEnrichmentFeature.register(container);\n }\n\n CmsCompareEntryRevisionsFeature.register(container);\n WbTranslatePageFeature.register(container);\n\n container.register(AiPowerUpsSettingsGraphQLMapperImpl).inSingletonScope();\n container.register(BaseGraphQLSchema);\n container.register(CmsCompareEntryRevisionsSchema);\n }\n});\n"],"names":["Extension","createFeature","container","AiPowerUpsSettingsCache","GetSettingsFeature","UpdateSettingsFeature","ProvidersFeature","ConnectionsFeature","ModelRolesFeature","CapabilitiesFeature","ReaderPersonasFeature","WriterPersonasFeature","ProjectsFeature","AiPromptContextFeature","WbGeneratePageContentFeature","CmsGenerateEntryContentFeature","CmsResolveImageToolFeature","ExtractFrontmatterFeature","wcp","WcpContext","AiImageEnrichmentFeature","CmsCompareEntryRevisionsFeature","WbTranslatePageFeature","AiPowerUpsSettingsGraphQLMapperImpl","BaseGraphQLSchema","CmsCompareEntryRevisionsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAMA,YAAYC,cAAc;IACnC,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,yBAAyB,gBAAgB;QAE5DC,mBAAmB,QAAQ,CAACF;QAC5BG,sBAAsB,QAAQ,CAACH;QAM/BI,iBAAiB,QAAQ,CAACJ;QAC1BK,mBAAmB,QAAQ,CAACL;QAC5BM,kBAAkB,QAAQ,CAACN;QAC3BO,oBAAoB,QAAQ,CAACP;QAC7BQ,sBAAsB,QAAQ,CAACR;QAC/BS,sBAAsB,QAAQ,CAACT;QAC/BU,gBAAgB,QAAQ,CAACV;QACzBW,uBAAuB,QAAQ,CAACX;QAChCY,6BAA6B,QAAQ,CAACZ;QACtCa,+BAA+B,QAAQ,CAACb;QACxCc,2BAA2B,QAAQ,CAACd;QACpCe,0BAA0B,QAAQ,CAACf;QAEnC,MAAMgB,MAAMhB,UAAU,OAAO,CAACiB;QAC9B,IAAID,IAAI,uBAAuB,IAC3BE,yBAAyB,QAAQ,CAAClB;QAGtCmB,gCAAgC,QAAQ,CAACnB;QACzCoB,uBAAuB,QAAQ,CAACpB;QAEhCA,UAAU,QAAQ,CAACqB,iCAAqC,gBAAgB;QACxErB,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;IACvB;AACJ"}
1
+ {"version":3,"file":"api/Extension.js","sources":["../../src/api/Extension.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { BaseGraphQLSchema } from \"./graphql/BaseGraphQLSchema.js\";\nimport AiPowerUpsSettingsGraphQLMapperImpl from \"./graphql/AiPowerUpsSettingsGraphQLMapper.js\";\nimport { AiPowerUpsSettingsCache } from \"./features/shared/SettingsCache.js\";\nimport { GetSettingsFeature } from \"./features/GetSettings/feature.js\";\nimport { UpdateSettingsFeature } from \"./features/UpdateSettings/feature.js\";\nimport { WbGeneratePageContentFeature } from \"./features/WbGeneratePageContent/feature.js\";\nimport { ProvidersFeature } from \"./features/Providers/feature.js\";\nimport { ConnectionsFeature } from \"./features/Connections/feature.js\";\nimport { ModelRolesFeature } from \"./features/ModelRoles/feature.js\";\nimport { CapabilitiesFeature } from \"./features/Capabilities/feature.js\";\nimport { ReaderPersonasFeature } from \"./features/ReaderPersonas/feature.js\";\nimport { WriterPersonasFeature } from \"./features/WriterPersonas/feature.js\";\nimport { ProjectsFeature } from \"./features/Projects/feature.js\";\nimport { AiPromptContextFeature } from \"./features/AiPromptContext/feature.js\";\nimport { AiImageEnrichmentFeature } from \"./features/AiImageEnrichment/feature.js\";\nimport { ExtractFrontmatterFeature } from \"./features/ExtractFrontmatter/feature.js\";\nimport { CmsGenerateEntryContentFeature } from \"./features/CmsGenerateEntryContent/feature.js\";\nimport { CmsResolveImageToolFeature } from \"./features/CmsResolveImageTool/feature.js\";\nimport { CmsCompareEntryRevisionsFeature } from \"./features/CmsCompareEntryRevisions/feature.js\";\nimport { WbTranslatePageFeature } from \"./features/WbTranslatePage/feature.js\";\nimport { CmsCompareEntryRevisionsSchema } from \"./graphql/CmsCompareEntryRevisionsSchema.js\";\n\nexport const Extension = createFeature({\n name: \"AiPowerUps\",\n register(container) {\n container.register(AiPowerUpsSettingsCache).inSingletonScope();\n\n GetSettingsFeature.register(container);\n UpdateSettingsFeature.register(container);\n /*\n * `ProvidersFeature` is still registered so the legacy `providers` section keeps round-\n * tripping through storage. `Connections` and `ModelRoles` read it once to seed\n * themselves; nothing else does. It goes away with the next breaking release.\n */\n ProvidersFeature.register(container);\n ConnectionsFeature.register(container);\n ModelRolesFeature.register(container);\n CapabilitiesFeature.register(container);\n ReaderPersonasFeature.register(container);\n WriterPersonasFeature.register(container);\n ProjectsFeature.register(container);\n AiPromptContextFeature.register(container);\n WbGeneratePageContentFeature.register(container);\n CmsGenerateEntryContentFeature.register(container);\n CmsResolveImageToolFeature.register(container);\n ExtractFrontmatterFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseAiImageEnrichment()) {\n AiImageEnrichmentFeature.register(container);\n }\n\n CmsCompareEntryRevisionsFeature.register(container);\n\n // Without it, translating a page still copies it into the target language, untranslated.\n if (wcp.canUseAiPageTranslation()) {\n WbTranslatePageFeature.register(container);\n }\n\n container.register(AiPowerUpsSettingsGraphQLMapperImpl).inSingletonScope();\n container.register(BaseGraphQLSchema);\n container.register(CmsCompareEntryRevisionsSchema);\n }\n});\n"],"names":["Extension","createFeature","container","AiPowerUpsSettingsCache","GetSettingsFeature","UpdateSettingsFeature","ProvidersFeature","ConnectionsFeature","ModelRolesFeature","CapabilitiesFeature","ReaderPersonasFeature","WriterPersonasFeature","ProjectsFeature","AiPromptContextFeature","WbGeneratePageContentFeature","CmsGenerateEntryContentFeature","CmsResolveImageToolFeature","ExtractFrontmatterFeature","wcp","WcpContext","AiImageEnrichmentFeature","CmsCompareEntryRevisionsFeature","WbTranslatePageFeature","AiPowerUpsSettingsGraphQLMapperImpl","BaseGraphQLSchema","CmsCompareEntryRevisionsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAMA,YAAYC,cAAc;IACnC,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,yBAAyB,gBAAgB;QAE5DC,mBAAmB,QAAQ,CAACF;QAC5BG,sBAAsB,QAAQ,CAACH;QAM/BI,iBAAiB,QAAQ,CAACJ;QAC1BK,mBAAmB,QAAQ,CAACL;QAC5BM,kBAAkB,QAAQ,CAACN;QAC3BO,oBAAoB,QAAQ,CAACP;QAC7BQ,sBAAsB,QAAQ,CAACR;QAC/BS,sBAAsB,QAAQ,CAACT;QAC/BU,gBAAgB,QAAQ,CAACV;QACzBW,uBAAuB,QAAQ,CAACX;QAChCY,6BAA6B,QAAQ,CAACZ;QACtCa,+BAA+B,QAAQ,CAACb;QACxCc,2BAA2B,QAAQ,CAACd;QACpCe,0BAA0B,QAAQ,CAACf;QAEnC,MAAMgB,MAAMhB,UAAU,OAAO,CAACiB;QAC9B,IAAID,IAAI,uBAAuB,IAC3BE,yBAAyB,QAAQ,CAAClB;QAGtCmB,gCAAgC,QAAQ,CAACnB;QAGzC,IAAIgB,IAAI,uBAAuB,IAC3BI,uBAAuB,QAAQ,CAACpB;QAGpCA,UAAU,QAAQ,CAACqB,iCAAqC,gBAAgB;QACxErB,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;IACvB;AACJ"}
@@ -1,5 +1,6 @@
1
1
  import { Ai } from "@webiny/api-core/features/ai/index.js";
2
2
  import { Logger } from "@webiny/api-core/features/logger/index.js";
3
+ import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
3
4
  import { GetDefaultLanguageUseCase } from "@webiny/languages/exports/api/languages.js";
4
5
  import { TranslatePageUseCase } from "@webiny/api-website-builder/features/pages/TranslatePage/index.js";
5
6
  import { UpdatePageRepository } from "@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js";
@@ -14,8 +15,9 @@ declare class WbTranslatePageDecoratorImpl implements TranslatePageUseCase.Inter
14
15
  private ai;
15
16
  private lexicalParser;
16
17
  private updatePageRepository;
18
+ private wcp;
17
19
  private decoratee;
18
- constructor(getDefaultLanguage: GetDefaultLanguageUseCase.Interface, getPageById: GetPageByIdUseCase.Interface, resolveCapability: ResolveAiCapabilityUseCase.Interface, logger: Logger.Interface, ai: Ai.Interface, lexicalParser: LexicalParser.Interface, updatePageRepository: UpdatePageRepository.Interface, decoratee: TranslatePageUseCase.Interface);
20
+ constructor(getDefaultLanguage: GetDefaultLanguageUseCase.Interface, getPageById: GetPageByIdUseCase.Interface, resolveCapability: ResolveAiCapabilityUseCase.Interface, logger: Logger.Interface, ai: Ai.Interface, lexicalParser: LexicalParser.Interface, updatePageRepository: UpdatePageRepository.Interface, wcp: WcpContext.Interface, decoratee: TranslatePageUseCase.Interface);
19
21
  execute(params: TranslatePageUseCase.Params): TranslatePageUseCase.Return;
20
22
  private resolveSourceLanguage;
21
23
  private translate;
@@ -2,6 +2,7 @@ import set from "lodash/set";
2
2
  import { Result } from "@webiny/feature/api";
3
3
  import { Ai } from "@webiny/api-core/features/ai/index.js";
4
4
  import { Logger } from "@webiny/api-core/features/logger/index.js";
5
+ import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
5
6
  import { GetDefaultLanguageUseCase } from "@webiny/languages/exports/api/languages.js";
6
7
  import { TranslatePageUseCase } from "@webiny/api-website-builder/features/pages/TranslatePage/index.js";
7
8
  import { UpdatePageRepository } from "@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js";
@@ -11,7 +12,7 @@ import { LexicalParser } from "./abstractions/LexicalParser.js";
11
12
  import { GetPageByIdUseCase } from "@webiny/api-website-builder/exports/api/website-builder/page.js";
12
13
  import { LlmJsonResponse } from "../../../domain/LlmJsonResponse.js";
13
14
  class WbTranslatePageDecoratorImpl {
14
- constructor(getDefaultLanguage, getPageById, resolveCapability, logger, ai, lexicalParser, updatePageRepository, decoratee){
15
+ constructor(getDefaultLanguage, getPageById, resolveCapability, logger, ai, lexicalParser, updatePageRepository, wcp, decoratee){
15
16
  this.getDefaultLanguage = getDefaultLanguage;
16
17
  this.getPageById = getPageById;
17
18
  this.resolveCapability = resolveCapability;
@@ -19,11 +20,13 @@ class WbTranslatePageDecoratorImpl {
19
20
  this.ai = ai;
20
21
  this.lexicalParser = lexicalParser;
21
22
  this.updatePageRepository = updatePageRepository;
23
+ this.wcp = wcp;
22
24
  this.decoratee = decoratee;
23
25
  }
24
26
  async execute(params) {
25
27
  const result = await this.decoratee.execute(params);
26
28
  if (result.isFail()) return result;
29
+ if (!this.wcp.canUseAiPageTranslation()) return result;
27
30
  const page = result.value;
28
31
  const sourceLanguage = await this.resolveSourceLanguage(page);
29
32
  const translations = await this.translate(page, sourceLanguage, params.languageCode);
@@ -139,7 +142,8 @@ const WbTranslatePageDecorator = TranslatePageUseCase.createDecorator({
139
142
  Logger,
140
143
  Ai,
141
144
  LexicalParser,
142
- UpdatePageRepository
145
+ UpdatePageRepository,
146
+ WcpContext
143
147
  ]
144
148
  });
145
149
  export { WbTranslatePageDecorator };
@@ -1 +1 @@
1
- {"version":3,"file":"api/features/WbTranslatePage/WbTranslatePageDecorator.js","sources":["../../../../src/api/features/WbTranslatePage/WbTranslatePageDecorator.ts"],"sourcesContent":["import set from \"lodash/set\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { GetDefaultLanguageUseCase } from \"@webiny/languages/exports/api/languages.js\";\nimport { TranslatePageUseCase } from \"@webiny/api-website-builder/features/pages/TranslatePage/index.js\";\nimport { UpdatePageRepository } from \"@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js\";\nimport type { WbPage } from \"@webiny/api-website-builder/domain/page/abstractions.js\";\nimport { AiCapabilityDisabledError } from \"~/api/features/Capabilities/index.js\";\nimport {\n ResolveAiCapabilityUseCase,\n withAdditionalInstructions\n} from \"~/api/features/Capabilities/index.js\";\nimport { WB_TRANSLATE_PAGE_CAPABILITY } from \"./capability.js\";\nimport { LexicalParser } from \"./abstractions/LexicalParser.js\";\nimport { GetPageByIdUseCase } from \"@webiny/api-website-builder/exports/api/website-builder/page.js\";\nimport { LlmJsonResponse } from \"~/domain/LlmJsonResponse.js\";\n\ntype InputType = \"text\" | \"longText\" | \"lexical\";\n\ninterface TranslatableBinding {\n type: InputType;\n value: string;\n}\n\ntype TranslatableBindings = Record<string, TranslatableBinding>;\n\ninterface TranslatedBindings {\n [key: string]: { type: InputType; value: string };\n}\n\ninterface TranslatedData {\n properties: Record<string, string>;\n bindings: TranslatedBindings;\n}\n\nclass WbTranslatePageDecoratorImpl implements TranslatePageUseCase.Interface {\n constructor(\n private getDefaultLanguage: GetDefaultLanguageUseCase.Interface,\n private getPageById: GetPageByIdUseCase.Interface,\n private resolveCapability: ResolveAiCapabilityUseCase.Interface,\n private logger: Logger.Interface,\n private ai: Ai.Interface,\n private lexicalParser: LexicalParser.Interface,\n private updatePageRepository: UpdatePageRepository.Interface,\n private decoratee: TranslatePageUseCase.Interface\n ) {}\n\n async execute(params: TranslatePageUseCase.Params): TranslatePageUseCase.Return {\n const result = await this.decoratee.execute(params);\n if (result.isFail()) {\n return result;\n }\n\n const page = result.value;\n const sourceLanguage = await this.resolveSourceLanguage(page);\n\n const translations = await this.translate(page, sourceLanguage, params.languageCode);\n if (!translations) {\n return Result.ok(page);\n }\n\n const updateData = await this.buildUpdateData(page, translations);\n const updateResult = await this.updatePageRepository.execute(page.id, updateData);\n if (updateResult.isFail()) {\n return Result.ok(page);\n }\n\n return Result.ok(updateResult.value);\n }\n\n private async resolveSourceLanguage(page: WbPage): Promise<string> {\n if (page.properties[\"sourcePage\"]) {\n const sourcePageId = `${page.properties[\"sourcePage\"]}#0001`;\n const sourcePage = await this.getPageById.execute(sourcePageId);\n if (sourcePage.isOk()) {\n return sourcePage.value.properties[\"language\"];\n }\n return page.properties[\"language\"] ?? \"en\";\n }\n\n const result = await this.getDefaultLanguage.execute();\n if (result.isOk()) {\n return result.value.code;\n }\n\n return \"en\";\n }\n\n private async translate(\n page: WbPage,\n sourceLanguage: string,\n targetLanguage: string\n ): Promise<TranslatedData | null> {\n const resolved = await this.resolveCapability.execute(WB_TRANSLATE_PAGE_CAPABILITY);\n if (resolved.isFail()) {\n /*\n * Translation is a decorator on top of a successful page save, so it stays non-fatal:\n * the page is already created, just untranslated. A misconfiguration is logged as a\n * warning, because a silently skipped translation was indistinguishable from a broken\n * one. Switched off is not a problem, so it is only noted.\n */\n if (resolved.error instanceof AiCapabilityDisabledError) {\n this.logger.info(\"AI page translation is switched off; skipping.\");\n return null;\n }\n this.logger.warn({ reason: resolved.error.message }, \"Skipping AI page translation.\");\n return null;\n }\n\n const capability = resolved.value;\n\n const properties = {\n title: page.properties[\"title\"],\n snippet: page.properties[\"snippet\"],\n pathSlug: page.properties[\"title\"]\n };\n const bindings = this.extractBindings(page.bindings);\n const input = JSON.stringify({ properties, bindings });\n\n const result = await this.ai.generateText({\n model: capability.model,\n connection: capability.connection,\n system: withAdditionalInstructions(capability),\n prompt: `Translate given key-value pairs from \"${sourceLanguage}\" to language code \"${targetLanguage}\". Do not modify the keys. \"properties\" is a simple key-value pair. \"bindings\" values are located in the \"value\" key. ${input}`,\n temperature: 0.3\n });\n\n try {\n return LlmJsonResponse.fromRawText(result.text).toJSON<TranslatedData>();\n } catch {\n return null;\n }\n }\n\n private extractBindings(bindings: Record<string, any>): TranslatableBindings {\n const result: TranslatableBindings = {};\n\n for (const elementId in bindings) {\n const element = bindings[elementId];\n const inputs = element.inputs;\n if (!inputs) {\n continue;\n }\n\n for (const inputName in inputs) {\n const input = inputs[inputName];\n if (input.type === \"text\" || input.type === \"longText\") {\n result[`${elementId}.inputs.${inputName}`] = {\n type: input.type,\n value: input.static\n };\n } else if (input.type === \"lexical\" && input.static?.html) {\n result[`${elementId}.inputs.${inputName}`] = {\n type: input.type,\n value: input.static.html\n };\n }\n }\n }\n\n return result;\n }\n\n private slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n }\n\n private async buildUpdateData(\n page: WbPage,\n translations: TranslatedData\n ): Promise<{ properties: Record<string, any>; bindings: Record<string, any> }> {\n const properties: Record<string, any> = { ...page.properties };\n const bindings: Record<string, any> = structuredClone(page.bindings);\n\n const translatedPathSlug = translations.properties[\"pathSlug\"];\n delete translations.properties[\"pathSlug\"];\n\n for (const [key, value] of Object.entries(translations.properties)) {\n properties[key] = value;\n }\n\n if (translatedPathSlug) {\n const slug = this.slugify(translatedPathSlug);\n if (slug) {\n const languageCode = page.properties[\"language\"];\n properties[\"path\"] = `/${languageCode}/${slug}`;\n }\n }\n\n for (const [key, binding] of Object.entries(translations.bindings)) {\n if (binding.type === \"lexical\") {\n const state = await this.lexicalParser.parse(binding.value);\n if (state) {\n set(bindings, `${key}.static.state`, JSON.stringify(state));\n set(bindings, `${key}.static.html`, binding.value);\n }\n } else {\n set(bindings, `${key}.static`, binding.value);\n }\n }\n\n return { properties, bindings };\n }\n}\n\nexport const WbTranslatePageDecorator = TranslatePageUseCase.createDecorator({\n decorator: WbTranslatePageDecoratorImpl,\n dependencies: [\n GetDefaultLanguageUseCase,\n GetPageByIdUseCase,\n ResolveAiCapabilityUseCase,\n Logger,\n Ai,\n LexicalParser,\n UpdatePageRepository\n ]\n});\n"],"names":["WbTranslatePageDecoratorImpl","getDefaultLanguage","getPageById","resolveCapability","logger","ai","lexicalParser","updatePageRepository","decoratee","params","result","page","sourceLanguage","translations","Result","updateData","updateResult","sourcePageId","sourcePage","targetLanguage","resolved","WB_TRANSLATE_PAGE_CAPABILITY","AiCapabilityDisabledError","capability","properties","bindings","input","JSON","withAdditionalInstructions","LlmJsonResponse","elementId","element","inputs","inputName","text","structuredClone","translatedPathSlug","key","value","Object","slug","languageCode","binding","state","set","WbTranslatePageDecorator","TranslatePageUseCase","GetDefaultLanguageUseCase","GetPageByIdUseCase","ResolveAiCapabilityUseCase","Logger","Ai","LexicalParser","UpdatePageRepository"],"mappings":"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"}
1
+ {"version":3,"file":"api/features/WbTranslatePage/WbTranslatePageDecorator.js","sources":["../../../../src/api/features/WbTranslatePage/WbTranslatePageDecorator.ts"],"sourcesContent":["import set from \"lodash/set\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { GetDefaultLanguageUseCase } from \"@webiny/languages/exports/api/languages.js\";\nimport { TranslatePageUseCase } from \"@webiny/api-website-builder/features/pages/TranslatePage/index.js\";\nimport { UpdatePageRepository } from \"@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js\";\nimport type { WbPage } from \"@webiny/api-website-builder/domain/page/abstractions.js\";\nimport { AiCapabilityDisabledError } from \"~/api/features/Capabilities/index.js\";\nimport {\n ResolveAiCapabilityUseCase,\n withAdditionalInstructions\n} from \"~/api/features/Capabilities/index.js\";\nimport { WB_TRANSLATE_PAGE_CAPABILITY } from \"./capability.js\";\nimport { LexicalParser } from \"./abstractions/LexicalParser.js\";\nimport { GetPageByIdUseCase } from \"@webiny/api-website-builder/exports/api/website-builder/page.js\";\nimport { LlmJsonResponse } from \"~/domain/LlmJsonResponse.js\";\n\ntype InputType = \"text\" | \"longText\" | \"lexical\";\n\ninterface TranslatableBinding {\n type: InputType;\n value: string;\n}\n\ntype TranslatableBindings = Record<string, TranslatableBinding>;\n\ninterface TranslatedBindings {\n [key: string]: { type: InputType; value: string };\n}\n\ninterface TranslatedData {\n properties: Record<string, string>;\n bindings: TranslatedBindings;\n}\n\nclass WbTranslatePageDecoratorImpl implements TranslatePageUseCase.Interface {\n constructor(\n private getDefaultLanguage: GetDefaultLanguageUseCase.Interface,\n private getPageById: GetPageByIdUseCase.Interface,\n private resolveCapability: ResolveAiCapabilityUseCase.Interface,\n private logger: Logger.Interface,\n private ai: Ai.Interface,\n private lexicalParser: LexicalParser.Interface,\n private updatePageRepository: UpdatePageRepository.Interface,\n private wcp: WcpContext.Interface,\n private decoratee: TranslatePageUseCase.Interface\n ) {}\n\n async execute(params: TranslatePageUseCase.Params): TranslatePageUseCase.Return {\n const result = await this.decoratee.execute(params);\n if (result.isFail()) {\n return result;\n }\n\n /*\n * Also checked when the feature is registered (see Extension.ts), but that check sees the\n * license only: the project's feature flags are build params, which are registered after\n * extensions. Here both are in place, so `aiPowerups.websiteBuilder.pageTranslation: false`\n * leaves the page as an untranslated copy.\n */\n if (!this.wcp.canUseAiPageTranslation()) {\n return result;\n }\n\n const page = result.value;\n const sourceLanguage = await this.resolveSourceLanguage(page);\n\n const translations = await this.translate(page, sourceLanguage, params.languageCode);\n if (!translations) {\n return Result.ok(page);\n }\n\n const updateData = await this.buildUpdateData(page, translations);\n const updateResult = await this.updatePageRepository.execute(page.id, updateData);\n if (updateResult.isFail()) {\n return Result.ok(page);\n }\n\n return Result.ok(updateResult.value);\n }\n\n private async resolveSourceLanguage(page: WbPage): Promise<string> {\n if (page.properties[\"sourcePage\"]) {\n const sourcePageId = `${page.properties[\"sourcePage\"]}#0001`;\n const sourcePage = await this.getPageById.execute(sourcePageId);\n if (sourcePage.isOk()) {\n return sourcePage.value.properties[\"language\"];\n }\n return page.properties[\"language\"] ?? \"en\";\n }\n\n const result = await this.getDefaultLanguage.execute();\n if (result.isOk()) {\n return result.value.code;\n }\n\n return \"en\";\n }\n\n private async translate(\n page: WbPage,\n sourceLanguage: string,\n targetLanguage: string\n ): Promise<TranslatedData | null> {\n const resolved = await this.resolveCapability.execute(WB_TRANSLATE_PAGE_CAPABILITY);\n if (resolved.isFail()) {\n /*\n * Translation is a decorator on top of a successful page save, so it stays non-fatal:\n * the page is already created, just untranslated. A misconfiguration is logged as a\n * warning, because a silently skipped translation was indistinguishable from a broken\n * one. Switched off is not a problem, so it is only noted.\n */\n if (resolved.error instanceof AiCapabilityDisabledError) {\n this.logger.info(\"AI page translation is switched off; skipping.\");\n return null;\n }\n this.logger.warn({ reason: resolved.error.message }, \"Skipping AI page translation.\");\n return null;\n }\n\n const capability = resolved.value;\n\n const properties = {\n title: page.properties[\"title\"],\n snippet: page.properties[\"snippet\"],\n pathSlug: page.properties[\"title\"]\n };\n const bindings = this.extractBindings(page.bindings);\n const input = JSON.stringify({ properties, bindings });\n\n const result = await this.ai.generateText({\n model: capability.model,\n connection: capability.connection,\n system: withAdditionalInstructions(capability),\n prompt: `Translate given key-value pairs from \"${sourceLanguage}\" to language code \"${targetLanguage}\". Do not modify the keys. \"properties\" is a simple key-value pair. \"bindings\" values are located in the \"value\" key. ${input}`,\n temperature: 0.3\n });\n\n try {\n return LlmJsonResponse.fromRawText(result.text).toJSON<TranslatedData>();\n } catch {\n return null;\n }\n }\n\n private extractBindings(bindings: Record<string, any>): TranslatableBindings {\n const result: TranslatableBindings = {};\n\n for (const elementId in bindings) {\n const element = bindings[elementId];\n const inputs = element.inputs;\n if (!inputs) {\n continue;\n }\n\n for (const inputName in inputs) {\n const input = inputs[inputName];\n if (input.type === \"text\" || input.type === \"longText\") {\n result[`${elementId}.inputs.${inputName}`] = {\n type: input.type,\n value: input.static\n };\n } else if (input.type === \"lexical\" && input.static?.html) {\n result[`${elementId}.inputs.${inputName}`] = {\n type: input.type,\n value: input.static.html\n };\n }\n }\n }\n\n return result;\n }\n\n private slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n }\n\n private async buildUpdateData(\n page: WbPage,\n translations: TranslatedData\n ): Promise<{ properties: Record<string, any>; bindings: Record<string, any> }> {\n const properties: Record<string, any> = { ...page.properties };\n const bindings: Record<string, any> = structuredClone(page.bindings);\n\n const translatedPathSlug = translations.properties[\"pathSlug\"];\n delete translations.properties[\"pathSlug\"];\n\n for (const [key, value] of Object.entries(translations.properties)) {\n properties[key] = value;\n }\n\n if (translatedPathSlug) {\n const slug = this.slugify(translatedPathSlug);\n if (slug) {\n const languageCode = page.properties[\"language\"];\n properties[\"path\"] = `/${languageCode}/${slug}`;\n }\n }\n\n for (const [key, binding] of Object.entries(translations.bindings)) {\n if (binding.type === \"lexical\") {\n const state = await this.lexicalParser.parse(binding.value);\n if (state) {\n set(bindings, `${key}.static.state`, JSON.stringify(state));\n set(bindings, `${key}.static.html`, binding.value);\n }\n } else {\n set(bindings, `${key}.static`, binding.value);\n }\n }\n\n return { properties, bindings };\n }\n}\n\nexport const WbTranslatePageDecorator = TranslatePageUseCase.createDecorator({\n decorator: WbTranslatePageDecoratorImpl,\n dependencies: [\n GetDefaultLanguageUseCase,\n GetPageByIdUseCase,\n ResolveAiCapabilityUseCase,\n Logger,\n Ai,\n LexicalParser,\n UpdatePageRepository,\n WcpContext\n ]\n});\n"],"names":["WbTranslatePageDecoratorImpl","getDefaultLanguage","getPageById","resolveCapability","logger","ai","lexicalParser","updatePageRepository","wcp","decoratee","params","result","page","sourceLanguage","translations","Result","updateData","updateResult","sourcePageId","sourcePage","targetLanguage","resolved","WB_TRANSLATE_PAGE_CAPABILITY","AiCapabilityDisabledError","capability","properties","bindings","input","JSON","withAdditionalInstructions","LlmJsonResponse","elementId","element","inputs","inputName","text","structuredClone","translatedPathSlug","key","value","Object","slug","languageCode","binding","state","set","WbTranslatePageDecorator","TranslatePageUseCase","GetDefaultLanguageUseCase","GetPageByIdUseCase","ResolveAiCapabilityUseCase","Logger","Ai","LexicalParser","UpdatePageRepository","WcpContext"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/ai-powerups",
3
- "version": "6.5.0",
3
+ "version": "6.5.1-beta.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -18,42 +18,42 @@
18
18
  "author": "Webiny Ltd.",
19
19
  "license": "Webiny Enterprise",
20
20
  "dependencies": {
21
- "@webiny/admin-ui": "6.5.0",
22
- "@webiny/api-core": "6.5.0",
23
- "@webiny/api-file-manager": "6.5.0",
24
- "@webiny/api-headless-cms": "6.5.0",
25
- "@webiny/api-website-builder": "6.5.0",
26
- "@webiny/api-websockets": "6.5.0",
27
- "@webiny/app": "6.5.0",
28
- "@webiny/app-admin": "6.5.0",
29
- "@webiny/app-headless-cms": "6.5.0",
30
- "@webiny/app-website-builder": "6.5.0",
31
- "@webiny/app-websockets": "6.5.0",
32
- "@webiny/background-tasks": "6.5.0",
21
+ "@webiny/admin-ui": "6.5.1-beta.1",
22
+ "@webiny/api-core": "6.5.1-beta.1",
23
+ "@webiny/api-file-manager": "6.5.1-beta.1",
24
+ "@webiny/api-headless-cms": "6.5.1-beta.1",
25
+ "@webiny/api-website-builder": "6.5.1-beta.1",
26
+ "@webiny/api-websockets": "6.5.1-beta.1",
27
+ "@webiny/app": "6.5.1-beta.1",
28
+ "@webiny/app-admin": "6.5.1-beta.1",
29
+ "@webiny/app-headless-cms": "6.5.1-beta.1",
30
+ "@webiny/app-website-builder": "6.5.1-beta.1",
31
+ "@webiny/app-websockets": "6.5.1-beta.1",
32
+ "@webiny/background-tasks": "6.5.1-beta.1",
33
33
  "@webiny/di": "1.1.0",
34
- "@webiny/feature": "6.5.0",
35
- "@webiny/icons": "6.5.0",
36
- "@webiny/languages": "6.5.0",
37
- "@webiny/lexical-converter": "6.5.0",
38
- "@webiny/project": "6.5.0",
39
- "@webiny/project-aws": "6.5.0",
40
- "@webiny/utils": "6.5.0",
41
- "ai": "7.0.142",
34
+ "@webiny/feature": "6.5.1-beta.1",
35
+ "@webiny/icons": "6.5.1-beta.1",
36
+ "@webiny/languages": "6.5.1-beta.1",
37
+ "@webiny/lexical-converter": "6.5.1-beta.1",
38
+ "@webiny/project": "6.5.1-beta.1",
39
+ "@webiny/project-aws": "6.5.1-beta.1",
40
+ "@webiny/utils": "6.5.1-beta.1",
41
+ "ai": "7.0.153",
42
42
  "front-matter": "4.0.2",
43
- "happy-dom": "21.0.3",
43
+ "happy-dom": "21.0.4",
44
44
  "lodash": "4.18.1",
45
- "mobx": "7.0.6",
45
+ "mobx": "7.1.1",
46
46
  "mobx-react-lite": "5.1.0",
47
47
  "react": "18.3.1",
48
48
  "react-dom": "18.3.1",
49
49
  "zod": "4.6.7"
50
50
  },
51
51
  "devDependencies": {
52
- "@webiny/build-tools": "6.5.0",
53
- "@webiny/handler-aws": "6.5.0",
54
- "@webiny/handler-graphql": "6.5.0",
55
- "@webiny/project-utils": "6.5.0",
56
- "@webiny/wcp": "6.5.0",
52
+ "@webiny/build-tools": "6.5.1-beta.1",
53
+ "@webiny/handler-aws": "6.5.1-beta.1",
54
+ "@webiny/handler-graphql": "6.5.1-beta.1",
55
+ "@webiny/project-utils": "6.5.1-beta.1",
56
+ "@webiny/wcp": "6.5.1-beta.1",
57
57
  "rimraf": "6.1.3",
58
58
  "typescript": "7.0.2",
59
59
  "vitest": "5.0.5"