{"version":3,"file":"annuadvent-ngx-cms-openai-auto-articles.mjs","sources":["../../../projects/ngx-cms/openai-auto-articles/src/interfaces/openai-auto-articles.interface.ts","../../../projects/ngx-cms/openai-auto-articles/src/constants/openai-auto-articles.constants.ts","../../../projects/ngx-cms/openai-auto-articles/src/components/openai-auto-articles/openai-auto-articles.component.ts","../../../projects/ngx-cms/openai-auto-articles/src/components/openai-auto-articles/openai-auto-articles.component.html","../../../projects/ngx-cms/openai-auto-articles/src/constants/ai-articles.constants.ts","../../../projects/ngx-cms/openai-auto-articles/src/services/ai-articles.service.ts","../../../projects/ngx-cms/openai-auto-articles/src/components/ai-articles/ai-articles.component.ts","../../../projects/ngx-cms/openai-auto-articles/src/components/ai-articles/ai-articles.component.html","../../../projects/ngx-cms/openai-auto-articles/src/openai-auto-articles.module.ts","../../../projects/ngx-cms/openai-auto-articles/src/interfaces/ai-articles.interface.ts","../../../projects/ngx-cms/openai-auto-articles/annuadvent-ngx-cms-openai-auto-articles.ts"],"sourcesContent":["import { OpenaiPrompt } from '@annuadvent/ngx-tools/openai';\r\n\r\nexport interface OpenaiPromptQueueItem {\r\n  name: string;\r\n  prompt: OpenaiPrompt;\r\n  status: OpenaiPromptQueueItemStatus;\r\n  timeTaken: number;\r\n  heading?: string;\r\n}\r\n\r\nexport interface OpenaiArticleQueueItem {\r\n  name: string;\r\n  openaiPromptQueue: Array<OpenaiPromptQueueItem>;\r\n  promptQueueItemToAdd: OpenaiPromptQueueItem;\r\n  saveStatus?: boolean;\r\n  imagePromptText?: string;\r\n}\r\n\r\nexport enum OpenaiPromptQueueItemStatus {\r\n  notstarted = 'notstarted',\r\n  inprogress = 'inprogress',\r\n  failed = 'failed',\r\n  completed = 'completed',\r\n}\r\n\r\nexport interface OpenaiPromptQueueBatch {\r\n  promptQueueItems: Array<OpenaiPromptQueueItem>;\r\n  batchIndices: Array<number>;\r\n}\r\n","import {\r\n    OpenaiPrompt,\r\n    OpenaiPromptTypeEnum,\r\n} from '@annuadvent/ngx-tools/openai';\r\nimport { OpenaiPromptQueueItem, OpenaiPromptQueueItemStatus } from '../interfaces/openai-auto-articles.interface';\r\n\r\nexport const EMPTY_PROMPT_QUEUE_ITEM: OpenaiPromptQueueItem = {\r\n    name: '',\r\n    prompt: {\r\n        prompt: '',\r\n        message: {\r\n            mdText: '',\r\n            htmlText: '',\r\n            jsonText: ''\r\n        },\r\n        promptType: OpenaiPromptTypeEnum.content\r\n    } as OpenaiPrompt,\r\n    status: OpenaiPromptQueueItemStatus.notstarted,\r\n    timeTaken: 0,\r\n    heading: '',\r\n};\r\n\r\nexport const DESCRIPTION_PROMPT_NAME = 'description';\r\nexport const KEYWORDS_PROMPT_NAME = 'keywords';\r\nexport const SUBTOPICS_PROMPT_NAME = 'subtopics';\r\nexport const QUESTIONS_PROMPT_NAME = 'questions';\r\n\r\nexport const DESCRIPTION_PROMPT_PREFIX = 'Write a good description for';\r\nexport const KEYWORDS_PROMPT_PREFIX = 'List good keywords or subtopics for';\r\nexport const SUBTOPICS_PROMPT_PREFIX = 'List 2 good closely related subtopics for';\r\nexport const QUESTIONS_PROMPT_PREFIX = 'List 2 good related questions for';\r\n\r\n\r\nexport const OPENAI_MAX_REQUEST_COUNT = 3;\r\nexport const OPENAI_MAX_REQUEST_DELAY = 65000;\r\nexport const OPENAI_FAILED_REQUEST_DELAY = 25000;\r\n\r\nexport const PROMPTS_SEPARATOR = '|||';\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { UtilsService } from '@annuadvent/ngx-core/utils';\r\nimport { ArticleEditorService } from '@annuadvent/ngx-cms/article-editor';\r\nimport { Html2JsonService } from '@annuadvent/ngx-cms/content-editor';\r\nimport {\r\n  OpenaiService,\r\n  OpenaiPrompt,\r\n  OpenaiPromptTypeEnum,\r\n  OpenaiImageSize,\r\n  OpenaiConfigService,\r\n  OpenaiConfig,\r\n  OpenaiConfiguration,\r\n} from '@annuadvent/ngx-tools/openai';\r\nimport {\r\n  OpenaiPromptQueueItem,\r\n  OpenaiPromptQueueItemStatus,\r\n  OpenaiArticleQueueItem,\r\n  OpenaiPromptQueueBatch,\r\n} from '../../interfaces/openai-auto-articles.interface';\r\nimport {\r\n  DESCRIPTION_PROMPT_NAME,\r\n  EMPTY_PROMPT_QUEUE_ITEM,\r\n  KEYWORDS_PROMPT_NAME,\r\n  DESCRIPTION_PROMPT_PREFIX,\r\n  KEYWORDS_PROMPT_PREFIX,\r\n  OPENAI_MAX_REQUEST_COUNT,\r\n  OPENAI_MAX_REQUEST_DELAY,\r\n  OPENAI_FAILED_REQUEST_DELAY,\r\n  SUBTOPICS_PROMPT_PREFIX,\r\n  SUBTOPICS_PROMPT_NAME,\r\n  QUESTIONS_PROMPT_PREFIX,\r\n  QUESTIONS_PROMPT_NAME,\r\n  PROMPTS_SEPARATOR,\r\n} from '../../constants/openai-auto-articles.constants';\r\nimport { Article } from '@annuadvent/ngx-cms/article';\r\nimport { AppConfig, AppConfigService } from '@annuadvent/ngx-core/app-config';\r\nimport { FireArticlesHttpService } from '@annuadvent/ngx-tools/fire-cms';\r\nimport { EditorElement } from '@annuadvent/ngx-cms/content-editor';\r\nimport { FireStorageImageService } from '@annuadvent/ngx-tools/fire-storage';\r\nimport { FireAuthService } from '@annuadvent/ngx-tools/fire-auth';\r\n\r\n@Component({\r\n  selector: 'anu-openai-auto-articles',\r\n  templateUrl: './openai-auto-articles.component.html',\r\n  styleUrls: ['./openai-auto-articles.component.scss'],\r\n})\r\nexport class OpenaiAutoArticlesComponent implements OnInit {\r\n  @Input() openaiArticleQueue: Array<OpenaiArticleQueueItem> = [];\r\n  @Input() openaiPromptQueueIndex: number = 0; // inprogress prompt index\r\n  @Input() openaiArticleQueueIndex: number = 0; // inprogress article index\r\n\r\n  errorMsg: Array<string> = [];\r\n  isQueuePaused: boolean = true;\r\n  isQueueStarted: boolean = false;\r\n  isQueueFinished: boolean = false;\r\n  promptQueueBatchJustBeforePause: OpenaiPromptQueueBatch = null;\r\n  historyPrompts: Array<OpenaiPrompt> = [];\r\n\r\n  //Bulk articles modal\r\n  bulkArticlesPromptsText: string = '';\r\n  toggleBulkArticlesModal: boolean = false;\r\n\r\n  //Openai Config Modal\r\n  toggleOpenaiConfigModal: boolean = false;\r\n\r\n  //Timers\r\n  expectedTotalTime: number = 0;\r\n  ellapsedTime: number = 0;\r\n  queueInterval: any = null;\r\n  batchStartTime: number = 0;\r\n\r\n  // resultPreview of queue items\r\n  currentMdText: string = '';\r\n  currentMdConvertedText: string = '';\r\n\r\n  constructor(\r\n    private utilsService: UtilsService,\r\n    private aeService: ArticleEditorService,\r\n    private openaiService: OpenaiService,\r\n    public html2json: Html2JsonService,\r\n    private fireArticlesHttpService: FireArticlesHttpService,\r\n    private fireStorageImageService: FireStorageImageService,\r\n    private fireAuthService: FireAuthService,\r\n    private appConfigService: AppConfigService,\r\n    private openaiConfigService: OpenaiConfigService,\r\n  ) {\r\n    this.openaiConfigService.config.subscribe((config: OpenaiConfiguration) => {\r\n      const openaiConfig: OpenaiConfig = {\r\n        apiKey: config?.apiKey?.value || '',\r\n        organization: config?.headers?.value['OpenAI-Organization'].value || ''\r\n      }\r\n\r\n      openaiConfig?.apiKey && this.openaiService.initOpenai(openaiConfig);\r\n    })\r\n  }\r\n\r\n  public ngOnInit(): void {\r\n    this.openaiConfigService.initOpenai((this.appConfigService.openai as OpenaiConfig).apiKey, (this.appConfigService.openai as OpenaiConfig).organization);\r\n  }\r\n\r\n  public startTimer(): void {\r\n    this.stopTimer();\r\n    this.queueInterval = setInterval(() => {\r\n      this.ellapsedTime++;\r\n    }, 1000);\r\n  }\r\n\r\n  public stopTimer(): void {\r\n    clearInterval(this.queueInterval);\r\n  }\r\n\r\n  public pauseQueue(): void {\r\n    this.isQueuePaused = true;\r\n    this.stopTimer();\r\n  }\r\n\r\n  public startQueue(): void {\r\n    this.isQueuePaused = false;\r\n    this.isQueueStarted = true;\r\n    this.isQueueFinished = false;\r\n    this.startTimer();\r\n    this.processQueue(null);\r\n  }\r\n\r\n  public stopQueue(): void {\r\n    this.isQueuePaused = false;\r\n    this.isQueueStarted = true;\r\n    this.isQueueFinished = true;\r\n    this.stopTimer();\r\n  }\r\n\r\n  public togglePauseQueue(): void {\r\n    if (this.isQueuePaused) {\r\n      this.startQueue();\r\n    } else {\r\n      this.pauseQueue();\r\n    }\r\n  }\r\n\r\n  public onBulkArticlesClick(): void {\r\n    this.toggleBulkArticlesModal = true;\r\n  }\r\n\r\n  public onGenerateBulkArticleQueues(): void {\r\n    this.toggleBulkArticlesModal = false;\r\n    if (!this.bulkArticlesPromptsText.trim()) return;\r\n\r\n    const promptTexts = this.bulkArticlesPromptsText.split(PROMPTS_SEPARATOR);\r\n    promptTexts.forEach((pmtText) => {\r\n      pmtText = pmtText.trim();\r\n      const prompt: OpenaiPrompt = {\r\n        prompt: pmtText,\r\n        promptType: OpenaiPromptTypeEnum.content,\r\n        message: { mdText: '', htmlText: '', jsonText: '' },\r\n      };\r\n\r\n      // Create a new articleQueue item and add its first prompts.\r\n      pmtText && this.addToArticleQueue(prompt);\r\n    });\r\n\r\n    // resets the bulk prompt text\r\n    this.bulkArticlesPromptsText = '';\r\n  }\r\n\r\n  public onNewPrompt(prompts: Array<OpenaiPrompt>): void {\r\n    const prompt =\r\n      (prompts && prompts.length && prompts[prompts.length - 1]) || null;\r\n    if (!prompt) return;\r\n\r\n    // Create a new articleQueue item and add its first prompts.\r\n    this.addToArticleQueue(prompt);\r\n  }\r\n\r\n  public createOpenaiPromptQueueItem(\r\n    prompt: OpenaiPrompt,\r\n    promptType: OpenaiPromptTypeEnum = OpenaiPromptTypeEnum.content\r\n  ): OpenaiPromptQueueItem {\r\n    if (!prompt) return null;\r\n\r\n    const promptQueueItem: OpenaiPromptQueueItem = {\r\n      name: prompt.prompt,\r\n      prompt: this.utilsService.deepCopy(prompt),\r\n      status: OpenaiPromptQueueItemStatus.notstarted,\r\n      timeTaken: 0,\r\n      heading: prompt.prompt,\r\n    };\r\n\r\n    switch (promptType) {\r\n      case OpenaiPromptTypeEnum.description:\r\n        promptQueueItem.name = DESCRIPTION_PROMPT_NAME;\r\n        promptQueueItem.prompt.promptType = OpenaiPromptTypeEnum.description;\r\n        promptQueueItem.prompt.prompt = `${DESCRIPTION_PROMPT_PREFIX} ${promptQueueItem.prompt.prompt}`;\r\n        promptQueueItem.heading = DESCRIPTION_PROMPT_NAME;\r\n\r\n        break;\r\n      case OpenaiPromptTypeEnum.keywords:\r\n        promptQueueItem.name = KEYWORDS_PROMPT_NAME;\r\n        promptQueueItem.prompt.promptType = OpenaiPromptTypeEnum.keywords;\r\n        promptQueueItem.prompt.prompt = `${KEYWORDS_PROMPT_PREFIX} ${promptQueueItem.prompt.prompt}`;\r\n        promptQueueItem.heading = KEYWORDS_PROMPT_NAME;\r\n        break;\r\n      case OpenaiPromptTypeEnum.subtopics:\r\n        promptQueueItem.name = SUBTOPICS_PROMPT_NAME;\r\n        promptQueueItem.prompt.promptType = OpenaiPromptTypeEnum.subtopics;\r\n        promptQueueItem.prompt.prompt = `${SUBTOPICS_PROMPT_PREFIX} ${promptQueueItem.prompt.prompt}`;\r\n        promptQueueItem.heading = SUBTOPICS_PROMPT_NAME;\r\n        break;\r\n      case OpenaiPromptTypeEnum.questions:\r\n        promptQueueItem.name = QUESTIONS_PROMPT_NAME;\r\n        promptQueueItem.prompt.promptType = OpenaiPromptTypeEnum.questions;\r\n        promptQueueItem.prompt.prompt = `${QUESTIONS_PROMPT_PREFIX} ${promptQueueItem.prompt.prompt}`;\r\n        promptQueueItem.heading = QUESTIONS_PROMPT_NAME;\r\n        break;\r\n      default:\r\n        promptQueueItem.prompt.promptType = OpenaiPromptTypeEnum.content;\r\n    }\r\n\r\n    return promptQueueItem;\r\n  }\r\n\r\n  public addToArticleQueue(prompt: OpenaiPrompt): void {\r\n    if (!prompt) return;\r\n    // Article's first prompt\r\n    const promptQueueItem = this.createOpenaiPromptQueueItem(prompt);\r\n\r\n    // Article's (subtopics prompt)\r\n    const subtopicsPromptQueueItem = this.createOpenaiPromptQueueItem(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.subtopics\r\n    );\r\n\r\n    // Article's (questions prompt)\r\n    const questionsPromptQueueItem = this.createOpenaiPromptQueueItem(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.questions\r\n    );\r\n\r\n    // Article's (description prompt)\r\n    const descriptionPromptQueueItem = this.createOpenaiPromptQueueItem(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.description\r\n    );\r\n\r\n    // Article's (keywords prompt)\r\n    const keywordsPromptQueueItem = this.createOpenaiPromptQueueItem(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.keywords\r\n    );\r\n\r\n    const openaiArticleQueueItem: OpenaiArticleQueueItem = {\r\n      name: prompt.prompt,\r\n      openaiPromptQueue: [\r\n        promptQueueItem,\r\n        subtopicsPromptQueueItem,\r\n        questionsPromptQueueItem,\r\n        keywordsPromptQueueItem,\r\n        descriptionPromptQueueItem,\r\n      ],\r\n      promptQueueItemToAdd: this.utilsService.deepCopy(EMPTY_PROMPT_QUEUE_ITEM),\r\n      imagePromptText: prompt.prompt,\r\n      saveStatus: true,\r\n    };\r\n\r\n    this.openaiArticleQueue.push(openaiArticleQueueItem);\r\n  }\r\n\r\n  public removePromptFromQueue(artQindex, pmtQindex): void {\r\n    this.openaiArticleQueue[artQindex].openaiPromptQueue.splice(pmtQindex, 1);\r\n  }\r\n\r\n  public showQueueItemResultModal(artQindex, pmtQindex): void {\r\n    this.currentMdText = this.openaiArticleQueue[artQindex].openaiPromptQueue[pmtQindex].prompt?.message?.mdText || '';\r\n    this.currentMdConvertedText = this.currentMdText;\r\n  }\r\n\r\n  public addPromptToArticleQueue(artQindex): void {\r\n    const articleQItem = this.openaiArticleQueue[artQindex];\r\n    const promptText = articleQItem.promptQueueItemToAdd?.prompt?.prompt || '';\r\n\r\n    if (!promptText.trim()) return;\r\n\r\n    const newPromptQItem: OpenaiPromptQueueItem = this.utilsService.deepCopy(\r\n      articleQItem.promptQueueItemToAdd\r\n    );\r\n    newPromptQItem.name = promptText;\r\n    this.openaiArticleQueue[artQindex].openaiPromptQueue.push(newPromptQItem);\r\n\r\n    // reset the item to add\r\n    this.openaiArticleQueue[artQindex].promptQueueItemToAdd =\r\n      this.utilsService.deepCopy(EMPTY_PROMPT_QUEUE_ITEM);\r\n  }\r\n\r\n  public processQueue(promptQueueBatch: OpenaiPromptQueueBatch): void {\r\n    this.batchStartTime = Date.now();\r\n\r\n    if (this.isQueuePaused) {\r\n      // cache previous pending batch, as Queue is paused.\r\n      if (promptQueueBatch)\r\n        this.promptQueueBatchJustBeforePause = promptQueueBatch;\r\n      return;\r\n    } else {\r\n      if (!promptQueueBatch) {\r\n        // Resume from where it was paused\r\n        promptQueueBatch = this.utilsService.deepCopy(\r\n          this.promptQueueBatchJustBeforePause\r\n        );\r\n        this.promptQueueBatchJustBeforePause = null;\r\n      }\r\n    }\r\n\r\n    // If this is a not a failed call to processQueue(), then create a batch.\r\n    if (!promptQueueBatch) {\r\n      promptQueueBatch = this.createBatchOfPromptQueueItems();\r\n    }\r\n    const { promptQueueItems, batchIndices } = promptQueueBatch;\r\n\r\n    // Increment current openaiPromptQueueIndex, with last item being in progress\r\n    this.updateOpenaiPromptQueueIndex(batchIndices);\r\n\r\n    // Set status as inprogress of the batch\r\n    this.updatePromptQueueBatchStatus(\r\n      this.openaiArticleQueueIndex,\r\n      batchIndices,\r\n      OpenaiPromptQueueItemStatus.inprogress\r\n    );\r\n\r\n    //Create the prompt promises for the batch\r\n    const batchPromises = promptQueueItems.map((item) =>\r\n      this.openaiService.getChatResponse([item.prompt.prompt])\r\n    );\r\n\r\n    // Wait for success/failure and process results\r\n    Promise.allSettled(batchPromises).then((results) => {\r\n      const faileditemsIndices: Array<number> = [];\r\n      const faileditems: Array<OpenaiPromptQueueItem> = [];\r\n\r\n      results.forEach((item, index) => {\r\n        const pmtQItem =\r\n          this.openaiArticleQueue[this.openaiArticleQueueIndex]\r\n            .openaiPromptQueue[batchIndices[index]];\r\n        if (item.status === 'fulfilled') {\r\n          // Write result back to original promptQueue, on successful prompt\r\n          pmtQItem.prompt.message.mdText = item.value;\r\n          pmtQItem.status = OpenaiPromptQueueItemStatus.completed;\r\n          pmtQItem.timeTaken = Date.now() - this.batchStartTime;\r\n        } else {\r\n          // On Prompt Failure, set status and processQueue agin with failed prompts after a delay.\r\n          pmtQItem.status = OpenaiPromptQueueItemStatus.failed;\r\n          pmtQItem.timeTaken = Date.now() - this.batchStartTime;\r\n          faileditems.push(pmtQItem);\r\n          faileditemsIndices.push(batchIndices[index]);\r\n          this.errorMsg.push(\r\n            `<span class=\"error\">Article Queue:</span> ${this.openaiArticleQueueIndex + 1\r\n            } | ${pmtQItem.name} | ${item.reason}`\r\n          );\r\n        }\r\n      });\r\n\r\n      // If there are some failed prompts, then re-attempt, after some time\r\n      if (faileditems.length) {\r\n        this.onPromptQueueBatchFailure({\r\n          promptQueueItems: faileditems,\r\n          batchIndices: faileditemsIndices,\r\n        });\r\n      } else {\r\n        // On success\r\n        this.onPromptQueueBatchSuccess(\r\n          this.openaiArticleQueueIndex,\r\n          batchIndices\r\n        );\r\n\r\n        // Update current Indices and process next batch if available.\r\n        this.processQueueForNextBatch();\r\n      }\r\n    });\r\n  }\r\n\r\n  public createBatchOfPromptQueueItems(): OpenaiPromptQueueBatch {\r\n    const currentPromptQueue: OpenaiArticleQueueItem =\r\n      this.openaiArticleQueue[this.openaiArticleQueueIndex];\r\n    const startIndex = this.openaiPromptQueueIndex;\r\n\r\n    const promptQueueItems = currentPromptQueue.openaiPromptQueue.slice(\r\n      startIndex,\r\n      startIndex + OPENAI_MAX_REQUEST_COUNT\r\n    );\r\n\r\n    const batchIndices = promptQueueItems.map(\r\n      (item, index) => startIndex + index\r\n    );\r\n\r\n    // Increment current openaiPromptQueueIndex, with last item being in progress\r\n    this.updateOpenaiPromptQueueIndex(batchIndices);\r\n\r\n    return { promptQueueItems, batchIndices };\r\n  }\r\n\r\n  public updateOpenaiPromptQueueIndex(batchIndices: Array<number>): void {\r\n    // Increment current openaiPromptQueueIndex, with last item being in progress\r\n    if (this.openaiPromptQueueIndex <= batchIndices[batchIndices.length - 1]) {\r\n      this.openaiPromptQueueIndex = batchIndices[batchIndices.length - 1] + 1;\r\n    }\r\n  }\r\n\r\n  public onPromptQueueBatchSuccess(\r\n    articleQueueIndex: number,\r\n    batchIndices: Array<number>\r\n  ): void {\r\n    // Update article\r\n    this.updateArticlePromptQueue(articleQueueIndex, batchIndices);\r\n  }\r\n\r\n  public onPromptQueueBatchFailure(failedBatch: OpenaiPromptQueueBatch): void {\r\n    this.utilsService\r\n      .delay(OPENAI_FAILED_REQUEST_DELAY)\r\n      .then(() => this.processQueue(failedBatch));\r\n  }\r\n\r\n  public updateArticlePromptQueue(\r\n    articleQueueIndex: number,\r\n    batchIndices: Array<number>\r\n  ) {\r\n    batchIndices.forEach((itemIndex) => {\r\n      const promptQueueItem =\r\n        this.openaiArticleQueue[articleQueueIndex].openaiPromptQueue[itemIndex];\r\n      const jsonEl = this.html2json.md2json(promptQueueItem.prompt.message.mdText);\r\n      switch (promptQueueItem.prompt.promptType) {\r\n        case OpenaiPromptTypeEnum.questions:\r\n          this.generatePromptQueueItemsFromKeywords(jsonEl);\r\n          break;\r\n        case OpenaiPromptTypeEnum.subtopics:\r\n          this.generatePromptQueueItemsFromKeywords(jsonEl);\r\n          break;\r\n        case OpenaiPromptTypeEnum.keywords:\r\n          break;\r\n        case OpenaiPromptTypeEnum.description:\r\n          break;\r\n        default:\r\n      }\r\n    });\r\n  }\r\n\r\n  public generatePromptQueueItemsFromKeywords(jsonEl: EditorElement) {\r\n    const keywords = this.aeService.readKeywordsFromEditorElement(jsonEl);\r\n    keywords.forEach((keyword) => {\r\n      const pmtQItem: OpenaiPromptQueueItem = this.utilsService.deepCopy(\r\n        EMPTY_PROMPT_QUEUE_ITEM\r\n      );\r\n      pmtQItem.name = keyword;\r\n      pmtQItem.prompt.prompt = keyword;\r\n      pmtQItem.prompt.promptType = OpenaiPromptTypeEnum.content;\r\n      pmtQItem.status = OpenaiPromptQueueItemStatus.notstarted;\r\n      this.openaiArticleQueue[\r\n        this.openaiArticleQueueIndex\r\n      ].openaiPromptQueue.push(pmtQItem);\r\n    });\r\n  }\r\n\r\n  public updatePromptQueueBatchStatus(\r\n    articleQueueIndex: number,\r\n    batchIndices: Array<number>,\r\n    status: OpenaiPromptQueueItemStatus\r\n  ) {\r\n    // Set status\r\n    const currentPromptQueue: OpenaiArticleQueueItem =\r\n      this.openaiArticleQueue[articleQueueIndex];\r\n    batchIndices.forEach(\r\n      (itemIndex) =>\r\n        (currentPromptQueue.openaiPromptQueue[itemIndex].status = status)\r\n    );\r\n  }\r\n\r\n  public processQueueForNextBatch(): void {\r\n    // if NOT end of both artQ and pmtQ is reached, process further\r\n    const articleQueueCount = this.openaiArticleQueue.length;\r\n    const promptQueueCount =\r\n      this.openaiArticleQueue[this.openaiArticleQueueIndex].openaiPromptQueue\r\n        .length;\r\n    const isEndOfAllQueues =\r\n      this.openaiArticleQueueIndex >= articleQueueCount - 1 &&\r\n      this.openaiPromptQueueIndex >= promptQueueCount - 1;\r\n\r\n    if (isEndOfAllQueues) {\r\n      this.stopQueue();\r\n      this.saveArticle(this.openaiArticleQueueIndex);\r\n      return;\r\n    }\r\n\r\n    if (this.openaiPromptQueueIndex >= promptQueueCount - 1) {\r\n      // As current article Q is Finished, let's save the article to firebase.\r\n      this.saveArticle(this.openaiArticleQueueIndex);\r\n      this.openaiArticleQueueIndex++;\r\n      this.openaiPromptQueueIndex = 0;\r\n    }\r\n\r\n    const timeToWaitForNextBatch =\r\n      OPENAI_MAX_REQUEST_DELAY - (Date.now() - this.batchStartTime);\r\n    if (timeToWaitForNextBatch > 0) {\r\n      this.utilsService.delay(timeToWaitForNextBatch).then(() => {\r\n        this.processQueue(null);\r\n      });\r\n    } else {\r\n      this.processQueue(null);\r\n    }\r\n  }\r\n\r\n  public saveArticle(artQIndex: number) {\r\n    const artQItem = this.openaiArticleQueue[artQIndex];\r\n    if (artQItem.saveStatus === true) return;\r\n\r\n    const article: Article = this.aeService.createInitializedArticle(\r\n      artQItem.name,\r\n    );\r\n\r\n    artQItem.openaiPromptQueue.forEach((item, index) => {\r\n      const jsonEl = this.aeService.cleanAndFormatEditorEl(\r\n        this.html2json.md2json(item.prompt.message.mdText),\r\n      );\r\n      if (jsonEl) {\r\n        if (index === 0) {\r\n          article.body = jsonEl;\r\n        } else {\r\n          switch (item.prompt.promptType) {\r\n            case OpenaiPromptTypeEnum.keywords:\r\n              article.metaInfo.keywords = this.aeService\r\n                .readKeywordsFromEditorElement(jsonEl)\r\n                .join(', ');\r\n              article.metaInfo['article:tag'] = article.metaInfo.keywords;\r\n              break;\r\n            case OpenaiPromptTypeEnum.description:\r\n              article.metaInfo.description =\r\n                this.aeService.readDescriptionFromEditorElement(jsonEl);\r\n              break;\r\n            case OpenaiPromptTypeEnum.questions:\r\n              break;\r\n            case OpenaiPromptTypeEnum.subtopics:\r\n              break;\r\n            default:\r\n              article.body.children = [].concat(\r\n                article.body.children,\r\n                this.aeService.generateArticleSubheading(item.heading),\r\n                jsonEl.children\r\n              );\r\n          }\r\n        }\r\n      }\r\n    });\r\n\r\n    this.generateAndSaveArticleImage(\r\n      article.id,\r\n      artQItem.imagePromptText,\r\n      artQIndex\r\n    ).then((imgUrl) => {\r\n      article.image.src = imgUrl;\r\n      article.metaInfo.image = imgUrl;\r\n\r\n      // Save article to firebase\r\n      this.fireArticlesHttpService\r\n        .addArticle(article)\r\n        .then((art) => {\r\n          artQItem.saveStatus = true;\r\n          this.errorMsg.push(\r\n            `Article (${artQIndex + 1}) Saved: ${artQItem.name} id: ${art.id}`\r\n          );\r\n        })\r\n        .catch((err) => {\r\n          artQItem.saveStatus = false;\r\n          this.errorMsg.push(\r\n            `<span class=\"error\">Error Saving Article (${artQIndex + 1\r\n            }):</span>: ${artQItem.name} | ${err.message}`\r\n          );\r\n        });\r\n    });\r\n  }\r\n\r\n  public async generateAndSaveArticleImage(\r\n    articleId: string,\r\n    articleTitle: string,\r\n    artQIndex: number\r\n  ): Promise<string> {\r\n    let base64Image: string = '';\r\n\r\n    try {\r\n      const base64Images = await this.openaiService.getImagetResponse(\r\n        articleTitle,\r\n        1,\r\n        OpenaiImageSize._1024x1024\r\n      );\r\n      base64Image = base64Images.length && base64Images[0];\r\n      this.errorMsg.push(\r\n        `<span class=\"success\">Generated Article ${artQIndex + 1} Image </span>`\r\n      );\r\n    } catch (err) {\r\n      this.errorMsg.push(\r\n        `<span class=\"error\">Error generating Article ${artQIndex + 1\r\n        } Image </span>| ${err.message}`\r\n      );\r\n\r\n      return '';\r\n    }\r\n\r\n    try {\r\n      const imageFileInfo = await this.fireStorageImageService.uploadImage(\r\n        `${articleId}.jpg`,\r\n        base64Image,\r\n        true,\r\n        this.fireAuthService.getCurrentUserId(),\r\n        true\r\n      );\r\n      this.errorMsg.push(\r\n        `<span class=\"success\">Uploaded Article ${artQIndex + 1} Image </span>`\r\n      );\r\n      return this.aeService.generateArticleImageUrl(imageFileInfo.fullPath);\r\n    } catch (err) {\r\n      this.errorMsg.push(\r\n        `<span class=\"error\">Error Saving Article ${artQIndex + 1\r\n        } Image </span>| ${err.message}`\r\n      );\r\n\r\n      return '';\r\n    }\r\n  }\r\n}\r\n","<div class=\"row right\">\r\n  <a\r\n    class=\"primary\"\r\n    href=\"javascript:void(0)\"\r\n    (click)=\"toggleOpenaiConfigModal = true\"\r\n    >Settings</a\r\n  >\r\n  <span class=\"spacing-h\">|</span>\r\n  <a class=\"primary\" href=\"javascript:void(0)\" (click)=\"onBulkArticlesClick()\"\r\n    >Bulk Articles</a\r\n  >\r\n</div>\r\n<div class=\"row\">\r\n  <anu-openai-form\r\n    class=\"container\"\r\n    [prompts]=\"historyPrompts\"\r\n    [selectedPromptText]=\"\"\r\n    [showHistory]=\"false\"\r\n    [showPrompts]=\"false\"\r\n    (goClicked)=\"onNewPrompt($event)\"\r\n  >\r\n  </anu-openai-form>\r\n</div>\r\n\r\n<anu-collapsible\r\n  *ngIf=\"errorMsg.length\"\r\n  [collapsed]=\"false\"\r\n  class=\"col-12 spacing-around-v\"\r\n  [hamBurgerClassNames]=\"['size-sm']\"\r\n  [isDropdownStyle]=\"true\"\r\n>\r\n  <anu-collapsible-header> Queue Messagees </anu-collapsible-header>\r\n  <anu-collapsible-content class=\"row\">\r\n    <ol>\r\n      <li *ngFor=\"let msg of errorMsg\" [innerHTML]=\"msg\"></li>\r\n    </ol>\r\n  </anu-collapsible-content>\r\n</anu-collapsible>\r\n\r\n<div *ngIf=\"openaiArticleQueue.length\" class=\"row\">\r\n  <div class=\"col-6\">\r\n    <strong>\r\n      {{ (ellapsedTime / 60).toFixed(2) }}mins <br />\r\n      <span *ngIf=\"!isQueueFinished && !isQueuePaused\"\r\n        >Writing article {{ openaiArticleQueueIndex + 1 }} ...</span\r\n      >\r\n    </strong>\r\n  </div>\r\n  <div class=\"col-6 right\">\r\n    <a\r\n      *ngIf=\"!isQueueFinished\"\r\n      class=\"btn primary\"\r\n      href=\"javascript:void(0)\"\r\n      (click)=\"togglePauseQueue()\"\r\n      >{{ isQueuePaused ? \"Start Queue\" : \"Pause Queue\" }}</a\r\n    >\r\n  </div>\r\n</div>\r\n<!-- Articles Queue -->\r\n<ol class=\"spacing-half container\">\r\n  <li\r\n    class=\"flex-container\"\r\n    *ngFor=\"let artQueue of openaiArticleQueue; let artQindex = index\"\r\n  >\r\n    <anu-collapsible\r\n      [collapsed]=\"false\"\r\n      class=\"col-12\"\r\n      [hamBurgerClassNames]=\"['size-sm']\"\r\n      [isDropdownStyle]=\"true\"\r\n    >\r\n      <anu-collapsible-header>\r\n        <h2>({{ artQindex + 1 }}): {{ artQueue.name }}</h2>\r\n      </anu-collapsible-header>\r\n      <anu-collapsible-content class=\"row queue-table-container\">\r\n        <table class=\"queue queue-table\">\r\n          <thead>\r\n            <tr>\r\n              <th class=\"queue_prompt\">Prompt</th>\r\n              <th class=\"queue_status\">Status</th>\r\n              <th class=\"queue_time-taken\">Time taken(s)</th>\r\n              <th class=\"queue_action\">\r\n                <span *ngIf=\"artQueue.saveStatus\">Saved</span>\r\n                <a\r\n                  *ngIf=\"!artQueue.saveStatus\"\r\n                  class=\"btn secondary\"\r\n                  href=\"javascript:void(0)\"\r\n                  (click)=\"saveArticle(artQindex)\"\r\n                  >Save</a\r\n                >\r\n              </th>\r\n            </tr>\r\n          </thead>\r\n          <tbody>\r\n            <!-- Already added prompt rows -->\r\n            <tr\r\n              *ngFor=\"\r\n                let queueItem of artQueue.openaiPromptQueue;\r\n                let pmtQindex = index\r\n              \"\r\n            >\r\n              <td>\r\n                <small>{{ queueItem.name }}</small>\r\n                <label>Heading</label>\r\n                <input\r\n                  [readonly]=\"queueItem.status !== 'notstarted'\"\r\n                  type=\"text\"\r\n                  [(ngModel)]=\"queueItem.heading\"\r\n                />\r\n                <label>Prompt</label>\r\n                <input\r\n                  [readonly]=\"queueItem.status !== 'notstarted'\"\r\n                  type=\"text\"\r\n                  [(ngModel)]=\"queueItem.prompt.prompt\"\r\n                />\r\n              </td>\r\n              <td\r\n                [ngClass]=\"{\r\n                  error: queueItem.status === 'failed',\r\n                  success: queueItem.status === 'completed',\r\n                  'warning relative': queueItem.status === 'inprogress'\r\n                }\"\r\n              >\r\n                <anu-spinner\r\n                  [show]=\"queueItem.status === 'inprogress'\"\r\n                ></anu-spinner>\r\n                <strong>{{ queueItem.status }}</strong>\r\n              </td>\r\n              <td>{{ queueItem.timeTaken / 1000 }}s</td>\r\n              <td>\r\n                <a\r\n                  *ngIf=\"queueItem.status === 'notstarted'\"\r\n                  class=\"error\"\r\n                  href=\"javascript:void(0)\"\r\n                  (click)=\"removePromptFromQueue(artQindex, pmtQindex)\"\r\n                  >X</a\r\n                >\r\n                <a\r\n                  *ngIf=\"queueItem.status === 'completed'\"\r\n                  class=\"success\"\r\n                  href=\"javascript:void(0)\"\r\n                  (click)=\"showQueueItemResultModal(artQindex, pmtQindex)\"\r\n                  >⛲</a\r\n                >\r\n              </td>\r\n            </tr>\r\n\r\n            <!-- Additional Prompt Addition row -->\r\n            <tr\r\n              *ngIf=\"\r\n                openaiArticleQueueIndex < artQindex ||\r\n                (openaiArticleQueueIndex === artQindex &&\r\n                  openaiPromptQueueIndex < artQueue.openaiPromptQueue.length)\r\n              \"\r\n            >\r\n              <td>\r\n                <small>{{ artQueue.promptQueueItemToAdd.name }}</small>\r\n                <input\r\n                  type=\"text\"\r\n                  [(ngModel)]=\"artQueue.promptQueueItemToAdd.prompt.prompt\"\r\n                />\r\n              </td>\r\n              <td\r\n                [ngClass]=\"{\r\n                  error: artQueue.promptQueueItemToAdd.status === 'failed',\r\n                  success: artQueue.promptQueueItemToAdd.status === 'completed',\r\n                  'warning relative':\r\n                    artQueue.promptQueueItemToAdd.status === 'inprogress'\r\n                }\"\r\n              >\r\n                <anu-spinner\r\n                  [show]=\"artQueue.promptQueueItemToAdd.status === 'inprogress'\"\r\n                ></anu-spinner>\r\n                {{ artQueue.promptQueueItemToAdd.status }}\r\n              </td>\r\n              <td>{{ artQueue.promptQueueItemToAdd.timeTaken }}</td>\r\n              <td>\r\n                <a\r\n                  class=\"primary\"\r\n                  href=\"javascript:void(0)\"\r\n                  (click)=\"addPromptToArticleQueue(artQindex)\"\r\n                  >Add</a\r\n                >\r\n              </td>\r\n            </tr>\r\n\r\n            <!-- Image Prompt Row -->\r\n            <tr>\r\n              <td colspan=\"4\">\r\n                <small>Article's Image Prompt</small>\r\n                <input\r\n                  [readonly]=\"artQindex < openaiArticleQueueIndex\"\r\n                  type=\"text\"\r\n                  [(ngModel)]=\"artQueue.imagePromptText\"\r\n                />\r\n              </td>\r\n            </tr>\r\n          </tbody>\r\n        </table>\r\n      </anu-collapsible-content>\r\n    </anu-collapsible>\r\n  </li>\r\n</ol>\r\n\r\n<anu-modal\r\n  [enableCancel]=\"true\"\r\n  [enableOk]=\"true\"\r\n  [opened]=\"toggleBulkArticlesModal\"\r\n  modalTitle=\"Bulk Articles Prompts\"\r\n  (okClick)=\"onGenerateBulkArticleQueues()\"\r\n  (cancelClick)=\"toggleBulkArticlesModal = false\"\r\n>\r\n  <textarea\r\n    placeholder=\"Article titles separated by 3 pipe symbols |||\"\r\n    [(ngModel)]=\"bulkArticlesPromptsText\"\r\n  ></textarea>\r\n</anu-modal>\r\n\r\n<anu-modal\r\n  [enableCancel]=\"true\"\r\n  [enableOk]=\"false\"\r\n  [opened]=\"toggleOpenaiConfigModal\"\r\n  modalTitle=\"Openai Configuration\"\r\n  (cancelClick)=\"toggleOpenaiConfigModal = false\"\r\n  cancelLabel=\"Go Back\"\r\n>\r\n  <anu-openai-configuration></anu-openai-configuration>\r\n</anu-modal>\r\n\r\n<anu-modal\r\n  [enableCancel]=\"true\"\r\n  [enableOk]=\"false\"\r\n  [opened]=\"!!currentMdText\"\r\n  modalTitle=\"Queue Item Result Preview\"\r\n  (cancelClick)=\"currentMdConvertedText = currentMdText = ''\"\r\n  cancelLabel=\"Go Back\"\r\n>\r\n  <div class=\"row spacing-around-v\">\r\n    <a class=\"btn\" (click)=\"currentMdConvertedText = currentMdText\">Markdown</a>\r\n    <a\r\n      class=\"btn\"\r\n      (click)=\"currentMdConvertedText = html2json.md2jsonText(currentMdText)\"\r\n      >JSON</a\r\n    >\r\n    <a\r\n      class=\"btn\"\r\n      (click)=\"currentMdConvertedText = html2json.md2html(currentMdText)\"\r\n      >HTML</a\r\n    >\r\n  </div>\r\n  <anu-code-block\r\n    [enableEdit]=\"false\"\r\n    [language]=\"'markup'\"\r\n    [source]=\"currentMdConvertedText\"\r\n  >\r\n  </anu-code-block>\r\n</anu-modal>\r\n","export const PROMPTS_SEPARATOR = '|||';\r\n\r\nexport const DESCRIPTION_PROMPT_NAME = 'description';\r\nexport const KEYWORDS_PROMPT_NAME = 'keywords';\r\nexport const SUBTOPICS_PROMPT_NAME = 'subtopics';\r\nexport const QUESTIONS_PROMPT_NAME = 'questions';\r\n\r\nexport const DESCRIPTION_PROMPT_PREFIX = 'Please give meta description for';\r\nexport const KEYWORDS_PROMPT_PREFIX = 'List good meta keywords for';\r\nexport const SUBTOPICS_PROMPT_PREFIX = 'List 2 good closely related subtopic titles only, for';\r\nexport const QUESTIONS_PROMPT_PREFIX = 'List 2 good related questions titles ony, for';\r\n\r\n\r\nexport const AI_MAX_REQUEST_COUNT = 3;\r\nexport const AI_MAX_REQUEST_DELAY = 65;\r\nexport const AI_FAILED_REQUEST_DELAY = 25;\r\n","import { Injectable } from '@angular/core';\r\nimport { Queue } from '@annuadvent/ngx-tools/queue';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class AiArticlesService {\r\n  articlesQ: Queue = new Queue();\r\n\r\n  constructor() { }\r\n}\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { AiArticlesService } from '../../services/ai-articles.service';\r\nimport { UtilsService } from '@annuadvent/ngx-core/utils';\r\nimport { Html2JsonService } from '@annuadvent/ngx-cms/content-editor';\r\nimport { FireArticlesHttpService } from '@annuadvent/ngx-tools/fire-cms';\r\nimport { Queue, QueueItem, QueueStatusEnum } from '@annuadvent/ngx-tools/queue';\r\nimport { OpenaiConfig, OpenaiConfigService, OpenaiConfiguration, OpenaiImageSize, OpenaiPrompt, OpenaiPromptTypeEnum, OpenaiService } from '@annuadvent/ngx-tools/openai';\r\nimport { AI_FAILED_REQUEST_DELAY, AI_MAX_REQUEST_COUNT, AI_MAX_REQUEST_DELAY, DESCRIPTION_PROMPT_NAME, DESCRIPTION_PROMPT_PREFIX, KEYWORDS_PROMPT_NAME, KEYWORDS_PROMPT_PREFIX, PROMPTS_SEPARATOR, QUESTIONS_PROMPT_NAME, QUESTIONS_PROMPT_PREFIX, SUBTOPICS_PROMPT_NAME, SUBTOPICS_PROMPT_PREFIX } from '../../constants/ai-articles.constants';\r\nimport { ArticlePrompt } from '../../interfaces/ai-articles.interface';\r\nimport { Subscription } from 'rxjs';\r\nimport { AppConfigService } from '@annuadvent/ngx-core/app-config';\r\nimport { ArticleEditorService } from '@annuadvent/ngx-cms/article-editor';\r\nimport { Article } from '@annuadvent/ngx-cms/article';\r\nimport { FireStorageImageService, ImageFileInfo } from '@annuadvent/ngx-tools/fire-storage';\r\nimport { FireAuthService } from '@annuadvent/ngx-tools/fire-auth';\r\n/**\r\n * AiArticles Component generates articles using AI apis, It works in a Queue, so that the process can be paused and resumed any time.\r\n * Keeps showing the progress and status of whole queue as well as Queue items. All completed items are saved to articles data base.\r\n *\r\n */\r\n@Component({\r\n  selector: 'anu-ai-articles',\r\n  templateUrl: './ai-articles.component.html',\r\n  styleUrls: ['./ai-articles.component.scss']\r\n})\r\nexport class AiArticlesComponent implements OnDestroy, OnInit {\r\n\r\n  // Bulk articles modal\r\n  toggleBulkArticlesModal: boolean = false;\r\n  bulkArticlesPromptsText: string = '';\r\n\r\n  //Openai Config Modal\r\n  toggleOpenaiConfigModal: boolean = false;\r\n\r\n  // Single Article prompt\r\n  historyPrompts: Array<OpenaiPrompt> = [];\r\n\r\n  // Preview Result Modal\r\n  currentMdText: string = '';\r\n  currentMdConvertedText: string = '';\r\n\r\n\r\n  // Batch process\r\n  articlesBatch: Array<QueueItem> = null;\r\n  promptsBatch: Array<QueueItem> = null;\r\n  articlesBatchSubscription: Subscription = null;\r\n  promptBatchSubscription: Subscription = null;\r\n  promptStatusSubscription: Subscription = null;\r\n\r\n  // Error Messages\r\n  errors: Array<string> = [];\r\n\r\n  //  Save status\r\n  articleSaveStatus = {};\r\n\r\n  constructor(\r\n    public aiArticlesService: AiArticlesService,\r\n    private utilsService: UtilsService,\r\n    private openaiService: OpenaiService,\r\n    private openaiConfigService: OpenaiConfigService,\r\n    private articleEditorService: ArticleEditorService,\r\n    private fireArticlesHttpService: FireArticlesHttpService,\r\n    private appConfigService: AppConfigService,\r\n    public html2json: Html2JsonService,\r\n    private fireStorageImageService: FireStorageImageService,\r\n    private fireAuthService: FireAuthService,\r\n  ) {\r\n    // init openai\r\n    this.openaiConfigService.config.subscribe((config: OpenaiConfiguration) => {\r\n      const openaiConfig: OpenaiConfig = {\r\n        apiKey: config?.apiKey?.value || '',\r\n        organization: config?.headers?.value['OpenAI-Organization'].value || ''\r\n      }\r\n\r\n      openaiConfig?.apiKey && this.openaiService.initOpenai(openaiConfig);\r\n    })\r\n\r\n    // this.aiArticlesService.articlesQ.queue.subscribe(qItems => console.log(''));\r\n\r\n    this.articlesBatchSubscription && this.articlesBatchSubscription.unsubscribe();\r\n\r\n    this.articlesBatchSubscription = this.aiArticlesService.articlesQ.currentBatch.subscribe(articlesBatchItems => {\r\n      this.onArticleSBatchChange(articlesBatchItems);\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.openaiConfigService.initOpenai((this.appConfigService.openai as OpenaiConfig).apiKey, (this.appConfigService.openai as OpenaiConfig).organization);\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.articlesBatchSubscription && this.articlesBatchSubscription.unsubscribe();\r\n    this.promptBatchSubscription && this.promptBatchSubscription.unsubscribe();\r\n    this.promptStatusSubscription && this.promptStatusSubscription.unsubscribe();\r\n  }\r\n\r\n  private onArticleSBatchChange(articlesBatchItems: Array<QueueItem>): void {\r\n    if (articlesBatchItems?.length) {\r\n      articlesBatchItems.forEach(articleQItem => {\r\n        const promptQ = (articleQItem.data as Queue);\r\n\r\n        promptQ.start(\r\n          AI_MAX_REQUEST_COUNT,\r\n          AI_MAX_REQUEST_DELAY,\r\n          AI_FAILED_REQUEST_DELAY,\r\n        );\r\n\r\n        this.promptBatchSubscription && this.promptBatchSubscription.unsubscribe();\r\n        this.promptStatusSubscription && this.promptStatusSubscription.unsubscribe();\r\n\r\n        this.promptBatchSubscription = promptQ.currentBatch.subscribe(promptQItems => {\r\n          this.processArtPrompts(articleQItem, promptQ, promptQItems);\r\n        });\r\n\r\n        this.promptStatusSubscription = promptQ.status.subscribe(status => {\r\n          // If Prompt Queue is completed successfully, then Save Article to DB and Mark ArticleQItem as completed.\r\n          if (\r\n            [QueueStatusEnum.paused, QueueStatusEnum.completed].includes(status) &&\r\n            !promptQ.queueValue.find(item => item.status !== QueueStatusEnum.completed) &&\r\n            this.articleSaveStatus[articleQItem.id] !== true\r\n          ) {\r\n            this.saveArticle(articleQItem);\r\n          }\r\n        });\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add Additional Prompts from subtopics and questions.\r\n   *\r\n   * @param promptQ\r\n   * @param promptQItem\r\n   * @returns\r\n   */\r\n  public generateAdditionalPrompts(promptQ: Queue, promptQItem: QueueItem): void {\r\n\r\n    const artPrompt = (promptQItem.data as ArticlePrompt);\r\n\r\n    if (![OpenaiPromptTypeEnum.questions, OpenaiPromptTypeEnum.subtopics].includes(artPrompt.prompt.promptType)) return;\r\n\r\n    const keywordsOrSubTopics = this.articleEditorService\r\n      .readKeywordsFromEditorElement(\r\n        this.html2json.md2json(artPrompt.prompt.message.mdText)\r\n      );\r\n\r\n    const promptQItems: Array<QueueItem> = keywordsOrSubTopics?.map(keyword => {\r\n      const qItem = new QueueItem({\r\n        id: keyword,\r\n        status: QueueStatusEnum.notstarted,\r\n        startTime: 0,\r\n        completedTime: 0,\r\n        data: {\r\n          heading: keyword,\r\n          prompt: {\r\n            prompt: keyword,\r\n            promptType: OpenaiPromptTypeEnum.content,\r\n            message: {},\r\n          } as OpenaiPrompt\r\n        } as ArticlePrompt\r\n      } as QueueItem);\r\n\r\n      return qItem;\r\n    });\r\n\r\n    promptQItems?.length && promptQ.add(promptQItems);\r\n  }\r\n\r\n  public processArtPrompts(articleQItem: QueueItem, promptQ: Queue, promptQItems: Array<QueueItem>) {\r\n\r\n    //Create the prompt promises for the batch\r\n    const batchPromises = promptQItems.map((item: QueueItem) => {\r\n      const artPrompt = item.data as ArticlePrompt;\r\n\r\n      this.pushStatusMsg('Prompt Started...', 'warning', articleQItem.id, item.id);\r\n\r\n      return artPrompt.prompt.promptType === OpenaiPromptTypeEnum.image ?\r\n        this.openaiService.getImagetResponse(artPrompt.prompt.prompt, 1, OpenaiImageSize._1024x1024) :\r\n        this.openaiService.getChatResponse([artPrompt.prompt.prompt])\r\n    });\r\n\r\n    // Wait for success/failure and process results\r\n    Promise.allSettled(batchPromises).then((results) => {\r\n\r\n      results.forEach((item, index) => {\r\n        const promptQItem = promptQItems[index];\r\n\r\n        if (item.status === 'fulfilled') {          // Write result back to original promptQueue, on successful prompt\r\n\r\n          const artPrompt = (promptQItem.data as ArticlePrompt);\r\n\r\n          artPrompt.prompt.message.mdText = artPrompt.prompt.promptType === OpenaiPromptTypeEnum.image ?\r\n            (item.value as any)[0] :\r\n            item.value as any;  // assign based on result\r\n\r\n          promptQItem.complete();\r\n          this.pushStatusMsg('Prompt DONE', 'success', articleQItem.id, promptQItem.id);\r\n          this.generateAdditionalPrompts(promptQ, promptQItem);\r\n        } else {\r\n          // On Prompt Failure, set status and processQueue agin with failed prompts after a delay.\r\n          promptQItem.fail();\r\n          this.pushStatusMsg('Prompt Failed', 'error', articleQItem.id, promptQItem.id);\r\n        }\r\n      });\r\n\r\n      // Update promptQueue back, that we are done with batch processing\r\n      promptQ.updateQueueBatch(promptQItems);\r\n    });\r\n  }\r\n\r\n  public onGenerateBulkArticleQueues(): void {\r\n    this.toggleBulkArticlesModal = false;\r\n    if (!this.bulkArticlesPromptsText.trim()) return;\r\n\r\n    const promptTexts = this.bulkArticlesPromptsText.split(PROMPTS_SEPARATOR);\r\n    promptTexts.forEach((pmtText) => {\r\n      pmtText = pmtText.trim();\r\n      const prompt: OpenaiPrompt = {\r\n        prompt: pmtText,\r\n        promptType: OpenaiPromptTypeEnum.content,\r\n        message: { mdText: '', htmlText: '', jsonText: '' },\r\n      };\r\n\r\n      // Create a new articleQueue item and add its first prompts.\r\n      pmtText && this.initAndAddNewArticleprompts(prompt);\r\n    });\r\n\r\n    // resets the bulk prompt text\r\n    this.bulkArticlesPromptsText = '';\r\n  }\r\n\r\n  public onNewPrompt(prompts: Array<OpenaiPrompt>): void {\r\n    const prompt =\r\n      (prompts && prompts.length && prompts[prompts.length - 1]) || null;\r\n    if (!prompt) return;\r\n\r\n    // Create a new articleQueue item and add its first prompts.\r\n    this.initAndAddNewArticleprompts(prompt);\r\n  }\r\n\r\n  public createArticlePrompt(\r\n    prompt: OpenaiPrompt,\r\n    promptType: OpenaiPromptTypeEnum = OpenaiPromptTypeEnum.content\r\n  ): QueueItem {\r\n    if (!prompt) return null;\r\n\r\n    const qItem: QueueItem = new QueueItem();\r\n    qItem.id = prompt.prompt;\r\n\r\n    const articlePrompt: ArticlePrompt = {\r\n      prompt: this.utilsService.deepCopy(prompt),\r\n      heading: prompt.prompt,\r\n    };\r\n\r\n    switch (promptType) {\r\n      case OpenaiPromptTypeEnum.description:\r\n        qItem.id = `${DESCRIPTION_PROMPT_NAME}`;\r\n        articlePrompt.prompt.promptType = OpenaiPromptTypeEnum.description;\r\n        articlePrompt.prompt.prompt = `${DESCRIPTION_PROMPT_PREFIX} ${prompt.prompt}`;\r\n        articlePrompt.heading = 'NA';\r\n\r\n        break;\r\n      case OpenaiPromptTypeEnum.keywords:\r\n        qItem.id = `${KEYWORDS_PROMPT_NAME}`;\r\n        articlePrompt.prompt.promptType = OpenaiPromptTypeEnum.keywords;\r\n        articlePrompt.prompt.prompt = `${KEYWORDS_PROMPT_PREFIX} ${prompt.prompt}`;\r\n        articlePrompt.heading = 'NA';\r\n        break;\r\n\r\n      case OpenaiPromptTypeEnum.subtopics:\r\n        qItem.id = `${SUBTOPICS_PROMPT_NAME}`;\r\n        articlePrompt.prompt.promptType = OpenaiPromptTypeEnum.subtopics;\r\n        articlePrompt.prompt.prompt = `${SUBTOPICS_PROMPT_PREFIX} ${prompt.prompt}`;\r\n        articlePrompt.heading = 'NA';\r\n        break;\r\n      case OpenaiPromptTypeEnum.questions:\r\n        qItem.id = `${QUESTIONS_PROMPT_NAME}`;\r\n        articlePrompt.prompt.promptType = OpenaiPromptTypeEnum.questions;\r\n        articlePrompt.prompt.prompt = `${QUESTIONS_PROMPT_PREFIX} ${prompt.prompt}`;\r\n        articlePrompt.heading = 'NA';\r\n        break;\r\n      case OpenaiPromptTypeEnum.image:\r\n        qItem.id = `IMAGE`;\r\n        articlePrompt.prompt.promptType = OpenaiPromptTypeEnum.image;\r\n        articlePrompt.prompt.prompt = prompt.prompt;\r\n        articlePrompt.heading = 'NA';\r\n        break;\r\n      default:\r\n        articlePrompt.prompt.promptType = OpenaiPromptTypeEnum.content;\r\n    }\r\n\r\n    qItem.data = articlePrompt;\r\n\r\n    return qItem;\r\n  }\r\n\r\n  public initAndAddNewArticleprompts(prompt: OpenaiPrompt): void {\r\n    if (!prompt) return;\r\n\r\n    // Article's first prompt\r\n    const promptQueueItem = this.createArticlePrompt(prompt);\r\n\r\n    // Article's (subtopics prompt)\r\n    const subtopicsPromptQueueItem = this.createArticlePrompt(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.subtopics\r\n    );\r\n\r\n    // Article's (questions prompt)\r\n    const questionsPromptQueueItem = this.createArticlePrompt(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.questions\r\n    );\r\n\r\n    // Article's (description prompt)\r\n    const descriptionPromptQueueItem = this.createArticlePrompt(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.description\r\n    );\r\n\r\n    // Article's (keywords prompt)\r\n    const keywordsPromptQueueItem = this.createArticlePrompt(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.keywords\r\n    );\r\n\r\n    // Article's (Image prompt)\r\n    const imagePromptQueueItem = this.createArticlePrompt(\r\n      prompt,\r\n      OpenaiPromptTypeEnum.image\r\n    );\r\n\r\n    const articleQ = new Queue();\r\n    articleQ.add([\r\n      promptQueueItem,\r\n      subtopicsPromptQueueItem,\r\n      questionsPromptQueueItem,\r\n      keywordsPromptQueueItem,\r\n      descriptionPromptQueueItem,\r\n      imagePromptQueueItem,\r\n    ]);\r\n\r\n    const articlesQItem = new QueueItem();\r\n    articlesQItem.id = prompt.prompt;\r\n    articlesQItem.data = articleQ;\r\n\r\n    this.aiArticlesService.articlesQ.add([articlesQItem]);\r\n  }\r\n\r\n  public updatePromptInQueue(artQindex: number, pmtQItem: QueueItem): void {\r\n    const promptQ = this.aiArticlesService.articlesQ.queueValue[artQindex].data as Queue;\r\n    promptQ.update([pmtQItem]);\r\n  }\r\n\r\n  public removePromptFromQueue(artQindex: number, pmtQItem: QueueItem): void {\r\n    const promptQ = this.aiArticlesService.articlesQ.queueValue[artQindex].data as Queue;\r\n    promptQ.remove([pmtQItem]);\r\n  }\r\n\r\n  public addPromptInQueue(artQindex: number): void {\r\n    const promptQ = this.aiArticlesService.articlesQ.queueValue[artQindex].data as Queue;\r\n    const pmtQItem = new QueueItem({\r\n      id: this.utilsService.getUniqueFromString(`article-prompt-${artQindex}`),\r\n      data: {\r\n        prompt: {\r\n          prompt: '',\r\n          message: {},\r\n          promptType: OpenaiPromptTypeEnum.content\r\n        } as OpenaiPrompt,\r\n        heading: '',\r\n      } as ArticlePrompt,\r\n      status: QueueStatusEnum.notstarted,\r\n      startTime: 0,\r\n      completedTime: 0,\r\n    } as QueueItem);\r\n\r\n    promptQ.add([pmtQItem]);\r\n  }\r\n\r\n  public showQueueItemResultModal(artQindex: number, pmtQItem: QueueItem): void {\r\n    this.currentMdText = pmtQItem.data.prompt?.message?.mdText || '';\r\n    this.currentMdConvertedText = this.currentMdText;\r\n  }\r\n\r\n  public startArticlesQueue(event: any): void {\r\n    this.aiArticlesService.articlesQ.start(\r\n      1,\r\n      AI_MAX_REQUEST_DELAY,\r\n      AI_FAILED_REQUEST_DELAY,\r\n    );\r\n    this.errors = [];\r\n  }\r\n\r\n  public async saveArticle(articleQItem: QueueItem): Promise<void> {\r\n\r\n    const article: Article = this.articleEditorService.createInitializedArticle(\r\n      articleQItem.id,\r\n    );\r\n\r\n    let articleImage: string = '';\r\n\r\n    const promptqItems: Array<QueueItem> = articleQItem.data.queueValue;\r\n\r\n    promptqItems.forEach((qItem: QueueItem, index) => {\r\n      const item: ArticlePrompt = qItem.data;\r\n\r\n      // Set Image, if image prompt\r\n      if (item.prompt.promptType === OpenaiPromptTypeEnum.image) {\r\n        articleImage = item.prompt.message.mdText;\r\n      } else {\r\n        const jsonEl = this.articleEditorService.cleanAndFormatEditorEl(\r\n          this.html2json.md2json(item.prompt.message.mdText),\r\n        );\r\n\r\n        if (jsonEl) {\r\n          if (index === 0) {\r\n            article.body = jsonEl;\r\n          } else {\r\n            switch (item.prompt.promptType) {\r\n              case OpenaiPromptTypeEnum.keywords:\r\n                article.metaInfo.keywords = this.articleEditorService\r\n                  .readKeywordsFromEditorElement(jsonEl)\r\n                  .join(', ');\r\n                article.metaInfo['article:tag'] = article.metaInfo.keywords;\r\n                break;\r\n              case OpenaiPromptTypeEnum.description:\r\n                article.metaInfo.description =\r\n                  this.articleEditorService.readDescriptionFromEditorElement(jsonEl);\r\n                break;\r\n              case OpenaiPromptTypeEnum.questions:\r\n                break;\r\n              case OpenaiPromptTypeEnum.subtopics:\r\n                break;\r\n              default:\r\n                article.body.children = [].concat(\r\n                  article.body.children,\r\n                  this.articleEditorService.generateArticleSubheading(item.heading || item.prompt.prompt || ''),\r\n                  jsonEl.children\r\n                );\r\n            }\r\n          }\r\n        }\r\n      }\r\n    });\r\n\r\n\r\n    // Save Image\r\n    const imageFileInfo: ImageFileInfo = await this.fireStorageImageService.uploadImage(\r\n      `${article.id}.jpg`,\r\n      articleImage,\r\n      true,\r\n      this.fireAuthService.getCurrentUserId(),\r\n      true\r\n    )\r\n      .catch(err => {\r\n        this.pushStatusMsg('Saving Article Image failed', 'error', articleQItem.id);\r\n        return null;\r\n      });\r\n\r\n    if (imageFileInfo) {\r\n      article.image.src = `getImage?imageId=${imageFileInfo.fullPath}` || '';\r\n      article.metaInfo.image = article.image.src;\r\n    }\r\n\r\n    this.pushStatusMsg('Saving Article Image DONE', 'success', articleQItem.id);\r\n\r\n    // Save article to firebase\r\n    const newArticle = await this.fireArticlesHttpService.addArticle(article)\r\n      .catch(err => {\r\n        this.pushStatusMsg('Saving Article failed', 'error', articleQItem.id);\r\n        this.articleSaveStatus[articleQItem.id] = false;\r\n        return null;\r\n      });\r\n\r\n    if (newArticle) {\r\n      articleQItem.complete();\r\n      this.aiArticlesService.articlesQ.updateQueueBatch([articleQItem]);\r\n      this.pushStatusMsg('Saving Article DONE', 'success', articleQItem.id);\r\n      this.articleSaveStatus[articleQItem.id] = true;\r\n    }\r\n  }\r\n\r\n  public pushStatusMsg(msg: string, type: string, articleId: string = '', promptId: string = ''): void {\r\n    this.errors.push(`\r\n    <div>${articleId}   |   ${promptId}</div>\r\n    <p class=\"${type}\">${msg}</p>\r\n    `);\r\n  }\r\n\r\n}\r\n","<div class=\"row right\">\r\n  <!-- Open ai Configuration -->\r\n  <a\r\n    class=\"primary\"\r\n    href=\"javascript:void(0)\"\r\n    (click)=\"toggleOpenaiConfigModal = true\"\r\n    >Settings</a\r\n  >\r\n  <span class=\"spacing-h\">|</span>\r\n  <!-- Add Bulk Articles to Queue -->\r\n  <a\r\n    class=\"primary\"\r\n    href=\"javascript:void(0)\"\r\n    (click)=\"toggleBulkArticlesModal = true\"\r\n    >Bulk Articles</a\r\n  >\r\n</div>\r\n\r\n<div class=\"row\">\r\n  <!-- Add Single Article to Queue -->\r\n  <anu-openai-form\r\n    class=\"container\"\r\n    [prompts]=\"historyPrompts\"\r\n    [selectedPromptText]=\"\"\r\n    [showHistory]=\"false\"\r\n    [showPrompts]=\"false\"\r\n    (goClicked)=\"onNewPrompt($event)\"\r\n  >\r\n  </anu-openai-form>\r\n</div>\r\n\r\n<anu-queue-status\r\n  class=\"row spacing-around-v\"\r\n  (startClick)=\"startArticlesQueue($event)\"\r\n  [queue]=\"aiArticlesService.articlesQ\"\r\n></anu-queue-status>\r\n\r\n<anu-collapsible\r\n  *ngIf=\"errors?.length\"\r\n  [collapsed]=\"false\"\r\n  class=\"col-12 spacing-around-v shadow\"\r\n  [hamBurgerClassNames]=\"['size-sm']\"\r\n  [isDropdownStyle]=\"true\"\r\n>\r\n  <anu-collapsible-header> Queue Messagees </anu-collapsible-header>\r\n  <anu-collapsible-content class=\"row\">\r\n    <ol>\r\n      <li *ngFor=\"let msg of errors\" [innerHTML]=\"msg\"></li>\r\n    </ol>\r\n  </anu-collapsible-content>\r\n</anu-collapsible>\r\n\r\n<anu-collapsible\r\n  *ngFor=\"\r\n    let artQItem of aiArticlesService.articlesQ.queueValue;\r\n    let artQIndex = index\r\n  \"\r\n  [collapsed]=\"false\"\r\n  class=\"container shadow spacing-around-v border-round\"\r\n  [hamBurgerClassNames]=\"['size-sm']\"\r\n  [isDropdownStyle]=\"true\"\r\n>\r\n  <anu-collapsible-header class=\"spacing\">\r\n    <h2>({{ artQIndex + 1 }}): {{ artQItem.id }}</h2>\r\n  </anu-collapsible-header>\r\n  <anu-collapsible-content class=\"container\">\r\n    <div class=\"row stretch\">\r\n      <div>\r\n        <anu-queue-status\r\n          class=\"row\"\r\n          [queue]=\"artQItem?.data\"\r\n        ></anu-queue-status>\r\n      </div>\r\n      <a\r\n        *ngIf=\"articleSaveStatus[artQItem.id] === false\"\r\n        class=\"success\"\r\n        href=\"javascript:void(0)\"\r\n        (click)=\"saveArticle(artQItem)\"\r\n        ><strong>Save</strong></a\r\n      >\r\n    </div>\r\n\r\n    <div class=\"row\">\r\n      <anu-card\r\n        class=\"col-sm-12 col-md-6 col-lg-6 border border-round overflow-hidden prompt-item spacing-around-v\"\r\n        *ngFor=\"let pQItem of artQItem.data.queueValue; let pmtQindex = index\"\r\n      >\r\n        <anu-card-title class=\"primary-darker-grad spacing-half\">\r\n          <h3 class=\"accent-deep-light\">{{ pQItem.id }}</h3>\r\n        </anu-card-title>\r\n        <anu-card-body class=\"container relative spacing-half\">\r\n          <!-- Prompt Heading -->\r\n          <div\r\n            class=\"col-12\"\r\n            *ngIf=\"pQItem.data.prompt.promptType === 'content'\"\r\n          >\r\n            <label>Heading</label>\r\n            <input\r\n              [readonly]=\"pQItem.status !== 'notstarted'\"\r\n              type=\"text\"\r\n              [(ngModel)]=\"pQItem.data.heading\"\r\n            />\r\n          </div>\r\n\r\n          <!-- Prompt's prompt text -->\r\n          <div class=\"col-12\">\r\n            <label>Prompt</label>\r\n            <input\r\n              [readonly]=\"pQItem.status !== 'notstarted'\"\r\n              type=\"text\"\r\n              [(ngModel)]=\"pQItem.data.prompt.prompt\"\r\n            />\r\n          </div>\r\n\r\n          <!-- loader -->\r\n          <anu-spinner [show]=\"pQItem.status === 'inprogress'\"></anu-spinner>\r\n        </anu-card-body>\r\n        <anu-card-footer class=\"primary-lightest-grad\">\r\n          <div class=\"row stretch spacing\">\r\n            <div\r\n              class=\"\"\r\n              [ngClass]=\"{\r\n                error: pQItem.status === 'failed',\r\n                success: pQItem.status === 'completed',\r\n                'warning relative': pQItem.status === 'inprogress'\r\n              }\"\r\n            >\r\n              <strong>{{ pQItem.status }}</strong>\r\n            </div>\r\n            <div class=\"\">{{ pQItem.timeEllapsed }}s</div>\r\n\r\n            <div class=\"\">\r\n              <a\r\n                *ngIf=\"pQItem.status === 'notstarted'\"\r\n                class=\"success\"\r\n                href=\"javascript:void(0)\"\r\n                (click)=\"updatePromptInQueue(artQIndex, pQItem)\"\r\n                ><strong>Update</strong></a\r\n              >\r\n            </div>\r\n\r\n            <div class=\"\">\r\n              <a\r\n                *ngIf=\"pQItem.status === 'notstarted'\"\r\n                class=\"error\"\r\n                href=\"javascript:void(0)\"\r\n                (click)=\"removePromptFromQueue(artQIndex, pQItem)\"\r\n                ><strong>X</strong></a\r\n              >\r\n\r\n              <a\r\n                *ngIf=\"pQItem.status === 'completed'\"\r\n                class=\"success\"\r\n                href=\"javascript:void(0)\"\r\n                (click)=\"showQueueItemResultModal(artQIndex, pQItem)\"\r\n                >⛲</a\r\n              >\r\n            </div>\r\n          </div>\r\n        </anu-card-footer>\r\n      </anu-card>\r\n\r\n      <anu-card\r\n        *ngIf=\"artQItem.status !== 'completed'\"\r\n        class=\"col-sm-12 col-md-6 col-lg-6 border border-round overflow-hidden prompt-item spacing-around-v\"\r\n      >\r\n        <anu-card-body class=\"container relative spacing-half\">\r\n          <a\r\n            class=\"success\"\r\n            href=\"javascript:void(0)\"\r\n            class=\"btn primary\"\r\n            (click)=\"addPromptInQueue(artQIndex)\"\r\n            ><strong>Add Prompt</strong></a\r\n          >\r\n        </anu-card-body>\r\n      </anu-card>\r\n    </div>\r\n  </anu-collapsible-content>\r\n</anu-collapsible>\r\n\r\n<anu-modal\r\n  [enableCancel]=\"true\"\r\n  [enableOk]=\"true\"\r\n  [opened]=\"toggleBulkArticlesModal\"\r\n  modalTitle=\"Bulk Articles Prompts\"\r\n  (okClick)=\"onGenerateBulkArticleQueues()\"\r\n  (cancelClick)=\"toggleBulkArticlesModal = false\"\r\n>\r\n  <textarea\r\n    placeholder=\"Article titles separated by 3 pipe symbols |||\"\r\n    [(ngModel)]=\"bulkArticlesPromptsText\"\r\n  ></textarea>\r\n</anu-modal>\r\n\r\n<anu-modal\r\n  [enableCancel]=\"true\"\r\n  [enableOk]=\"false\"\r\n  [opened]=\"toggleOpenaiConfigModal\"\r\n  modalTitle=\"Openai Configuration\"\r\n  (cancelClick)=\"toggleOpenaiConfigModal = false\"\r\n  cancelLabel=\"Go Back\"\r\n>\r\n  <anu-openai-configuration></anu-openai-configuration>\r\n</anu-modal>\r\n\r\n<anu-modal\r\n  [enableCancel]=\"true\"\r\n  [enableOk]=\"false\"\r\n  [opened]=\"!!currentMdText\"\r\n  modalTitle=\"Queue Item Result Preview\"\r\n  (cancelClick)=\"currentMdConvertedText = currentMdText = ''\"\r\n  cancelLabel=\"Go Back\"\r\n>\r\n  <div class=\"row spacing-around-v\">\r\n    <a class=\"btn\" (click)=\"currentMdConvertedText = currentMdText\">Markdown</a>\r\n    <a\r\n      class=\"btn\"\r\n      (click)=\"currentMdConvertedText = html2json.md2jsonText(currentMdText)\"\r\n      >JSON</a\r\n    >\r\n    <a\r\n      class=\"btn\"\r\n      (click)=\"currentMdConvertedText = html2json.md2html(currentMdText)\"\r\n      >HTML</a\r\n    >\r\n  </div>\r\n  <anu-code-block\r\n    [enableEdit]=\"false\"\r\n    [language]=\"'markup'\"\r\n    [source]=\"currentMdConvertedText\"\r\n  >\r\n  </anu-code-block>\r\n</anu-modal>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { OpenaiAutoArticlesComponent } from './components/openai-auto-articles/openai-auto-articles.component';\r\nimport { OpenaiModule } from '@annuadvent/ngx-tools/openai';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SpinnerModule } from '@annuadvent/ngx-common-ui/spinner';\r\nimport { CardModule } from '@annuadvent/ngx-common-ui/card';\r\nimport { CollapsibleModule } from '@annuadvent/ngx-common-ui/collapsible';\r\nimport { ModalModule } from '@annuadvent/ngx-common-ui/modal';\r\nimport { CodeBlockModule } from '@annuadvent/ngx-common-ui/code-block';\r\nimport { AiArticlesComponent } from './components/ai-articles/ai-articles.component';\r\nimport { QueueModule } from '@annuadvent/ngx-tools/queue';\r\n\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    OpenaiAutoArticlesComponent,\r\n    AiArticlesComponent,\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    OpenaiModule,\r\n    SpinnerModule,\r\n    CollapsibleModule,\r\n    ModalModule,\r\n    CodeBlockModule,\r\n    QueueModule,\r\n    CardModule,\r\n  ],\r\n  exports: [\r\n    OpenaiAutoArticlesComponent,\r\n    AiArticlesComponent,\r\n  ]\r\n})\r\nexport class OpenaiAutoArticlesModule { }\r\n","import { OpenaiPrompt } from \"@annuadvent/ngx-tools/openai\";\r\n\r\nexport interface ArticlePrompt {\r\n    prompt: OpenaiPrompt;\r\n    heading: string;\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DESCRIPTION_PROMPT_NAME","KEYWORDS_PROMPT_NAME","SUBTOPICS_PROMPT_NAME","QUESTIONS_PROMPT_NAME","DESCRIPTION_PROMPT_PREFIX","KEYWORDS_PROMPT_PREFIX","SUBTOPICS_PROMPT_PREFIX","QUESTIONS_PROMPT_PREFIX","PROMPTS_SEPARATOR","i1.AiArticlesService","i2","i4","i6","i7","i8","i9","i10","i11","i12","i13","i14","i15"],"mappings":"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"}