@sinequa/assistant 3.5.0 → 3.5.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sinequa-assistant-chat.mjs","sources":["../../../projects/assistant/chat/instance-manager.service.ts","../../../projects/assistant/chat/chat-settings-v3/chat-settings-v3.component.ts","../../../projects/assistant/chat/chat-settings-v3/chat-settings-v3.component.html","../../../projects/assistant/chat/types.ts","../../../projects/assistant/chat/chat.service.ts","../../../projects/assistant/chat/websocket-chat.service.ts","../../../projects/assistant/chat/initials-avatar/initials-avatar.component.ts","../../../projects/assistant/chat/initials-avatar/initials-avatar.component.html","../../../projects/assistant/chat/format-icon/icons.ts","../../../projects/assistant/chat/format-icon/format-icon.component.ts","../../../projects/assistant/chat/format-icon/format-icon.component.html","../../../projects/assistant/chat/chat-reference/chat-reference.component.ts","../../../projects/assistant/chat/chat-reference/chat-reference.component.html","../../../projects/assistant/chat/charts/chart/chart.component.ts","../../../projects/assistant/chat/charts/chart/chart.component.html","../../../projects/assistant/chat/chat-message/chat-message.component.ts","../../../projects/assistant/chat/chat-message/chat-message.component.html","../../../projects/assistant/chat/rest-chat.service.ts","../../../projects/assistant/chat/token-progress-bar/token-progress-bar.component.ts","../../../projects/assistant/chat/token-progress-bar/token-progress-bar.component.html","../../../projects/assistant/chat/debug-message/debug-message.component.ts","../../../projects/assistant/chat/debug-message/debug-message.component.html","../../../projects/assistant/chat/chat.component.ts","../../../projects/assistant/chat/chat.component.html","../../../projects/assistant/chat/saved-chats/saved-chats.component.ts","../../../projects/assistant/chat/saved-chats/saved-chats.component.html","../../../projects/assistant/chat/messages/en.ts","../../../projects/assistant/chat/messages/fr.ts","../../../projects/assistant/chat/messages/de.ts","../../../projects/assistant/chat/messages/index.ts","../../../projects/assistant/chat/prompt.component.ts","../../../projects/assistant/chat/sinequa-assistant-chat.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ChatService } from './chat.service';\n\n/**\n * A service to create and manage instances of ChatService dynamically based on the provided component references and the implementation type (http or websocket)\n * All chat-related components should share the same instance of this InstanceManagerService, which in turn provides the appropriate instance of ChatService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class InstanceManagerService {\n private _serviceInstances: Map<string, ChatService> = new Map();\n\n /**\n * Store the instance of ChatService in the map\n * @param key key differentiator between components used to store their corresponding ChatService instance\n * @param service The ChatService instance\n */\n storeInstance(key: string, service: ChatService): void {\n this._serviceInstances.set(key, service);\n }\n\n /**\n * @param key key differentiator between components based on which the corresponding ChatService instance is fetched\n * @returns The instance of the service corresponding to the instance of the component\n */\n getInstance(key: string): ChatService {\n if (!this.checkInstance(key)) {\n throw new Error(`No chat instance found for the given key : '${key}'`);\n }\n return this._serviceInstances.get(key)!;\n }\n\n /**\n *\n * @param key key differentiator between components based on which the check for an existent ChatService instance is performed\n * @returns True if a ChatService instance has been already instantiated for the given key. Otherwise, false.\n */\n checkInstance(key: string): boolean {\n return this._serviceInstances.has(key);\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject } from \"@angular/core\";\nimport { ChatService } from \"../chat.service\";\nimport { ChatConfig, GllmModelDescription } from \"../types\";\nimport { Subscription, filter, switchMap, tap } from \"rxjs\";\nimport { InstanceManagerService } from \"../instance-manager.service\";\nimport { PrincipalWebService } from \"@sinequa/core/web-services\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { AppService } from \"@sinequa/core/app-utils\";\n\n@Component({\n selector: 'sq-chat-settings-v3',\n templateUrl: './chat-settings-v3.component.html',\n styleUrls: [\"./chat-settings-v3.component.scss\"],\n standalone: true,\n imports: [CommonModule, FormsModule]\n})\nexport class ChatSettingsV3Component implements OnInit, OnDestroy {\n /** Define the key based on it, the appropriate chatService instance will be returned from instanceManagerService */\n @Input() instanceId: string;\n\n @Output(\"update\") _update = new EventEmitter<ChatConfig>();\n @Output(\"cancel\") _cancel = new EventEmitter<ChatConfig>();\n\n chatService: ChatService;\n config: ChatConfig;\n subscription = new Subscription();\n selectedModel: GllmModelDescription | undefined;\n functions: {name: string, enabled: boolean}[] = [];\n isAdmin = false;\n\n public loginService = inject(LoginService);\n public instanceManagerService = inject(InstanceManagerService);\n public principalService = inject(PrincipalWebService);\n public appService = inject(AppService);\n\n ngOnInit(): void {\n this.subscription.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n switchMap(() => this.chatService.initConfig$),\n filter(initConfig => !!initConfig)\n ).subscribe(_ => {\n this.isAdmin = this.principalService.principal!.isAdministrator;\n // Init config with a copy of the original chat config, so that it won't be modified by the user until he clicks on save\n this.config = JSON.parse(JSON.stringify(this.chatService.chatConfig$.value));\n this.selectedModel = this.chatService.getModel(this.config.defaultValues.service_id, this.config.defaultValues.model_id);\n this.initFunctionsList();\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n get hasPrompts(): boolean {\n return this.isAdmin\n || !!this.config.uiSettings.displaySystemPrompt\n || !!this.config.uiSettings.displayUserPrompt;\n }\n\n get hasAdvancedParameters(): boolean {\n return this.isAdmin\n || !!this.config.uiSettings.temperature\n || !!this.config.uiSettings.top_p\n || !!this.config.uiSettings.max_tokens;\n }\n\n get hasModel(): boolean {\n return this.isAdmin\n || !!this.config.uiSettings.servicesModels\n || !!this.config.uiSettings.functions\n || !!this.config.uiSettings.debug\n || !!this.config.uiSettings.temperature\n || !!this.config.uiSettings.top_p\n || !!this.config.uiSettings.max_tokens;\n }\n\n instantiateChatService(): void {\n this.chatService = this.instanceManagerService.getInstance(this.instanceId);\n }\n\n onChatModelChange(selectedModel: GllmModelDescription) {\n // Update properties based on the selected model\n this.config.defaultValues.service_id = selectedModel.serviceId;\n this.config.defaultValues.model_id = selectedModel.modelId;\n }\n\n getFunctionDescription(name: string): string {\n return this.chatService.functions?.find(fn => fn.functionName === name)?.description || \"\";\n }\n\n toggleFunctionsSelection(name: string) {\n // Update the enabled property of the function\n const index = this.config.defaultValues.functions.findIndex(func => func.name === name);\n this.config.defaultValues.functions[index].enabled = this.functions[index].enabled;\n }\n\n private initFunctionsList(): void {\n this.functions = this.config.defaultValues.functions.filter(func => !!this.chatService.functions?.find(fn => fn.functionName === func.name));\n }\n\n /**\n * Save the new chat config in the chat service and the user preferences\n * If the user has never modified the default values, we need to save the hash of the standard default values, as defined by the admin, in order to properly track changes afterwards.\n */\n save() {\n const userSettingsConfig = this.chatService.assistants[this.instanceId] || {};\n if (!userSettingsConfig.defaultValues) { // At this point, it is the very first time the user makes changes to the default values\n const standardChatConfig = this.appService.app?.data?.assistants?.[this.instanceId];\n const hashes = { ...userSettingsConfig.hashes, \"applied-defaultValues-hash\": Utils.sha512(JSON.stringify(standardChatConfig.defaultValues)) };\n this.chatService.updateChatConfig(this.config, hashes);\n } else {\n this.chatService.updateChatConfig(this.config);\n }\n this.chatService.generateAuditEvent(\"configuration.edit\", { 'configuration': JSON.stringify(this.config) });\n this._update.emit(this.config);\n }\n\n /**\n * Cancel the current changes\n */\n cancel() {\n this._cancel.emit(this.chatService.chatConfig$.value);\n }\n}\n","<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\n <div class=\"settings-panel card-body small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">Model</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">Model</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.displayName}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">Functions</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-check-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"isAdmin || config.uiSettings.debug\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">Debug</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>Advanced parameters</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">Temperature: {{config.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">Top P: {{config.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">Max generated tokens per answer:\n {{config.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">Prompts</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">System prompt (hidden)</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">Initial user prompt</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">Save</button>\n </div>\n\n</div>\n","import { z } from 'zod';\nimport { Record } from \"@sinequa/core/web-services\";\nimport { Query } from '@sinequa/core/app-utils';\n\n/**\n * Individual message sent & returned by the ChatGPT API.\n * If this message is an attachment, we attach the minimal\n * information needed to reconstruct this attachment (RawAttachment)\n * as well as the reference id computed at the moment of sending\n * the attachment to the API.\n */\nexport interface RawMessage {\n role: string;\n content: string;\n messageType?: 'CHART' | 'MARKDOWN'\n additionalProperties: {\n [key: string]: any\n };\n}\n\n/**\n * A chat message that has been processed to include the markdown-formatted\n * content for display, as well as detailed attachment data, and optionally\n * a list of the references extracted from that message\n */\nexport interface ChatMessage extends RawMessage {\n additionalProperties: {\n display?: boolean;\n $progress?: ChatProgress[];\n $attachment?: ChatContextAttachment[];\n $suggestedAction?: SuggestedAction[];\n $debug?: DebugMessage[];\n forcedWorkflow?: string;\n query?: Query;\n isUserInput?: boolean;\n usageMetrics?: ChatUsageMetrics;\n additionalWorkflowProperties?: any;\n [key: string]: any;\n };\n}\n\nexport interface ChatProgress {\n title: string;\n content?: string;\n done?: boolean;\n time?: number;\n}\n\nexport interface RawAttachment {\n /** Type of the attachment */\n type: string;\n /** Record id from which this attachment is taken */\n recordId: string;\n /** Record from which this this attachment is taken */\n record: Record;\n}\n\nexport interface DocumentPart {\n partId: number;\n offset: number;\n length: number;\n text: string;\n}\n\nexport interface ChatContextAttachment extends RawAttachment {\n /** Type of the attachment */\n type: \"Context\";\n /** Rank of the attachment in the context message */\n contextId: number;\n /** Parts of the record that the assistant uses to answer */\n parts: DocumentPart[];\n /** The specific id used of the referenced part */\n $partId?: number;\n}\n\n/**\n * Raw response of the chat API\n */\nexport interface RawResponse {\n history: RawMessage[];\n executionTime: string;\n}\n\n/**\n * Enriched response of the chat API\n */\nexport interface ChatResponse extends RawResponse{\n history: ChatMessage[];\n}\n\n/**\n * Response of the ListModels API\n */\nexport interface GllmModelDescription {\n provider: string;\n displayName: string;\n serviceId: string;\n modelId: string;\n enable: boolean;\n maxGenerationSize: number;\n contextWindowSize: number;\n}\n\n/**\n * Response of the ListFunctions API\n */\nexport interface GllmFunction {\n functionName: string;\n description: string;\n enabled: boolean;\n parameters: GllmFunctionParameter[];\n}\n\nexport interface GllmFunctionParameter {\n description: string;\n isRequired: boolean;\n name: string;\n type: string;\n}\n\n/**\n * Minimal representation of a saved chat\n */\nexport interface SavedChat {\n id: string;\n title: string;\n modifiedUTC: string;\n}\n\n/**\n * Data structure saved to reconstruct a saved chat conversation\n */\nexport interface SavedChatHistory extends SavedChat{\n history: ChatMessage[];\n}\n\n// Define the Zod representation for the connectionSettings object\nexport const connectionSettingsSchema = z.object({\n restEndpoint: z.string().optional(),\n websocketEndpoint: z.string().optional(),\n signalRTransport: z.enum([\"WebSockets\", \"ServerSentEvents\", \"LongPolling\", \"None\"]),\n signalRLogLevel: z.enum([\"Critical\", \"Debug\", \"Error\", \"Information\", \"None\", \"Trace\", \"Warning\"])\n}).refine(data => (!!data.restEndpoint || !!data.websocketEndpoint), {\n message: \"Based on the provided input() protocol ('REST' or 'WEBSOCKET') to the Chat Component, either 'restEndpoint' or 'websocketEndpoint' property should be provided in the 'globalSettings' of the assistant instance.\",\n});\n// Define the ConnectionSettings interface\nexport type ConnectionSettings = z.infer<typeof connectionSettingsSchema>;\n\n// Define the Zod representation for the serviceSettings object\nconst serviceSettingsSchema = z.object({\n service_id: z.string(),\n model_id: z.string(),\n temperature: z.number(),\n top_p: z.number(),\n max_tokens: z.number()\n});\n// Define the ServiceSettings interface\nexport interface ServiceSettings extends z.infer<typeof serviceSettingsSchema> {}\n\n// Define the Zod representation for the additionalServiceSettings object\nconst additionalServiceSettingsSchema = z.object({});\n// Define the AdditionalServiceSettings interface\nexport interface AdditionalServiceSettings extends z.infer<typeof additionalServiceSettingsSchema> {}\n\n// Define the Zod representation for the additionalWorkflowProperties object\nconst additionalWorkflowPropertiesSchema = z.object({});\n// Define the additionalWorkflowProperties interface\nexport interface additionalWorkflowProperties extends z.infer<typeof additionalWorkflowPropertiesSchema> {}\n\n// Define the Zod representation for the uiSettings object\nconst uiSettingsSchema = z.object({\n display: z.boolean(),\n servicesModels: z.boolean(),\n functions: z.boolean(),\n temperature: z.boolean(),\n top_p: z.boolean(),\n max_tokens: z.boolean(),\n debug: z.boolean(),\n displaySystemPrompt: z.boolean(),\n displayUserPrompt: z.boolean()\n});\n// Define the UiSettings interface\nexport interface UiSettings extends z.infer<typeof uiSettingsSchema> {}\n\n// Define the Zod representation for the defaultValues object\nconst defaultValuesSchema = z.object({\n service_id: z.string(),\n model_id: z.string(),\n functions: z.array(\n z.object({\n name: z.string(),\n enabled: z.boolean()\n })\n ),\n temperature: z.number(),\n top_p: z.number(),\n max_tokens: z.number(),\n debug: z.boolean(),\n systemPrompt: z.string(),\n userPrompt: z.string()\n});\n// Define the DefaultValues interface\nexport interface DefaultValues extends z.infer<typeof defaultValuesSchema> {}\n\n// Define the Zod representation for the modeSettings object\nconst initializationSchema = z.object({\n event: z.enum(['Query', 'Prompt']),\n forcedWorkflow: z.string().optional(), // Optional for event 'Prompt'\n displayUserQuery: z.boolean().optional(), // Optional for event 'Prompt'\n}).refine(data => ((data.event === \"Query\") ? (!!data.forcedWorkflow && data.displayUserQuery !== undefined && data.displayUserQuery !== null) : true), {\n message: \"The 'forcedWorkflow' and 'displayUserQuery' properties must be provided when the initialization's event is 'Query'.\",\n});\nconst modeSettingsSchema = z.object({\n enabledUserInput: z.boolean(),\n displayUserPrompt: z.boolean(),\n sendUserPrompt: z.boolean(),\n initialization: initializationSchema\n});\n// Define the ModeSettings interface\nexport interface ModeSettings extends z.infer<typeof modeSettingsSchema> {}\n\n// Define the Zod representation for the savedChatSettings object\nconst savedChatSettingsSchema = z.object({\n enabled: z.boolean(),\n display: z.boolean()\n})\n// Define the SavedChatSettings interface\nexport interface SavedChatSettings extends z.infer<typeof savedChatSettingsSchema> {}\n\n// Define the Zod representation for the globalSettings object\nconst globalSettingsSchema = z.object({\n disclaimer: z.string().optional(),\n displayUserQuotaConsumption: z.boolean().optional(),\n displayChatTokensConsumption: z.boolean().optional()\n})\n// Define the SavedChatSettings interface\nexport interface SavedChatSettings extends z.infer<typeof savedChatSettingsSchema> {}\n\n// Define the Zod representation for the entire ChatConfig object\nexport const chatConfigSchema = z.object({\n connectionSettings: connectionSettingsSchema,\n defaultValues: defaultValuesSchema,\n modeSettings: modeSettingsSchema,\n uiSettings: uiSettingsSchema,\n savedChatSettings: savedChatSettingsSchema,\n globalSettings: globalSettingsSchema,\n additionalServiceSettings: additionalServiceSettingsSchema,\n additionalWorkflowProperties: additionalWorkflowPropertiesSchema\n});\n// Define the ChatConfig interface\nexport interface ChatConfig extends z.infer<typeof chatConfigSchema> {}\n\nexport interface ChatPayload {\n debug: boolean;\n functions: string[];\n history: ChatMessage[];\n serviceSettings: ServiceSettings;\n appQuery: {\n app: string;\n query: Query | undefined;\n targetUrl?: string;\n accessToken?: string;\n };\n instanceId?: string;\n savedChatId?: string;\n}\n\nexport type ActionMessage = {\n guid: string;\n displayName?: string\n displayValue?: string;\n executionTime?: number;\n}\n\nexport interface TextChunksOptions {\n extendMode?: 'None' | 'Sentence' | 'Chars';\n extendScope?: number;\n}\n\nexport interface Quota {\n lastRequest: string;\n promptTokenCount: number;\n completionTokenCount: number;\n periodTokens: number;\n resetHours: number;\n tokenCount: number;\n nextReset: string;\n lastResetUTC: string;\n nextResetUTC: string;\n maxQuotaReached: boolean;\n}\n\nexport interface SuggestedAction {\n content: string;\n type: string;\n}\n\nexport interface InitChat {\n messages: RawMessage[];\n}\n\n/**\n * List of events data that can be emitted by the websocket chat endpoint\n */\nexport type SuggestedActionsEvent = { suggestedActions: SuggestedAction[] };\nexport type QuotaEvent = { quota: Quota };\nexport type MessageEvent = string;\nexport type ContextMessageEvent = { content: string; metadata: ChatContextAttachment };\nexport type ErrorEvent = string;\nexport type ActionStartEvent = { guid: string; displayName: string };\nexport type ActionResultEvent = { guid: string; displayValue: string };\nexport type ActionStopEvent = { guid: string; executionTime: number };\nexport type HistoryEvent = { history: RawMessage[]; executionTime: string };\nexport type DebugMessageEvent = DebugMessage;\n\n/**\n * Data emitted by the http chat endpoint\n */\nexport type HttpChatResponse = {\n quota: Quota;\n suggestedActions: SuggestedAction[];\n debug: any;\n context: { content: string; additionalProperties: ChatContextAttachment }[];\n actions: ActionMessage[];\n history: RawMessage[];\n executionTime: string;\n}\n\nexport interface TokenConsumption {\n percentage: number;\n}\n\nexport interface UserTokenConsumption extends TokenConsumption {\n nextResetDate: string;\n}\n\nexport interface ChatUsageMetrics {\n totalTokenCount: number;\n promptTokenCount: number;\n completionTokenCount: number;\n tokenizerType: string\n}\n\nexport interface KvObject {\n data: {\n key: string;\n value: any; // string | number | boolean | null | undefined | { [key: string]: any };\n };\n type: 'KV';\n isError: boolean;\n}\n\nexport interface ListObject {\n name: string;\n type: 'LIST';\n isError: boolean;\n items: (KvObject | ListObject)[];\n expanded: boolean;\n}\n\nexport type DebugMessage = KvObject | ListObject;\n\n\nexport type MessageHandler<T> = {\n handler: (data: T) => void;\n isGlobalHandler: boolean;\n};\n","import { Injectable, inject } from \"@angular/core\";\nimport { UserPreferences } from \"@sinequa/components/user-settings\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { NotificationsService } from \"@sinequa/core/notification\";\nimport { AuditWebService, UserSettingsWebService, PrincipalWebService } from \"@sinequa/core/web-services\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { ChatConfig, ChatMessage, ChatResponse, ChatUsageMetrics, GllmFunction, GllmModelDescription, Quota, SavedChat, SavedChatHistory, TokenConsumption, UserTokenConsumption, chatConfigSchema } from \"./types\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { IntlService } from \"@sinequa/core/intl\";\nimport get from \"lodash/get\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { ConfirmType, ModalButton, ModalResult, ModalService } from \"@sinequa/core/modal\";\nimport { parseISO, toDate } from \"date-fns\";\n\n@Injectable()\nexport abstract class ChatService {\n /** Name of the assistant plugin OR websocket endpoint. */\n REQUEST_URL: string;\n /** Emit true once the initialization of the chat process is done. */\n initProcess$ = new BehaviorSubject<boolean>(false);\n /** Emit true once the initialization of the chat config is done. */\n initConfig$ = new BehaviorSubject<boolean>(false);\n /** Global configuration of the chat. */\n chatConfig$ = new BehaviorSubject<ChatConfig | undefined>(undefined);\n /** Streaming status of the chat endpoint. */\n streaming$ = new BehaviorSubject<boolean>(false);\n /** Store the messages history of the current chat. */\n chatHistory: ChatMessage[] | undefined;\n /** List of models available on the server. */\n models: GllmModelDescription[] | undefined;\n /** List of functions available on the server. */\n functions: GllmFunction[] | undefined;\n /** List of saved chats. */\n savedChats$ = new BehaviorSubject<SavedChat[]>([]);\n /** Emit the saved chat to load. */\n loadSavedChat$ = new BehaviorSubject<SavedChat | undefined>(undefined);\n /** Emit the quota each time the chat is invoked. */\n quota$ = new BehaviorSubject<Quota | undefined>(undefined);\n /** Emit the calculated user's token consumption based on the quota. */\n userTokenConsumption$ = new BehaviorSubject<UserTokenConsumption | undefined>(undefined);\n /** Emit the chat usage metrics each time the generation of the assistant response is completed. */\n chatUsageMetrics$ = new BehaviorSubject<ChatUsageMetrics | undefined>(undefined);\n /** Emit the calculated chat's token consumption based on the chat usage metrics. */\n chatTokenConsumption$ = new BehaviorSubject<TokenConsumption | undefined>(undefined);\n /** Instance ID of the chat service defining the assistant instance. */\n private _chatInstanceId: string;\n /** ID of the current **saved chat** discussion which is used to update/get/delete it. */\n private _savedChatId: string | undefined;\n /** Generated GUID for the current non-saved chat discussion used to identify audit events.\n * If the chat is saved, the savedChatId is initialized with the value of this chatId.\n */\n private _chatId: string;\n\n public userSettingsService = inject(UserSettingsWebService);\n public notificationsService = inject(NotificationsService);\n public auditService = inject(AuditWebService);\n public prefs = inject(UserPreferences);\n public loginService = inject(LoginService);\n public appService = inject(AppService);\n public intlService = inject(IntlService);\n public modalService = inject(ModalService);\n public principalService = inject(PrincipalWebService);\n /**\n * Initialize the chat process\n */\n abstract init(): Observable<boolean>;\n\n /**\n * Initialize the REQUEST_URL\n */\n abstract getRequestsUrl(): void;\n\n get assistants(): any {\n if (!this.userSettingsService.userSettings)\n this.userSettingsService.userSettings = {};\n if (!this.userSettingsService.userSettings[\"assistants\"])\n this.userSettingsService.userSettings[\"assistants\"] = {};\n return this.userSettingsService.userSettings[\"assistants\"];\n }\n\n /**\n * Get the instance ID of the chat service\n * @returns The instance ID of the chat service\n */\n get chatInstanceId(): string {\n return this._chatInstanceId;\n }\n\n /**\n * Persist the instance ID of the chat service\n * @param instanceId The instance ID of the chat service\n */\n setChatInstanceId(instanceId: string) {\n this._chatInstanceId = instanceId;\n }\n\n /**\n * Get the ID of the current chat discussion which is used to save/get/delete it\n * @returns The ID of the current chat discussion\n */\n get savedChatId(): string | undefined {\n return this._savedChatId;\n }\n\n /**\n * Persist the ID of the current chat discussion which is used to save/get/delete it\n * @param savedChatId The ID of the current chat discussion which is used to save/get/delete it\n */\n setSavedChatId(savedChatId: string | undefined) {\n this._savedChatId = savedChatId;\n }\n\n /**\n * Get the ID of the current chat discussion which is used to identify audit events\n * @returns The ID of the current chat discussion\n */\n get chatId(): string {\n return this._chatId;\n }\n\n /**\n * Generate an GUID for the current chat discussion which is used to identify audit events\n * If the discussion is saved, the savedChatId is initialized with the value of this chatId\n * @param chatId if provided, it will be considered as the ID of the current chat discussion which is used to identify audit events\n */\n generateChatId(chatId?: string) {\n this._chatId = chatId || Utils.guid();\n }\n\n /**\n * Initialize the chat config by managing ONLY sub-object **defaultValues** configs of the standard app config (defined in the customization json tab ) and the user preferences.\n * To do so, a tracking mechanism is implemented to notify the user about the available updates in the defaultValues object of the standard app config.\n * The rest of the config object coming from \"standard app config\" is used as it is without any override.\n * Thus, the user preferences are used only for the defaultValues object.\n * This provide a centralized way to manage the rest of the config object by admins and ensure a unique common behavior for all users.\n */\n initChatConfig() {\n const key = this.chatInstanceId;\n const userSettingsConfig = this.assistants[key] || {};\n const standardChatConfig = this.appService.app?.data?.assistants?.[key];\n\n try {\n // Validate the whole config object against the schema\n chatConfigSchema.parse(standardChatConfig);\n // If the user preferences do not contain a config's defaultValues object, keep using the standard app config and nothing to store in the user preferences\n if (!userSettingsConfig.defaultValues) {\n this.chatConfig$.next({...standardChatConfig});\n this.initConfig$.next(true);\n } else { // If the user has its own defaultValues in its userSettings, then we need to check for potential updates made by admins in the meantime and how he wants to manage them\n\n // Retrieve already stored hashes in the user settings if exists\n const appliedDefaultValuesHash = userSettingsConfig.hashes?.[\"applied-defaultValues-hash\"];\n const skippedDefaultValuesHash = userSettingsConfig.hashes?.[\"skipped-defaultValues-hash\"];\n // Create a hash of the current defaultValues of the standardChatConfig\n const currentDefaultValuesHash = Utils.sha512(JSON.stringify(standardChatConfig.defaultValues));\n\n // Implement the tracking mechanism to notify the user about the available updates in the defaultValues object of the standard app config\n const condition = (currentDefaultValuesHash !== appliedDefaultValuesHash) && (currentDefaultValuesHash !== skippedDefaultValuesHash);\n if (condition) {\n this.modalService\n .confirm({\n title: \"Available updates !\",\n message: \"Changes have been made to the default configuration. Do you want to update your own version ?\",\n buttons: [\n new ModalButton({result: ModalResult.No, text: \"See no more\"}),\n new ModalButton({result: ModalResult.Ignore, text: \"Remind me later\"}),\n new ModalButton({result: ModalResult.OK, text: \"Update\", primary: true})\n ],\n confirmType: ConfirmType.Warning\n }).then(res => {\n if(res === ModalResult.OK) {\n const hashes = { ...userSettingsConfig.hashes, \"applied-defaultValues-hash\": currentDefaultValuesHash, \"skipped-defaultValues-hash\": undefined };\n // Update the chat config and store its defaultValues in the user preferences\n this.updateChatConfig({...standardChatConfig}, hashes, true);\n this.initConfig$.next(true);\n this.generateAuditEvent(\"configuration.edit\", { 'configuration': JSON.stringify({...standardChatConfig}) });\n } else if(res === ModalResult.No) {\n // Do not notify the user about changes while this skipped version is not updated\n const hashes = { ...userSettingsConfig.hashes, \"skipped-defaultValues-hash\": currentDefaultValuesHash };\n this.updateChatConfig({...standardChatConfig, defaultValues: userSettingsConfig.defaultValues}, hashes, false);\n this.initConfig$.next(true);\n } else {\n // Just pick the version in the user settings, nothing to be updated\n this.chatConfig$.next({...standardChatConfig, defaultValues: userSettingsConfig.defaultValues});\n this.initConfig$.next(true);\n }\n });\n } else { // No available updates Or updates has been already skipped, then just pick the version in the user settings\n this.chatConfig$.next({...standardChatConfig, defaultValues: userSettingsConfig.defaultValues});\n this.initConfig$.next(true);\n }\n }\n } catch (error) {\n this.notificationsService.error(`Missing valid configuration for the assistant instance '${key}'`);\n throw new Error(`Missing valid configuration for the assistant instance '${key}' . \\n ${JSON.stringify(error.issues, null, 2)}`);\n }\n }\n\n /**\n * Update the chat config and store its defaultValues in the user preferences\n * @param config The updated chat config\n * @param hashes The updated hashes to store in the user preferences\n * @param notify Whether to notify the user about the update\n * @param successCallback The callback to execute if the update is successful\n * @param errorCallback The callback to execute if the update fails\n */\n updateChatConfig(config: ChatConfig, hashes?: {\"applied-defaultValues-hash\"?: string, \"skipped-defaultValues-hash\"?: string}, notify = true, successCallback?: () => any, errorCallback?: () => any) {\n this.chatConfig$.next(config);\n const assistants = Object.assign({}, this.assistants);\n assistants[this.chatInstanceId] = { ...assistants[this.chatInstanceId], defaultValues: config.defaultValues };\n if(hashes) assistants[this.chatInstanceId].hashes = hashes;\n this.userSettingsService.patch({ assistants }).subscribe(\n next => {},\n error => {\n if(notify) {\n errorCallback ? errorCallback() : this.notificationsService.error(`The update of the assistant instance '${this.chatInstanceId}' configuration failed`);\n }\n console.error(\"Could not patch assistants!\", error);\n },\n () => {\n if(notify) {\n successCallback ? successCallback() : this.notificationsService.success(`The assistant instance '${this.chatInstanceId}' configuration has been successfully updated`);\n }\n }\n );\n }\n\n /**\n * Calls the Fetch API to retrieve a new message given all previous messages\n */\n abstract fetch(messages: ChatMessage[], query: Query): Observable<ChatResponse>\n\n /**\n * Return the list of models available on the server\n */\n abstract listModels(): Observable<GllmModelDescription[] | undefined>;\n\n /**\n * Return the list of functions available on the server AND matching enabled functions in the chat config\n */\n abstract listFunctions(): Observable<GllmFunction[] | undefined>;\n\n /**\n * A handler for quota updates each time the chat is invoked.\n * It emits the updated quota to the quota$ subject, emits accordingly the updated user's tokens consumption and notifies the user if the max quota is reached.\n * @param quota The updated quota\n * @param propagateError Whether to propagate the error to the caller\n */\n updateQuota(quota: Quota, propagateError = false) {\n this.quota$.next(quota);\n const nextResetDate = this.formatDateTime(quota.nextResetUTC+\"+00:00\"); // This +00:00 is to ensure dates will be properly converted to local time\n const consumptionPercentage = Math.round((quota.tokenCount * 100 / quota.periodTokens) * 100) / 100;\n this.userTokenConsumption$.next({percentage: consumptionPercentage, nextResetDate});\n if(quota.maxQuotaReached) {\n const msg = `Sorry, you have exceeded the allowed quota. Please retry starting from ${nextResetDate}.`;\n this.notificationsService.error(msg);\n if(propagateError) throw new Error(msg);\n }\n }\n\n /**\n * A handler for chat usage metrics each time the generation of the assistant response is completed.\n * It emits the chat usage metrics to the chatUsageMetrics$ subject, emits accordingly the updated chat's tokens consumption\n * @param chatUsageMetrics The chat usage metrics\n */\n updateChatUsageMetrics(chatUsageMetrics: ChatUsageMetrics) {\n this.chatUsageMetrics$.next(chatUsageMetrics);\n const currentModel = this.getModel(this.chatConfig$.value!.defaultValues.service_id, this.chatConfig$.value!.defaultValues.model_id);\n const consumptionPercentage = Math.round((chatUsageMetrics.totalTokenCount * 100 / (currentModel!.contextWindowSize - currentModel!.maxGenerationSize)) * 100) / 100;\n this.chatTokenConsumption$.next({percentage: consumptionPercentage});\n }\n\n /**\n * Get the model description for the given (serviceId + modelId)\n * If a model is not found, an error message is returned\n * @param serviceId The serviceId of the model\n * @param modelId The modelId of the model\n * @returns The model description\n */\n getModel(serviceId: string, modelId: string): GllmModelDescription | undefined{\n let model = this.models?.find(m => m.serviceId === serviceId && m.modelId === modelId);\n // Handle obsolete config\n if(!model) {\n this.notificationsService.error(`FATAL ERROR : The model (serviceId = '${serviceId}', modelId = '${modelId}') is no longer available. Please contact an admin for further information.`);\n throw new Error(`FATAL ERROR : The model (serviceId = '${serviceId}', modelId = '${modelId}') is no longer available`);\n }\n return model;\n }\n\n /**\n * Fetch the list saved chats belonging to a specific instance of the assistant\n */\n abstract listSavedChat(): void;\n\n /**\n * Return the saved chat with the given id, if exists. Otherwise, return undefined\n * @param id The id of the saved chat\n */\n abstract getSavedChat(id: string): Observable<SavedChatHistory | undefined>;\n\n /**\n * Save a chat with the given messages\n * @param messages The messages to add to the saved chat index\n * @returns The saved chat\n */\n abstract addSavedChat(messages: ChatMessage[]): Observable<SavedChat>;\n\n /**\n * Update a saved chat with the given id.\n * @param id The id of the saved chat\n * @param name The new name of the saved chat, if provided\n * @param messages The messages to update the saved chat history, if provided\n * @returns True if the saved chat has been successfully updated\n */\n abstract updateSavedChat(id: string, name?: string, messages?: ChatMessage[]): Observable<SavedChat>;\n\n /**\n * Bulk delete of saved chats matching the given ids\n * @param ids List of ids of the saved chats to delete\n * @returns The number of deleted chats\n */\n abstract deleteSavedChat(ids: string[]): Observable<number>;\n\n /**\n * Generate an audit event with the given type and details. The generated audit event is sent afterwards via the AuditWebService\n * @param type Audit event type\n * @param details Audit event details\n * @param id Actions (savedChat delete/rename/...) may occur on a specific chat different than the current one stored in this service, so the chat id can be provided\n */\n generateAuditEvent(type: string, details: Record<string, any>, id?: string): void {\n const baseDetails = {\n \"url\": decodeURIComponent(window.location.href),\n \"app\": this.appService.appName,\n \"user-id\": this.principalService.principal?.userId,\n \"instance-id\": this.chatInstanceId,\n \"chat-id\": id || this.chatId,\n \"service-id\": this.chatConfig$.value!.defaultValues.service_id,\n \"model-id\": this.chatConfig$.value!.defaultValues.model_id,\n };\n const audit = {\n type,\n detail: {\n ...baseDetails,\n ...details\n }\n }\n this.auditService.notify(audit);\n }\n\n /**\n * Format a date string in UTC to a local date string\n * @param value Date string in UTC to format\n * @returns A formatted local date string\n */\n protected formatDateTime(value: string): string {\n const localDate = toDate(parseISO(value));\n return this.intlService[\"formatTime\"](localDate, {day: \"numeric\", month: \"short\", year: \"numeric\", timeZoneName: 'short'});\n }\n\n /**\n * Takes a text prompt that may contain placeholders for variables\n * and replaces these placeholders if it finds a match in the given\n * context object.\n */\n static formatPrompt(prompt: string, context: any) {\n return prompt.replace(\n /{{(.*?)}}/g,\n (match, expr) => get(context, expr) ?? match\n );\n }\n\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { AuthenticationService } from \"@sinequa/core/login\";\nimport { ConnectionOptions, SignalRWebService } from \"@sinequa/core/web-services\";\nimport { Query } from \"@sinequa/core/app-utils\";\nimport { HttpTransportType, HubConnection, LogLevel, MessageHeaders } from \"@microsoft/signalr\";\nimport { ActionMessage, ActionResultEvent, ActionStartEvent, ActionStopEvent, MessageEvent, ChatMessage, ChatPayload, ChatResponse, GllmFunction, GllmModelDescription, MessageHandler, HistoryEvent, ErrorEvent, QuotaEvent, ChatContextAttachment, ContextMessageEvent, SavedChatHistory, SavedChat, ChatProgress, SuggestedActionsEvent, SuggestedAction, DebugMessageEvent, DebugMessage } from \"./types\";\nimport { ChatService } from \"./chat.service\";\nimport { merge, fromEvent, Observable, Subject, catchError, filter, forkJoin, map, shareReplay, switchMap, tap, throwError, takeUntil, take } from \"rxjs\";\n\n@Injectable()\nexport class WebSocketChatService extends ChatService {\n\n public connection: HubConnection | undefined;\n public connectionBuilt$ = new Subject<void>(); // Emit when the connection is built\n public connectionStarted$ = new Subject<void>(); // Emit when the connection is started\n\n private _messageHandlers: Map<string, MessageHandler<any>> = new Map();\n private _actionMap = new Map<string, ActionMessage>();\n private _progress: ChatProgress[] | undefined = undefined;\n private _content = \"\";\n private _executionTime: string;\n private _attachments: ChatContextAttachment[] = [];\n private _suggestedActions: SuggestedAction[] = [];\n private _debugMessages: DebugMessage[] | undefined = undefined;\n\n public signalRService = inject(SignalRWebService);\n public authenticationService = inject(AuthenticationService);\n\n constructor() {\n super();\n }\n\n /**\n * Initialize the chat process after the login is complete.\n * It includes building and starting a connection, executing parallel requests for models and functions, and handling errors during the process.\n *\n * @returns An Observable<boolean> indicating the success of the initialization process.\n */\n init(): Observable<boolean> {\n return this.loginService.events.pipe(\n filter((e) => e.type === 'login-complete'),\n tap(() => this.getRequestsUrl()),\n // Build the connection and handle the completion with the connectionBuilt$ subject\n switchMap(() => this.buildConnection()),\n tap(() => {\n this.initMessageHandlers();\n this.connectionBuilt$.next();\n }),\n // Start the connection and handle the completion with the connectionStarted$ subject\n switchMap(() => this.startConnection()),\n // Execute parallel requests for models and functions\n switchMap(() => {\n this.connectionStarted$.next();\n return forkJoin([\n this.listModels(),\n this.listFunctions()\n ])\n }),\n // Map the results of parallel requests to a boolean indicating success\n map(([models, functions]) => {\n this.initProcess$.next(true);\n return !!models && !!functions\n }),\n // Any errors during the process are caught, logged, and re-thrown to propagate the error further\n catchError((error) => {\n console.error('Error occurred:', error);\n return throwError(() => error);\n }),\n // Cache and replay the emitted value for subsequent subscribers\n shareReplay(1)\n );\n }\n\n /**\n * Define the assistant endpoint to use for the websocket requests\n * It can be overridden by the app config\n */\n getRequestsUrl() {\n if (this.chatConfig$.value!.connectionSettings.websocketEndpoint) {\n this.REQUEST_URL = this.chatConfig$.value!.connectionSettings.websocketEndpoint;\n } else {\n throw new Error(`The property 'websocketEndpoint' must be provided when attempting to use 'WebSocket' in assistant instance`);\n }\n }\n\n listModels(): Observable<GllmModelDescription[] | undefined> {\n const modelsSubject = new Subject<GllmModelDescription[] | undefined>();\n\n this.connection!.on('ListModels', (res) => {\n this.models = (res.models as GllmModelDescription[] | undefined)?.filter(model => !!model.enable);\n modelsSubject.next(this.models);\n modelsSubject.complete()\n });\n\n // Send the request to get the list of models\n this.connection!.invoke('ListModels', { debug: this.chatConfig$.value!.defaultValues.debug })\n .catch(error => {\n console.error('Error invoking ListModels:', error);\n modelsSubject.complete()\n return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection\n })\n\n return modelsSubject.asObservable();\n }\n\n listFunctions(): Observable<GllmFunction[] | undefined> {\n const functionsSubject = new Subject<GllmFunction[] | undefined>();\n\n this.connection!.on('ListFunctions', (res) => {\n this.functions = (res.functions as GllmFunction[] | undefined)?.filter(func => func.enabled);\n functionsSubject.next(this.functions);\n functionsSubject.complete()\n });\n\n // Send the request to get the list of functions\n this.connection!.invoke('ListFunctions', { debug: this.chatConfig$.value!.defaultValues.debug })\n .catch(error => {\n console.error('Error invoking ListFunctions:', error);\n functionsSubject.complete()\n return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection\n })\n\n return functionsSubject.asObservable();\n }\n\n fetch(messages: ChatMessage[], query: Query): Observable<ChatResponse> {\n // Start streaming by invoking the Chat method\n this.streaming$.next(true);\n\n // Prepare the payload to send to the Chat method\n const data: ChatPayload = {\n history: messages,\n functions: this.chatConfig$.value!.defaultValues.functions?.filter(func => func.enabled).map(func => func.name),\n debug: this.chatConfig$.value!.defaultValues.debug,\n serviceSettings: {\n service_id: this.chatConfig$.value!.defaultValues.service_id,\n model_id: this.chatConfig$.value!.defaultValues.model_id,\n top_p: this.chatConfig$.value!.defaultValues.top_p,\n temperature: this.chatConfig$.value!.defaultValues.temperature,\n max_tokens: this.chatConfig$.value!.defaultValues.max_tokens,\n ...this.chatConfig$.value!.additionalServiceSettings\n },\n appQuery: {\n app: this.appService.appName,\n query\n }\n }\n if (this.chatConfig$.value!.savedChatSettings.enabled) {\n data.instanceId = this.chatInstanceId;\n data.savedChatId = this.savedChatId;\n }\n\n let response: ChatMessage = {role: \"assistant\", content: \"\", additionalProperties: {display: true}}; // here display: true is needed in order to be able to show the progress\n\n // Create a Subject to signal completion\n const completion$ = new Subject<void>();\n\n // Create observables for each non-global handler in the _messageHandlers map (default and eventual custom ones) once it is triggered by the hub connection\n const observables = Array\n .from(this._messageHandlers.entries())\n .filter(([eventName, eventHandler]) => !eventHandler.isGlobalHandler)\n .map(([eventName, eventHandler]) => {\n return fromEvent<any>(this.connection!, eventName).pipe(\n map((event) => eventHandler.handler(event)) // Execute the corresponding handler\n );\n });\n\n // Then merge them into a single observable in order to simulate the streaming behavior\n const combined$ = merge(...observables).pipe(\n takeUntil(completion$) // Complete the observable when completion$ emits\n );\n\n // Invoke the Chat method\n this.connection!.invoke('Chat', data)\n .catch(error => {\n console.error('Error invoking Chat:', error);\n return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection\n })\n .finally(() => {\n this.streaming$.next(false); // Complete streaming regardless of success or error\n this._actionMap.clear(); // Clear the _actionMap\n this._content = \"\"; // Clear the _content\n this._progress = undefined; // Clear the _progress\n this._attachments = []; // Clear the _attachments\n this._suggestedActions = []; // Clear the _suggestedActions\n this._debugMessages = []; // Clear the _debugMessages\n this._executionTime = \"\"; // Clear the _executionTime\n completion$.next(); // Emit a signal to complete the observables\n completion$.complete(); // Complete the subject\n });\n\n // Return the merged observables\n return combined$.pipe(\n map(() => {\n // Define $progress from the _actionMap\n const actions = Array.from(this._actionMap.values());\n this._progress = actions.length > 0\n ? actions.map((a) => ({\n title: a.displayName ?? \"\",\n content: a.displayValue ?? \"\",\n done: a.executionTime !== undefined,\n time: a.executionTime,\n }))\n : undefined;\n\n // As soon as the first _content, $progress, _attachments or __suggestedActions is defined and not empty, the assistant is considered as streaming\n if(!!this._content || this._progress || this._attachments.length > 0 || this._suggestedActions.length > 0) {\n response = {...response, content: this._content, additionalProperties: {...response.additionalProperties, $progress: this._progress, $attachment: this._attachments, $suggestedAction: this._suggestedActions, $debug: this._debugMessages}};\n }\n\n // Return the result\n return { history: [...messages, response], executionTime: this._executionTime };\n })\n );\n }\n\n listSavedChat(): void {\n const data = {\n instanceId: this.chatInstanceId,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatList', (res) => {\n this.savedChats$.next(res.savedChats); // emits the result to the savedChats$ subject\n });\n\n // Invoke the method SavedChatList\n this.connection!.invoke('SavedChatList', data)\n .catch(error => {\n console.error('Error invoking SavedChatList:', error);\n return Promise.resolve();\n });\n }\n\n getSavedChat(id: string): Observable<SavedChatHistory | undefined> {\n const savedChatSubject = new Subject<SavedChatHistory | undefined>();\n\n const data = {\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatGet', (res) => {\n savedChatSubject.next(res.savedChat);\n savedChatSubject.complete()\n });\n\n // Invoke the method SavedChatGet\n this.connection!.invoke('SavedChatGet', data)\n .catch(error => {\n console.error('Error invoking SavedChatGet:', error);\n savedChatSubject.complete()\n return Promise.resolve();\n })\n\n return savedChatSubject.asObservable();\n }\n\n addSavedChat(messages: ChatMessage[]): Observable<SavedChat> {\n const addSavedChatSubject = new Subject<SavedChat>();\n\n const data = {\n instanceId: this.chatInstanceId,\n savedChatId: this.chatId,\n history: messages,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatAdd', (res) => {\n this.setSavedChatId(res.savedChat.id); // Persist the savedChatId\n this.generateAuditEvent('saved-chat.add', {}, res.savedChat.id); // Generate audit event\n addSavedChatSubject.next(res.savedChat);\n addSavedChatSubject.complete()\n });\n\n // Invoke the method SavedChatAdd\n this.connection!.invoke('SavedChatAdd', data)\n .catch(error => {\n console.error('Error invoking SavedChatAdd:', error);\n addSavedChatSubject.complete()\n return Promise.resolve();\n })\n\n return addSavedChatSubject.asObservable();\n }\n\n updateSavedChat(id: string, name?: string, messages?: ChatMessage[]): Observable<SavedChat> {\n const updateSavedChatSubject = new Subject<SavedChat>();\n\n const data = {\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n if(name) data[\"title\"] = name;\n if(messages) data[\"history\"] = messages;\n\n this.connection!.on('SavedChatUpdate', (res) => {\n updateSavedChatSubject.next(res.savedChat);\n updateSavedChatSubject.complete()\n });\n\n // Invoke the method SavedChatUpdate\n this.connection!.invoke('SavedChatUpdate', data)\n .catch(error => {\n console.error('Error invoking SavedChatUpdate:', error);\n updateSavedChatSubject.complete()\n return Promise.resolve();\n })\n\n return updateSavedChatSubject.asObservable();\n }\n\n deleteSavedChat(ids: string[]): Observable<number> {\n const deleteSavedChatSubject = new Subject<number>();\n\n const data = {\n instanceId: this.chatInstanceId,\n SavedChatIds: ids,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatDelete', (res) => {\n deleteSavedChatSubject.next(res.deleteCount);\n deleteSavedChatSubject.complete();\n });\n\n // Invoke the method SavedChatDelete\n this.connection!.invoke('SavedChatDelete', data)\n .catch(error => {\n console.error('Error invoking SavedChatDelete:', error);\n deleteSavedChatSubject.complete();\n return Promise.resolve();\n })\n\n return deleteSavedChatSubject.asObservable();\n }\n\n /**\n * Initialize out-of-the-box handlers\n * It is a placeholder for non-streaming scenarios, where you invoke a specific hub method, and the server responds with a single message or a result\n */\n initMessageHandlers() {\n this.addMessageHandler(\n \"Debug\",\n { handler: (debug: any) => console.log(debug),\n isGlobalHandler: true\n }\n );\n this.addMessageHandler(\n \"ActionStart\",\n { handler: (action: ActionStartEvent) => this._actionMap.set(action.guid, action),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"ActionResult\",\n {\n handler: (action: ActionResultEvent) => this._actionMap.set(action.guid, { ...this._actionMap.get(action.guid), ...action }),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"ActionStop\",\n {\n handler: (action: ActionStopEvent) => this._actionMap.set(action.guid, { ...this._actionMap.get(action.guid), ...action }),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"ContextMessage\",\n {\n handler: (message: ContextMessageEvent) => this._attachments.push(message.metadata),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"Message\",\n {\n handler: (message: MessageEvent) => this._content += message ?? \"\",\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"History\",\n {\n handler: (history: HistoryEvent) => {\n this.chatHistory = history.history;\n // Re-attach the {$progress, $attachment, $suggestedAction and $debug} of the last response to the last assistant's response in the chat history\n this.chatHistory.at(-1)!.additionalProperties.$progress = this._progress;\n this.chatHistory.at(-1)!.additionalProperties.$attachment = this._attachments;\n this.chatHistory.at(-1)!.additionalProperties.$suggestedAction = this._suggestedActions;\n this.chatHistory.at(-1)!.additionalProperties.$debug = this._debugMessages;\n // Emit the updated chat usage metrics once the generation of the assistant response is completed\n if (!!this.chatHistory.at(-1)?.additionalProperties.usageMetrics) {\n this.updateChatUsageMetrics(this.chatHistory.at(-1)!.additionalProperties.usageMetrics!);\n }\n // Save/update the chat if savedChat enabled\n if (this.chatConfig$.value!.savedChatSettings.enabled && this.chatHistory.some((msg) => msg.additionalProperties?.isUserInput === true)) {\n const action = !this.savedChatId ? this.addSavedChat(this.chatHistory) : this.updateSavedChat(this.savedChatId, undefined, this.chatHistory);\n action.pipe(take(1)).subscribe();\n }\n this._executionTime = history.executionTime;\n // Generate audit event\n const details = {\n 'duration': this._executionTime,\n 'text': this.chatHistory.at(-1)!.content,\n 'role': this.chatHistory.at(-1)!.role, // 'assistant'\n 'rank': this.chatHistory.length - 1,\n 'generation-tokencount': this.chatHistory.at(-1)!.additionalProperties.usageMetrics!.completionTokenCount,\n 'prompt-tokencount': this.chatHistory.at(-1)!.additionalProperties.usageMetrics!.promptTokenCount,\n 'attachments': JSON.stringify(this._attachments.map(({ recordId, contextId, parts, type }) => ({\n recordId,\n contextId,\n parts: parts.map(({ partId, text }) => ({ partId, text })),\n type\n })))\n };\n this.generateAuditEvent('message', details);\n },\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"Error\",\n {\n handler: (error: ErrorEvent) => {\n console.error(error);\n this.notificationsService.error(error);\n },\n isGlobalHandler: true\n }\n );\n this.addMessageHandler(\n \"Quota\",\n {\n handler: (message: QuotaEvent) => this.updateQuota(message.quota),\n isGlobalHandler: true\n }\n );\n this.addMessageHandler(\n \"SuggestedActions\",\n {\n handler: (message: SuggestedActionsEvent) => {\n // Suggested actions are concatenated to the existing ones in case of multiple events \"SuggestedActions\"\n this._suggestedActions = this._suggestedActions.concat(message.suggestedActions);\n },\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"DebugDisplay\",\n {\n handler: (message: DebugMessageEvent) => this._debugMessages = this._debugMessages ? this._debugMessages.concat(message) : [message],\n isGlobalHandler: false\n }\n );\n }\n\n /**\n * Override and register the entire _messageHandlers map by merging the provided map with the default one\n * @param _messageHandlers\n */\n overrideMessageHandlers<T>(_messageHandlers: Map<string, MessageHandler<T>>) {\n // Clear the already registered global chat handlers before merging the new ones\n this._messageHandlers.forEach((eventHandler, eventName) => {\n if(eventHandler.isGlobalHandler) {\n this.unsubscribeMessageHandler(eventName);\n }\n });\n\n // Merge the new event handlers with the existing ones\n this._messageHandlers = new Map([...this._messageHandlers, ..._messageHandlers]);\n\n // Register the global chat handlers among the merged map\n this._messageHandlers.forEach((eventHandler, eventName) => {\n if(eventHandler.isGlobalHandler) {\n this.registerMessageHandler(eventName, eventHandler);\n }\n });\n }\n\n /**\n * Add a listener for a specific event.\n * If a listener for this same event already exists, it will be overridden.\n * If the listener has \"isChatGlobalHandler\" set to true, it will be registered to the hub connection.\n * @param eventName Name of the event to register a listener for\n * @param eventHandler The handler to be called when the event is received\n */\n addMessageHandler<T>(eventName: string, eventHandler: MessageHandler<T>) {\n this._messageHandlers.set(eventName, eventHandler);\n if(eventHandler.isGlobalHandler) {\n this.registerMessageHandler(eventName, eventHandler);\n }\n }\n\n /**\n * Dynamically register a listener for a specific event.\n * If a listener for this event already exists, it will be overridden.\n * @param eventName Name of the event to register a listener for\n * @param eventHandler The handler to be called when the event is received\n */\n protected registerMessageHandler<T>(eventName: string, eventHandler: MessageHandler<T>) {\n if (!this.connection) {\n console.log(\"No connection found to register the listener\" + eventName);\n return;\n }\n\n this.connection.on(eventName, (data: T) => {\n eventHandler.handler(data);\n });\n }\n\n /**\n * Remove a listener for a specific event from the _messageHandlers map and unsubscribe from receiving messages for this event from the SignalR hub.\n * @param eventName Name of the event to remove the listener for\n */\n removeMessageHandler(eventName: string) {\n this._messageHandlers.delete(eventName);\n this.unsubscribeMessageHandler(eventName);\n }\n\n /**\n * Unsubscribe from receiving messages for a specific event from the SignalR hub.\n * ALL its related listeners will be removed from hub connection\n * This is needed to prevent accumulating old listeners when overriding the entire _messageHandlers map\n * @param eventName Name of the event\n */\n protected unsubscribeMessageHandler(eventName: string) {\n this.connection!.off(eventName);\n }\n\n /**\n * Build a connection to the signalR websocket and register default listeners to the methods defined in the server hub class\n * @param options The options for the connection. It overrides the default options\n * @param logLevel Define the log level displayed in the console\n * @returns Promise that resolves when the connection is built\n */\n buildConnection(options?: ConnectionOptions): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!this.REQUEST_URL) {\n reject(new Error(\"No endpoint provided to connect the websocket to\"));\n return;\n }\n const logLevel = this.getLogLevel();\n this.connection = this.signalRService.buildConnection(this.REQUEST_URL, {...this.defaultOptions, ...options}, logLevel, true);\n resolve();\n });\n }\n\n /**\n * Start the connection\n * @returns Promise that resolves when the connection is started\n */\n startConnection(): Promise<void> {\n return this.signalRService.startConnection(this.connection);\n }\n\n /**\n * Stop the connection\n * @returns Promise that resolves when the connection is stopped\n */\n stopConnection(): Promise<void> {\n return this.signalRService.stopConnection(this.connection);\n }\n\n private getTransports(): HttpTransportType {\n switch (this.chatConfig$.value?.connectionSettings.signalRTransport) {\n case \"WebSockets\":\n return HttpTransportType.WebSockets;\n case \"ServerSentEvents\":\n return HttpTransportType.ServerSentEvents;\n case \"LongPolling\":\n return HttpTransportType.LongPolling;\n default:\n return HttpTransportType.None;\n }\n }\n\n private getLogLevel(): LogLevel {\n switch (this.chatConfig$.value?.connectionSettings.signalRLogLevel) {\n case \"Critical\":\n return LogLevel.Critical; // Log level for diagnostic messages that indicate a failure that will terminate the entire application.\n case \"Debug\":\n return LogLevel.Debug; // Log level for low severity diagnostic messages.\n case \"Error\":\n return LogLevel.Error; // Log level for diagnostic messages that indicate a failure in the current operation.\n case \"Information\":\n return LogLevel.Information; // Log level for informational diagnostic messages.\n case \"None\":\n return LogLevel.None; // The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted.\n case \"Trace\":\n return LogLevel.Trace; // Log level for very low severity diagnostic messages.\n case \"Warning\":\n return LogLevel.Warning; // Log level for diagnostic messages that indicate a non-fatal problem.\n default:\n return LogLevel.None; // The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted.\n }\n }\n\n get defaultOptions(): ConnectionOptions {\n let headers: MessageHeaders = {\n \"sinequa-force-camel-case\": \"true\",\n \"x-language\": this.intlService.currentLocale.name,\n \"ui-language\": this.intlService.currentLocale.name,\n };\n if (this.authenticationService.processedCredentials) {\n headers = {...headers, \"sinequa-csrf-token\": this.authenticationService.processedCredentials.data.csrfToken};\n };\n // For the first GET request sent by signalR to start a WebSocket protocol,\n // as far as we know, signalR only lets us tweak the request with this access token factory\n // so we pass along the Sinequa CSRF token to pass the CSRF check..\n return {\n transport: this.getTransports(),\n withCredentials: true,\n headers,\n accessTokenFactory: () => this.authenticationService.processedCredentials?.data?.csrfToken || \"\"\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport SafeColor from 'safecolor'\n\n@Component({\n selector: 'sq-initials-avatar',\n templateUrl: './initials-avatar.component.html',\n styleUrls: ['./initials-avatar.component.scss'],\n standalone: true,\n imports: [CommonModule]\n})\nexport class InitialsAvatarComponent {\n\n @Input() fullName: string = '';\n @Input() size: number = 1.5; // in rem\n\n /**\n * Gives initials of a name and a safe color background to use,\n * assuming text color will be white\n * @param fullName full name to evaluate intials for\n * @param split string to use has splitter for `fullName`\n * @returns an `object` containing initials and color\n */\n getInitialsAndColorFromFullName(fullName: string, split: string = ' '): { initials: string; color: string } {\n return { initials: this.getInitialsFromFullName(fullName, split), color: this.getColorFromName(fullName) };\n }\n\n /**\n * Gives initials of a name, ie:\n * ```\n * getInitialForFullName('John Snow') => 'JS'\n * getInitialForFullName('Geralt of Rivia', ' of ') => 'GR'\n * ```\n * @param fullName full name to evaluate intial for\n * @param split string to use has splitter\n * @returns string containg the first letter of splitted name\n */\n getInitialsFromFullName(fullName: string, split: string = ' '): string {\n if (!fullName) return '';\n\n const names = fullName.split(split);\n return names[0][0] + (names[1]?.[0] ?? '');\n }\n\n /**\n * Gets a random color using text as seed\n * @param text string to use for color generation\n * @returns string formatted like `rgb(xxx, xxx, xxx)`\n */\n getColorFromName(text: string): string {\n const safeColor = new SafeColor({\n color: [255, 255, 255],\n contrast: 4.5\n });\n\n return safeColor.random(text);\n }\n\n}\n","<span class=\"sq-initials-avatar\" *ngIf=\"getInitialsAndColorFromFullName(fullName) as meta\"\n [ngStyle]=\"{ 'background-color': meta.color }\" [style.height.rem]=\"size\" [style.width.rem]=\"size\"\n [style.line-height.rem]=\"size\" [style.font-size.rem]=\"size/2\">\n {{ meta.initials | uppercase }}\n</span>","export interface IconFormat {\n icon: string;\n color?: string;\n}\n\nexport const defaultFormatIcons: Record<string, IconFormat> = {\n \"extractslocations\": { icon: \"far fa-file-alt\" },\n \"matchlocations\": { icon: \"far fa-flag\" },\n \"geo\": { icon: \"fas fa-map-marker-alt\" },\n \"person\": { icon: \"fas fa-user\" },\n \"company\": { icon: \"fas fa-building\" },\n \"title\": { icon: \"fas fa-tag\" },\n \"modified\": { icon: \"far fa-calendar-alt\" },\n \"size\": { icon: \"fas fa-weight-hanging\" },\n \"treepath\": { icon: \"fas fa-folder-open\" },\n \"filename\": { icon: \"far fa-file-alt\" },\n \"authors\": { icon: \"fas fa-user-edit\" },\n \"accesslists\": { icon: \"fas fa-lock\" },\n \"doctype\": { icon: \"far fa-file\" },\n \"documentlanguages\": { icon: \"fas fa-globe-americas\" },\n \"globalrelevance\": { icon: \"far fa-star\" },\n \"indexationtime\": { icon: \"fas fa-search\" },\n \"concepts\": { icon: \"far fa-comment-dots\" },\n \"keywords\": { icon: \"fas fa-tags\" },\n \"matchingpartnames\": { icon: \"fas fa-align-left\" },\n \"msgfrom\": { icon: \"fas fa-envelope\" },\n \"msgto\": { icon: \"fas fa-envelope-open-text\" },\n\n \"file\": { icon: \"far fa-file\" },\n \"htm\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"html\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"xhtm\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"xhtml\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"mht\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"doc\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"docx\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"docm\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"dot\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"dotx\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"dotm\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"rtf\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"odt\": { icon: \"far fa-file-word\", color: 'grey' },\n \"ott\": { icon: \"far fa-file-word\", color: 'grey' },\n \"gdoc\": { icon: \"far fa-file-word\", color: 'blue' },\n \"xls\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xlsx\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xlt\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xltx\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xlsm\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xltm\": { icon: \"far fa-file-excel\", color: 'green' },\n \"gsheet\": { icon: \"far fa-file-excel\", color: 'darkgreen' },\n \"ods\": { icon: \"far fa-file-excel\", color: 'lightgreen' },\n \"ots\": { icon: \"far fa-file-excel\", color: 'lightgreen' },\n \"ppt\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pptx\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pptm\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pptm2\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pps\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"ppsx\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"ppsm\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pot\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"potx\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"potm\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"odp\": { icon: \"far fa-file-powerpoint\", color: 'red' },\n \"otp\": { icon: \"far fa-file-powerpoint\", color: 'red' },\n \"gslides\": { icon: \"far fa-file-powerpoint\", color: 'orange' },\n \"pdf\": { icon: \"far fa-file-pdf\", color: '#ec2e2e' },\n \"jpg\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"jpeg\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"bmp\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"tiff\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"tif\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"gif\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"png\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"mp4\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"flv\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"swf\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mts\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"divx\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"wmv\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"avi\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mov\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mpg\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mpeg\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"asf\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"rm\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mp3\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"wav\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"ogg\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"wma\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"aac\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"m3u\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"txt\": { icon: \"far fa-file-alt\", color: '#202020' },\n \"text\": { icon: \"far fa-file-alt\", color: '#202020' },\n \"xml\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"cs\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"java\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"cpp\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"c\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"h\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"hpp\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"js\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"ts\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"zip\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"7zip\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"7z\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"rar\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"gz\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"notes\": { icon: \"fas fa-file-invoice\", color: 'orange' },\n \"quickr\": { icon: \"fas fa-file-invoice\", color: 'orange' },\n \"email\": { icon: \"far fa-envelope\", color: 'black' },\n \"mail\": { icon: \"far fa-envelope\", color: 'black' },\n \"msg\": { icon: \"far fa-envelope\", color: 'black' },\n \"mdb\": { icon: \"far fa-database\", color: 'purple' },\n \"odb\": { icon: \"far fa-database\", color: 'darkred' },\n \"otb\": { icon: \"far fa-database\", color: 'darkred' },\n \"xsn\": { icon: \"fas fa-file-excel\", color: 'purple' },\n \"gform\": { icon: \"fas fa-file-excel\", color: 'purple' },\n \"one\": { icon: \"far fa-book\", color: 'purple' },\n \"odf\": { icon: \"fas fa-file-medical-alt\", color: 'grey' },\n \"otf\": { icon: \"fas fa-file-medical-alt\", color: 'grey' },\n \"vsdx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vsx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vtx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vdx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vssx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vstx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vsdm\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vssm\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vstm\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vdw\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vsd\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vss\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vst\": { icon: \"far fa-object-group\", color: 'purple' },\n \"odg\": { icon: \"far fa-object-group\", color: 'orange' },\n \"otg\": { icon: \"far fa-object-group\", color: 'orange' },\n \"gdraw\": { icon: \"far fa-object-group\", color: 'red' },\n \"pub\": { icon: \"far fa-object-group\", color: 'darkgreen' },\n \"ldap\": { icon: \"far fa-users\", color: 'brown' },\n \"ad\": { icon: \"far fa-users\", color: 'brown' },\n \"mmp\": { icon: \"fas fa-file-medical\", color: 'grey' },\n \"mppx\": { icon: \"fas fa-file-medical\", color: 'grey' },\n}","import { Component, Input, OnChanges, ViewEncapsulation } from '@angular/core';\nimport { defaultFormatIcons } from './icons';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'sq-format-icon',\n templateUrl: './format-icon.component.html',\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [CommonModule]\n})\nexport class FormatIconComponent implements OnChanges {\n\n @Input() extension: string;\n\n private _formatIcons = defaultFormatIcons;\n \n icon: string;\n\n ngOnChanges() {\n const icon = this.extension ? this._formatIcons[this.extension] : undefined;\n this.icon = icon?.icon || this._formatIcons.file.icon;\n }\n\n}\n","<span *ngIf=\"icon\" class=\"{{icon}}\"></span>","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UtilsModule } from '@sinequa/components/utils';\nimport { FormatIconComponent } from '../format-icon/format-icon.component';\nimport { ChatContextAttachment, DocumentPart } from '../types';\n\n@Component({\n selector: 'sq-chat-reference',\n templateUrl: './chat-reference.component.html',\n styleUrls: ['./chat-reference.component.scss'],\n standalone: true,\n imports: [CommonModule, UtilsModule, FormatIconComponent]\n})\nexport class ChatReferenceComponent {\n\n @Input() reference: string;\n @Input() attachment: ChatContextAttachment;\n @Input() partId?: number;\n\n @Output() openDocument = new EventEmitter<ChatContextAttachment>();\n @Output() openPreview = new EventEmitter<ChatContextAttachment>();\n\n get parts(): DocumentPart[] {\n if (!this.attachment) return [];\n return this.attachment.parts.filter(part => (!this.partId || part.partId === this.partId) && !!part.text);\n }\n\n expandAttachment() {\n if (this.partId) return;\n this.attachment['$expanded'] = !this.attachment['$expanded'];\n }\n}\n","<div [class.reference-tooltip]=\"!!partId\">\n <div class=\"reference-data\" [class.expanded]=\"attachment['$expanded'] || !!partId\">\n <span class=\"reference me-1\">{{reference}}</span>\n <sq-format-icon [extension]=\"attachment.record.fileext\"></sq-format-icon>\n <a [id]=\"'attachment-'+attachment.recordId\" (click)=\"expandAttachment()\">\n {{attachment.record.title}}\n </a>\n <i class=\"fas fa-eye\" (click)=\"openPreview.emit(attachment)\" [sqTooltip]=\"!partId ? 'Preview document' : ''\"></i>\n <i class=\"fas fa-arrow-up-right-from-square\" *ngIf=\"attachment.record.url1 || attachment.record.originalUrl\"\n (click)=\"openDocument.emit(attachment)\" [sqTooltip]=\"!partId ? 'Open document' : ''\">\n </i>\n </div>\n <div class=\"reference-passages\" *ngIf=\"!!partId || (attachment['$expanded']) && parts.length\">\n <div class=\"reference-passage\" *ngFor=\"let part of parts\">\n <span class=\"reference me-1\">{{reference}}.{{part.partId}}</span>\n <span [innerHTML]=\"part.text\"></span>\n </div>\n </div>\n</div>\n","import { OnChanges, Component, Input, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Chart, registerables } from 'chart.js'\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sq-assistant-chart',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './chart.component.html',\n styleUrls: ['./chart.component.css']\n})\nexport class ChartComponent implements OnChanges {\n @Input() rawChartData: string;\n\n public chart: Chart;\n private debounceTimer: any;\n\n constructor() { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['rawChartData']) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => this.initializeChart(), 300);\n }\n }\n\n private initializeChart() {\n Chart.getChart('chart-canvas')?.destroy();\n\n const canvasElement = document.getElementById('chart-canvas');\n\n if(canvasElement){\n try{\n let chartInput = this.rawChartData.match(/<chartjs>({[\\s\\S]*?)<\\/chartjs>/)?.[1]?.trim().replace(/'/g, '\"') as string;\n let chartConfig = JSON.parse(chartInput); \n \n this.chart = new Chart('chart-canvas', chartConfig);\n\n } catch (error) {\n console.error('Invalid chart configuration, check the assistant configuration: ', error);\n }\n\n }\n else {\n console.error('Chart Canvas is not found');\n }\n }\n}\n","<div class=\"chart-container\">\n <canvas id=\"chart-canvas\">{{ chart }}</canvas>\n</div>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ChangeDetectorRef, AfterViewInit, ElementRef } from \"@angular/core\";\nimport { PrincipalWebService } from \"@sinequa/core/web-services\";\nimport { SearchService } from \"@sinequa/components/search\";\nimport { ChatContextAttachment, ChatMessage, SuggestedAction } from \"../types\";\n\nimport { unified, Processor } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport { visit, CONTINUE, EXIT } from \"unist-util-visit\";\nimport { Text, Parent, Content } from \"mdast\";\nimport { Node } from \"unist\";\nimport { UIService, UtilsModule } from \"@sinequa/components/utils\";\nimport remarkGfm from \"remark-gfm\";\nimport { CommonModule } from \"@angular/common\";\nimport { CollapseModule } from \"@sinequa/components/collapse\";\nimport { RemarkModule } from \"ngx-remark\";\nimport { InitialsAvatarComponent } from \"../initials-avatar/initials-avatar.component\";\nimport { ChatReferenceComponent } from \"../chat-reference/chat-reference.component\";\n\nimport \"prismjs-components-importer/esm\";\nimport 'prismjs/plugins/autoloader/prism-autoloader';\nimport { ChartComponent } from \"../charts/chart/chart.component\";\n\ndeclare module Prism {\n function highlightAllUnder(el: HTMLElement): void;\n}\n\n@Component({\n selector: \"sq-chat-message\",\n templateUrl: \"./chat-message.component.html\",\n styleUrls: [\"./chat-message.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, UtilsModule, CollapseModule, RemarkModule,\n InitialsAvatarComponent, ChatReferenceComponent, ChartComponent]\n})\nexport class ChatMessageComponent implements OnChanges, AfterViewInit {\n @Input() message: ChatMessage;\n @Input() conversation: ChatMessage[];\n @Input() suggestedActions: SuggestedAction[] | undefined;\n @Input() assistantMessageIcon: string;\n @Input() userMessageIcon: string;\n @Input() streaming: boolean;\n @Input() canEdit: boolean = false;\n @Input() canRegenerate: boolean = false;\n @Input() canCopy: boolean = false;\n @Input() canDebug: boolean = false;\n @Input() canLike: boolean = false;\n @Input() canDislike: boolean = false;\n @Output() openDocument = new EventEmitter<{reference: ChatContextAttachment, partId?: number}>();\n @Output() openPreview = new EventEmitter<{reference: ChatContextAttachment, partId?: number}>();\n @Output() suggestAction = new EventEmitter<SuggestedAction>();\n @Output() edit = new EventEmitter<ChatMessage>();\n @Output() copy = new EventEmitter<ChatMessage>();\n @Output() regenerate = new EventEmitter<ChatMessage>();\n @Output() like = new EventEmitter<ChatMessage>();\n @Output() dislike = new EventEmitter<ChatMessage>();\n @Output() debug = new EventEmitter<ChatMessage>();\n\n processor: Processor;\n\n references: string[] = [];\n referenceMap = new Map<string, ChatContextAttachment>();\n showReferences: boolean = true;\n collapseProgress: boolean;\n iconSize = 24;\n\n liked: boolean = false;\n disliked: boolean = false;\n\n constructor(\n public searchService: SearchService,\n public ui: UIService,\n public principalService: PrincipalWebService,\n public cdr: ChangeDetectorRef,\n public el: ElementRef\n ) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.streaming) {\n this.collapseProgress = !this.streaming;\n }\n\n if (changes.message && this.message?.role === \"assistant\") {\n this.references = [];\n this.referenceMap.clear();\n for (let m of this.conversation) {\n if (m.additionalProperties.$attachment) {\n for (const attachment of m.additionalProperties.$attachment) {\n this.referenceMap.set('' + attachment.contextId, { ...attachment, $partId: attachment.parts?.[0].partId });\n for (let i = 0; i < attachment.parts.length; i++) {\n const refId = `${attachment.contextId}.${attachment.parts[i].partId}`;\n this.referenceMap.set(refId, { ...attachment, $partId: attachment.parts[i].partId });\n }\n }\n }\n\n if(m.content.startsWith(\"<chartjs>\")){\n m.messageType = \"CHART\";\n }\n else{\n m.messageType = \"MARKDOWN\";\n }\n }\n\n this.processor = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(() => this.referencePlugin);\n\n if (this.streaming) {\n this.processor = this.processor.use(() => this.placeholderPlugin);\n }\n }\n }\n\n ngAfterViewInit(): void {\n Prism?.highlightAllUnder?.(this.el.nativeElement);\n }\n\n get name(): string {\n return !this.principalService.principal ? ''\n : this.principalService.principal['fullName'] as string || this.principalService.principal.name;\n }\n\n get isAdmin(): boolean {\n return this.principalService.principal?.isAdministrator || false;\n }\n\n /**\n * This Unified plugin looks a text nodes and replaces any reference in the\n * form [1], [2.3], etc. with custom nodes of type \"chat-reference\".\n */\n referencePlugin = (tree: Node) => {\n\n const references = new Set<number>();\n\n // Visit all text nodes\n visit(tree, \"text\", (node: Text, index: number, parent: Parent) => {\n let text = node.value;\n\n text = this.reformatReferences(text);\n const matches = this.getReferenceMatches(text);\n\n // Quit if no references were found\n if (matches.length === 0) {\n return CONTINUE;\n }\n\n const nodes: (Content & { end: number })[] = [];\n\n for (let match of matches) {\n const refId = match[1].trim();\n const [ref] = refId.split(\".\");\n // We find a valid reference in the text\n if (!isNaN(+ref)) {\n references.add(+ref); // Add it to the set of used references\n\n // If needed, insert a text node before the reference\n const current = nodes.at(-1) ?? { end: 0 };\n if (match.index! > current.end) {\n nodes.push({ type: \"text\", value: text.substring(current.end, match.index!), end: match.index! });\n }\n\n // Add a custom reference node\n nodes.push({ type: \"chat-reference\", refId, end: match.index! + match[0].length } as any);\n }\n }\n\n // Quit if no references were found\n if (nodes.length === 0) {\n return CONTINUE;\n }\n\n if (nodes.at(-1)!.end < text.length) {\n nodes.push({ type: \"text\", value: text.substring(nodes.at(-1)!.end, text.length), end: text.length });\n }\n\n // Delete the current text node from the parent and replace it with the new nodes\n parent.children.splice(index, 1, ...nodes);\n\n return index + nodes.length; // Visit the next node after the inserted ones\n });\n\n if (references.size > 0) {\n this.references = Array.from(references.values())\n .sort((a, b) => a - b)\n .map(r => '' + r);\n this.cdr.detectChanges();\n }\n\n return tree;\n }\n\n placeholderPlugin = (tree: Node) => {\n\n visit(tree, \"text\", (node: Text, index: number, parent: Parent) => {\n parent.children.push({ type: \"streaming-placeholder\" } as any);\n return EXIT;\n }, true);\n\n return tree;\n }\n\n getLinkText(node: any): string {\n if (node.text) {\n return node.text; // Return directly if text is provided in node.text ([Example link](https://example.com))\n } else if (node.children && node.children.length > 0) {\n // Recursively search for text content in child nodes\n for (const child of node.children) {\n if (child.type === 'text' && child.value) {\n return child.value; // Return the value of the first text node found ([**Emphasized Link Text**](https://example.com))\n } else if (child.children && child.children.length > 0) {\n const textContent = this.getLinkText(child); // Recursively search child nodes ([![Example image](https://example.com/image.png)](https://example.com))\n if (textContent) {\n return textContent; // Return text content if found\n }\n }\n }\n }\n return 'link'; // Return empty string if no text content is found\n }\n\n /**\n * Reformat [ids: 12.2, 42.5] to [12.2][42.5]\n */\n reformatReferences(content: string) {\n return content.replace(/\\[(?:ids?:?\\s*)?(?:documents?:?\\s*)?(\\s*(?:,?\\s*\\d+(?:\\.\\d+)?(?:\\.part)?\\s*)+)\\]/g,\n (str, match: string) => `[${match.replace(/\\.part/g, \"\").split(',').join(\"] [\")}]`\n );\n }\n\n /**\n * Match all references in a given message\n */\n getReferenceMatches(content: string) {\n return Array.from(content.matchAll(/\\[(\\s*\\d+(?:\\.\\d+)?\\s*)\\]/g));\n }\n\n private _copyToClipboard(content: string) {\n this.ui.copyToClipboard(content);\n\n }\n\n copyMessage(message: ChatMessage) {\n this._copyToClipboard(message.content);\n this.copy.emit(message);\n }\n\n copyCode(code: string) {\n this._copyToClipboard(code);\n }\n\n openAttachmentPreview(attachment: ChatContextAttachment, partId?: number) {\n this.openPreview.emit({reference: attachment, partId});\n }\n\n openOriginalAttachment(attachment: ChatContextAttachment, partId?: number) {\n this.openDocument.emit({reference: attachment, partId});\n }\n}\n","<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { ChatService } from './chat.service';\nimport { Observable, catchError, filter, finalize, forkJoin, map, shareReplay, switchMap, take, tap, throwError } from 'rxjs';\nimport { ActionMessage, ChatMessage, ChatPayload, ChatProgress, ChatResponse, GllmFunction, GllmModelDescription, HttpChatResponse, SavedChat, SavedChatHistory } from './types';\nimport { JsonMethodPluginService } from '@sinequa/core/web-services';\nimport { Query } from \"@sinequa/core/app-utils\";\n\n@Injectable()\nexport class RestChatService extends ChatService {\n\n public jsonMethodWebService = inject(JsonMethodPluginService);\n\n constructor() {\n super();\n }\n\n /**\n * Initialize the chat process after the login is complete.\n * It listens for the 'login-complete' event, initializes necessary URL, and performs parallel requests for models, functions and quota data.\n * @returns An Observable<boolean> indicating the success of the initialization process.\n */\n init(): Observable<boolean> {\n return this.loginService.events.pipe(\n filter((e) => e.type === 'login-complete'),\n tap(() => this.getRequestsUrl()),\n // Execute parallel requests for models and functions\n switchMap(() =>\n forkJoin([\n this.listModels(),\n this.listFunctions()\n ])\n ),\n // Map the results of parallel requests to a boolean indicating success\n map(([models, functions]) => {\n this.initProcess$.next(true);\n return !!models && !!functions\n }),\n // Any errors during the process are caught, logged, and re-thrown to propagate the error further\n catchError((error) => {\n console.error('Error occurred:', error);\n return throwError(() => error);\n }),\n // cache and replay the emitted value for subsequent subscribers, ensuring the initialization logic is only executed once even if there are multiple subscribers\n shareReplay(1)\n );\n }\n\n /**\n * Define the GLLM plugin to use for the http requests\n * It can be overridden by the app config\n */\n getRequestsUrl() {\n if (this.chatConfig$.value!.connectionSettings.restEndpoint) {\n this.REQUEST_URL = this.chatConfig$.value!.connectionSettings.restEndpoint;\n } else {\n throw new Error(`The property 'restEndpoint' must be provided when attempting to use 'REST' in assistant instance`);\n }\n }\n\n listModels(): Observable<GllmModelDescription[] | undefined> {\n const data = {\n action: \"listmodels\",\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(\n map(res => res.models),\n tap(models => this.models = models?.filter(model => !!model.enable)),\n catchError((error) => {\n console.error('Error invoking listmodels:', error);\n return throwError(() => error);\n })\n );\n }\n\n listFunctions(): Observable<GllmFunction[] | undefined> {\n const data = {\n action: \"listfunctions\",\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(\n map(res => res.functions),\n tap((functions: GllmFunction[] | undefined) => this.functions = functions?.filter(func => func.enabled && !!this.chatConfig$.value!.defaultValues.functions.find(fn => fn.name === func.functionName))),\n catchError((error) => {\n console.error('Error invoking listfunctions:', error);\n return throwError(() => error);\n })\n );\n }\n\n fetch(messages: ChatMessage[], query: Query): Observable<ChatResponse> {\n // Start streaming by invoking the Chat method\n this.streaming$.next(true);\n\n // Prepare the payload to send to the Chat method\n const data: ChatPayload & {action: \"chat\"} = {\n action: \"chat\",\n history: messages,\n functions: this.chatConfig$.value!.defaultValues.functions?.filter(func => func.enabled).map(func => func.name),\n debug: this.chatConfig$.value!.defaultValues.debug,\n serviceSettings: {\n service_id: this.chatConfig$.value!.defaultValues.service_id,\n model_id: this.chatConfig$.value!.defaultValues.model_id,\n top_p: this.chatConfig$.value!.defaultValues.top_p,\n temperature: this.chatConfig$.value!.defaultValues.temperature,\n max_tokens: this.chatConfig$.value!.defaultValues.max_tokens,\n ...this.chatConfig$.value!.additionalServiceSettings\n },\n appQuery: {\n app: this.appService.appName,\n query\n }\n }\n if (this.chatConfig$.value!.savedChatSettings.enabled) {\n data.instanceId = this.chatInstanceId;\n data.savedChatId = this.savedChatId;\n }\n\n // Request the Chat endpoint\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n tap((res: HttpChatResponse) => this.updateQuota(res.quota, true)),\n map((res: HttpChatResponse) => {\n // Define $progress from the actions property of the response\n let $progress: ChatProgress[] | undefined;\n if( res.actions?.length > 0) {\n const actions: ActionMessage[] = Object.values(res.actions.reduce((acc, item) => {\n acc[item.guid] = { ...(acc[item.guid] || {}), ...item };\n return acc;\n }, {}));\n $progress = actions.map((a) => ({\n title: a.displayName ?? \"\",\n content: a.displayValue ?? \"\",\n done: a.executionTime !== undefined,\n time: a.executionTime,\n }))\n }\n // Re-attach the $progress and $attachment of the last response to the last assistant's response in the chat history\n const response = {...(res.history as Array<ChatMessage>).at(-1)} as ChatMessage;\n if($progress) response.additionalProperties.$progress = $progress;\n if(res.context) response.additionalProperties.$attachment = res.context.map((ctx) => ctx.additionalProperties);\n if(res.suggestedActions) response.additionalProperties.$suggestedAction = res.suggestedActions;\n // Emit the updated chat usage metrics once the generation of the assistant response is completed\n if (!!response.additionalProperties.usageMetrics) {\n this.updateChatUsageMetrics(response.additionalProperties.usageMetrics!);\n }\n // Update the chat history with the incoming history property of the res AND the processed response message\n this.chatHistory = res.history;\n this.chatHistory[this.chatHistory.length - 1] = response;\n // Save/update the chat if savedChat enabled\n if (this.chatConfig$.value!.savedChatSettings.enabled && this.chatHistory.some((msg) => msg.additionalProperties?.isUserInput === true)) {\n const action = !this.savedChatId ? this.addSavedChat(this.chatHistory) : this.updateSavedChat(this.savedChatId, undefined, this.chatHistory);\n action.pipe(take(1)).subscribe();\n }\n // Generate audit event\n const details = {\n 'duration': res.executionTime,\n 'text': response.content,\n 'role': response.role, // 'assistant'\n 'rank': this.chatHistory.length - 1,\n 'generation-tokencount': response.additionalProperties.usageMetrics!.completionTokenCount,\n 'prompt-tokencount': response.additionalProperties.usageMetrics!.promptTokenCount,\n 'attachments': response.additionalProperties.$attachment?.map(({ recordId, contextId, parts, type }) => ({\n recordId,\n contextId,\n parts: parts.map(({ partId, text }) => ({ partId, text })),\n type\n }))\n };\n this.generateAuditEvent('message', details);\n // Return the result\n return { history: [...messages, response], executionTime: res.executionTime };\n }),\n finalize(() => this.streaming$.next(false))\n );\n }\n\n listSavedChat(): void {\n const data = {\n action: \"SavedChatList\",\n instanceId: this.chatInstanceId,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n this.jsonMethodWebService.get(this.REQUEST_URL, data).subscribe(\n res => this.savedChats$.next(res.savedChats),\n error => {\n console.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);\n }\n );\n }\n\n addSavedChat(messages: ChatMessage[]): Observable<SavedChat> {\n const data = {\n action: \"SavedChatAdd\",\n instanceId: this.chatInstanceId,\n savedChatId: this.chatId,\n history: messages,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n map(res => res.savedChat),\n tap((savedChat: SavedChat) => {\n this.setSavedChatId(savedChat.id); // Persist the savedChatId\n this.generateAuditEvent('saved-chat.add', {}, savedChat.id); // Generate audit event\n }),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n getSavedChat(id: string): Observable<SavedChatHistory | undefined> {\n const data = {\n action: \"SavedChatGet\",\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(\n map(res => res.savedChat),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n updateSavedChat(id: string, name?: string, messages?: ChatMessage[]): Observable<SavedChat> {\n const data = {\n action: \"SavedChatUpdate\",\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n if(name) data[\"title\"] = name;\n if(messages) data[\"history\"] = messages;\n\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n map(res => res.savedChat),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n deleteSavedChat(ids: string[]): Observable<number> {\n const data = {\n action: \"SavedChatDelete\",\n instanceId: this.chatInstanceId,\n savedChatIds: ids,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n map(res => res.deletedCount),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n}\n","import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Subscription, filter, switchMap, tap } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { ChatConfig, TokenConsumption, UserTokenConsumption } from '../types';\nimport { LoginService } from '@sinequa/core/login';\nimport { InstanceManagerService } from '../instance-manager.service';\nimport { ChatService } from '../chat.service';\nimport { UtilsModule } from '@sinequa/components/utils';\n\n@Component({\n selector: 'sq-token-progress-bar',\n templateUrl: './token-progress-bar.component.html',\n styleUrls: ['./token-progress-bar.component.scss'],\n standalone: true,\n imports: [CommonModule, UtilsModule]\n})\nexport class TokenProgressBarComponent implements OnInit, OnDestroy {\n /** Define the key based on it, the appropriate chatService instance will be returned from instanceManagerService */\n @Input() instanceId: string;\n\n chatService: ChatService;\n config: ChatConfig;\n subscription = new Subscription();\n\n // User token consumption progress bar\n userPercentage?: number;\n userTitle?: string;\n\n // Current chat token consumption progress bar\n chatPercentage?: number;\n chatTitle?: string;\n\n public loginService = inject(LoginService);\n public instanceManagerService = inject(InstanceManagerService);\n\n ngOnInit() {\n this.subscription.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n switchMap(_ => this.chatService.initProcess$),\n filter(success => !!success),\n tap(_ => {\n this.config = this.chatService.chatConfig$.value!;\n this.onUserTokensConsumption();\n this.onChatTokensConsumption();\n })\n ).subscribe()\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n instantiateChatService(): void {\n this.chatService = this.instanceManagerService.getInstance(this.instanceId);\n }\n\n onUserTokensConsumption() {\n this.subscription.add(\n this.chatService.userTokenConsumption$.subscribe(\n (data: UserTokenConsumption | undefined) => {\n if (data) {\n this.userPercentage = data.percentage;\n this.userTitle = `Max generation allowed: ${this.userPercentage}% consumed. Resets at ${data.nextResetDate}`;\n }\n }\n )\n );\n }\n\n onChatTokensConsumption() {\n this.subscription.add(\n this.chatService.chatTokenConsumption$.subscribe(\n (data: TokenConsumption | undefined) => {\n if (data) {\n this.chatPercentage = data.percentage;\n this.chatTitle = `Max length of conversation: ${this.chatPercentage}% reached.`;\n }\n }\n )\n );\n }\n\n}\n","<div class=\"bars-container d-flex flex-row gap-2 p-2 me-4\" *ngIf=\"(config?.globalSettings?.displayUserQuotaConsumption && userPercentage !== undefined) || (config?.globalSettings?.displayChatTokensConsumption && chatPercentage !== undefined)\">\n <div *ngIf=\"(config?.globalSettings?.displayUserQuotaConsumption && userPercentage !== undefined)\" class=\"token-progress-bar\" [sqTooltip]=\"userTitle\"\n [style.background]=\"'radial-gradient(closest-side, var(--ast-primary-bg, #F8F8F8) 70%, transparent 75% 100%), conic-gradient(#FF854A ' + userPercentage + '%, #0040BF 0)'\">\n </div>\n <div *ngIf=\"(config?.globalSettings?.displayChatTokensConsumption && chatPercentage !== undefined)\" class=\"token-progress-bar\" [sqTooltip]=\"chatTitle\"\n [style.background]=\"'radial-gradient(closest-side, var(--ast-primary-bg, #F8F8F8) 70%, transparent 75% 100%), conic-gradient(#FF854A ' + chatPercentage + '%, #0040BF 0)'\">\n </div>\n</div>\n","import { CommonModule } from \"@angular/common\";\nimport { AfterViewInit, Component, Input } from \"@angular/core\";\nimport { DebugMessage } from \"../types\";\nimport { Utils } from \"@sinequa/core/base\";\nimport * as Prism from 'prismjs';\nimport { UIService } from \"@sinequa/components/utils\";\n\n@Component({\n selector: \"sq-debug-message\",\n templateUrl: \"./debug-message.component.html\",\n styleUrls: [\"./debug-message.component.scss\"],\n standalone: true,\n imports: [CommonModule]\n})\nexport class DebugMessageComponent implements AfterViewInit {\n @Input() data: DebugMessage[] | undefined;\n @Input() level: number = 0; // Track the nesting level\n @Input() parentColor: string = ''; // Track the parent row color\n\n constructor(public ui: UIService) { }\n\n ngAfterViewInit() {\n Prism.highlightAll();\n }\n\n isObject(value: any): boolean {\n return Utils.isObject(value);\n }\n\n getRowClass(item: DebugMessage, index: number): string {\n if (item.isError) return 'row-error';\n if (this.level === 0) return index % 2 === 0 ? 'row-even' : 'row-odd';\n return this.parentColor;\n }\n\n copyToClipboard(code: any) {\n this.ui.copyToClipboard(JSON.stringify(code, null, 2));\n }\n}\n","<div *ngIf=\"data\" class=\"table-root\">\n <ng-container *ngFor=\"let item of data; let i = index\">\n <div *ngIf=\"item.type === 'KV'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row kv-object\">\n <div class=\"kv-key\">{{ item.data.key }}</div>\n <div class=\"kv-value\">\n <ng-container *ngIf=\"isObject(item.data.value); else normalValue\">\n <div class=\"card mb-2\">\n <div class=\"card-header\">\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(item.data.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-json my-0 rounded-0 rounded-bottom\"><code class=\"language-json\">{{ item.data.value | json }}</code></pre>\n </div>\n </ng-container>\n <ng-template #normalValue>{{ item.data.value }}</ng-template>\n </div>\n </div>\n <div *ngIf=\"item.type === 'LIST'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row list-object\">\n <div class=\"list-name\" [class.w-100]=\"!item.expanded\" (click)=\"item.expanded=!item.expanded\">\n <i class=\"fas\" [class.fa-chevron-up]=\"item.expanded\" [class.fa-chevron-down]=\"!item.expanded\"></i>\n {{ item.name }}\n </div>\n <div class=\"list-items\" *ngIf=\"item.expanded\">\n <sq-debug-message [data]=\"item.items\" [level]=\"level + 1\" [parentColor]=\"getRowClass(item, i)\"></sq-debug-message>\n </div>\n </div>\n </ng-container>\n</div>\n","import { inject, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\nimport { Action } from \"@sinequa/components/action\";\nimport { AbstractFacet } from \"@sinequa/components/facet\";\nimport { SearchService } from \"@sinequa/components/search\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { PrincipalWebService, Record as Article } from \"@sinequa/core/web-services\";\nimport { BehaviorSubject, Subscription, filter, fromEvent, map, merge, switchMap, tap } from \"rxjs\";\nimport { ChatService } from \"./chat.service\";\nimport { ChatContextAttachment, ChatConfig, ChatMessage, GllmModelDescription, MessageHandler, RawMessage, SuggestedAction, InitChat, DebugMessage } from \"./types\";\nimport { InstanceManagerService } from \"./instance-manager.service\";\nimport { WebSocketChatService } from \"./websocket-chat.service\";\nimport { ChatMessageComponent } from \"./chat-message/chat-message.component\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { RestChatService } from \"./rest-chat.service\";\nimport { TokenProgressBarComponent } from \"./token-progress-bar/token-progress-bar.component\";\nimport { DebugMessageComponent } from \"./debug-message/debug-message.component\";\n\n@Component({\n selector: 'sq-chat-v3', // mandatory since @sinequa/components already has the same tag-name \"sq-chat\"\n templateUrl: './chat.component.html',\n styleUrls: ['./chat.component.scss'],\n providers: [\n RestChatService,\n WebSocketChatService\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, FormsModule, ChatMessageComponent, TokenProgressBarComponent, DebugMessageComponent]\n})\nexport class ChatComponent extends AbstractFacet implements OnInit, OnChanges, OnDestroy {\n\n public loginService = inject(LoginService);\n public websocketService = inject(WebSocketChatService);\n public restService = inject(RestChatService);\n public instanceManagerService = inject(InstanceManagerService);\n public searchService = inject(SearchService);\n public principalService = inject(PrincipalWebService);\n public cdr = inject(ChangeDetectorRef);\n public appService = inject(AppService);\n\n /** Define the key based on it, the chat service instance will be stored */\n @Input() instanceId: string;\n /** Define the query to use to fetch answers */\n @Input() query: Query = this.searchService.query;\n /** Function that determines whether the chat should be reloaded after the query changes\n * If not provided, the chat will be reloaded by default\n * @param prevQuery The previous query\n * @param newQuery The new query\n * @returns true if the chat should be reloaded, false otherwise\n */\n @Input() queryChangeShouldTriggerReload: (prevQuery: Query, newQuery: Query) => boolean;\n /** Define the protocol to be used for this chat instance*/\n @Input() protocol: 'REST' | 'WEBSOCKET' = \"WEBSOCKET\";\n /** Map of listeners overriding default registered ones*/\n @Input() messageHandlers: Map<string, MessageHandler<any>> = new Map();\n /** When the assistant answer a user question, automatically scroll down to the bottom of the discussion */\n @Input() automaticScrollToLastResponse = false;\n /** A chat discussion that the component should get initialized with it */\n @Input() chat?: InitChat;\n /** Icon to use for the assistant messages */\n @Input() assistantMessageIcon = 'sq-sinequa';\n /** Icon to use for the user messages */\n @Input() userMessageIcon: string;\n /** Event emitter triggered each time the assistant updates the current chat */\n @Output() data = new EventEmitter<ChatMessage[]>();\n /** Event emitter triggered when the user clicks to open the original document representing the context attachment*/\n @Output() openDocument = new EventEmitter<Article>();\n /** Event emitter triggered when the user clicks to open the preview of a document representing the context attachment */\n @Output() openPreview = new EventEmitter<ChatContextAttachment>();\n /** Event emitter triggered when the user clicks on a suggested action */\n @Output() suggestAction = new EventEmitter<SuggestedAction>();\n /** Event emitter triggered when the chat is loading new content */\n @Output(\"loading\") loading$ = new EventEmitter<boolean>(false);\n /** Emits the assistant configuration used when instantiating the component */\n @Output(\"config\") _config = new EventEmitter<ChatConfig>();\n\n @ViewChild('messageList') messageList?: ElementRef<HTMLUListElement>;\n @ViewChild('questionInput') questionInput?: ElementRef<HTMLTextAreaElement>;\n\n @ContentChild('loadingTpl') loadingTpl?: TemplateRef<any>;\n @ContentChild('reportIssueTpl') reportIssueTpl?: TemplateRef<any>;\n @ContentChild('tokenConsumptionTpl') tokenConsumptionTpl?: TemplateRef<any>;\n @ContentChild('debugMessagesTpl') debugMessagesTpl?: TemplateRef<any>;\n\n chatService: ChatService;\n config: ChatConfig;\n messages$ = new BehaviorSubject<ChatMessage[] | undefined>(undefined);\n\n question = '';\n\n _actions: Action[] = [];\n\n sub = new Subscription();\n dataSubscription: Subscription | undefined;\n\n /** Variables that depend on the type of model in use */\n modelDescription?: GllmModelDescription;\n\n messageToEdit?: number;\n changes$ = new BehaviorSubject<SimpleChanges | undefined>(undefined);\n currentMessageIndex: number | undefined;\n firstChangesHandled = false;\n isAtBottom = true;\n initializationError = false;\n enabledUserInput = false;\n\n // Issue reporting\n issueTypes: string[] = [\n 'User Interface bug',\n 'Incorrect or misleading response',\n 'Incomplete response',\n 'Technical issue',\n 'Privacy/data security issue',\n 'Other'\n ];\n issueType: string = '';\n issueComment?: string;\n messageRelatedIssue?: ChatMessage;\n issueRank?: number;\n showReportIssue = false;\n\n // Debug messages\n debugMessages: DebugMessage[] | undefined;\n showDebugMessages = false;\n\n private _previousQuery: Query;\n\n constructor() {\n super();\n\n this._actions.push(new Action({\n icon: 'fas fa-sync',\n title: 'Reset chat',\n action: () => this.newChat()\n }));\n }\n\n ngOnInit(): void {\n this.sub.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n map(_ => this.chatService.initChatConfig()),\n switchMap(() => this.chatService.initConfig$),\n filter(initConfig => !!initConfig),\n switchMap(_ => this.chatService.init()),\n switchMap(_ => this.chatService.initProcess$),\n filter(success => !!success),\n tap(_ => this.onLoadChat()),\n switchMap(_ => this.chatService.chatConfig$),\n tap(config => {\n this.config = config!;\n this.enabledUserInput = this.config.modeSettings.enabledUserInput;\n this._config.emit(config);\n try {\n this.updateModelDescription();\n if(!this.firstChangesHandled) {\n this._previousQuery = JSON.parse(JSON.stringify(this.query)); // Initialize the previous query\n this.handleChanges();\n this.addScrollListener();\n this.firstChangesHandled = true;\n }\n } catch (error) {\n this.initializationError = true\n throw error;\n }\n })\n ).subscribe()\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n this.changes$.next(changes);\n if (this.config) {\n this.handleChanges();\n }\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n this.dataSubscription?.unsubscribe();\n }\n\n get isAdmin(): boolean {\n return this.principalService.principal?.isAdministrator || false;\n }\n\n /**\n * Instantiate the chat service based on the provided @input protocol\n * This chat service instance will then be stored in the instanceManagerService with provided @input instanceId as a key\n */\n instantiateChatService(): void {\n switch (this.protocol) {\n case 'REST':\n this.chatService = this.restService;\n break;\n case 'WEBSOCKET':\n this.chatService = this.websocketService;\n break;\n default:\n throw new Error(`Could not found a ChatService implementation corresponding to the provided protocol: '${this.protocol}'`);\n }\n this.chatService.setChatInstanceId(this.instanceId);\n this.instanceManagerService.storeInstance(this.instanceId, this.chatService);\n }\n\n override get actions() { return this._actions; }\n\n private handleChanges() {\n const changes = this.changes$.value;\n // If the chat service is a WebSocketChatService, handle the override of the message handlers if exists\n if (changes?.messageHandlers && this.messageHandlers && this.chatService instanceof WebSocketChatService) {\n this.chatService.overrideMessageHandlers(this.messageHandlers);\n }\n /**\n * Initialize the chat with the provided chat messages if exists, otherwise load the default chat\n * Once the chat is initialized (firstChangesHandled is true), allow opening the chat with the new provided messages (if exists)\n */\n if (!this.firstChangesHandled || changes?.chat) {\n const openChat = () => {\n if (this.messages$.value && this.config.savedChatSettings.enabled) {\n this.chatService.listSavedChat(); // Refresh the list of saved chats\n }\n this.openChat(this.chat!.messages);\n };\n this.chatService.generateChatId();\n if (this.chat) {\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value),'chat-init': JSON.stringify(this.chat)});\n openChat();\n } else {\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value)});\n this.loadDefaultChat();\n }\n }\n /**\n * If the chat is initialized, the initialization event is \"Query\", the query changes and the queryChangeShouldTriggerReload function is provided,\n * then the chat should be reloaded if the function returns true\n * Otherwise, the chat should be reloaded by default\n */\n if (this.firstChangesHandled && changes?.query && this.config.modeSettings.initialization.event === 'Query') {\n if (this.queryChangeShouldTriggerReload ? this.queryChangeShouldTriggerReload(this._previousQuery, this.query) : true) {\n this._triggerReloadAfterQueryChange();\n }\n this._previousQuery = JSON.parse(JSON.stringify(this.query)); // Update the previous query\n }\n }\n\n private _triggerReloadAfterQueryChange() {\n const systemMsg = {role: 'system', content: this.config.defaultValues.systemPrompt, additionalProperties: {display: false}};\n const userMsg = {role: 'user', content: ChatService.formatPrompt(this.config.defaultValues.userPrompt, {principal: this.principalService.principal}), additionalProperties: {display: this.config.modeSettings.displayUserPrompt}};\n this.chatService.setSavedChatId(undefined); // Reset the savedChatId\n this.chatService.generateChatId(); // Generate a new chatId\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value)}); // Generate a new chat audit event\n this._handleQueryMode(systemMsg, userMsg);\n }\n\n private addScrollListener() {\n this.sub.add(\n merge(this.loading$, this.messages$, this.chatService.streaming$, fromEvent(this.messageList!.nativeElement, 'scroll')).subscribe(() => {\n this.isAtBottom = this.toggleScrollButtonVisibility();\n this.cdr.detectChanges();\n })\n );\n }\n\n updateModelDescription() {\n this.modelDescription = this.chatService.getModel(this.config.defaultValues.service_id, this.config.defaultValues.model_id);\n this.cdr.detectChanges();\n }\n\n submitQuestion() {\n if(this.question.trim() && this.messages$.value && this.chatService.chatHistory) {\n if (this.messageToEdit !== undefined) {\n // Update the messages in the UI\n this.messages$.next(this.messages$.value.slice(0, this.messageToEdit));\n // Update the raw messages in the chat history which is the clean version used to make the next request\n this.chatService.chatHistory = this.chatService.chatHistory.slice(0, this.messageToEdit);\n this.messageToEdit = undefined;\n }\n // Fetch the answer\n this.fetchAnswer(this.question.trim(), this.chatService.chatHistory);\n // Clear the input value in the UI\n this.questionInput!.nativeElement.value = '';\n this.questionInput!.nativeElement.style.height = `auto`;\n }\n }\n\n private fetchAnswer(question: string, conversation: ChatMessage[]) {\n const userMsg = {role: 'user', content: question, additionalProperties: {display: true, isUserInput: true, additionalWorkflowProperties: this.config.additionalWorkflowProperties}};\n const messages = [...conversation, userMsg];\n this.messages$.next(messages);\n this.fetch(messages);\n this.chatService.generateAuditEvent('message', {...this._defineMessageAuditDetails(userMsg, messages.length - 1), 'query': JSON.stringify(this.query), 'is-user-input': true, 'enabled-functions': this.config.defaultValues.functions?.filter(func => func.enabled).map(func => func.name), 'additional-workflow-properties': JSON.stringify(this.config.additionalWorkflowProperties)});\n }\n\n /**\n * Given a list of messages, the chat endpoint is invoked for a continuation and updates the list of messages accordingly.\n * @param messages\n */\n public fetch(messages: ChatMessage[]) {\n this.cdr.detectChanges();\n this.loading$.next(true);\n this.dataSubscription?.unsubscribe();\n this.dataSubscription = this.chatService.fetch(messages, this.query)\n .subscribe({\n next: res => this.updateData(res.history),\n error: () => {\n this.terminateFetch();\n },\n complete: () => {\n this.terminateFetch();\n }\n });\n\n if(this.automaticScrollToLastResponse) {\n this.scrollDown();\n }\n }\n\n /**\n * Update the UI with the new messages\n * @param messages\n */\n updateData(messages: ChatMessage[]) {\n this.messages$.next(messages);\n this.data.emit(messages);\n this.loading$.next(false);\n this.question = '';\n if(this.automaticScrollToLastResponse) {\n this.scrollDown();\n }\n }\n\n private toggleScrollButtonVisibility(): boolean {\n if(this.messageList?.nativeElement) {\n return Math.round(this.messageList?.nativeElement.scrollHeight - this.messageList?.nativeElement.scrollTop - 1) <= this.messageList?.nativeElement.clientHeight;\n }\n return true;\n }\n\n scrollDown() {\n setTimeout(() => {\n if(this.messageList?.nativeElement) {\n this.messageList.nativeElement.scrollTop = this.messageList.nativeElement.scrollHeight;\n this.cdr.detectChanges();\n }\n }, 10);\n }\n\n /**\n * Start a new chat with the defaultValues settings\n * The savedChatId in the chat service will be reset, so that the upcoming saved chat operations will be performed on the fresh new chat\n * If the savedChat feature is enabled, the list of saved chats will be refreshed\n */\n newChat() {\n this.chatService.setSavedChatId(undefined); // Reset the savedChatId\n this.chatService.generateChatId(); // Generate a new chatId\n if (this.config.savedChatSettings.enabled) {\n this.chatService.listSavedChat(); // Refresh the list of saved chats\n }\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value)}); // Generate a new chat audit event\n this.loadDefaultChat(); // Start a new chat\n }\n\n /**\n * Start the default chat with the defaultValues settings\n * If the chat is meant to be initialized with event === \"Query\", the corresponding user query message will be added to the chat history\n */\n loadDefaultChat() {\n // Define the default system prompt and user prompt messages\n const systemMsg = {role: 'system', content: this.config.defaultValues.systemPrompt, additionalProperties: {display: false}};\n const userMsg = {role: 'user', content: ChatService.formatPrompt(this.config.defaultValues.userPrompt, {principal: this.principalService.principal}), additionalProperties: {display: this.config.modeSettings.displayUserPrompt}};\n\n if (this.config.modeSettings.initialization.event === 'Query') {\n this._handleQueryMode(systemMsg, userMsg);\n } else { // If the chat is meant to be initialized with event === \"Prompt\"\n this.openChat([systemMsg, userMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(systemMsg, 0));\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(userMsg, 1));\n }\n }\n\n /**\n * If the provided query text is not empty, then add the user query message to the chat history and invoke the assistant\n * Otherwise, just start a new chat with a warning message inviting the user to perform a full text search to retrieve some results\n */\n private _handleQueryMode(systemMsg: ChatMessage, userMsg: ChatMessage) {\n if (!!this.query.text) {\n const userQueryMsg = {role: 'user', content: this.query.text, additionalProperties: {display: this.config.modeSettings.initialization.displayUserQuery, query: this.query, forcedWorkflow: this.config.modeSettings.initialization.forcedWorkflow, isUserInput: true, additionalWorkflowProperties: this.config.additionalWorkflowProperties}};\n if (this.config.modeSettings.sendUserPrompt) {\n this.openChat([systemMsg, userMsg, userQueryMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(systemMsg, 0));\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(userMsg, 1));\n this.chatService.generateAuditEvent('message', {...this._defineMessageAuditDetails(userQueryMsg, 2), 'query': JSON.stringify(this.query) ,'is-user-input': true, 'forced-workflow': this.config.modeSettings.initialization.forcedWorkflow, 'enabled-functions': this.config.defaultValues.functions?.filter(func => func.enabled).map(func => func.name), 'additional-workflow-properties':JSON.stringify(this.config.additionalWorkflowProperties)});\n } else {\n this.openChat([systemMsg, userQueryMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(systemMsg, 0));\n this.chatService.generateAuditEvent('message', {...this._defineMessageAuditDetails(userQueryMsg, 1), 'query': JSON.stringify(this.query) ,'is-user-input': true, 'forced-workflow': this.config.modeSettings.initialization.forcedWorkflow, 'enabled-functions': this.config.defaultValues.functions?.filter(func => func.enabled).map(func => func.name), 'additional-workflow-properties': JSON.stringify(this.config.additionalWorkflowProperties)});\n }\n } else {\n const warningMsg = {role: 'assistant', content: \"You must perform a full text search to retrieve some results\", additionalProperties: {display: true}};\n this.openChat([warningMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(warningMsg, 0));\n }\n }\n\n private _defineMessageAuditDetails(message: ChatMessage, rank: number): Record<string, any> {\n return {\n 'duration': 0,\n 'text': message.content,\n 'role': message.role,\n 'rank': rank\n };\n }\n\n /**\n * Start/open a new chat with the provided messages and chatId\n * If the last message is from the user, a request to the assistant is made to get an answer\n * If the last message is from the assistant, the conversation is loaded right away\n * @param messages The list of messages of the chat\n * @param savedChatId The id of the saved chat. If provided (ie. an existing discussion in the saved chat index), update the savedChatId in the chat service for the upcoming saved chat operations\n */\n openChat(messages: RawMessage[], savedChatId?: string) {\n if (!messages || !Array.isArray(messages)) {\n console.error('Error occurs while trying to load the chat discussion. Invalid messages received :', messages);\n return;\n }\n if (savedChatId) {\n this.chatService.setSavedChatId(savedChatId);\n this.chatService.generateChatId(savedChatId);\n }\n this.resetChat();\n this.messages$.next(messages);\n this.chatService.chatHistory = messages;\n const lastMessage = messages.at(-1);\n if(lastMessage && lastMessage.role === 'user') {\n this.fetch(messages); // If the last message if from a user, an answer from the assistant is expected\n }\n else {\n this.updateData(messages); // If the last message if from the assistant, we can load the conversation right away\n this.terminateFetch();\n }\n this.addScrollListener();\n }\n\n /**\n * Reset the chat by clearing the chat history and the UI accordingly\n * The user input will be cleared\n * The fetch subscription will be terminated\n */\n resetChat() {\n if(this.messages$.value) {\n this.messages$.next(undefined); // Reset chat\n }\n this.chatService.chatHistory = undefined; // Reset chat history\n this.question = '';\n this.terminateFetch();\n }\n\n onLoadChat() {\n this.loading$.next(true);\n this.sub.add(\n this.chatService.loadSavedChat$\n .pipe(\n filter(savedChat => !!savedChat),\n switchMap(savedChat => this.chatService.getSavedChat(savedChat!.id)),\n filter(savedChatHistory => !!savedChatHistory),\n tap(savedChatHistory => this.openChat(savedChatHistory!.history, savedChatHistory!.id))\n ).subscribe()\n );\n }\n\n terminateFetch() {\n this.dataSubscription?.unsubscribe();\n this.dataSubscription = undefined;\n this.loading$.next(false);\n this.cdr.detectChanges();\n }\n\n /**\n * Copy a previous user message of the chat history to the chat user input.\n * Thus, the user can edit and resubmit the message.\n * Once the edited message is submitted, all subsequent messages starting from @param index will be removed from the history and the UI will be updated accordingly.\n * The assistant will regenerate a new answer based on the updated chat history.\n * @param index The index of the user's message to edit\n */\n editMessage(index: number) {\n this.messageToEdit = index;\n this.question = this.chatService.chatHistory![index].content;\n this.chatService.generateAuditEvent('edit.click', {'rank': index});\n }\n\n /**\n * Copy a previous assistant message of the chat history to the clipboard.\n * @param index The index of the assistant's message to edit\n */\n copyMessage(index: number) {\n this.chatService.generateAuditEvent('copy.click', {'rank': index});\n }\n\n /**\n * Starting from the provided index, remove all subsequent messages from the chat history and the UI accordingly.\n * The assistant will regenerate a new answer based on the updated chat history.\n * @param index The index of the assistant's message to regenerate\n */\n regenerateMessage(index: number) {\n // Define the chat history based on which the assistant will generate a new answer\n const slicedMessages = this.chatService.chatHistory!.slice(0, index);\n // Accordingly update the messages in the UI\n this.messages$.next(slicedMessages);\n // Fetch the answer\n this.fetch(slicedMessages);\n this.chatService.generateAuditEvent('regenerate.click', {'rank': index});\n }\n\n onKeyUp(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Backspace':\n this.calculateHeight();\n break;\n case 'Enter':\n if (!event.shiftKey) {\n event.preventDefault();\n this.submitQuestion();\n }\n this.calculateHeight();\n break;\n default:\n break;\n }\n }\n\n calculateHeight(): void {\n const maxHeight = 170;\n const el = this.questionInput!.nativeElement;\n el.style.maxHeight = `${maxHeight}px`;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n el.style.overflowY = el.scrollHeight >= maxHeight ? 'scroll' : 'hidden';\n }\n\n /**\n * Send a \"like\" event on clicking on the thumb-up icon of an assistant's message\n * @param rank The rank of the message to like\n */\n onLike(rank: number): void {\n this.chatService.generateAuditEvent('thumb-up.click', {rank});\n }\n\n /**\n * Send a \"dislike\" event on clicking on the thumb-down icon of an assistant's message.\n * It also opens the issue reporting dialog.\n * @param message The assistant message to dislike\n * @param rank The rank of the message to dislike\n */\n onDislike(message: ChatMessage, rank: number): void {\n this.chatService.generateAuditEvent('thumb-down.click', {rank});\n this.messageRelatedIssue = message;\n this.issueType = '';\n this.issueComment = undefined;\n this.issueRank = rank;\n this.showReportIssue = true\n }\n\n /**\n * Report an issue related to the assistant's message.\n */\n sendIssue(): void {\n const details = {\n 'report-type': this.issueType,\n 'comment': this.issueComment,\n 'text': this.messageRelatedIssue!.content,\n 'rank': this.issueRank,\n };\n this.chatService.generateAuditEvent('negative-report.send', details);\n this.showReportIssue = false;\n }\n\n /**\n * Close the issue reporting dialog.\n */\n ignoreIssue(): void {\n this.showReportIssue = false;\n }\n\n /**\n * Handle the click on a reference's 'open preview'.\n * @param data\n */\n openAttachmentPreview(data: {reference: ChatContextAttachment, partId?: number}) {\n this.openPreview.emit(data.reference);\n const details = {\n 'doc-id': data.reference.recordId,\n 'title': data.reference.record.title,\n 'source': data.reference.record.treepath,\n 'collection': data.reference.record.collection,\n 'index': data.reference.record.databasealias,\n };\n if(!!data.partId) details['part-id'] = data.partId;\n this.chatService.generateAuditEvent('attachment.preview.click', details);\n }\n\n /**\n * Handle the click on a reference's 'open original document'.\n * @param data\n */\n openOriginalAttachment(data: {reference: ChatContextAttachment, partId?: number}) {\n this.openDocument.emit(data.reference.record);\n const details = {\n 'doc-id': data.reference.recordId,\n 'title': data.reference.record.title,\n 'source': data.reference.record.treepath,\n 'collection': data.reference.record.collection,\n 'index': data.reference.record.databasealias,\n };\n if(!!data.partId) details['part-id'] = data.partId;\n this.chatService.generateAuditEvent('attachment.link.click', details);\n }\n\n /**\n * Handle the click on a suggested action.\n * @param action Suggested action.\n * @param index Rank of the message in the chatHistory related to the suggested action.\n */\n suggestActionClick(action: SuggestedAction, index: number) {\n this.suggestAction.emit(action);\n this.chatService.generateAuditEvent('suggestedAction.click', {'text': action.content, 'suggestedAction-type': action.type})\n }\n\n /**\n * Handle the click on the 'show log info' button of a message.\n * @param message The message of the ChatHistory to show its debug messages\n */\n showDebug(message: ChatMessage): void {\n this.debugMessages = message.additionalProperties.$debug;\n this.showDebugMessages = true;\n this.cdr.detectChanges();\n }\n}\n","<ng-container *ngIf=\"!initializationError\">\n <div *ngIf=\"messages$ | async as messages; else loadingTpl || loadingTplDefault\" class=\"h-100 d-flex flex-column\">\n <!-- Token consumption -->\n <div class=\"ms-1\" *ngIf=\"config?.globalSettings?.displayUserQuotaConsumption || config?.globalSettings?.displayChatTokensConsumption\">\n <ng-container *ngTemplateOutlet=\"tokenConsumptionTpl || defaultTokenConsumptionTpl; context: { $implicit: instanceId }\"></ng-container>\n </div>\n\n <!-- Chat Messages -->\n <ul class=\"list-group list-group-flush overflow-auto flex-grow-1 pe-2 pb-2\" #messageList>\n <ng-container *ngFor=\"let message of messages; let index = index; let last = last\">\n <!-- Regular messages -->\n <li class=\"list-group-item\" [style.--bs-list-group-item-padding-y.rem]=\"'0.6'\" *ngIf=\"message.additionalProperties.display\"\n [class.opacity-50]=\"messageToEdit && messageToEdit < index + 1\">\n <sq-chat-message\n [class.sq-user-message]=\"message.role === 'user'\"\n [class.last-message]=\"last\"\n [message]=\"message\"\n [conversation]=\"messages\"\n [suggestedActions]=\"last ? message.additionalProperties.$suggestedAction : undefined\"\n [assistantMessageIcon]=\"assistantMessageIcon\"\n [userMessageIcon]=\"userMessageIcon\"\n [streaming]=\"last && (chatService.streaming$ | async)\"\n [canEdit]=\"(loading$ | async) === false && ((chatService.streaming$ | async) === false || !last) && messageToEdit === undefined && message.role === 'user'\"\n [canRegenerate]=\"(loading$ | async) === false && (chatService.streaming$ | async) === false && messageToEdit === undefined && message.role === 'assistant' && last\"\n [canCopy]=\"((chatService.streaming$ | async) === false || !last) && messageToEdit === undefined && message.role === 'assistant'\"\n [canDebug]=\"((chatService.streaming$ | async) === false || !last) && message.role === 'assistant' && isAdmin && message.additionalProperties.$debug\"\n [canLike]=\"((chatService.streaming$ | async) === false || !last) && message.role === 'assistant'\"\n [canDislike]=\"((chatService.streaming$ | async) === false || !last) && message.role === 'assistant'\"\n (edit)=\"editMessage(index)\"\n (copy)=\"copyMessage(index)\"\n (regenerate)=\"regenerateMessage(index)\"\n (openDocument)=\"openOriginalAttachment($event)\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (suggestAction)=\"suggestActionClick($event, index)\"\n (like)=\"onLike(index)\"\n (dislike)=\"onDislike($event, index)\"\n (debug)=\"showDebug($event)\">\n </sq-chat-message>\n </li>\n </ng-container>\n <!-- Loading spinner -->\n <li class=\"list-group-item\" *ngIf=\"(loading$ | async) === true\">\n <ng-container *ngTemplateOutlet=\"loadingTpl || loadingTplDefault\"></ng-container>\n </li>\n </ul>\n\n <!-- Reporting an issue form -->\n <div class=\"issue-report bg-light pt-3 pb-2\" *ngIf=\"showReportIssue\">\n <ng-container *ngTemplateOutlet=\"reportIssueTpl || reportIssueTplDefault; context: { $implicit: messageRelatedIssue, rank: issueRank }\"></ng-container>\n </div>\n\n <!-- User text input -->\n <div class=\"user-input mt-auto\" *ngIf=\"enabledUserInput && !showReportIssue\">\n <div class=\"py-2\">\n <ng-container *ngTemplateOutlet=\"inputTpl\"></ng-container>\n <div class=\"text-end small text-muted px-3\" *ngIf=\"!!config?.globalSettings?.disclaimer\">\n {{ config?.globalSettings?.disclaimer }}\n </div>\n </div>\n </div>\n\n <!-- Floating scroll button -->\n <div *ngIf=\"!isAtBottom && !showReportIssue\" class=\"sq-floating-scroll\" [ngClass]=\"enabledUserInput ? 'sq-floating-scroll--when-user-input' : 'sq-floating-scroll--without-user-input'\">\n <button class=\"btn shadow\" (click)=\"scrollDown()\">\n <i class=\"fas fa-angle-double-down\"></i>\n </button>\n </div>\n </div>\n</ng-container>\n\n<!-- NG TEMPLATES-->\n\n<ng-template #loadingTplDefault>\n <div class=\"spinner-grow text-primary d-block mx-auto my-5\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</ng-template>\n\n<ng-template #inputTpl>\n <div class=\"px-3 py-1\">\n <div class=\"ast-input-container\">\n <button disabled class=\"btn btn-light\">\n <i class=\"fas fa-search\"></i>\n </button>\n <textarea #questionInput rows=\"1\"\n type=\"text\" class=\"form-control\"\n placeholder=\"Ask something\" autofocus\n [(ngModel)]=\"question\"\n (keyup)=\"onKeyUp($event)\"\n (keydown)=\"calculateHeight()\"\n [disabled]=\"(loading$ | async) || (chatService.streaming$ | async)\">\n </textarea>\n <button\n *ngIf=\"!(chatService.streaming$ | async) && !(loading$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Send message\"\n (click)=\"submitQuestion()\">\n <i class=\"fas fa-paper-plane\"></i>\n </button>\n <!--<button\n *ngIf=\"(chatService.streaming$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Stop generating\"\n (click)=\"terminateFetch()\">\n <i class=\"fas fa-stop\"></i>\n </button>-->\n <button\n *ngIf=\"messageToEdit\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Cancel edition\"\n (click)=\"messageToEdit = undefined; question = ''\">\n <i class=\"fas fa-undo-alt\"></i>\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #reportIssueTplDefault let-message let-rank=\"rank\">\n <div class=\"px-3\">\n <h5>Issue type</h5>\n <select class=\"form-select mb-4\" [(ngModel)]=\"issueType\">\n <option [value]=\"''\">Choose an issue type</option>\n <option *ngFor=\"let type of issueTypes\">{{type}}</option>\n </select>\n <h5>Comment (optional)</h5>\n <textarea class=\"form-control\" [(ngModel)]=\"issueComment\" placeholder=\"What was unsatisfying about this response?\"></textarea>\n <div class=\"d-flex flex-row-reverse mt-2\">\n <button class=\"btn btn-primary\" [disabled]=\"!issueType\" (click)=\"sendIssue()\">Send</button>\n <button class=\"btn btn-light\" (click)=\"ignoreIssue()\">Cancel</button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultTokenConsumptionTpl let-instanceId>\n <sq-token-progress-bar\n [instanceId]=\"instanceId\">\n </sq-token-progress-bar>\n</ng-template>\n\n<div class=\"debug-messages\" [class.displayed]=\"showDebugMessages\">\n <button *ngIf=\"showDebugMessages\" class=\"btn btn-light shadow back-btn\" (click)=\"showDebugMessages=false\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n <ng-container *ngTemplateOutlet=\"debugMessagesTpl || defaultDebugMessagesTpl; context: { $implicit: debugMessages }\">\n </ng-container>\n</div>\n\n<ng-template #defaultDebugMessagesTpl let-debugMessages>\n <sq-debug-message [data]=\"debugMessages\"></sq-debug-message>\n</ng-template>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { Validators } from '@angular/forms';\nimport { Subscription, catchError, filter, switchMap, tap, throwError, BehaviorSubject } from \"rxjs\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { ConfirmType, ModalButton, ModalResult, ModalService, PromptOptions, ModalModule } from \"@sinequa/core/modal\";\nimport { NotificationsService } from \"@sinequa/core/notification\";\nimport { UtilsModule } from \"@sinequa/components/utils\";\nimport { format, parseISO, isToday, isYesterday, isThisWeek, isThisMonth, isThisQuarter, isThisYear, endOfYesterday, differenceInDays, differenceInMonths, differenceInYears, toDate } from 'date-fns';\nimport { ChatService } from \"../chat.service\";\nimport { SavedChat } from \"../types\";\nimport { InstanceManagerService } from \"../instance-manager.service\";\n\n@Component({\n selector: 'sq-saved-chats-v3',\n templateUrl: 'saved-chats.component.html',\n styleUrls: ['saved-chats.component.scss'],\n standalone: true,\n imports: [CommonModule, ModalModule, UtilsModule]\n})\nexport class SavedChatsComponent implements OnInit, OnDestroy {\n /** Define the key based on it, the appropriate chatService instance will be returned from instanceManagerService */\n @Input() instanceId: string;\n\n @Output() load = new EventEmitter<SavedChat>();\n @Output() delete = new EventEmitter<SavedChat>();\n\n chatService: ChatService;\n subscription = new Subscription();\n groupedSavedChats$ = new BehaviorSubject<{ key: string; value: SavedChat[]}[]>([]);\n\n public loginService = inject(LoginService);\n public instanceManagerService = inject(InstanceManagerService);\n public modalService = inject(ModalService);\n public notificationsService = inject(NotificationsService);\n\n ngOnInit(): void {\n this.subscription.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n switchMap(_ => this.chatService.initProcess$),\n filter(success => !!success),\n tap(_ => {\n this.onListSavedChat();\n this.chatService.listSavedChat();\n })\n ).subscribe()\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n instantiateChatService(): void {\n this.chatService = this.instanceManagerService.getInstance(this.instanceId);\n }\n\n onListSavedChat() {\n this.subscription.add(\n this.chatService.savedChats$.subscribe(\n (savedChats: SavedChat[]) => {\n this.groupedSavedChats$.next(this._groupSavedChatsByDate(savedChats));\n }\n )\n );\n }\n\n onLoad(savedChat: SavedChat) {\n this.chatService.setSavedChatId(savedChat.id);\n this.chatService.generateChatId(savedChat.id);\n this.chatService.loadSavedChat$.next(savedChat);\n this.chatService.generateAuditEvent('saved-chat.load', {}, savedChat.id);\n this.chatService.listSavedChat();\n this.load.emit(savedChat);\n }\n\n onRename(savedChat: SavedChat) {\n const model: PromptOptions = {\n title: 'Rename saved discussion',\n message: `Please enter a new name for the discussion \"${savedChat.title}\".`,\n buttons: [\n new ModalButton({result: ModalResult.Cancel}),\n new ModalButton({result: ModalResult.OK, text: \"Rename\", primary: true})\n ],\n output: savedChat.title,\n validators: [Validators.required]\n };\n\n this.modalService.prompt(model).then(res => {\n if(res === ModalResult.OK) {\n this.subscription.add(\n this.chatService.updateSavedChat(savedChat.id, model.output)\n .pipe(\n tap(() => {\n this.notificationsService.success(`The saved discussion \"${savedChat.title}\" has been successfully renamed to \"${model.output}\".`);\n this.chatService.listSavedChat();\n }),\n catchError((error) => {\n console.error('Error occurred while updating the saved chat:', error);\n this.notificationsService.error(`Error occurred while updating the saved discussion \"${savedChat.title}\"`);\n return throwError(() => error);\n })\n ).subscribe()\n );\n this.chatService.generateAuditEvent('saved-chat.rename', {'text': model.output}, savedChat.id);\n }\n });\n }\n\n onDelete(savedChat: SavedChat) {\n this.modalService\n .confirm({\n title: \"Delete saved discussion\",\n message: `You are about to delete the discussion \"${savedChat.title}\". Do you want to continue?`,\n buttons: [\n new ModalButton({result: ModalResult.Cancel}),\n new ModalButton({result: ModalResult.OK, text: \"Confirm\", primary: true})\n ],\n confirmType: ConfirmType.Warning\n }).then(res => {\n if(res === ModalResult.OK) {\n this.subscription.add(\n this.chatService.deleteSavedChat([savedChat.id])\n .pipe(\n tap(() => {\n this.notificationsService.success(`The saved discussion \"${savedChat.title}\" has been successfully deleted.`);\n this.delete.emit(savedChat);\n this.chatService.listSavedChat();\n }),\n catchError((error) => {\n console.error('Error occurred while deleting the saved chat:', error);\n this.notificationsService.error(`Error occurred while deleting the saved discussion \"${savedChat.title}\"`);\n return throwError(() => error);\n })\n ).subscribe()\n );\n this.chatService.generateAuditEvent('saved-chat.delete', {}, savedChat.id);\n }\n });\n }\n\n private _groupSavedChatsByDate(savedChats: SavedChat[]): { key: string; value: SavedChat[] }[] {\n const groupedSavedChats = new Map<string, SavedChat[]>();\n\n savedChats\n .sort((a, b) => parseISO(b.modifiedUTC).getTime() - parseISO(a.modifiedUTC).getTime())\n .forEach(savedChat => {\n const groupKey = this._getTimeKey(toDate(parseISO(savedChat.modifiedUTC))); // Must convert the UTC date to local date before passing to _getTimeKey\n\n if (!groupedSavedChats.has(groupKey)) {\n groupedSavedChats.set(groupKey, []);\n }\n\n groupedSavedChats.get(groupKey)!.push(savedChat);\n });\n\n return Array.from(groupedSavedChats, ([key, value]) => ({ key, value }));;\n }\n\n private _getTimeKey(date: Date): string {\n if (isToday(date)) {\n return 'Today';\n } else if (isYesterday(date)) {\n return 'Yesterday';\n } else if (isThisWeek(date)) {\n return 'This week';\n } else if (differenceInDays(endOfYesterday(), date) <= 7) {\n return 'Last week';\n } else if (isThisMonth(date)) {\n return 'This month';\n } else if (differenceInMonths(endOfYesterday(), date) <= 1) {\n return 'Last month';\n } else if (isThisQuarter(date)) {\n return 'This quarter';\n } else if (differenceInMonths(endOfYesterday(), date) <= 3) {\n return 'Last quarter';\n } else if (isThisYear(date)) {\n return 'This year';\n } else if (differenceInYears(endOfYesterday(), date) === 1) {\n return 'Last year';\n } else {\n return format(date, 'yyyy');\n }\n }\n\n}\n","<ng-container *ngIf=\"(chatService.chatConfig$ | async)?.savedChatSettings.display\">\n <div *ngFor=\"let group of (groupedSavedChats$ | async)\" class=\"saved-chats\">\n <div class=\"saved-chat-date\">{{group.key}}</div>\n <div *ngFor=\"let savedChat of group.value\" class=\"saved-chat p-2\" [class.active]=\"chatService.savedChatId === savedChat.id\"\n (click)=\"onLoad(savedChat)\">\n <span class=\"title me-1\">{{savedChat.title}}</span>\n <i class=\"saved-chat-actions fas fa-pen mx-1\" [sqTooltip]=\"'Rename'\"\n (click)=\"$event.stopPropagation(); onRename(savedChat)\"></i>\n <i class=\"saved-chat-actions fas fa-trash ms-1\" [sqTooltip]=\"'Delete'\"\n (click)=\"$event.stopPropagation(); onDelete(savedChat)\"></i>\n </div>\n </div>\n</ng-container>\n","export default {\n \"assistant\": {}\n}\n","export default {\n \"assistant\": {}\n}\n","export default {\n \"assistant\": {}\n}\n","import { Utils } from '@sinequa/core/base';\nimport _enAssistant from './en';\nimport _frAssistant from './fr';\nimport _deAssistant from './de';\n\nconst enAssistant = Utils.merge({}, _enAssistant);\nconst frAssistant = Utils.merge({}, _frAssistant);\nconst deAssistant = Utils.merge({}, _deAssistant);\n\nexport { enAssistant, frAssistant, deAssistant };\n","import { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { UntypedFormControl, UntypedFormBuilder, Validators, UntypedFormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { MODAL_MODEL, PromptOptions, ModalRef, ModalButton, ModalResult } from \"@sinequa/core/modal\";\nimport { Utils } from '@sinequa/core/base';\nimport { BsModalModule } from \"@sinequa/components/modal\";\nimport { ValidationModule } from \"@sinequa/core/validation\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { IntlModule } from \"@sinequa/core/intl\";\n\n@Component({\n selector: \"sq-chat-prompt\",\n template: `\n <form name=\"prompt\" novalidate [formGroup]=\"form\">\n <sq-modal [title]=\"title\" [buttons]=\"buttons\">\n <div class=\"mb-3 sq-form-group\">\n <label class=\"form-label\" for=\"input\">{{model.message | sqMessage:model.messageParams}}</label>\n <input [sqValidation]=\"form\" type=\"text\" class=\"form-control\" id=\"input\" formControlName=\"input\" spellcheck=\"off\" sqAutofocus *ngIf=\"!model.rowCount\">\n <textarea [sqValidation]=\"form\" type=\"text\" class=\"form-control\" id=\"input\" formControlName=\"input\" spellcheck=\"on\" rows=\"{{model.rowCount}}\" sqAutofocus *ngIf=\"!!model.rowCount\">\n </textarea>\n </div>\n </sq-modal>\n </form>\n `,\n standalone: true,\n imports: [CommonModule, BsModalModule, ValidationModule, ReactiveFormsModule, IntlModule],\n})\nexport class ChatPrompt implements OnInit, OnDestroy {\n inputControl: UntypedFormControl;\n form: UntypedFormGroup;\n formChanges: Subscription;\n defaultButtons: ModalButton[];\n\n constructor(\n @Inject(MODAL_MODEL) public model: PromptOptions,\n protected modalRef: ModalRef,\n protected formBuilder: UntypedFormBuilder) {\n this.defaultButtons = [\n new ModalButton({\n result: ModalResult.OK,\n primary: true,\n validation: this.form\n }),\n new ModalButton({\n result: ModalResult.Cancel\n })\n ];\n }\n\n ngOnInit() {\n this.inputControl = new UntypedFormControl(this.model.output, this.model.validators || Validators.required);\n this.form = this.formBuilder.group({\n input: this.inputControl\n });\n this.formChanges = Utils.subscribe(this.form.valueChanges,\n (value) => {\n this.model.output = this.inputControl.value;\n });\n }\n\n ngOnDestroy() {\n this.formChanges.unsubscribe();\n }\n\n get title(): string {\n return this.model.title ? this.model.title : \"msg#modal.prompt.title\";\n }\n\n get buttons(): ModalButton[] {\n return (this.model.buttons && this.model.buttons.length > 0) ? this.model.buttons : this.defaultButtons;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","Prism","i5","i6"],"mappings":"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"}
1
+ {"version":3,"file":"sinequa-assistant-chat.mjs","sources":["../../../projects/assistant/chat/instance-manager.service.ts","../../../projects/assistant/chat/chat-settings-v3/chat-settings-v3.component.ts","../../../projects/assistant/chat/chat-settings-v3/chat-settings-v3.component.html","../../../projects/assistant/chat/types.ts","../../../projects/assistant/chat/chat.service.ts","../../../projects/assistant/chat/websocket-chat.service.ts","../../../projects/assistant/chat/initials-avatar/initials-avatar.component.ts","../../../projects/assistant/chat/initials-avatar/initials-avatar.component.html","../../../projects/assistant/chat/format-icon/icons.ts","../../../projects/assistant/chat/format-icon/format-icon.component.ts","../../../projects/assistant/chat/format-icon/format-icon.component.html","../../../projects/assistant/chat/chat-reference/chat-reference.component.ts","../../../projects/assistant/chat/chat-reference/chat-reference.component.html","../../../projects/assistant/chat/charts/chart/chart.component.ts","../../../projects/assistant/chat/charts/chart/chart.component.html","../../../projects/assistant/chat/chat-message/chat-message.component.ts","../../../projects/assistant/chat/chat-message/chat-message.component.html","../../../projects/assistant/chat/rest-chat.service.ts","../../../projects/assistant/chat/token-progress-bar/token-progress-bar.component.ts","../../../projects/assistant/chat/token-progress-bar/token-progress-bar.component.html","../../../projects/assistant/chat/debug-message/debug-message.component.ts","../../../projects/assistant/chat/debug-message/debug-message.component.html","../../../projects/assistant/chat/chat.component.ts","../../../projects/assistant/chat/chat.component.html","../../../projects/assistant/chat/saved-chats/saved-chats.component.ts","../../../projects/assistant/chat/saved-chats/saved-chats.component.html","../../../projects/assistant/chat/messages/en.ts","../../../projects/assistant/chat/messages/fr.ts","../../../projects/assistant/chat/messages/de.ts","../../../projects/assistant/chat/messages/index.ts","../../../projects/assistant/chat/prompt.component.ts","../../../projects/assistant/chat/sinequa-assistant-chat.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ChatService } from './chat.service';\n\n/**\n * A service to create and manage instances of ChatService dynamically based on the provided component references and the implementation type (http or websocket)\n * All chat-related components should share the same instance of this InstanceManagerService, which in turn provides the appropriate instance of ChatService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class InstanceManagerService {\n private _serviceInstances: Map<string, ChatService> = new Map();\n\n /**\n * Store the instance of ChatService in the map\n * @param key key differentiator between components used to store their corresponding ChatService instance\n * @param service The ChatService instance\n */\n storeInstance(key: string, service: ChatService): void {\n this._serviceInstances.set(key, service);\n }\n\n /**\n * @param key key differentiator between components based on which the corresponding ChatService instance is fetched\n * @returns The instance of the service corresponding to the instance of the component\n */\n getInstance(key: string): ChatService {\n if (!this.checkInstance(key)) {\n throw new Error(`No chat instance found for the given key : '${key}'`);\n }\n return this._serviceInstances.get(key)!;\n }\n\n /**\n *\n * @param key key differentiator between components based on which the check for an existent ChatService instance is performed\n * @returns True if a ChatService instance has been already instantiated for the given key. Otherwise, false.\n */\n checkInstance(key: string): boolean {\n return this._serviceInstances.has(key);\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject } from \"@angular/core\";\nimport { ChatService } from \"../chat.service\";\nimport { ChatConfig, GllmModelDescription } from \"../types\";\nimport { Subscription, filter, switchMap, tap } from \"rxjs\";\nimport { InstanceManagerService } from \"../instance-manager.service\";\nimport { PrincipalWebService } from \"@sinequa/core/web-services\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { AppService } from \"@sinequa/core/app-utils\";\n\n@Component({\n selector: 'sq-chat-settings-v3',\n templateUrl: './chat-settings-v3.component.html',\n styleUrls: [\"./chat-settings-v3.component.scss\"],\n standalone: true,\n imports: [CommonModule, FormsModule]\n})\nexport class ChatSettingsV3Component implements OnInit, OnDestroy {\n /** Define the key based on it, the appropriate chatService instance will be returned from instanceManagerService */\n @Input() instanceId: string;\n\n @Output(\"update\") _update = new EventEmitter<ChatConfig>();\n @Output(\"cancel\") _cancel = new EventEmitter<ChatConfig>();\n\n chatService: ChatService;\n config: ChatConfig;\n subscription = new Subscription();\n selectedModel: GllmModelDescription | undefined;\n functions: {name: string, enabled: boolean}[] = [];\n isAdmin = false;\n\n public loginService = inject(LoginService);\n public instanceManagerService = inject(InstanceManagerService);\n public principalService = inject(PrincipalWebService);\n public appService = inject(AppService);\n\n ngOnInit(): void {\n this.subscription.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n switchMap(() => this.chatService.initConfig$),\n filter(initConfig => !!initConfig)\n ).subscribe(_ => {\n this.isAdmin = this.principalService.principal!.isAdministrator;\n // Init config with a copy of the original chat config, so that it won't be modified by the user until he clicks on save\n this.config = JSON.parse(JSON.stringify(this.chatService.chatConfig$.value));\n this.selectedModel = this.chatService.getModel(this.config.defaultValues.service_id, this.config.defaultValues.model_id);\n this.initFunctionsList();\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n get hasPrompts(): boolean {\n return this.isAdmin\n || !!this.config.uiSettings.displaySystemPrompt\n || !!this.config.uiSettings.displayUserPrompt;\n }\n\n get hasAdvancedParameters(): boolean {\n return this.isAdmin\n || !!this.config.uiSettings.temperature\n || !!this.config.uiSettings.top_p\n || !!this.config.uiSettings.max_tokens;\n }\n\n get hasModel(): boolean {\n return this.isAdmin\n || !!this.config.uiSettings.servicesModels\n || !!this.config.uiSettings.functions\n || !!this.config.uiSettings.debug\n || !!this.config.uiSettings.temperature\n || !!this.config.uiSettings.top_p\n || !!this.config.uiSettings.max_tokens;\n }\n\n instantiateChatService(): void {\n this.chatService = this.instanceManagerService.getInstance(this.instanceId);\n }\n\n onChatModelChange(selectedModel: GllmModelDescription) {\n // Update properties based on the selected model\n this.config.defaultValues.service_id = selectedModel.serviceId;\n this.config.defaultValues.model_id = selectedModel.modelId;\n }\n\n getFunctionDescription(name: string): string {\n return this.chatService.functions?.find(fn => fn.functionName === name)?.description || \"\";\n }\n\n toggleFunctionsSelection(name: string) {\n // Update the enabled property of the function\n const index = this.config.defaultValues.functions.findIndex(func => func.name === name);\n this.config.defaultValues.functions[index].enabled = this.functions[index].enabled;\n }\n\n private initFunctionsList(): void {\n this.functions = this.config.defaultValues.functions.filter(func => !!this.chatService.functions?.find(fn => fn.functionName === func.name));\n }\n\n /**\n * Save the new chat config in the chat service and the user preferences\n * If the user has never modified the default values, we need to save the hash of the standard default values, as defined by the admin, in order to properly track changes afterwards.\n */\n save() {\n const userSettingsConfig = this.chatService.assistants[this.instanceId] || {};\n if (!userSettingsConfig.defaultValues) { // At this point, it is the very first time the user makes changes to the default values\n const standardChatConfig = this.appService.app?.data?.assistants?.[this.instanceId];\n const hashes = { ...userSettingsConfig.hashes, \"applied-defaultValues-hash\": Utils.sha512(JSON.stringify(standardChatConfig.defaultValues)) };\n this.chatService.updateChatConfig(this.config, hashes);\n } else {\n this.chatService.updateChatConfig(this.config);\n }\n this.chatService.generateAuditEvent(\"configuration.edit\", { 'configuration': JSON.stringify(this.config) });\n this._update.emit(this.config);\n }\n\n /**\n * Cancel the current changes\n */\n cancel() {\n this._cancel.emit(this.chatService.chatConfig$.value);\n }\n}\n","<div class=\"sq-chat-settings\" *ngIf=\"isAdmin || config.uiSettings.display\">\n <div class=\"settings-panel card-body small\" *ngIf=\"config\">\n\n <h5 *ngIf=\"hasModel\">Model</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.servicesModels\">\n <label for=\"gllmModel\" class=\"form-label\">Model</label>\n <select class=\"form-select\" id=\"gllmModel\" [(ngModel)]=\"selectedModel\" (ngModelChange)=\"onChatModelChange($event)\">\n <option *ngFor=\"let model of chatService.models\" [ngValue]=\"model\">{{model.displayName}}</option>\n </select>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"isAdmin || config.uiSettings.functions\">\n <label for=\"gllmFunctions\" class=\"form-label\">Functions</label>\n <div id=\"gllmFunctions\" *ngFor=\"let func of functions\" class=\"multi-option form-check form-switch\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" [id]=\"func.name\" [(ngModel)]=\"func.enabled\"\n (ngModelChange)=\"toggleFunctionsSelection(func.name)\">\n <label class=\"form-check-label\" [for]=\"func.name\" [title]=\"getFunctionDescription(func.name)\">{{ func.name }}</label>\n </div>\n </div>\n\n <div class=\"form-check form-switch mb-2\" *ngIf=\"isAdmin || config.uiSettings.debug\">\n <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"debug\" [(ngModel)]=\"config.defaultValues.debug\">\n <label class=\"form-check-label\" for=\"debug\">Debug</label>\n </div>\n\n <details *ngIf=\"hasAdvancedParameters\">\n <summary>Advanced parameters</summary>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.temperature\">\n <label for=\"temperature\" class=\"form-label\">Temperature: {{config.defaultValues.temperature}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"2\" step=\"0.1\" id=\"temperature\"\n [(ngModel)]=\"config.defaultValues.temperature\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.top_p\">\n <label for=\"top-p\" class=\"form-label\">Top P: {{config.defaultValues.top_p}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"0\" max=\"1\" step=\"0.05\" id=\"top-p\"\n [(ngModel)]=\"config.defaultValues.top_p\">\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.max_tokens\">\n <label for=\"max-tokens\" class=\"form-label\">Max generated tokens per answer:\n {{config.defaultValues.max_tokens}}</label>\n <input type=\"range\" class=\"form-range form-range-sm\" min=\"1\" max=\"2048\" step=\"1\" id=\"max-tokens\"\n [(ngModel)]=\"config.defaultValues.max_tokens\">\n </div>\n </details>\n\n <hr>\n\n <h5 *ngIf=\"hasPrompts\">Prompts</h5>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displaySystemPrompt\">\n <label for=\"initialSystemPrompt\" class=\"form-label\">System prompt (hidden)</label>\n <textarea class=\"form-control\" id=\"initialSystemPrompt\" [(ngModel)]=\"config.defaultValues.systemPrompt\"></textarea>\n </div>\n <div class=\"mb-2\" *ngIf=\"isAdmin || config.uiSettings.displayUserPrompt\">\n <label for=\"initialUserPrompt\" class=\"form-label\">Initial user prompt</label>\n <textarea class=\"form-control\" id=\"initialUserPrompt\" [(ngModel)]=\"config.defaultValues.userPrompt\"></textarea>\n </div>\n\n </div>\n\n <div class=\"buttons-panel d-flex justify-content-end\">\n <button class=\"btn btn-light me-1\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn btn-primary\" *ngIf=\"config\" (click)=\"save()\">Save</button>\n </div>\n\n</div>\n","import { z } from 'zod';\nimport { Record } from \"@sinequa/core/web-services\";\nimport { Query } from '@sinequa/core/app-utils';\n\n/**\n * Individual message sent & returned by the ChatGPT API.\n * If this message is an attachment, we attach the minimal\n * information needed to reconstruct this attachment (RawAttachment)\n * as well as the reference id computed at the moment of sending\n * the attachment to the API.\n */\nexport interface RawMessage {\n role: string;\n content: string;\n messageType?: 'CHART' | 'MARKDOWN'\n additionalProperties: {\n [key: string]: any\n };\n}\n\n/**\n * A chat message that has been processed to include the markdown-formatted\n * content for display, as well as detailed attachment data, and optionally\n * a list of the references extracted from that message\n */\nexport interface ChatMessage extends RawMessage {\n additionalProperties: {\n display?: boolean;\n $progress?: ChatProgress[];\n $attachment?: ChatContextAttachment[];\n $suggestedAction?: SuggestedAction[];\n $debug?: DebugMessage[];\n forcedWorkflow?: string;\n query?: Query;\n isUserInput?: boolean;\n usageMetrics?: ChatUsageMetrics;\n additionalWorkflowProperties?: any;\n [key: string]: any;\n };\n}\n\nexport interface ChatProgress {\n title: string;\n content?: string;\n done?: boolean;\n time?: number;\n}\n\nexport interface RawAttachment {\n /** Type of the attachment */\n type: string;\n /** Record id from which this attachment is taken */\n recordId: string;\n /** Record from which this this attachment is taken */\n record: Record;\n}\n\nexport interface DocumentPart {\n partId: number;\n offset: number;\n length: number;\n text: string;\n}\n\nexport interface ChatContextAttachment extends RawAttachment {\n /** Type of the attachment */\n type: \"Context\";\n /** Rank of the attachment in the context message */\n contextId: number;\n /** Parts of the record that the assistant uses to answer */\n parts: DocumentPart[];\n /** The specific id used of the referenced part */\n $partId?: number;\n}\n\n/**\n * Raw response of the chat API\n */\nexport interface RawResponse {\n history: RawMessage[];\n executionTime: string;\n}\n\n/**\n * Enriched response of the chat API\n */\nexport interface ChatResponse extends RawResponse{\n history: ChatMessage[];\n}\n\n/**\n * Response of the ListModels API\n */\nexport interface GllmModelDescription {\n provider: string;\n displayName: string;\n serviceId: string;\n modelId: string;\n enable: boolean;\n maxGenerationSize: number;\n contextWindowSize: number;\n}\n\n/**\n * Response of the ListFunctions API\n */\nexport interface GllmFunction {\n functionName: string;\n description: string;\n enabled: boolean;\n parameters: GllmFunctionParameter[];\n}\n\nexport interface GllmFunctionParameter {\n description: string;\n isRequired: boolean;\n name: string;\n type: string;\n}\n\n/**\n * Minimal representation of a saved chat\n */\nexport interface SavedChat {\n id: string;\n title: string;\n modifiedUTC: string;\n}\n\n/**\n * Data structure saved to reconstruct a saved chat conversation\n */\nexport interface SavedChatHistory extends SavedChat{\n history: ChatMessage[];\n}\n\n// Define the Zod representation for the connectionSettings object\nexport const connectionSettingsSchema = z.object({\n restEndpoint: z.string().optional(),\n websocketEndpoint: z.string().optional(),\n signalRTransport: z.enum([\"WebSockets\", \"ServerSentEvents\", \"LongPolling\", \"None\"]),\n signalRLogLevel: z.enum([\"Critical\", \"Debug\", \"Error\", \"Information\", \"None\", \"Trace\", \"Warning\"])\n}).refine(data => (!!data.restEndpoint || !!data.websocketEndpoint), {\n message: \"Based on the provided input() protocol ('REST' or 'WEBSOCKET') to the Chat Component, either 'restEndpoint' or 'websocketEndpoint' property should be provided in the 'globalSettings' of the assistant instance.\",\n});\n// Define the ConnectionSettings interface\nexport type ConnectionSettings = z.infer<typeof connectionSettingsSchema>;\n\n// Define the Zod representation for the serviceSettings object\nconst serviceSettingsSchema = z.object({\n service_id: z.string(),\n model_id: z.string(),\n temperature: z.number(),\n top_p: z.number(),\n max_tokens: z.number()\n});\n// Define the ServiceSettings interface\nexport interface ServiceSettings extends z.infer<typeof serviceSettingsSchema> {}\n\n// Define the Zod representation for the additionalServiceSettings object\nconst additionalServiceSettingsSchema = z.object({});\n// Define the AdditionalServiceSettings interface\nexport interface AdditionalServiceSettings extends z.infer<typeof additionalServiceSettingsSchema> {}\n\n// Define the Zod representation for the additionalWorkflowProperties object\nconst additionalWorkflowPropertiesSchema = z.object({});\n// Define the additionalWorkflowProperties interface\nexport interface additionalWorkflowProperties extends z.infer<typeof additionalWorkflowPropertiesSchema> {}\n\n// Define the Zod representation for the uiSettings object\nconst uiSettingsSchema = z.object({\n display: z.boolean(),\n servicesModels: z.boolean(),\n functions: z.boolean(),\n temperature: z.boolean(),\n top_p: z.boolean(),\n max_tokens: z.boolean(),\n debug: z.boolean(),\n displaySystemPrompt: z.boolean(),\n displayUserPrompt: z.boolean()\n});\n// Define the UiSettings interface\nexport interface UiSettings extends z.infer<typeof uiSettingsSchema> {}\n\n// Define the Zod representation for the defaultValues object\nconst defaultValuesSchema = z.object({\n service_id: z.string(),\n model_id: z.string(),\n functions: z.array(\n z.object({\n name: z.string(),\n enabled: z.boolean()\n })\n ),\n temperature: z.number(),\n top_p: z.number(),\n max_tokens: z.number(),\n debug: z.boolean(),\n systemPrompt: z.string(),\n userPrompt: z.string()\n});\n// Define the DefaultValues interface\nexport interface DefaultValues extends z.infer<typeof defaultValuesSchema> {}\n\n// Define the Zod representation for the modeSettings object\nconst initializationSchema = z.object({\n event: z.enum(['Query', 'Prompt']),\n forcedWorkflow: z.string().optional(), // Optional for event 'Prompt'\n displayUserQuery: z.boolean().optional(), // Optional for event 'Prompt'\n}).refine(data => ((data.event === \"Query\") ? (!!data.forcedWorkflow && data.displayUserQuery !== undefined && data.displayUserQuery !== null) : true), {\n message: \"The 'forcedWorkflow' and 'displayUserQuery' properties must be provided when the initialization's event is 'Query'.\",\n});\nconst modeSettingsSchema = z.object({\n enabledUserInput: z.boolean(),\n displayUserPrompt: z.boolean(),\n sendUserPrompt: z.boolean(),\n initialization: initializationSchema\n});\n// Define the ModeSettings interface\nexport interface ModeSettings extends z.infer<typeof modeSettingsSchema> {}\n\n// Define the Zod representation for the savedChatSettings object\nconst savedChatSettingsSchema = z.object({\n enabled: z.boolean(),\n display: z.boolean()\n})\n// Define the SavedChatSettings interface\nexport interface SavedChatSettings extends z.infer<typeof savedChatSettingsSchema> {}\n\n// Define the Zod representation for the globalSettings object\nconst globalSettingsSchema = z.object({\n disclaimer: z.string().optional(),\n displayUserQuotaConsumption: z.boolean().optional(),\n displayChatTokensConsumption: z.boolean().optional()\n})\n// Define the SavedChatSettings interface\nexport interface SavedChatSettings extends z.infer<typeof savedChatSettingsSchema> {}\n\n// Define the Zod representation for the entire ChatConfig object\nexport const chatConfigSchema = z.object({\n connectionSettings: connectionSettingsSchema,\n defaultValues: defaultValuesSchema,\n modeSettings: modeSettingsSchema,\n uiSettings: uiSettingsSchema,\n savedChatSettings: savedChatSettingsSchema,\n globalSettings: globalSettingsSchema,\n additionalServiceSettings: additionalServiceSettingsSchema,\n additionalWorkflowProperties: additionalWorkflowPropertiesSchema\n});\n// Define the ChatConfig interface\nexport interface ChatConfig extends z.infer<typeof chatConfigSchema> {}\n\nexport interface ChatPayload {\n debug: boolean;\n functions: string[];\n history: ChatMessage[];\n serviceSettings: ServiceSettings;\n appQuery: {\n app: string;\n query: Query | undefined;\n targetUrl?: string;\n accessToken?: string;\n };\n instanceId?: string;\n savedChatId?: string;\n}\n\nexport type ActionMessage = {\n guid: string;\n displayName?: string\n displayValue?: string;\n executionTime?: number;\n}\n\nexport interface TextChunksOptions {\n extendMode?: 'None' | 'Sentence' | 'Chars';\n extendScope?: number;\n}\n\nexport interface Quota {\n lastRequest: string;\n promptTokenCount: number;\n completionTokenCount: number;\n periodTokens: number;\n resetHours: number;\n tokenCount: number;\n nextReset: string;\n lastResetUTC: string;\n nextResetUTC: string;\n maxQuotaReached: boolean;\n}\n\nexport interface SuggestedAction {\n content: string;\n type: string;\n}\n\nexport interface InitChat {\n messages: RawMessage[];\n}\n\n/**\n * List of events data that can be emitted by the websocket chat endpoint\n */\nexport type SuggestedActionsEvent = { suggestedActions: SuggestedAction[] };\nexport type QuotaEvent = { quota: Quota };\nexport type MessageEvent = string;\nexport type ContextMessageEvent = { content: string; metadata: ChatContextAttachment };\nexport type ErrorEvent = string;\nexport type ActionStartEvent = { guid: string; displayName: string };\nexport type ActionResultEvent = { guid: string; displayValue: string };\nexport type ActionStopEvent = { guid: string; executionTime: number };\nexport type HistoryEvent = { history: RawMessage[]; executionTime: string };\nexport type DebugMessageEvent = DebugMessage;\n\n/**\n * Data emitted by the http chat endpoint\n */\nexport type HttpChatResponse = {\n quota: Quota;\n suggestedActions: SuggestedAction[];\n debug: any;\n context: { content: string; additionalProperties: ChatContextAttachment }[];\n actions: ActionMessage[];\n history: RawMessage[];\n executionTime: string;\n}\n\nexport interface TokenConsumption {\n percentage: number;\n}\n\nexport interface UserTokenConsumption extends TokenConsumption {\n nextResetDate: string;\n}\n\nexport interface ChatUsageMetrics {\n totalTokenCount: number;\n promptTokenCount: number;\n completionTokenCount: number;\n tokenizerType: string\n}\n\nexport interface KvObject {\n data: {\n key: string;\n value: any; // string | number | boolean | null | undefined | { [key: string]: any };\n };\n type: 'KV';\n isError: boolean;\n}\n\nexport interface ListObject {\n name: string;\n type: 'LIST';\n isError: boolean;\n items: (KvObject | ListObject)[];\n expanded: boolean;\n}\n\nexport type DebugMessage = KvObject | ListObject;\n\n\nexport type MessageHandler<T> = {\n handler: (data: T) => void;\n isGlobalHandler: boolean;\n};\n","import { Injectable, inject } from \"@angular/core\";\nimport { UserPreferences } from \"@sinequa/components/user-settings\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { NotificationsService } from \"@sinequa/core/notification\";\nimport { AuditWebService, UserSettingsWebService, PrincipalWebService } from \"@sinequa/core/web-services\";\nimport { BehaviorSubject, Observable } from \"rxjs\";\nimport { ChatConfig, ChatMessage, ChatResponse, ChatUsageMetrics, GllmFunction, GllmModelDescription, Quota, SavedChat, SavedChatHistory, TokenConsumption, UserTokenConsumption, chatConfigSchema } from \"./types\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { IntlService } from \"@sinequa/core/intl\";\nimport get from \"lodash/get\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { ConfirmType, ModalButton, ModalResult, ModalService } from \"@sinequa/core/modal\";\nimport { parseISO, toDate } from \"date-fns\";\n\n@Injectable()\nexport abstract class ChatService {\n /** Name of the assistant plugin OR websocket endpoint. */\n REQUEST_URL: string;\n /** Emit true once the initialization of the chat process is done. */\n initProcess$ = new BehaviorSubject<boolean>(false);\n /** Emit true once the initialization of the chat config is done. */\n initConfig$ = new BehaviorSubject<boolean>(false);\n /** Global configuration of the chat. */\n chatConfig$ = new BehaviorSubject<ChatConfig | undefined>(undefined);\n /** Streaming status of the chat endpoint. */\n streaming$ = new BehaviorSubject<boolean>(false);\n /** Store the messages history of the current chat. */\n chatHistory: ChatMessage[] | undefined;\n /** List of models available on the server. */\n models: GllmModelDescription[] | undefined;\n /** List of functions available on the server. */\n functions: GllmFunction[] | undefined;\n /** List of saved chats. */\n savedChats$ = new BehaviorSubject<SavedChat[]>([]);\n /** Emit the saved chat to load. */\n loadSavedChat$ = new BehaviorSubject<SavedChat | undefined>(undefined);\n /** Emit the quota each time the chat is invoked. */\n quota$ = new BehaviorSubject<Quota | undefined>(undefined);\n /** Emit the calculated user's token consumption based on the quota. */\n userTokenConsumption$ = new BehaviorSubject<UserTokenConsumption | undefined>(undefined);\n /** Emit the chat usage metrics each time the generation of the assistant response is completed. */\n chatUsageMetrics$ = new BehaviorSubject<ChatUsageMetrics | undefined>(undefined);\n /** Emit the calculated chat's token consumption based on the chat usage metrics. */\n chatTokenConsumption$ = new BehaviorSubject<TokenConsumption | undefined>(undefined);\n /** Instance ID of the chat service defining the assistant instance. */\n private _chatInstanceId: string;\n /** ID of the current **saved chat** discussion which is used to update/get/delete it. */\n private _savedChatId: string | undefined;\n /** Generated GUID for the current non-saved chat discussion used to identify audit events.\n * If the chat is saved, the savedChatId is initialized with the value of this chatId.\n */\n private _chatId: string;\n\n public userSettingsService = inject(UserSettingsWebService);\n public notificationsService = inject(NotificationsService);\n public auditService = inject(AuditWebService);\n public prefs = inject(UserPreferences);\n public loginService = inject(LoginService);\n public appService = inject(AppService);\n public intlService = inject(IntlService);\n public modalService = inject(ModalService);\n public principalService = inject(PrincipalWebService);\n /**\n * Initialize the chat process\n */\n abstract init(): Observable<boolean>;\n\n /**\n * Initialize the REQUEST_URL\n */\n abstract getRequestsUrl(): void;\n\n get assistants(): any {\n if (!this.userSettingsService.userSettings)\n this.userSettingsService.userSettings = {};\n if (!this.userSettingsService.userSettings[\"assistants\"])\n this.userSettingsService.userSettings[\"assistants\"] = {};\n return this.userSettingsService.userSettings[\"assistants\"];\n }\n\n /**\n * Get the instance ID of the chat service\n * @returns The instance ID of the chat service\n */\n get chatInstanceId(): string {\n return this._chatInstanceId;\n }\n\n /**\n * Persist the instance ID of the chat service\n * @param instanceId The instance ID of the chat service\n */\n setChatInstanceId(instanceId: string) {\n this._chatInstanceId = instanceId;\n }\n\n /**\n * Get the ID of the current chat discussion which is used to save/get/delete it\n * @returns The ID of the current chat discussion\n */\n get savedChatId(): string | undefined {\n return this._savedChatId;\n }\n\n /**\n * Persist the ID of the current chat discussion which is used to save/get/delete it\n * @param savedChatId The ID of the current chat discussion which is used to save/get/delete it\n */\n setSavedChatId(savedChatId: string | undefined) {\n this._savedChatId = savedChatId;\n }\n\n /**\n * Get the ID of the current chat discussion which is used to identify audit events\n * @returns The ID of the current chat discussion\n */\n get chatId(): string {\n return this._chatId;\n }\n\n /**\n * Generate an GUID for the current chat discussion which is used to identify audit events\n * If the discussion is saved, the savedChatId is initialized with the value of this chatId\n * @param chatId if provided, it will be considered as the ID of the current chat discussion which is used to identify audit events\n */\n generateChatId(chatId?: string) {\n this._chatId = chatId || Utils.guid();\n }\n\n /**\n * Initialize the chat config by managing ONLY sub-object **defaultValues** configs of the standard app config (defined in the customization json tab ) and the user preferences.\n * To do so, a tracking mechanism is implemented to notify the user about the available updates in the defaultValues object of the standard app config.\n * The rest of the config object coming from \"standard app config\" is used as it is without any override.\n * Thus, the user preferences are used only for the defaultValues object.\n * This provide a centralized way to manage the rest of the config object by admins and ensure a unique common behavior for all users.\n */\n initChatConfig() {\n const key = this.chatInstanceId;\n const userSettingsConfig = this.assistants[key] || {};\n const standardChatConfig = this.appService.app?.data?.assistants?.[key];\n\n try {\n // Validate the whole config object against the schema\n chatConfigSchema.parse(standardChatConfig);\n // If the user preferences do not contain a config's defaultValues object, keep using the standard app config and nothing to store in the user preferences\n if (!userSettingsConfig.defaultValues) {\n this.chatConfig$.next({...standardChatConfig});\n this.initConfig$.next(true);\n } else { // If the user has its own defaultValues in its userSettings, then we need to check for potential updates made by admins in the meantime and how he wants to manage them\n\n // Retrieve already stored hashes in the user settings if exists\n const appliedDefaultValuesHash = userSettingsConfig.hashes?.[\"applied-defaultValues-hash\"];\n const skippedDefaultValuesHash = userSettingsConfig.hashes?.[\"skipped-defaultValues-hash\"];\n // Create a hash of the current defaultValues of the standardChatConfig\n const currentDefaultValuesHash = Utils.sha512(JSON.stringify(standardChatConfig.defaultValues));\n\n // Implement the tracking mechanism to notify the user about the available updates in the defaultValues object of the standard app config\n const condition = (currentDefaultValuesHash !== appliedDefaultValuesHash) && (currentDefaultValuesHash !== skippedDefaultValuesHash);\n if (condition) {\n this.modalService\n .confirm({\n title: \"Available updates !\",\n message: \"Changes have been made to the default configuration. Do you want to update your own version ?\",\n buttons: [\n new ModalButton({result: ModalResult.No, text: \"See no more\"}),\n new ModalButton({result: ModalResult.Ignore, text: \"Remind me later\"}),\n new ModalButton({result: ModalResult.OK, text: \"Update\", primary: true})\n ],\n confirmType: ConfirmType.Warning\n }).then(res => {\n if(res === ModalResult.OK) {\n const hashes = { ...userSettingsConfig.hashes, \"applied-defaultValues-hash\": currentDefaultValuesHash, \"skipped-defaultValues-hash\": undefined };\n // Update the chat config and store its defaultValues in the user preferences\n this.updateChatConfig({...standardChatConfig}, hashes, true);\n this.initConfig$.next(true);\n this.generateAuditEvent(\"configuration.edit\", { 'configuration': JSON.stringify({...standardChatConfig}) });\n } else if(res === ModalResult.No) {\n // Do not notify the user about changes while this skipped version is not updated\n const hashes = { ...userSettingsConfig.hashes, \"skipped-defaultValues-hash\": currentDefaultValuesHash };\n this.updateChatConfig({...standardChatConfig, defaultValues: userSettingsConfig.defaultValues}, hashes, false);\n this.initConfig$.next(true);\n } else {\n // Just pick the version in the user settings, nothing to be updated\n this.chatConfig$.next({...standardChatConfig, defaultValues: userSettingsConfig.defaultValues});\n this.initConfig$.next(true);\n }\n });\n } else { // No available updates Or updates has been already skipped, then just pick the version in the user settings\n this.chatConfig$.next({...standardChatConfig, defaultValues: userSettingsConfig.defaultValues});\n this.initConfig$.next(true);\n }\n }\n } catch (error) {\n this.notificationsService.error(`Missing valid configuration for the assistant instance '${key}'`);\n throw new Error(`Missing valid configuration for the assistant instance '${key}' . \\n ${JSON.stringify(error.issues, null, 2)}`);\n }\n }\n\n /**\n * Update the chat config and store its defaultValues in the user preferences\n * @param config The updated chat config\n * @param hashes The updated hashes to store in the user preferences\n * @param notify Whether to notify the user about the update\n * @param successCallback The callback to execute if the update is successful\n * @param errorCallback The callback to execute if the update fails\n */\n updateChatConfig(config: ChatConfig, hashes?: {\"applied-defaultValues-hash\"?: string, \"skipped-defaultValues-hash\"?: string}, notify = true, successCallback?: () => any, errorCallback?: () => any) {\n this.chatConfig$.next(config);\n const assistants = Object.assign({}, this.assistants);\n assistants[this.chatInstanceId] = { ...assistants[this.chatInstanceId], defaultValues: config.defaultValues };\n if(hashes) assistants[this.chatInstanceId].hashes = hashes;\n this.userSettingsService.patch({ assistants }).subscribe(\n next => {},\n error => {\n if(notify) {\n errorCallback ? errorCallback() : this.notificationsService.error(`The update of the assistant instance '${this.chatInstanceId}' configuration failed`);\n }\n console.error(\"Could not patch assistants!\", error);\n },\n () => {\n if(notify) {\n successCallback ? successCallback() : this.notificationsService.success(`The assistant instance '${this.chatInstanceId}' configuration has been successfully updated`);\n }\n }\n );\n }\n\n /**\n * Calls the Fetch API to retrieve a new message given all previous messages\n */\n abstract fetch(messages: ChatMessage[], query: Query): Observable<ChatResponse>\n\n /**\n * Return the list of models available on the server\n */\n abstract listModels(): Observable<GllmModelDescription[] | undefined>;\n\n /**\n * Return the list of functions available on the server AND matching enabled functions in the chat config\n */\n abstract listFunctions(): Observable<GllmFunction[] | undefined>;\n\n /**\n * A handler for quota updates each time the chat is invoked.\n * It emits the updated quota to the quota$ subject, emits accordingly the updated user's tokens consumption and notifies the user if the max quota is reached.\n * @param quota The updated quota\n * @param propagateError Whether to propagate the error to the caller\n */\n updateQuota(quota: Quota, propagateError = false) {\n this.quota$.next(quota);\n const nextResetDate = this.formatDateTime(quota.nextResetUTC+\"+00:00\"); // This +00:00 is to ensure dates will be properly converted to local time\n const consumptionPercentage = Math.round((quota.tokenCount * 100 / quota.periodTokens) * 100) / 100;\n this.userTokenConsumption$.next({percentage: consumptionPercentage, nextResetDate});\n if(quota.maxQuotaReached) {\n const msg = `Sorry, you have exceeded the allowed quota. Please retry starting from ${nextResetDate}.`;\n this.notificationsService.error(msg);\n if(propagateError) throw new Error(msg);\n }\n }\n\n /**\n * A handler for chat usage metrics each time the generation of the assistant response is completed.\n * It emits the chat usage metrics to the chatUsageMetrics$ subject, emits accordingly the updated chat's tokens consumption\n * @param chatUsageMetrics The chat usage metrics\n */\n updateChatUsageMetrics(chatUsageMetrics: ChatUsageMetrics) {\n this.chatUsageMetrics$.next(chatUsageMetrics);\n const currentModel = this.getModel(this.chatConfig$.value!.defaultValues.service_id, this.chatConfig$.value!.defaultValues.model_id);\n const consumptionPercentage = Math.round((chatUsageMetrics.totalTokenCount * 100 / (currentModel!.contextWindowSize - currentModel!.maxGenerationSize)) * 100) / 100;\n this.chatTokenConsumption$.next({percentage: consumptionPercentage});\n }\n\n /**\n * Get the model description for the given (serviceId + modelId)\n * If a model is not found, an error message is returned\n * @param serviceId The serviceId of the model\n * @param modelId The modelId of the model\n * @returns The model description\n */\n getModel(serviceId: string, modelId: string): GllmModelDescription | undefined{\n let model = this.models?.find(m => m.serviceId === serviceId && m.modelId === modelId);\n // Handle obsolete config\n if(!model) {\n this.notificationsService.error(`FATAL ERROR : The model (serviceId = '${serviceId}', modelId = '${modelId}') is no longer available. Please contact an admin for further information.`);\n throw new Error(`FATAL ERROR : The model (serviceId = '${serviceId}', modelId = '${modelId}') is no longer available`);\n }\n return model;\n }\n\n /**\n * Fetch the list saved chats belonging to a specific instance of the assistant\n */\n abstract listSavedChat(): void;\n\n /**\n * Return the saved chat with the given id, if exists. Otherwise, return undefined\n * @param id The id of the saved chat\n */\n abstract getSavedChat(id: string): Observable<SavedChatHistory | undefined>;\n\n /**\n * Save a chat with the given messages\n * @param messages The messages to add to the saved chat index\n * @returns The saved chat\n */\n abstract addSavedChat(messages: ChatMessage[]): Observable<SavedChat>;\n\n /**\n * Update a saved chat with the given id.\n * @param id The id of the saved chat\n * @param name The new name of the saved chat, if provided\n * @param messages The messages to update the saved chat history, if provided\n * @returns True if the saved chat has been successfully updated\n */\n abstract updateSavedChat(id: string, name?: string, messages?: ChatMessage[]): Observable<SavedChat>;\n\n /**\n * Bulk delete of saved chats matching the given ids\n * @param ids List of ids of the saved chats to delete\n * @returns The number of deleted chats\n */\n abstract deleteSavedChat(ids: string[]): Observable<number>;\n\n /**\n * Generate an audit event with the given type and details. The generated audit event is sent afterwards via the AuditWebService\n * @param type Audit event type\n * @param details Audit event details\n * @param id Actions (savedChat delete/rename/...) may occur on a specific chat different than the current one stored in this service, so the chat id can be provided\n */\n generateAuditEvent(type: string, details: Record<string, any>, id?: string): void {\n const baseDetails = {\n \"url\": decodeURIComponent(window.location.href),\n \"app\": this.appService.appName,\n \"user-id\": this.principalService.principal?.userId,\n \"instance-id\": this.chatInstanceId,\n \"chat-id\": id || this.chatId,\n \"service-id\": this.chatConfig$.value!.defaultValues.service_id,\n \"model-id\": this.chatConfig$.value!.defaultValues.model_id,\n };\n const audit = {\n type,\n detail: {\n ...baseDetails,\n ...details\n }\n }\n this.auditService.notify(audit);\n }\n\n /**\n * Format a date string in UTC to a local date string\n * @param value Date string in UTC to format\n * @returns A formatted local date string\n */\n protected formatDateTime(value: string): string {\n const localDate = toDate(parseISO(value));\n return this.intlService[\"formatTime\"](localDate, {day: \"numeric\", month: \"short\", year: \"numeric\", timeZoneName: 'short'});\n }\n\n /**\n * Takes a text prompt that may contain placeholders for variables\n * and replaces these placeholders if it finds a match in the given\n * context object.\n */\n static formatPrompt(prompt: string, context: any) {\n return prompt.replace(\n /{{(.*?)}}/g,\n (match, expr) => get(context, expr) ?? match\n );\n }\n\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { AuthenticationService } from \"@sinequa/core/login\";\nimport { ConnectionOptions, SignalRWebService } from \"@sinequa/core/web-services\";\nimport { Query } from \"@sinequa/core/app-utils\";\nimport { HttpTransportType, HubConnection, LogLevel, MessageHeaders } from \"@microsoft/signalr\";\nimport { ActionMessage, ActionResultEvent, ActionStartEvent, ActionStopEvent, MessageEvent, ChatMessage, ChatPayload, ChatResponse, GllmFunction, GllmModelDescription, MessageHandler, HistoryEvent, ErrorEvent, QuotaEvent, ChatContextAttachment, ContextMessageEvent, SavedChatHistory, SavedChat, ChatProgress, SuggestedActionsEvent, SuggestedAction, DebugMessageEvent, DebugMessage } from \"./types\";\nimport { ChatService } from \"./chat.service\";\nimport { merge, fromEvent, Observable, Subject, catchError, filter, forkJoin, map, shareReplay, switchMap, tap, throwError, takeUntil, take } from \"rxjs\";\n\n@Injectable()\nexport class WebSocketChatService extends ChatService {\n\n public connection: HubConnection | undefined;\n public connectionBuilt$ = new Subject<void>(); // Emit when the connection is built\n public connectionStarted$ = new Subject<void>(); // Emit when the connection is started\n\n private _messageHandlers: Map<string, MessageHandler<any>> = new Map();\n private _actionMap = new Map<string, ActionMessage>();\n private _progress: ChatProgress[] | undefined = undefined;\n private _content = \"\";\n private _executionTime: string;\n private _attachments: ChatContextAttachment[] = [];\n private _suggestedActions: SuggestedAction[] = [];\n private _debugMessages: DebugMessage[] | undefined = undefined;\n\n public signalRService = inject(SignalRWebService);\n public authenticationService = inject(AuthenticationService);\n\n constructor() {\n super();\n }\n\n /**\n * Initialize the chat process after the login is complete.\n * It includes building and starting a connection, executing parallel requests for models and functions, and handling errors during the process.\n *\n * @returns An Observable<boolean> indicating the success of the initialization process.\n */\n init(): Observable<boolean> {\n return this.loginService.events.pipe(\n filter((e) => e.type === 'login-complete'),\n tap(() => this.getRequestsUrl()),\n // Build the connection and handle the completion with the connectionBuilt$ subject\n switchMap(() => this.buildConnection()),\n tap(() => {\n this.initMessageHandlers();\n this.connectionBuilt$.next();\n }),\n // Start the connection and handle the completion with the connectionStarted$ subject\n switchMap(() => this.startConnection()),\n // Execute parallel requests for models and functions\n switchMap(() => {\n this.connectionStarted$.next();\n return forkJoin([\n this.listModels(),\n this.listFunctions()\n ])\n }),\n // Map the results of parallel requests to a boolean indicating success\n map(([models, functions]) => {\n this.initProcess$.next(true);\n return !!models && !!functions\n }),\n // Any errors during the process are caught, logged, and re-thrown to propagate the error further\n catchError((error) => {\n console.error('Error occurred:', error);\n return throwError(() => error);\n }),\n // Cache and replay the emitted value for subsequent subscribers\n shareReplay(1)\n );\n }\n\n /**\n * Define the assistant endpoint to use for the websocket requests\n * It can be overridden by the app config\n */\n getRequestsUrl() {\n if (this.chatConfig$.value!.connectionSettings.websocketEndpoint) {\n this.REQUEST_URL = this.chatConfig$.value!.connectionSettings.websocketEndpoint;\n } else {\n throw new Error(`The property 'websocketEndpoint' must be provided when attempting to use 'WebSocket' in assistant instance`);\n }\n }\n\n listModels(): Observable<GllmModelDescription[] | undefined> {\n const modelsSubject = new Subject<GllmModelDescription[] | undefined>();\n\n this.connection!.on('ListModels', (res) => {\n this.models = (res.models as GllmModelDescription[] | undefined)?.filter(model => !!model.enable);\n modelsSubject.next(this.models);\n modelsSubject.complete()\n });\n\n // Send the request to get the list of models\n this.connection!.invoke('ListModels', { debug: this.chatConfig$.value!.defaultValues.debug })\n .catch(error => {\n console.error('Error invoking ListModels:', error);\n modelsSubject.complete()\n return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection\n })\n\n return modelsSubject.asObservable();\n }\n\n listFunctions(): Observable<GllmFunction[] | undefined> {\n const functionsSubject = new Subject<GllmFunction[] | undefined>();\n\n this.connection!.on('ListFunctions', (res) => {\n this.functions = (res.functions as GllmFunction[] | undefined)?.filter(func => func.enabled);\n functionsSubject.next(this.functions);\n functionsSubject.complete()\n });\n\n // Send the request to get the list of functions\n this.connection!.invoke('ListFunctions', { debug: this.chatConfig$.value!.defaultValues.debug })\n .catch(error => {\n console.error('Error invoking ListFunctions:', error);\n functionsSubject.complete()\n return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection\n })\n\n return functionsSubject.asObservable();\n }\n\n fetch(messages: ChatMessage[], query: Query): Observable<ChatResponse> {\n // Start streaming by invoking the Chat method\n this.streaming$.next(true);\n\n // Prepare the payload to send to the Chat method\n const data: ChatPayload = {\n history: messages,\n functions: this.chatConfig$.value!.defaultValues.functions?.filter(func => func.enabled).map(func => func.name),\n debug: this.chatConfig$.value!.defaultValues.debug,\n serviceSettings: {\n service_id: this.chatConfig$.value!.defaultValues.service_id,\n model_id: this.chatConfig$.value!.defaultValues.model_id,\n top_p: this.chatConfig$.value!.defaultValues.top_p,\n temperature: this.chatConfig$.value!.defaultValues.temperature,\n max_tokens: this.chatConfig$.value!.defaultValues.max_tokens,\n ...this.chatConfig$.value!.additionalServiceSettings\n },\n appQuery: {\n app: this.appService.appName,\n query\n }\n }\n if (this.chatConfig$.value!.savedChatSettings.enabled) {\n data.instanceId = this.chatInstanceId;\n data.savedChatId = this.savedChatId;\n }\n\n let response: ChatMessage = {role: \"assistant\", content: \"\", additionalProperties: {display: true}}; // here display: true is needed in order to be able to show the progress\n\n // Create a Subject to signal completion\n const completion$ = new Subject<void>();\n\n // Create observables for each non-global handler in the _messageHandlers map (default and eventual custom ones) once it is triggered by the hub connection\n const observables = Array\n .from(this._messageHandlers.entries())\n .filter(([eventName, eventHandler]) => !eventHandler.isGlobalHandler)\n .map(([eventName, eventHandler]) => {\n return fromEvent<any>(this.connection!, eventName).pipe(\n map((event) => eventHandler.handler(event)) // Execute the corresponding handler\n );\n });\n\n // Then merge them into a single observable in order to simulate the streaming behavior\n const combined$ = merge(...observables).pipe(\n takeUntil(completion$) // Complete the observable when completion$ emits\n );\n\n // Invoke the Chat method\n this.connection!.invoke('Chat', data)\n .catch(error => {\n console.error('Error invoking Chat:', error);\n return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection\n })\n .finally(() => {\n this.streaming$.next(false); // Complete streaming regardless of success or error\n this._actionMap.clear(); // Clear the _actionMap\n this._content = \"\"; // Clear the _content\n this._progress = undefined; // Clear the _progress\n this._attachments = []; // Clear the _attachments\n this._suggestedActions = []; // Clear the _suggestedActions\n this._debugMessages = []; // Clear the _debugMessages\n this._executionTime = \"\"; // Clear the _executionTime\n completion$.next(); // Emit a signal to complete the observables\n completion$.complete(); // Complete the subject\n });\n\n // Return the merged observables\n return combined$.pipe(\n map(() => {\n // Define $progress from the _actionMap\n const actions = Array.from(this._actionMap.values());\n this._progress = actions.length > 0\n ? actions.map((a) => ({\n title: a.displayName ?? \"\",\n content: a.displayValue ?? \"\",\n done: a.executionTime !== undefined,\n time: a.executionTime,\n }))\n : undefined;\n\n // As soon as the first _content, $progress, _attachments or __suggestedActions is defined and not empty, the assistant is considered as streaming\n if(!!this._content || this._progress || this._attachments.length > 0 || this._suggestedActions.length > 0) {\n response = {...response, content: this._content, additionalProperties: {...response.additionalProperties, $progress: this._progress, $attachment: this._attachments, $suggestedAction: this._suggestedActions, $debug: this._debugMessages}};\n }\n\n // Return the result\n return { history: [...messages, response], executionTime: this._executionTime };\n })\n );\n }\n\n listSavedChat(): void {\n const data = {\n instanceId: this.chatInstanceId,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatList', (res) => {\n this.savedChats$.next(res.savedChats); // emits the result to the savedChats$ subject\n });\n\n // Invoke the method SavedChatList\n this.connection!.invoke('SavedChatList', data)\n .catch(error => {\n console.error('Error invoking SavedChatList:', error);\n return Promise.resolve();\n });\n }\n\n getSavedChat(id: string): Observable<SavedChatHistory | undefined> {\n const savedChatSubject = new Subject<SavedChatHistory | undefined>();\n\n const data = {\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatGet', (res) => {\n savedChatSubject.next(res.savedChat);\n savedChatSubject.complete()\n });\n\n // Invoke the method SavedChatGet\n this.connection!.invoke('SavedChatGet', data)\n .catch(error => {\n console.error('Error invoking SavedChatGet:', error);\n savedChatSubject.complete()\n return Promise.resolve();\n })\n\n return savedChatSubject.asObservable();\n }\n\n addSavedChat(messages: ChatMessage[]): Observable<SavedChat> {\n const addSavedChatSubject = new Subject<SavedChat>();\n\n const data = {\n instanceId: this.chatInstanceId,\n savedChatId: this.chatId,\n history: messages,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatAdd', (res) => {\n this.setSavedChatId(res.savedChat.id); // Persist the savedChatId\n this.generateAuditEvent('saved-chat.add', {}, res.savedChat.id); // Generate audit event\n addSavedChatSubject.next(res.savedChat);\n addSavedChatSubject.complete()\n });\n\n // Invoke the method SavedChatAdd\n this.connection!.invoke('SavedChatAdd', data)\n .catch(error => {\n console.error('Error invoking SavedChatAdd:', error);\n addSavedChatSubject.complete()\n return Promise.resolve();\n })\n\n return addSavedChatSubject.asObservable();\n }\n\n updateSavedChat(id: string, name?: string, messages?: ChatMessage[]): Observable<SavedChat> {\n const updateSavedChatSubject = new Subject<SavedChat>();\n\n const data = {\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n if(name) data[\"title\"] = name;\n if(messages) data[\"history\"] = messages;\n\n this.connection!.on('SavedChatUpdate', (res) => {\n updateSavedChatSubject.next(res.savedChat);\n updateSavedChatSubject.complete()\n });\n\n // Invoke the method SavedChatUpdate\n this.connection!.invoke('SavedChatUpdate', data)\n .catch(error => {\n console.error('Error invoking SavedChatUpdate:', error);\n updateSavedChatSubject.complete()\n return Promise.resolve();\n })\n\n return updateSavedChatSubject.asObservable();\n }\n\n deleteSavedChat(ids: string[]): Observable<number> {\n const deleteSavedChatSubject = new Subject<number>();\n\n const data = {\n instanceId: this.chatInstanceId,\n SavedChatIds: ids,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n this.connection!.on('SavedChatDelete', (res) => {\n deleteSavedChatSubject.next(res.deleteCount);\n deleteSavedChatSubject.complete();\n });\n\n // Invoke the method SavedChatDelete\n this.connection!.invoke('SavedChatDelete', data)\n .catch(error => {\n console.error('Error invoking SavedChatDelete:', error);\n deleteSavedChatSubject.complete();\n return Promise.resolve();\n })\n\n return deleteSavedChatSubject.asObservable();\n }\n\n /**\n * Initialize out-of-the-box handlers\n * It is a placeholder for non-streaming scenarios, where you invoke a specific hub method, and the server responds with a single message or a result\n */\n initMessageHandlers() {\n this.addMessageHandler(\n \"Debug\",\n { handler: (debug: any) => console.log(debug),\n isGlobalHandler: true\n }\n );\n this.addMessageHandler(\n \"ActionStart\",\n { handler: (action: ActionStartEvent) => this._actionMap.set(action.guid, action),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"ActionResult\",\n {\n handler: (action: ActionResultEvent) => this._actionMap.set(action.guid, { ...this._actionMap.get(action.guid), ...action }),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"ActionStop\",\n {\n handler: (action: ActionStopEvent) => this._actionMap.set(action.guid, { ...this._actionMap.get(action.guid), ...action }),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"ContextMessage\",\n {\n handler: (message: ContextMessageEvent) => this._attachments.push(message.metadata),\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"Message\",\n {\n handler: (message: MessageEvent) => this._content += message ?? \"\",\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"History\",\n {\n handler: (history: HistoryEvent) => {\n this.chatHistory = history.history;\n // Re-attach the {$progress, $attachment, $suggestedAction and $debug} of the last response to the last assistant's response in the chat history\n this.chatHistory.at(-1)!.additionalProperties.$progress = this._progress;\n this.chatHistory.at(-1)!.additionalProperties.$attachment = this._attachments;\n this.chatHistory.at(-1)!.additionalProperties.$suggestedAction = this._suggestedActions;\n this.chatHistory.at(-1)!.additionalProperties.$debug = this._debugMessages;\n // Emit the updated chat usage metrics once the generation of the assistant response is completed\n if (!!this.chatHistory.at(-1)?.additionalProperties.usageMetrics) {\n this.updateChatUsageMetrics(this.chatHistory.at(-1)!.additionalProperties.usageMetrics!);\n }\n // Save/update the chat if savedChat enabled\n if (this.chatConfig$.value!.savedChatSettings.enabled && this.chatHistory.some((msg) => msg.additionalProperties?.isUserInput === true)) {\n const action = !this.savedChatId ? this.addSavedChat(this.chatHistory) : this.updateSavedChat(this.savedChatId, undefined, this.chatHistory);\n action.pipe(take(1)).subscribe();\n }\n this._executionTime = history.executionTime;\n // Generate audit event\n const details = {\n 'duration': this._executionTime,\n 'text': this.chatHistory.at(-1)!.content,\n 'role': this.chatHistory.at(-1)!.role, // 'assistant'\n 'rank': this.chatHistory.length - 1,\n 'generation-tokencount': this.chatHistory.at(-1)!.additionalProperties.usageMetrics!.completionTokenCount,\n 'prompt-tokencount': this.chatHistory.at(-1)!.additionalProperties.usageMetrics!.promptTokenCount,\n 'attachments': JSON.stringify(this._attachments.map(({ recordId, contextId, parts, type }) => ({\n recordId,\n contextId,\n parts: parts.map(({ partId, text }) => ({ partId, text })),\n type\n })))\n };\n this.generateAuditEvent('message', details);\n },\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"Error\",\n {\n handler: (error: ErrorEvent) => {\n console.error(error);\n this.notificationsService.error(error);\n },\n isGlobalHandler: true\n }\n );\n this.addMessageHandler(\n \"Quota\",\n {\n handler: (message: QuotaEvent) => this.updateQuota(message.quota),\n isGlobalHandler: true\n }\n );\n this.addMessageHandler(\n \"SuggestedActions\",\n {\n handler: (message: SuggestedActionsEvent) => {\n // Suggested actions are concatenated to the existing ones in case of multiple events \"SuggestedActions\"\n this._suggestedActions = this._suggestedActions.concat(message.suggestedActions);\n },\n isGlobalHandler: false\n }\n );\n this.addMessageHandler(\n \"DebugDisplay\",\n {\n handler: (message: DebugMessageEvent) => this._debugMessages = this._debugMessages ? this._debugMessages.concat(message) : [message],\n isGlobalHandler: false\n }\n );\n }\n\n /**\n * Override and register the entire _messageHandlers map by merging the provided map with the default one\n * @param _messageHandlers\n */\n overrideMessageHandlers<T>(_messageHandlers: Map<string, MessageHandler<T>>) {\n // Clear the already registered global chat handlers before merging the new ones\n this._messageHandlers.forEach((eventHandler, eventName) => {\n if(eventHandler.isGlobalHandler) {\n this.unsubscribeMessageHandler(eventName);\n }\n });\n\n // Merge the new event handlers with the existing ones\n this._messageHandlers = new Map([...this._messageHandlers, ..._messageHandlers]);\n\n // Register the global chat handlers among the merged map\n this._messageHandlers.forEach((eventHandler, eventName) => {\n if(eventHandler.isGlobalHandler) {\n this.registerMessageHandler(eventName, eventHandler);\n }\n });\n }\n\n /**\n * Add a listener for a specific event.\n * If a listener for this same event already exists, it will be overridden.\n * If the listener has \"isChatGlobalHandler\" set to true, it will be registered to the hub connection.\n * @param eventName Name of the event to register a listener for\n * @param eventHandler The handler to be called when the event is received\n */\n addMessageHandler<T>(eventName: string, eventHandler: MessageHandler<T>) {\n this._messageHandlers.set(eventName, eventHandler);\n if(eventHandler.isGlobalHandler) {\n this.registerMessageHandler(eventName, eventHandler);\n }\n }\n\n /**\n * Dynamically register a listener for a specific event.\n * If a listener for this event already exists, it will be overridden.\n * @param eventName Name of the event to register a listener for\n * @param eventHandler The handler to be called when the event is received\n */\n protected registerMessageHandler<T>(eventName: string, eventHandler: MessageHandler<T>) {\n if (!this.connection) {\n console.log(\"No connection found to register the listener\" + eventName);\n return;\n }\n\n this.connection.on(eventName, (data: T) => {\n eventHandler.handler(data);\n });\n }\n\n /**\n * Remove a listener for a specific event from the _messageHandlers map and unsubscribe from receiving messages for this event from the SignalR hub.\n * @param eventName Name of the event to remove the listener for\n */\n removeMessageHandler(eventName: string) {\n this._messageHandlers.delete(eventName);\n this.unsubscribeMessageHandler(eventName);\n }\n\n /**\n * Unsubscribe from receiving messages for a specific event from the SignalR hub.\n * ALL its related listeners will be removed from hub connection\n * This is needed to prevent accumulating old listeners when overriding the entire _messageHandlers map\n * @param eventName Name of the event\n */\n protected unsubscribeMessageHandler(eventName: string) {\n this.connection!.off(eventName);\n }\n\n /**\n * Build a connection to the signalR websocket and register default listeners to the methods defined in the server hub class\n * @param options The options for the connection. It overrides the default options\n * @param logLevel Define the log level displayed in the console\n * @returns Promise that resolves when the connection is built\n */\n buildConnection(options?: ConnectionOptions): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (!this.REQUEST_URL) {\n reject(new Error(\"No endpoint provided to connect the websocket to\"));\n return;\n }\n const logLevel = this.getLogLevel();\n this.connection = this.signalRService.buildConnection(this.REQUEST_URL, {...this.defaultOptions, ...options}, logLevel, true);\n resolve();\n });\n }\n\n /**\n * Start the connection\n * @returns Promise that resolves when the connection is started\n */\n startConnection(): Promise<void> {\n return this.signalRService.startConnection(this.connection);\n }\n\n /**\n * Stop the connection\n * @returns Promise that resolves when the connection is stopped\n */\n stopConnection(): Promise<void> {\n return this.signalRService.stopConnection(this.connection);\n }\n\n private getTransports(): HttpTransportType {\n switch (this.chatConfig$.value?.connectionSettings.signalRTransport) {\n case \"WebSockets\":\n return HttpTransportType.WebSockets;\n case \"ServerSentEvents\":\n return HttpTransportType.ServerSentEvents;\n case \"LongPolling\":\n return HttpTransportType.LongPolling;\n default:\n return HttpTransportType.None;\n }\n }\n\n private getLogLevel(): LogLevel {\n switch (this.chatConfig$.value?.connectionSettings.signalRLogLevel) {\n case \"Critical\":\n return LogLevel.Critical; // Log level for diagnostic messages that indicate a failure that will terminate the entire application.\n case \"Debug\":\n return LogLevel.Debug; // Log level for low severity diagnostic messages.\n case \"Error\":\n return LogLevel.Error; // Log level for diagnostic messages that indicate a failure in the current operation.\n case \"Information\":\n return LogLevel.Information; // Log level for informational diagnostic messages.\n case \"None\":\n return LogLevel.None; // The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted.\n case \"Trace\":\n return LogLevel.Trace; // Log level for very low severity diagnostic messages.\n case \"Warning\":\n return LogLevel.Warning; // Log level for diagnostic messages that indicate a non-fatal problem.\n default:\n return LogLevel.None; // The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted.\n }\n }\n\n get defaultOptions(): ConnectionOptions {\n let headers: MessageHeaders = {\n \"sinequa-force-camel-case\": \"true\",\n \"x-language\": this.intlService.currentLocale.name,\n \"ui-language\": this.intlService.currentLocale.name,\n };\n if (this.authenticationService.processedCredentials) {\n headers = {...headers, \"sinequa-csrf-token\": this.authenticationService.processedCredentials.data.csrfToken};\n };\n // For the first GET request sent by signalR to start a WebSocket protocol,\n // as far as we know, signalR only lets us tweak the request with this access token factory\n // so we pass along the Sinequa CSRF token to pass the CSRF check..\n return {\n transport: this.getTransports(),\n withCredentials: true,\n headers,\n accessTokenFactory: () => this.authenticationService.processedCredentials?.data?.csrfToken || \"\"\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport SafeColor from 'safecolor'\n\n@Component({\n selector: 'sq-initials-avatar',\n templateUrl: './initials-avatar.component.html',\n styleUrls: ['./initials-avatar.component.scss'],\n standalone: true,\n imports: [CommonModule]\n})\nexport class InitialsAvatarComponent {\n\n @Input() fullName: string = '';\n @Input() size: number = 1.5; // in rem\n\n /**\n * Gives initials of a name and a safe color background to use,\n * assuming text color will be white\n * @param fullName full name to evaluate intials for\n * @param split string to use has splitter for `fullName`\n * @returns an `object` containing initials and color\n */\n getInitialsAndColorFromFullName(fullName: string, split: string = ' '): { initials: string; color: string } {\n return { initials: this.getInitialsFromFullName(fullName, split), color: this.getColorFromName(fullName) };\n }\n\n /**\n * Gives initials of a name, ie:\n * ```\n * getInitialForFullName('John Snow') => 'JS'\n * getInitialForFullName('Geralt of Rivia', ' of ') => 'GR'\n * ```\n * @param fullName full name to evaluate intial for\n * @param split string to use has splitter\n * @returns string containg the first letter of splitted name\n */\n getInitialsFromFullName(fullName: string, split: string = ' '): string {\n if (!fullName) return '';\n\n const names = fullName.split(split);\n return names[0][0] + (names[1]?.[0] ?? '');\n }\n\n /**\n * Gets a random color using text as seed\n * @param text string to use for color generation\n * @returns string formatted like `rgb(xxx, xxx, xxx)`\n */\n getColorFromName(text: string): string {\n const safeColor = new SafeColor({\n color: [255, 255, 255],\n contrast: 4.5\n });\n\n return safeColor.random(text);\n }\n\n}\n","<span class=\"sq-initials-avatar\" *ngIf=\"getInitialsAndColorFromFullName(fullName) as meta\"\n [ngStyle]=\"{ 'background-color': meta.color }\" [style.height.rem]=\"size\" [style.width.rem]=\"size\"\n [style.line-height.rem]=\"size\" [style.font-size.rem]=\"size/2\">\n {{ meta.initials | uppercase }}\n</span>","export interface IconFormat {\n icon: string;\n color?: string;\n}\n\nexport const defaultFormatIcons: Record<string, IconFormat> = {\n \"extractslocations\": { icon: \"far fa-file-alt\" },\n \"matchlocations\": { icon: \"far fa-flag\" },\n \"geo\": { icon: \"fas fa-map-marker-alt\" },\n \"person\": { icon: \"fas fa-user\" },\n \"company\": { icon: \"fas fa-building\" },\n \"title\": { icon: \"fas fa-tag\" },\n \"modified\": { icon: \"far fa-calendar-alt\" },\n \"size\": { icon: \"fas fa-weight-hanging\" },\n \"treepath\": { icon: \"fas fa-folder-open\" },\n \"filename\": { icon: \"far fa-file-alt\" },\n \"authors\": { icon: \"fas fa-user-edit\" },\n \"accesslists\": { icon: \"fas fa-lock\" },\n \"doctype\": { icon: \"far fa-file\" },\n \"documentlanguages\": { icon: \"fas fa-globe-americas\" },\n \"globalrelevance\": { icon: \"far fa-star\" },\n \"indexationtime\": { icon: \"fas fa-search\" },\n \"concepts\": { icon: \"far fa-comment-dots\" },\n \"keywords\": { icon: \"fas fa-tags\" },\n \"matchingpartnames\": { icon: \"fas fa-align-left\" },\n \"msgfrom\": { icon: \"fas fa-envelope\" },\n \"msgto\": { icon: \"fas fa-envelope-open-text\" },\n\n \"file\": { icon: \"far fa-file\" },\n \"htm\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"html\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"xhtm\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"xhtml\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"mht\": { icon: \"fas fa-globe-europe\", color: '#4545bf' },\n \"doc\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"docx\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"docm\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"dot\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"dotx\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"dotm\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"rtf\": { icon: \"far fa-file-word\", color: '#3f3fca' },\n \"odt\": { icon: \"far fa-file-word\", color: 'grey' },\n \"ott\": { icon: \"far fa-file-word\", color: 'grey' },\n \"gdoc\": { icon: \"far fa-file-word\", color: 'blue' },\n \"xls\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xlsx\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xlt\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xltx\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xlsm\": { icon: \"far fa-file-excel\", color: 'green' },\n \"xltm\": { icon: \"far fa-file-excel\", color: 'green' },\n \"gsheet\": { icon: \"far fa-file-excel\", color: 'darkgreen' },\n \"ods\": { icon: \"far fa-file-excel\", color: 'lightgreen' },\n \"ots\": { icon: \"far fa-file-excel\", color: 'lightgreen' },\n \"ppt\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pptx\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pptm\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pptm2\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pps\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"ppsx\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"ppsm\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"pot\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"potx\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"potm\": { icon: \"far fa-file-powerpoint\", color: '#e64b30' },\n \"odp\": { icon: \"far fa-file-powerpoint\", color: 'red' },\n \"otp\": { icon: \"far fa-file-powerpoint\", color: 'red' },\n \"gslides\": { icon: \"far fa-file-powerpoint\", color: 'orange' },\n \"pdf\": { icon: \"far fa-file-pdf\", color: '#ec2e2e' },\n \"jpg\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"jpeg\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"bmp\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"tiff\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"tif\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"gif\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"png\": { icon: \"far fa-file-image\", color: '#4545bf' },\n \"mp4\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"flv\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"swf\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mts\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"divx\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"wmv\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"avi\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mov\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mpg\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mpeg\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"asf\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"rm\": { icon: \"far fa-file-video\", color: '#4545bf' },\n \"mp3\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"wav\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"ogg\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"wma\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"aac\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"m3u\": { icon: \"far fa-file-audio\", color: 'lightblue' },\n \"txt\": { icon: \"far fa-file-alt\", color: '#202020' },\n \"text\": { icon: \"far fa-file-alt\", color: '#202020' },\n \"xml\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"cs\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"java\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"cpp\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"c\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"h\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"hpp\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"js\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"ts\": { icon: \"far fa-file-code\", color: '#4545bf' },\n \"zip\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"7zip\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"7z\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"rar\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"gz\": { icon: \"far fa-file-archive\", color: 'yellow' },\n \"notes\": { icon: \"fas fa-file-invoice\", color: 'orange' },\n \"quickr\": { icon: \"fas fa-file-invoice\", color: 'orange' },\n \"email\": { icon: \"far fa-envelope\", color: 'black' },\n \"mail\": { icon: \"far fa-envelope\", color: 'black' },\n \"msg\": { icon: \"far fa-envelope\", color: 'black' },\n \"mdb\": { icon: \"far fa-database\", color: 'purple' },\n \"odb\": { icon: \"far fa-database\", color: 'darkred' },\n \"otb\": { icon: \"far fa-database\", color: 'darkred' },\n \"xsn\": { icon: \"fas fa-file-excel\", color: 'purple' },\n \"gform\": { icon: \"fas fa-file-excel\", color: 'purple' },\n \"one\": { icon: \"far fa-book\", color: 'purple' },\n \"odf\": { icon: \"fas fa-file-medical-alt\", color: 'grey' },\n \"otf\": { icon: \"fas fa-file-medical-alt\", color: 'grey' },\n \"vsdx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vsx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vtx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vdx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vssx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vstx\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vsdm\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vssm\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vstm\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vdw\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vsd\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vss\": { icon: \"far fa-object-group\", color: 'purple' },\n \"vst\": { icon: \"far fa-object-group\", color: 'purple' },\n \"odg\": { icon: \"far fa-object-group\", color: 'orange' },\n \"otg\": { icon: \"far fa-object-group\", color: 'orange' },\n \"gdraw\": { icon: \"far fa-object-group\", color: 'red' },\n \"pub\": { icon: \"far fa-object-group\", color: 'darkgreen' },\n \"ldap\": { icon: \"far fa-users\", color: 'brown' },\n \"ad\": { icon: \"far fa-users\", color: 'brown' },\n \"mmp\": { icon: \"fas fa-file-medical\", color: 'grey' },\n \"mppx\": { icon: \"fas fa-file-medical\", color: 'grey' },\n}","import { Component, Input, OnChanges, ViewEncapsulation } from '@angular/core';\nimport { defaultFormatIcons } from './icons';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'sq-format-icon',\n templateUrl: './format-icon.component.html',\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [CommonModule]\n})\nexport class FormatIconComponent implements OnChanges {\n\n @Input() extension: string;\n\n private _formatIcons = defaultFormatIcons;\n \n icon: string;\n\n ngOnChanges() {\n const icon = this.extension ? this._formatIcons[this.extension] : undefined;\n this.icon = icon?.icon || this._formatIcons.file.icon;\n }\n\n}\n","<span *ngIf=\"icon\" class=\"{{icon}}\"></span>","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { UtilsModule } from '@sinequa/components/utils';\nimport { FormatIconComponent } from '../format-icon/format-icon.component';\nimport { ChatContextAttachment, DocumentPart } from '../types';\n\n@Component({\n selector: 'sq-chat-reference',\n templateUrl: './chat-reference.component.html',\n styleUrls: ['./chat-reference.component.scss'],\n standalone: true,\n imports: [CommonModule, UtilsModule, FormatIconComponent]\n})\nexport class ChatReferenceComponent {\n\n @Input() reference: string;\n @Input() attachment: ChatContextAttachment;\n @Input() partId?: number;\n\n @Output() openDocument = new EventEmitter<ChatContextAttachment>();\n @Output() openPreview = new EventEmitter<ChatContextAttachment>();\n\n get parts(): DocumentPart[] {\n if (!this.attachment) return [];\n return this.attachment.parts.filter(part => (!this.partId || part.partId === this.partId) && !!part.text);\n }\n\n expandAttachment() {\n if (this.partId) return;\n this.attachment['$expanded'] = !this.attachment['$expanded'];\n }\n}\n","<div [class.reference-tooltip]=\"!!partId\">\n <div class=\"reference-data\" [class.expanded]=\"attachment['$expanded'] || !!partId\">\n <span class=\"reference me-1\">{{reference}}</span>\n <sq-format-icon [extension]=\"attachment.record.fileext\"></sq-format-icon>\n <a [id]=\"'attachment-'+attachment.recordId\" (click)=\"expandAttachment()\">\n {{attachment.record.title}}\n </a>\n <i class=\"fas fa-eye\" (click)=\"openPreview.emit(attachment)\" [sqTooltip]=\"!partId ? 'Preview document' : ''\"></i>\n <i class=\"fas fa-arrow-up-right-from-square\" *ngIf=\"attachment.record.url1 || attachment.record.originalUrl\"\n (click)=\"openDocument.emit(attachment)\" [sqTooltip]=\"!partId ? 'Open document' : ''\">\n </i>\n </div>\n <div class=\"reference-passages\" *ngIf=\"!!partId || (attachment['$expanded']) && parts.length\">\n <div class=\"reference-passage\" *ngFor=\"let part of parts\">\n <span class=\"reference me-1\">{{reference}}.{{part.partId}}</span>\n <span [innerHTML]=\"part.text\"></span>\n </div>\n </div>\n</div>\n","import { OnChanges, Component, Input, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Chart, registerables } from 'chart.js'\n\nChart.register(...registerables);\n\n@Component({\n selector: 'sq-assistant-chart',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './chart.component.html',\n styleUrls: ['./chart.component.css']\n})\nexport class ChartComponent implements OnChanges {\n @Input() rawChartData: string;\n\n public chart: Chart;\n private debounceTimer: any;\n\n constructor() { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['rawChartData']) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => this.initializeChart(), 300);\n }\n }\n\n private initializeChart() {\n Chart.getChart('chart-canvas')?.destroy();\n\n const canvasElement = document.getElementById('chart-canvas');\n\n if(canvasElement){\n try{\n let chartInput = this.rawChartData.match(/<chartjs>({[\\s\\S]*?)<\\/chartjs>/)?.[1]?.trim().replace(/'/g, '\"') as string;\n let chartConfig = JSON.parse(chartInput); \n \n this.chart = new Chart('chart-canvas', chartConfig);\n\n } catch (error) {\n console.error('Invalid chart configuration, check the assistant configuration: ', error);\n }\n\n }\n else {\n console.error('Chart Canvas is not found');\n }\n }\n}\n","<div class=\"chart-container\">\n <canvas id=\"chart-canvas\">{{ chart }}</canvas>\n</div>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ChangeDetectorRef, AfterViewInit, ElementRef } from \"@angular/core\";\nimport { PrincipalWebService } from \"@sinequa/core/web-services\";\nimport { SearchService } from \"@sinequa/components/search\";\nimport { ChatContextAttachment, ChatMessage, SuggestedAction } from \"../types\";\n\nimport { unified, Processor } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport { visit, CONTINUE, EXIT } from \"unist-util-visit\";\nimport { Text, Parent, Content } from \"mdast\";\nimport { Node } from \"unist\";\nimport { UIService, UtilsModule } from \"@sinequa/components/utils\";\nimport remarkGfm from \"remark-gfm\";\nimport { CommonModule } from \"@angular/common\";\nimport { CollapseModule } from \"@sinequa/components/collapse\";\nimport { RemarkModule } from \"ngx-remark\";\nimport { InitialsAvatarComponent } from \"../initials-avatar/initials-avatar.component\";\nimport { ChatReferenceComponent } from \"../chat-reference/chat-reference.component\";\n\nimport \"prismjs-components-importer/esm\";\nimport 'prismjs/plugins/autoloader/prism-autoloader';\nimport { ChartComponent } from \"../charts/chart/chart.component\";\n\ndeclare module Prism {\n function highlightAllUnder(el: HTMLElement): void;\n}\n\n@Component({\n selector: \"sq-chat-message\",\n templateUrl: \"./chat-message.component.html\",\n styleUrls: [\"./chat-message.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, UtilsModule, CollapseModule, RemarkModule,\n InitialsAvatarComponent, ChatReferenceComponent, ChartComponent]\n})\nexport class ChatMessageComponent implements OnChanges, AfterViewInit {\n @Input() message: ChatMessage;\n @Input() conversation: ChatMessage[];\n @Input() suggestedActions: SuggestedAction[] | undefined;\n @Input() assistantMessageIcon: string;\n @Input() userMessageIcon: string;\n @Input() streaming: boolean;\n @Input() canEdit: boolean = false;\n @Input() canRegenerate: boolean = false;\n @Input() canCopy: boolean = false;\n @Input() canDebug: boolean = false;\n @Input() canLike: boolean = false;\n @Input() canDislike: boolean = false;\n @Output() openDocument = new EventEmitter<{reference: ChatContextAttachment, partId?: number}>();\n @Output() openPreview = new EventEmitter<{reference: ChatContextAttachment, partId?: number}>();\n @Output() suggestAction = new EventEmitter<SuggestedAction>();\n @Output() edit = new EventEmitter<ChatMessage>();\n @Output() copy = new EventEmitter<ChatMessage>();\n @Output() regenerate = new EventEmitter<ChatMessage>();\n @Output() like = new EventEmitter<ChatMessage>();\n @Output() dislike = new EventEmitter<ChatMessage>();\n @Output() debug = new EventEmitter<ChatMessage>();\n\n processor: Processor;\n\n references: string[] = [];\n referenceMap = new Map<string, ChatContextAttachment>();\n showReferences: boolean = true;\n collapseProgress: boolean;\n iconSize = 24;\n\n liked: boolean = false;\n disliked: boolean = false;\n\n constructor(\n public searchService: SearchService,\n public ui: UIService,\n public principalService: PrincipalWebService,\n public cdr: ChangeDetectorRef,\n public el: ElementRef\n ) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.streaming) {\n this.collapseProgress = !this.streaming;\n }\n\n if (changes.message && this.message?.role === \"assistant\") {\n this.references = [];\n this.referenceMap.clear();\n for (let m of this.conversation) {\n if (m.additionalProperties.$attachment) {\n for (const attachment of m.additionalProperties.$attachment) {\n this.referenceMap.set('' + attachment.contextId, { ...attachment, $partId: attachment.parts?.[0]?.partId });\n if (!!attachment.parts && attachment.parts.length > 0) {\n for (let i = 0; i < attachment.parts.length; i++) {\n const refId = `${attachment.contextId}.${attachment.parts[i].partId}`;\n this.referenceMap.set(refId, { ...attachment, $partId: attachment.parts?.[i]?.partId });\n }\n }\n }\n }\n\n if(m.content.startsWith(\"<chartjs>\")){\n m.messageType = \"CHART\";\n }\n else{\n m.messageType = \"MARKDOWN\";\n }\n }\n\n this.processor = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(() => this.referencePlugin);\n\n if (this.streaming) {\n this.processor = this.processor.use(() => this.placeholderPlugin);\n }\n }\n }\n\n ngAfterViewInit(): void {\n Prism?.highlightAllUnder?.(this.el.nativeElement);\n }\n\n get name(): string {\n return !this.principalService.principal ? ''\n : this.principalService.principal['fullName'] as string || this.principalService.principal.name;\n }\n\n get isAdmin(): boolean {\n return this.principalService.principal?.isAdministrator || false;\n }\n\n /**\n * This Unified plugin looks a text nodes and replaces any reference in the\n * form [1], [2.3], etc. with custom nodes of type \"chat-reference\".\n */\n referencePlugin = (tree: Node) => {\n\n const references = new Set<number>();\n\n // Visit all text nodes\n visit(tree, \"text\", (node: Text, index: number, parent: Parent) => {\n let text = node.value;\n\n text = this.reformatReferences(text);\n const matches = this.getReferenceMatches(text);\n\n // Quit if no references were found\n if (matches.length === 0) {\n return CONTINUE;\n }\n\n const nodes: (Content & { end: number })[] = [];\n\n for (let match of matches) {\n const refId = match[1].trim();\n const [ref] = refId.split(\".\");\n // We find a valid reference in the text\n if (!isNaN(+ref)) {\n references.add(+ref); // Add it to the set of used references\n\n // If needed, insert a text node before the reference\n const current = nodes.at(-1) ?? { end: 0 };\n if (match.index! > current.end) {\n nodes.push({ type: \"text\", value: text.substring(current.end, match.index!), end: match.index! });\n }\n\n // Add a custom reference node\n nodes.push({ type: \"chat-reference\", refId, end: match.index! + match[0].length } as any);\n }\n }\n\n // Quit if no references were found\n if (nodes.length === 0) {\n return CONTINUE;\n }\n\n if (nodes.at(-1)!.end < text.length) {\n nodes.push({ type: \"text\", value: text.substring(nodes.at(-1)!.end, text.length), end: text.length });\n }\n\n // Delete the current text node from the parent and replace it with the new nodes\n parent.children.splice(index, 1, ...nodes);\n\n return index + nodes.length; // Visit the next node after the inserted ones\n });\n\n if (references.size > 0) {\n this.references = Array.from(references.values())\n .sort((a, b) => a - b)\n .map(r => '' + r);\n this.cdr.detectChanges();\n }\n\n return tree;\n }\n\n placeholderPlugin = (tree: Node) => {\n\n visit(tree, \"text\", (node: Text, index: number, parent: Parent) => {\n parent.children.push({ type: \"streaming-placeholder\" } as any);\n return EXIT;\n }, true);\n\n return tree;\n }\n\n getLinkText(node: any): string {\n if (node.text) {\n return node.text; // Return directly if text is provided in node.text ([Example link](https://example.com))\n } else if (node.children && node.children.length > 0) {\n // Recursively search for text content in child nodes\n for (const child of node.children) {\n if (child.type === 'text' && child.value) {\n return child.value; // Return the value of the first text node found ([**Emphasized Link Text**](https://example.com))\n } else if (child.children && child.children.length > 0) {\n const textContent = this.getLinkText(child); // Recursively search child nodes ([![Example image](https://example.com/image.png)](https://example.com))\n if (textContent) {\n return textContent; // Return text content if found\n }\n }\n }\n }\n return 'link'; // Return empty string if no text content is found\n }\n\n /**\n * Reformat [ids: 12.2, 42.5] to [12.2][42.5]\n */\n reformatReferences(content: string) {\n return content.replace(/\\[(?:ids?:?\\s*)?(?:documents?:?\\s*)?(\\s*(?:,?\\s*\\d+(?:\\.\\d+)?(?:\\.part)?\\s*)+)\\]/g,\n (str, match: string) => `[${match.replace(/\\.part/g, \"\").split(',').join(\"] [\")}]`\n );\n }\n\n /**\n * Match all references in a given message\n */\n getReferenceMatches(content: string) {\n return Array.from(content.matchAll(/\\[(\\s*\\d+(?:\\.\\d+)?\\s*)\\]/g));\n }\n\n private _copyToClipboard(content: string) {\n this.ui.copyToClipboard(content);\n\n }\n\n copyMessage(message: ChatMessage) {\n this._copyToClipboard(message.content);\n this.copy.emit(message);\n }\n\n copyCode(code: string) {\n this._copyToClipboard(code);\n }\n\n openAttachmentPreview(attachment: ChatContextAttachment, partId?: number) {\n this.openPreview.emit({reference: attachment, partId});\n }\n\n openOriginalAttachment(attachment: ChatContextAttachment, partId?: number) {\n this.openDocument.emit({reference: attachment, partId});\n }\n}\n","<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { ChatService } from './chat.service';\nimport { Observable, catchError, filter, finalize, forkJoin, map, shareReplay, switchMap, take, tap, throwError } from 'rxjs';\nimport { ActionMessage, ChatMessage, ChatPayload, ChatProgress, ChatResponse, GllmFunction, GllmModelDescription, HttpChatResponse, SavedChat, SavedChatHistory } from './types';\nimport { JsonMethodPluginService } from '@sinequa/core/web-services';\nimport { Query } from \"@sinequa/core/app-utils\";\n\n@Injectable()\nexport class RestChatService extends ChatService {\n\n public jsonMethodWebService = inject(JsonMethodPluginService);\n\n constructor() {\n super();\n }\n\n /**\n * Initialize the chat process after the login is complete.\n * It listens for the 'login-complete' event, initializes necessary URL, and performs parallel requests for models, functions and quota data.\n * @returns An Observable<boolean> indicating the success of the initialization process.\n */\n init(): Observable<boolean> {\n return this.loginService.events.pipe(\n filter((e) => e.type === 'login-complete'),\n tap(() => this.getRequestsUrl()),\n // Execute parallel requests for models and functions\n switchMap(() =>\n forkJoin([\n this.listModels(),\n this.listFunctions()\n ])\n ),\n // Map the results of parallel requests to a boolean indicating success\n map(([models, functions]) => {\n this.initProcess$.next(true);\n return !!models && !!functions\n }),\n // Any errors during the process are caught, logged, and re-thrown to propagate the error further\n catchError((error) => {\n console.error('Error occurred:', error);\n return throwError(() => error);\n }),\n // cache and replay the emitted value for subsequent subscribers, ensuring the initialization logic is only executed once even if there are multiple subscribers\n shareReplay(1)\n );\n }\n\n /**\n * Define the GLLM plugin to use for the http requests\n * It can be overridden by the app config\n */\n getRequestsUrl() {\n if (this.chatConfig$.value!.connectionSettings.restEndpoint) {\n this.REQUEST_URL = this.chatConfig$.value!.connectionSettings.restEndpoint;\n } else {\n throw new Error(`The property 'restEndpoint' must be provided when attempting to use 'REST' in assistant instance`);\n }\n }\n\n listModels(): Observable<GllmModelDescription[] | undefined> {\n const data = {\n action: \"listmodels\",\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(\n map(res => res.models),\n tap(models => this.models = models?.filter(model => !!model.enable)),\n catchError((error) => {\n console.error('Error invoking listmodels:', error);\n return throwError(() => error);\n })\n );\n }\n\n listFunctions(): Observable<GllmFunction[] | undefined> {\n const data = {\n action: \"listfunctions\",\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(\n map(res => res.functions),\n tap((functions: GllmFunction[] | undefined) => this.functions = functions?.filter(func => func.enabled && !!this.chatConfig$.value!.defaultValues.functions.find(fn => fn.name === func.functionName))),\n catchError((error) => {\n console.error('Error invoking listfunctions:', error);\n return throwError(() => error);\n })\n );\n }\n\n fetch(messages: ChatMessage[], query: Query): Observable<ChatResponse> {\n // Start streaming by invoking the Chat method\n this.streaming$.next(true);\n\n // Prepare the payload to send to the Chat method\n const data: ChatPayload & {action: \"chat\"} = {\n action: \"chat\",\n history: messages,\n functions: this.chatConfig$.value!.defaultValues.functions?.filter(func => func.enabled).map(func => func.name),\n debug: this.chatConfig$.value!.defaultValues.debug,\n serviceSettings: {\n service_id: this.chatConfig$.value!.defaultValues.service_id,\n model_id: this.chatConfig$.value!.defaultValues.model_id,\n top_p: this.chatConfig$.value!.defaultValues.top_p,\n temperature: this.chatConfig$.value!.defaultValues.temperature,\n max_tokens: this.chatConfig$.value!.defaultValues.max_tokens,\n ...this.chatConfig$.value!.additionalServiceSettings\n },\n appQuery: {\n app: this.appService.appName,\n query\n }\n }\n if (this.chatConfig$.value!.savedChatSettings.enabled) {\n data.instanceId = this.chatInstanceId;\n data.savedChatId = this.savedChatId;\n }\n\n // Request the Chat endpoint\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n tap((res: HttpChatResponse) => this.updateQuota(res.quota, true)),\n map((res: HttpChatResponse) => {\n // Define $progress from the actions property of the response\n let $progress: ChatProgress[] | undefined;\n if( res.actions?.length > 0) {\n const actions: ActionMessage[] = Object.values(res.actions.reduce((acc, item) => {\n acc[item.guid] = { ...(acc[item.guid] || {}), ...item };\n return acc;\n }, {}));\n $progress = actions.map((a) => ({\n title: a.displayName ?? \"\",\n content: a.displayValue ?? \"\",\n done: a.executionTime !== undefined,\n time: a.executionTime,\n }))\n }\n // Re-attach the $progress and $attachment of the last response to the last assistant's response in the chat history\n const response = {...(res.history as Array<ChatMessage>).at(-1)} as ChatMessage;\n if($progress) response.additionalProperties.$progress = $progress;\n if(res.context) response.additionalProperties.$attachment = res.context.map((ctx) => ctx.additionalProperties);\n if(res.suggestedActions) response.additionalProperties.$suggestedAction = res.suggestedActions;\n // Emit the updated chat usage metrics once the generation of the assistant response is completed\n if (!!response.additionalProperties.usageMetrics) {\n this.updateChatUsageMetrics(response.additionalProperties.usageMetrics!);\n }\n // Update the chat history with the incoming history property of the res AND the processed response message\n this.chatHistory = res.history;\n this.chatHistory[this.chatHistory.length - 1] = response;\n // Save/update the chat if savedChat enabled\n if (this.chatConfig$.value!.savedChatSettings.enabled && this.chatHistory.some((msg) => msg.additionalProperties?.isUserInput === true)) {\n const action = !this.savedChatId ? this.addSavedChat(this.chatHistory) : this.updateSavedChat(this.savedChatId, undefined, this.chatHistory);\n action.pipe(take(1)).subscribe();\n }\n // Generate audit event\n const details = {\n 'duration': res.executionTime,\n 'text': response.content,\n 'role': response.role, // 'assistant'\n 'rank': this.chatHistory.length - 1,\n 'generation-tokencount': response.additionalProperties.usageMetrics!.completionTokenCount,\n 'prompt-tokencount': response.additionalProperties.usageMetrics!.promptTokenCount,\n 'attachments': response.additionalProperties.$attachment?.map(({ recordId, contextId, parts, type }) => ({\n recordId,\n contextId,\n parts: parts.map(({ partId, text }) => ({ partId, text })),\n type\n }))\n };\n this.generateAuditEvent('message', details);\n // Return the result\n return { history: [...messages, response], executionTime: res.executionTime };\n }),\n finalize(() => this.streaming$.next(false))\n );\n }\n\n listSavedChat(): void {\n const data = {\n action: \"SavedChatList\",\n instanceId: this.chatInstanceId,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n this.jsonMethodWebService.get(this.REQUEST_URL, data).subscribe(\n res => this.savedChats$.next(res.savedChats),\n error => {\n console.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatList API:', error.error.errorMessage);\n }\n );\n }\n\n addSavedChat(messages: ChatMessage[]): Observable<SavedChat> {\n const data = {\n action: \"SavedChatAdd\",\n instanceId: this.chatInstanceId,\n savedChatId: this.chatId,\n history: messages,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n map(res => res.savedChat),\n tap((savedChat: SavedChat) => {\n this.setSavedChatId(savedChat.id); // Persist the savedChatId\n this.generateAuditEvent('saved-chat.add', {}, savedChat.id); // Generate audit event\n }),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatAdd API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n getSavedChat(id: string): Observable<SavedChatHistory | undefined> {\n const data = {\n action: \"SavedChatGet\",\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.get(this.REQUEST_URL, data).pipe(\n map(res => res.savedChat),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatGet API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n updateSavedChat(id: string, name?: string, messages?: ChatMessage[]): Observable<SavedChat> {\n const data = {\n action: \"SavedChatUpdate\",\n instanceId: this.chatInstanceId,\n savedChatId: id,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n\n if(name) data[\"title\"] = name;\n if(messages) data[\"history\"] = messages;\n\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n map(res => res.savedChat),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatUpdate API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n deleteSavedChat(ids: string[]): Observable<number> {\n const data = {\n action: \"SavedChatDelete\",\n instanceId: this.chatInstanceId,\n savedChatIds: ids,\n debug: this.chatConfig$.value!.defaultValues.debug\n };\n return this.jsonMethodWebService.post(this.REQUEST_URL, data).pipe(\n map(res => res.deletedCount),\n catchError((error) => {\n console.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);\n this.notificationsService.error('Error occurred while calling the SavedChatDelete API:', error.error.errorMessage);\n return throwError(() => error);\n })\n );\n }\n\n}\n","import { Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Subscription, filter, switchMap, tap } from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { ChatConfig, TokenConsumption, UserTokenConsumption } from '../types';\nimport { LoginService } from '@sinequa/core/login';\nimport { InstanceManagerService } from '../instance-manager.service';\nimport { ChatService } from '../chat.service';\nimport { UtilsModule } from '@sinequa/components/utils';\n\n@Component({\n selector: 'sq-token-progress-bar',\n templateUrl: './token-progress-bar.component.html',\n styleUrls: ['./token-progress-bar.component.scss'],\n standalone: true,\n imports: [CommonModule, UtilsModule]\n})\nexport class TokenProgressBarComponent implements OnInit, OnDestroy {\n /** Define the key based on it, the appropriate chatService instance will be returned from instanceManagerService */\n @Input() instanceId: string;\n\n chatService: ChatService;\n config: ChatConfig;\n subscription = new Subscription();\n\n // User token consumption progress bar\n userPercentage?: number;\n userTitle?: string;\n\n // Current chat token consumption progress bar\n chatPercentage?: number;\n chatTitle?: string;\n\n public loginService = inject(LoginService);\n public instanceManagerService = inject(InstanceManagerService);\n\n ngOnInit() {\n this.subscription.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n switchMap(_ => this.chatService.initProcess$),\n filter(success => !!success),\n tap(_ => {\n this.config = this.chatService.chatConfig$.value!;\n this.onUserTokensConsumption();\n this.onChatTokensConsumption();\n })\n ).subscribe()\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n instantiateChatService(): void {\n this.chatService = this.instanceManagerService.getInstance(this.instanceId);\n }\n\n onUserTokensConsumption() {\n this.subscription.add(\n this.chatService.userTokenConsumption$.subscribe(\n (data: UserTokenConsumption | undefined) => {\n if (data) {\n this.userPercentage = data.percentage;\n this.userTitle = `Max generation allowed: ${this.userPercentage}% consumed. Resets at ${data.nextResetDate}`;\n }\n }\n )\n );\n }\n\n onChatTokensConsumption() {\n this.subscription.add(\n this.chatService.chatTokenConsumption$.subscribe(\n (data: TokenConsumption | undefined) => {\n if (data) {\n this.chatPercentage = data.percentage;\n this.chatTitle = `Max length of conversation: ${this.chatPercentage}% reached.`;\n }\n }\n )\n );\n }\n\n}\n","<div class=\"bars-container d-flex flex-row gap-2 p-2 me-4\" *ngIf=\"(config?.globalSettings?.displayUserQuotaConsumption && userPercentage !== undefined) || (config?.globalSettings?.displayChatTokensConsumption && chatPercentage !== undefined)\">\n <div *ngIf=\"(config?.globalSettings?.displayUserQuotaConsumption && userPercentage !== undefined)\" class=\"token-progress-bar\" [sqTooltip]=\"userTitle\"\n [style.background]=\"'radial-gradient(closest-side, var(--ast-primary-bg, #F8F8F8) 70%, transparent 75% 100%), conic-gradient(#FF854A ' + userPercentage + '%, #0040BF 0)'\">\n </div>\n <div *ngIf=\"(config?.globalSettings?.displayChatTokensConsumption && chatPercentage !== undefined)\" class=\"token-progress-bar\" [sqTooltip]=\"chatTitle\"\n [style.background]=\"'radial-gradient(closest-side, var(--ast-primary-bg, #F8F8F8) 70%, transparent 75% 100%), conic-gradient(#FF854A ' + chatPercentage + '%, #0040BF 0)'\">\n </div>\n</div>\n","import { CommonModule } from \"@angular/common\";\nimport { AfterViewInit, Component, Input } from \"@angular/core\";\nimport { DebugMessage } from \"../types\";\nimport { Utils } from \"@sinequa/core/base\";\nimport * as Prism from 'prismjs';\nimport { UIService } from \"@sinequa/components/utils\";\n\n@Component({\n selector: \"sq-debug-message\",\n templateUrl: \"./debug-message.component.html\",\n styleUrls: [\"./debug-message.component.scss\"],\n standalone: true,\n imports: [CommonModule]\n})\nexport class DebugMessageComponent implements AfterViewInit {\n @Input() data: DebugMessage[] | undefined;\n @Input() level: number = 0; // Track the nesting level\n @Input() parentColor: string = ''; // Track the parent row color\n\n constructor(public ui: UIService) { }\n\n ngAfterViewInit() {\n Prism.highlightAll();\n }\n\n isObject(value: any): boolean {\n return Utils.isObject(value);\n }\n\n getRowClass(item: DebugMessage, index: number): string {\n if (item.isError) return 'row-error';\n if (this.level === 0) return index % 2 === 0 ? 'row-even' : 'row-odd';\n return this.parentColor;\n }\n\n copyToClipboard(code: any) {\n this.ui.copyToClipboard(JSON.stringify(code, null, 2));\n }\n}\n","<div *ngIf=\"data\" class=\"table-root\">\n <ng-container *ngFor=\"let item of data; let i = index\">\n <div *ngIf=\"item.type === 'KV'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row kv-object\">\n <div class=\"kv-key\">{{ item.data.key }}</div>\n <div class=\"kv-value\">\n <ng-container *ngIf=\"isObject(item.data.value); else normalValue\">\n <div class=\"card mb-2\">\n <div class=\"card-header\">\n <button class=\"btn btn-light btn-sm\" (click)=\"copyToClipboard(item.data.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-json my-0 rounded-0 rounded-bottom\"><code class=\"language-json\">{{ item.data.value | json }}</code></pre>\n </div>\n </ng-container>\n <ng-template #normalValue>{{ item.data.value }}</ng-template>\n </div>\n </div>\n <div *ngIf=\"item.type === 'LIST'\" [ngClass]=\"getRowClass(item, i)\" class=\"table-row list-object\">\n <div class=\"list-name\" [class.w-100]=\"!item.expanded\" (click)=\"item.expanded=!item.expanded\">\n <i class=\"fas\" [class.fa-chevron-up]=\"item.expanded\" [class.fa-chevron-down]=\"!item.expanded\"></i>\n {{ item.name }}\n </div>\n <div class=\"list-items\" *ngIf=\"item.expanded\">\n <sq-debug-message [data]=\"item.items\" [level]=\"level + 1\" [parentColor]=\"getRowClass(item, i)\"></sq-debug-message>\n </div>\n </div>\n </ng-container>\n</div>\n","import { inject, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\nimport { Action } from \"@sinequa/components/action\";\nimport { AbstractFacet } from \"@sinequa/components/facet\";\nimport { SearchService } from \"@sinequa/components/search\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { PrincipalWebService, Record as Article } from \"@sinequa/core/web-services\";\nimport { BehaviorSubject, Subscription, filter, fromEvent, map, merge, switchMap, tap } from \"rxjs\";\nimport { ChatService } from \"./chat.service\";\nimport { ChatContextAttachment, ChatConfig, ChatMessage, GllmModelDescription, MessageHandler, RawMessage, SuggestedAction, InitChat, DebugMessage } from \"./types\";\nimport { InstanceManagerService } from \"./instance-manager.service\";\nimport { WebSocketChatService } from \"./websocket-chat.service\";\nimport { ChatMessageComponent } from \"./chat-message/chat-message.component\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { RestChatService } from \"./rest-chat.service\";\nimport { TokenProgressBarComponent } from \"./token-progress-bar/token-progress-bar.component\";\nimport { DebugMessageComponent } from \"./debug-message/debug-message.component\";\n\n@Component({\n selector: 'sq-chat-v3', // mandatory since @sinequa/components already has the same tag-name \"sq-chat\"\n templateUrl: './chat.component.html',\n styleUrls: ['./chat.component.scss'],\n providers: [\n RestChatService,\n WebSocketChatService\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, FormsModule, ChatMessageComponent, TokenProgressBarComponent, DebugMessageComponent]\n})\nexport class ChatComponent extends AbstractFacet implements OnInit, OnChanges, OnDestroy {\n\n public loginService = inject(LoginService);\n public websocketService = inject(WebSocketChatService);\n public restService = inject(RestChatService);\n public instanceManagerService = inject(InstanceManagerService);\n public searchService = inject(SearchService);\n public principalService = inject(PrincipalWebService);\n public cdr = inject(ChangeDetectorRef);\n public appService = inject(AppService);\n\n /** Define the key based on it, the chat service instance will be stored */\n @Input() instanceId: string;\n /** Define the query to use to fetch answers */\n @Input() query: Query = this.searchService.query;\n /** Function that determines whether the chat should be reloaded after the query changes\n * If not provided, the chat will be reloaded by default\n * @param prevQuery The previous query\n * @param newQuery The new query\n * @returns true if the chat should be reloaded, false otherwise\n */\n @Input() queryChangeShouldTriggerReload: (prevQuery: Query, newQuery: Query) => boolean;\n /** Define the protocol to be used for this chat instance*/\n @Input() protocol: 'REST' | 'WEBSOCKET' = \"WEBSOCKET\";\n /** Map of listeners overriding default registered ones*/\n @Input() messageHandlers: Map<string, MessageHandler<any>> = new Map();\n /** When the assistant answer a user question, automatically scroll down to the bottom of the discussion */\n @Input() automaticScrollToLastResponse = false;\n /** A chat discussion that the component should get initialized with it */\n @Input() chat?: InitChat;\n /** Icon to use for the assistant messages */\n @Input() assistantMessageIcon = 'sq-sinequa';\n /** Icon to use for the user messages */\n @Input() userMessageIcon: string;\n /** Event emitter triggered each time the assistant updates the current chat */\n @Output() data = new EventEmitter<ChatMessage[]>();\n /** Event emitter triggered when the user clicks to open the original document representing the context attachment*/\n @Output() openDocument = new EventEmitter<Article>();\n /** Event emitter triggered when the user clicks to open the preview of a document representing the context attachment */\n @Output() openPreview = new EventEmitter<ChatContextAttachment>();\n /** Event emitter triggered when the user clicks on a suggested action */\n @Output() suggestAction = new EventEmitter<SuggestedAction>();\n /** Event emitter triggered when the chat is loading new content */\n @Output(\"loading\") loading$ = new EventEmitter<boolean>(false);\n /** Emits the assistant configuration used when instantiating the component */\n @Output(\"config\") _config = new EventEmitter<ChatConfig>();\n\n @ViewChild('messageList') messageList?: ElementRef<HTMLUListElement>;\n @ViewChild('questionInput') questionInput?: ElementRef<HTMLTextAreaElement>;\n\n @ContentChild('loadingTpl') loadingTpl?: TemplateRef<any>;\n @ContentChild('reportIssueTpl') reportIssueTpl?: TemplateRef<any>;\n @ContentChild('tokenConsumptionTpl') tokenConsumptionTpl?: TemplateRef<any>;\n @ContentChild('debugMessagesTpl') debugMessagesTpl?: TemplateRef<any>;\n\n chatService: ChatService;\n config: ChatConfig;\n messages$ = new BehaviorSubject<ChatMessage[] | undefined>(undefined);\n\n question = '';\n\n _actions: Action[] = [];\n\n sub = new Subscription();\n dataSubscription: Subscription | undefined;\n\n /** Variables that depend on the type of model in use */\n modelDescription?: GllmModelDescription;\n\n messageToEdit?: number;\n changes$ = new BehaviorSubject<SimpleChanges | undefined>(undefined);\n currentMessageIndex: number | undefined;\n firstChangesHandled = false;\n isAtBottom = true;\n initializationError = false;\n enabledUserInput = false;\n\n // Issue reporting\n issueTypes: string[] = [\n 'User Interface bug',\n 'Incorrect or misleading response',\n 'Incomplete response',\n 'Technical issue',\n 'Privacy/data security issue',\n 'Other'\n ];\n issueType: string = '';\n issueComment?: string;\n messageRelatedIssue?: ChatMessage;\n issueRank?: number;\n showReportIssue = false;\n\n // Debug messages\n debugMessages: DebugMessage[] | undefined;\n showDebugMessages = false;\n\n private _previousQuery: Query;\n\n constructor() {\n super();\n\n this._actions.push(new Action({\n icon: 'fas fa-sync',\n title: 'Reset chat',\n action: () => this.newChat()\n }));\n }\n\n ngOnInit(): void {\n this.sub.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n map(_ => this.chatService.initChatConfig()),\n switchMap(() => this.chatService.initConfig$),\n filter(initConfig => !!initConfig),\n switchMap(_ => this.chatService.init()),\n switchMap(_ => this.chatService.initProcess$),\n filter(success => !!success),\n tap(_ => this.onLoadChat()),\n switchMap(_ => this.chatService.chatConfig$),\n tap(config => {\n this.config = config!;\n this.enabledUserInput = this.config.modeSettings.enabledUserInput;\n this._config.emit(config);\n try {\n this.updateModelDescription();\n if(!this.firstChangesHandled) {\n this._previousQuery = JSON.parse(JSON.stringify(this.query)); // Initialize the previous query\n this.handleChanges();\n this.addScrollListener();\n this.firstChangesHandled = true;\n }\n } catch (error) {\n this.initializationError = true\n throw error;\n }\n })\n ).subscribe()\n );\n }\n\n ngOnChanges(changes: SimpleChanges) {\n this.changes$.next(changes);\n if (this.config) {\n this.handleChanges();\n }\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n this.dataSubscription?.unsubscribe();\n }\n\n get isAdmin(): boolean {\n return this.principalService.principal?.isAdministrator || false;\n }\n\n /**\n * Instantiate the chat service based on the provided @input protocol\n * This chat service instance will then be stored in the instanceManagerService with provided @input instanceId as a key\n */\n instantiateChatService(): void {\n switch (this.protocol) {\n case 'REST':\n this.chatService = this.restService;\n break;\n case 'WEBSOCKET':\n this.chatService = this.websocketService;\n break;\n default:\n throw new Error(`Could not found a ChatService implementation corresponding to the provided protocol: '${this.protocol}'`);\n }\n this.chatService.setChatInstanceId(this.instanceId);\n this.instanceManagerService.storeInstance(this.instanceId, this.chatService);\n }\n\n override get actions() { return this._actions; }\n\n private handleChanges() {\n const changes = this.changes$.value;\n // If the chat service is a WebSocketChatService, handle the override of the message handlers if exists\n if (changes?.messageHandlers && this.messageHandlers && this.chatService instanceof WebSocketChatService) {\n this.chatService.overrideMessageHandlers(this.messageHandlers);\n }\n /**\n * Initialize the chat with the provided chat messages if exists, otherwise load the default chat\n * Once the chat is initialized (firstChangesHandled is true), allow opening the chat with the new provided messages (if exists)\n */\n if (!this.firstChangesHandled || changes?.chat) {\n const openChat = () => {\n if (this.messages$.value && this.config.savedChatSettings.enabled) {\n this.chatService.listSavedChat(); // Refresh the list of saved chats\n }\n this.openChat(this.chat!.messages);\n };\n this.chatService.generateChatId();\n if (this.chat) {\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value),'chat-init': JSON.stringify(this.chat)});\n openChat();\n } else {\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value)});\n this.loadDefaultChat();\n }\n }\n /**\n * If the chat is initialized, the initialization event is \"Query\", the query changes and the queryChangeShouldTriggerReload function is provided,\n * then the chat should be reloaded if the function returns true\n * Otherwise, the chat should be reloaded by default\n */\n if (this.firstChangesHandled && changes?.query && this.config.modeSettings.initialization.event === 'Query') {\n if (this.queryChangeShouldTriggerReload ? this.queryChangeShouldTriggerReload(this._previousQuery, this.query) : true) {\n this._triggerReloadAfterQueryChange();\n }\n this._previousQuery = JSON.parse(JSON.stringify(this.query)); // Update the previous query\n }\n }\n\n private _triggerReloadAfterQueryChange() {\n const systemMsg = {role: 'system', content: this.config.defaultValues.systemPrompt, additionalProperties: {display: false}};\n const userMsg = {role: 'user', content: ChatService.formatPrompt(this.config.defaultValues.userPrompt, {principal: this.principalService.principal}), additionalProperties: {display: this.config.modeSettings.displayUserPrompt}};\n this.chatService.setSavedChatId(undefined); // Reset the savedChatId\n this.chatService.generateChatId(); // Generate a new chatId\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value)}); // Generate a new chat audit event\n this._handleQueryMode(systemMsg, userMsg);\n }\n\n private addScrollListener() {\n this.sub.add(\n merge(this.loading$, this.messages$, this.chatService.streaming$, fromEvent(this.messageList!.nativeElement, 'scroll')).subscribe(() => {\n this.isAtBottom = this.toggleScrollButtonVisibility();\n this.cdr.detectChanges();\n })\n );\n }\n\n updateModelDescription() {\n this.modelDescription = this.chatService.getModel(this.config.defaultValues.service_id, this.config.defaultValues.model_id);\n this.cdr.detectChanges();\n }\n\n submitQuestion() {\n if(this.question.trim() && this.messages$.value && this.chatService.chatHistory) {\n if (this.messageToEdit !== undefined) {\n // Update the messages in the UI\n this.messages$.next(this.messages$.value.slice(0, this.messageToEdit));\n // Update the raw messages in the chat history which is the clean version used to make the next request\n this.chatService.chatHistory = this.chatService.chatHistory.slice(0, this.messageToEdit);\n this.messageToEdit = undefined;\n }\n // Fetch the answer\n this.fetchAnswer(this.question.trim(), this.chatService.chatHistory);\n // Clear the input value in the UI\n this.questionInput!.nativeElement.value = '';\n this.questionInput!.nativeElement.style.height = `auto`;\n }\n }\n\n private fetchAnswer(question: string, conversation: ChatMessage[]) {\n const userMsg = {role: 'user', content: question, additionalProperties: {display: true, isUserInput: true, additionalWorkflowProperties: this.config.additionalWorkflowProperties}};\n const messages = [...conversation, userMsg];\n this.messages$.next(messages);\n this.fetch(messages);\n this.chatService.generateAuditEvent('message', {...this._defineMessageAuditDetails(userMsg, messages.length - 1), 'query': JSON.stringify(this.query), 'is-user-input': true, 'enabled-functions': this.config.defaultValues.functions?.filter(func => func.enabled).map(func => func.name), 'additional-workflow-properties': JSON.stringify(this.config.additionalWorkflowProperties)});\n }\n\n /**\n * Given a list of messages, the chat endpoint is invoked for a continuation and updates the list of messages accordingly.\n * @param messages\n */\n public fetch(messages: ChatMessage[]) {\n this.cdr.detectChanges();\n this.loading$.next(true);\n this.dataSubscription?.unsubscribe();\n this.dataSubscription = this.chatService.fetch(messages, this.query)\n .subscribe({\n next: res => this.updateData(res.history),\n error: () => {\n this.terminateFetch();\n },\n complete: () => {\n this.terminateFetch();\n }\n });\n\n if(this.automaticScrollToLastResponse) {\n this.scrollDown();\n }\n }\n\n /**\n * Update the UI with the new messages\n * @param messages\n */\n updateData(messages: ChatMessage[]) {\n this.messages$.next(messages);\n this.data.emit(messages);\n this.loading$.next(false);\n this.question = '';\n if(this.automaticScrollToLastResponse) {\n this.scrollDown();\n }\n }\n\n private toggleScrollButtonVisibility(): boolean {\n if(this.messageList?.nativeElement) {\n return Math.round(this.messageList?.nativeElement.scrollHeight - this.messageList?.nativeElement.scrollTop - 1) <= this.messageList?.nativeElement.clientHeight;\n }\n return true;\n }\n\n scrollDown() {\n setTimeout(() => {\n if(this.messageList?.nativeElement) {\n this.messageList.nativeElement.scrollTop = this.messageList.nativeElement.scrollHeight;\n this.cdr.detectChanges();\n }\n }, 10);\n }\n\n /**\n * Start a new chat with the defaultValues settings\n * The savedChatId in the chat service will be reset, so that the upcoming saved chat operations will be performed on the fresh new chat\n * If the savedChat feature is enabled, the list of saved chats will be refreshed\n */\n newChat() {\n this.chatService.setSavedChatId(undefined); // Reset the savedChatId\n this.chatService.generateChatId(); // Generate a new chatId\n if (this.config.savedChatSettings.enabled) {\n this.chatService.listSavedChat(); // Refresh the list of saved chats\n }\n this.chatService.generateAuditEvent('new-chat', {'configuration': JSON.stringify(this.chatService.chatConfig$.value)}); // Generate a new chat audit event\n this.loadDefaultChat(); // Start a new chat\n }\n\n /**\n * Start the default chat with the defaultValues settings\n * If the chat is meant to be initialized with event === \"Query\", the corresponding user query message will be added to the chat history\n */\n loadDefaultChat() {\n // Define the default system prompt and user prompt messages\n const systemMsg = {role: 'system', content: this.config.defaultValues.systemPrompt, additionalProperties: {display: false}};\n const userMsg = {role: 'user', content: ChatService.formatPrompt(this.config.defaultValues.userPrompt, {principal: this.principalService.principal}), additionalProperties: {display: this.config.modeSettings.displayUserPrompt}};\n\n if (this.config.modeSettings.initialization.event === 'Query') {\n this._handleQueryMode(systemMsg, userMsg);\n } else { // If the chat is meant to be initialized with event === \"Prompt\"\n this.openChat([systemMsg, userMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(systemMsg, 0));\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(userMsg, 1));\n }\n }\n\n /**\n * If the provided query text is not empty, then add the user query message to the chat history and invoke the assistant\n * Otherwise, just start a new chat with a warning message inviting the user to perform a full text search to retrieve some results\n */\n private _handleQueryMode(systemMsg: ChatMessage, userMsg: ChatMessage) {\n if (!!this.query.text) {\n const userQueryMsg = {role: 'user', content: this.query.text, additionalProperties: {display: this.config.modeSettings.initialization.displayUserQuery, query: this.query, forcedWorkflow: this.config.modeSettings.initialization.forcedWorkflow, isUserInput: true, additionalWorkflowProperties: this.config.additionalWorkflowProperties}};\n if (this.config.modeSettings.sendUserPrompt) {\n this.openChat([systemMsg, userMsg, userQueryMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(systemMsg, 0));\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(userMsg, 1));\n this.chatService.generateAuditEvent('message', {...this._defineMessageAuditDetails(userQueryMsg, 2), 'query': JSON.stringify(this.query) ,'is-user-input': true, 'forced-workflow': this.config.modeSettings.initialization.forcedWorkflow, 'enabled-functions': this.config.defaultValues.functions?.filter(func => func.enabled).map(func => func.name), 'additional-workflow-properties':JSON.stringify(this.config.additionalWorkflowProperties)});\n } else {\n this.openChat([systemMsg, userQueryMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(systemMsg, 0));\n this.chatService.generateAuditEvent('message', {...this._defineMessageAuditDetails(userQueryMsg, 1), 'query': JSON.stringify(this.query) ,'is-user-input': true, 'forced-workflow': this.config.modeSettings.initialization.forcedWorkflow, 'enabled-functions': this.config.defaultValues.functions?.filter(func => func.enabled).map(func => func.name), 'additional-workflow-properties': JSON.stringify(this.config.additionalWorkflowProperties)});\n }\n } else {\n const warningMsg = {role: 'assistant', content: \"You must perform a full text search to retrieve some results\", additionalProperties: {display: true}};\n this.openChat([warningMsg]);\n this.chatService.generateAuditEvent('message', this._defineMessageAuditDetails(warningMsg, 0));\n }\n }\n\n private _defineMessageAuditDetails(message: ChatMessage, rank: number): Record<string, any> {\n return {\n 'duration': 0,\n 'text': message.content,\n 'role': message.role,\n 'rank': rank\n };\n }\n\n /**\n * Start/open a new chat with the provided messages and chatId\n * If the last message is from the user, a request to the assistant is made to get an answer\n * If the last message is from the assistant, the conversation is loaded right away\n * @param messages The list of messages of the chat\n * @param savedChatId The id of the saved chat. If provided (ie. an existing discussion in the saved chat index), update the savedChatId in the chat service for the upcoming saved chat operations\n */\n openChat(messages: RawMessage[], savedChatId?: string) {\n if (!messages || !Array.isArray(messages)) {\n console.error('Error occurs while trying to load the chat discussion. Invalid messages received :', messages);\n return;\n }\n if (savedChatId) {\n this.chatService.setSavedChatId(savedChatId);\n this.chatService.generateChatId(savedChatId);\n }\n this.resetChat();\n this.messages$.next(messages);\n this.chatService.chatHistory = messages;\n const lastMessage = messages.at(-1);\n if(lastMessage && lastMessage.role === 'user') {\n this.fetch(messages); // If the last message if from a user, an answer from the assistant is expected\n }\n else {\n this.updateData(messages); // If the last message if from the assistant, we can load the conversation right away\n this.terminateFetch();\n }\n this.addScrollListener();\n }\n\n /**\n * Reset the chat by clearing the chat history and the UI accordingly\n * The user input will be cleared\n * The fetch subscription will be terminated\n */\n resetChat() {\n if(this.messages$.value) {\n this.messages$.next(undefined); // Reset chat\n }\n this.chatService.chatHistory = undefined; // Reset chat history\n this.question = '';\n this.terminateFetch();\n }\n\n onLoadChat() {\n this.loading$.next(true);\n this.sub.add(\n this.chatService.loadSavedChat$\n .pipe(\n filter(savedChat => !!savedChat),\n switchMap(savedChat => this.chatService.getSavedChat(savedChat!.id)),\n filter(savedChatHistory => !!savedChatHistory),\n tap(savedChatHistory => this.openChat(savedChatHistory!.history, savedChatHistory!.id))\n ).subscribe()\n );\n }\n\n terminateFetch() {\n this.dataSubscription?.unsubscribe();\n this.dataSubscription = undefined;\n this.loading$.next(false);\n this.cdr.detectChanges();\n }\n\n /**\n * Copy a previous user message of the chat history to the chat user input.\n * Thus, the user can edit and resubmit the message.\n * Once the edited message is submitted, all subsequent messages starting from @param index will be removed from the history and the UI will be updated accordingly.\n * The assistant will regenerate a new answer based on the updated chat history.\n * @param index The index of the user's message to edit\n */\n editMessage(index: number) {\n this.messageToEdit = index;\n this.question = this.chatService.chatHistory![index].content;\n this.chatService.generateAuditEvent('edit.click', {'rank': index});\n }\n\n /**\n * Copy a previous assistant message of the chat history to the clipboard.\n * @param index The index of the assistant's message to edit\n */\n copyMessage(index: number) {\n this.chatService.generateAuditEvent('copy.click', {'rank': index});\n }\n\n /**\n * Starting from the provided index, remove all subsequent messages from the chat history and the UI accordingly.\n * The assistant will regenerate a new answer based on the updated chat history.\n * @param index The index of the assistant's message to regenerate\n */\n regenerateMessage(index: number) {\n // Define the chat history based on which the assistant will generate a new answer\n const slicedMessages = this.chatService.chatHistory!.slice(0, index);\n // Accordingly update the messages in the UI\n this.messages$.next(slicedMessages);\n // Fetch the answer\n this.fetch(slicedMessages);\n this.chatService.generateAuditEvent('regenerate.click', {'rank': index});\n }\n\n onKeyUp(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Backspace':\n this.calculateHeight();\n break;\n case 'Enter':\n if (!event.shiftKey) {\n event.preventDefault();\n this.submitQuestion();\n }\n this.calculateHeight();\n break;\n default:\n break;\n }\n }\n\n calculateHeight(): void {\n const maxHeight = 170;\n const el = this.questionInput!.nativeElement;\n el.style.maxHeight = `${maxHeight}px`;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n el.style.overflowY = el.scrollHeight >= maxHeight ? 'scroll' : 'hidden';\n }\n\n /**\n * Send a \"like\" event on clicking on the thumb-up icon of an assistant's message\n * @param rank The rank of the message to like\n */\n onLike(rank: number): void {\n this.chatService.generateAuditEvent('thumb-up.click', {rank});\n }\n\n /**\n * Send a \"dislike\" event on clicking on the thumb-down icon of an assistant's message.\n * It also opens the issue reporting dialog.\n * @param message The assistant message to dislike\n * @param rank The rank of the message to dislike\n */\n onDislike(message: ChatMessage, rank: number): void {\n this.chatService.generateAuditEvent('thumb-down.click', {rank});\n this.messageRelatedIssue = message;\n this.issueType = '';\n this.issueComment = undefined;\n this.issueRank = rank;\n this.showReportIssue = true\n }\n\n /**\n * Report an issue related to the assistant's message.\n */\n sendIssue(): void {\n const details = {\n 'report-type': this.issueType,\n 'comment': this.issueComment,\n 'text': this.messageRelatedIssue!.content,\n 'rank': this.issueRank,\n };\n this.chatService.generateAuditEvent('negative-report.send', details);\n this.showReportIssue = false;\n }\n\n /**\n * Close the issue reporting dialog.\n */\n ignoreIssue(): void {\n this.showReportIssue = false;\n }\n\n /**\n * Handle the click on a reference's 'open preview'.\n * @param data\n */\n openAttachmentPreview(data: {reference: ChatContextAttachment, partId?: number}) {\n this.openPreview.emit(data.reference);\n const details = {\n 'doc-id': data.reference.recordId,\n 'title': data.reference.record.title,\n 'source': data.reference.record.treepath,\n 'collection': data.reference.record.collection,\n 'index': data.reference.record.databasealias,\n };\n if(!!data.partId) details['part-id'] = data.partId;\n this.chatService.generateAuditEvent('attachment.preview.click', details);\n }\n\n /**\n * Handle the click on a reference's 'open original document'.\n * @param data\n */\n openOriginalAttachment(data: {reference: ChatContextAttachment, partId?: number}) {\n this.openDocument.emit(data.reference.record);\n const details = {\n 'doc-id': data.reference.recordId,\n 'title': data.reference.record.title,\n 'source': data.reference.record.treepath,\n 'collection': data.reference.record.collection,\n 'index': data.reference.record.databasealias,\n };\n if(!!data.partId) details['part-id'] = data.partId;\n this.chatService.generateAuditEvent('attachment.link.click', details);\n }\n\n /**\n * Handle the click on a suggested action.\n * @param action Suggested action.\n * @param index Rank of the message in the chatHistory related to the suggested action.\n */\n suggestActionClick(action: SuggestedAction, index: number) {\n this.suggestAction.emit(action);\n this.chatService.generateAuditEvent('suggestedAction.click', {'text': action.content, 'suggestedAction-type': action.type})\n }\n\n /**\n * Handle the click on the 'show log info' button of a message.\n * @param message The message of the ChatHistory to show its debug messages\n */\n showDebug(message: ChatMessage): void {\n this.debugMessages = message.additionalProperties.$debug;\n this.showDebugMessages = true;\n this.cdr.detectChanges();\n }\n}\n","<ng-container *ngIf=\"!initializationError\">\n <div *ngIf=\"messages$ | async as messages; else loadingTpl || loadingTplDefault\" class=\"h-100 d-flex flex-column\">\n <!-- Token consumption -->\n <div class=\"ms-1\" *ngIf=\"config?.globalSettings?.displayUserQuotaConsumption || config?.globalSettings?.displayChatTokensConsumption\">\n <ng-container *ngTemplateOutlet=\"tokenConsumptionTpl || defaultTokenConsumptionTpl; context: { $implicit: instanceId }\"></ng-container>\n </div>\n\n <!-- Chat Messages -->\n <ul class=\"list-group list-group-flush overflow-auto flex-grow-1 pe-2 pb-2\" #messageList>\n <ng-container *ngFor=\"let message of messages; let index = index; let last = last\">\n <!-- Regular messages -->\n <li class=\"list-group-item\" [style.--bs-list-group-item-padding-y.rem]=\"'0.6'\" *ngIf=\"message.additionalProperties.display\"\n [class.opacity-50]=\"messageToEdit && messageToEdit < index + 1\">\n <sq-chat-message\n [class.sq-user-message]=\"message.role === 'user'\"\n [class.last-message]=\"last\"\n [message]=\"message\"\n [conversation]=\"messages\"\n [suggestedActions]=\"last ? message.additionalProperties.$suggestedAction : undefined\"\n [assistantMessageIcon]=\"assistantMessageIcon\"\n [userMessageIcon]=\"userMessageIcon\"\n [streaming]=\"last && (chatService.streaming$ | async)\"\n [canEdit]=\"(loading$ | async) === false && ((chatService.streaming$ | async) === false || !last) && messageToEdit === undefined && message.role === 'user'\"\n [canRegenerate]=\"(loading$ | async) === false && (chatService.streaming$ | async) === false && messageToEdit === undefined && message.role === 'assistant' && last\"\n [canCopy]=\"((chatService.streaming$ | async) === false || !last) && messageToEdit === undefined && message.role === 'assistant'\"\n [canDebug]=\"((chatService.streaming$ | async) === false || !last) && message.role === 'assistant' && isAdmin && message.additionalProperties.$debug\"\n [canLike]=\"((chatService.streaming$ | async) === false || !last) && message.role === 'assistant'\"\n [canDislike]=\"((chatService.streaming$ | async) === false || !last) && message.role === 'assistant'\"\n (edit)=\"editMessage(index)\"\n (copy)=\"copyMessage(index)\"\n (regenerate)=\"regenerateMessage(index)\"\n (openDocument)=\"openOriginalAttachment($event)\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (suggestAction)=\"suggestActionClick($event, index)\"\n (like)=\"onLike(index)\"\n (dislike)=\"onDislike($event, index)\"\n (debug)=\"showDebug($event)\">\n </sq-chat-message>\n </li>\n </ng-container>\n <!-- Loading spinner -->\n <li class=\"list-group-item\" *ngIf=\"(loading$ | async) === true\">\n <ng-container *ngTemplateOutlet=\"loadingTpl || loadingTplDefault\"></ng-container>\n </li>\n </ul>\n\n <!-- Reporting an issue form -->\n <div class=\"issue-report bg-light pt-3 pb-2\" *ngIf=\"showReportIssue\">\n <ng-container *ngTemplateOutlet=\"reportIssueTpl || reportIssueTplDefault; context: { $implicit: messageRelatedIssue, rank: issueRank }\"></ng-container>\n </div>\n\n <!-- User text input -->\n <div class=\"user-input mt-auto\" *ngIf=\"enabledUserInput && !showReportIssue\">\n <div class=\"py-2\">\n <ng-container *ngTemplateOutlet=\"inputTpl\"></ng-container>\n <div class=\"text-end small text-muted px-3\" *ngIf=\"!!config?.globalSettings?.disclaimer\">\n {{ config?.globalSettings?.disclaimer }}\n </div>\n </div>\n </div>\n\n <!-- Floating scroll button -->\n <div *ngIf=\"!isAtBottom && !showReportIssue\" class=\"sq-floating-scroll\" [ngClass]=\"enabledUserInput ? 'sq-floating-scroll--when-user-input' : 'sq-floating-scroll--without-user-input'\">\n <button class=\"btn shadow\" (click)=\"scrollDown()\">\n <i class=\"fas fa-angle-double-down\"></i>\n </button>\n </div>\n </div>\n</ng-container>\n\n<!-- NG TEMPLATES-->\n\n<ng-template #loadingTplDefault>\n <div class=\"spinner-grow text-primary d-block mx-auto my-5\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</ng-template>\n\n<ng-template #inputTpl>\n <div class=\"px-3 py-1\">\n <div class=\"ast-input-container\">\n <button disabled class=\"btn btn-light\">\n <i class=\"fas fa-search\"></i>\n </button>\n <textarea #questionInput rows=\"1\"\n type=\"text\" class=\"form-control\"\n placeholder=\"Ask something\" autofocus\n [(ngModel)]=\"question\"\n (keyup)=\"onKeyUp($event)\"\n (keydown)=\"calculateHeight()\"\n [disabled]=\"(loading$ | async) || (chatService.streaming$ | async)\">\n </textarea>\n <button\n *ngIf=\"!(chatService.streaming$ | async) && !(loading$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Send message\"\n (click)=\"submitQuestion()\">\n <i class=\"fas fa-paper-plane\"></i>\n </button>\n <!--<button\n *ngIf=\"(chatService.streaming$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Stop generating\"\n (click)=\"terminateFetch()\">\n <i class=\"fas fa-stop\"></i>\n </button>-->\n <button\n *ngIf=\"messageToEdit\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Cancel edition\"\n (click)=\"messageToEdit = undefined; question = ''\">\n <i class=\"fas fa-undo-alt\"></i>\n </button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #reportIssueTplDefault let-message let-rank=\"rank\">\n <div class=\"px-3\">\n <h5>Issue type</h5>\n <select class=\"form-select mb-4\" [(ngModel)]=\"issueType\">\n <option [value]=\"''\">Choose an issue type</option>\n <option *ngFor=\"let type of issueTypes\">{{type}}</option>\n </select>\n <h5>Comment (optional)</h5>\n <textarea class=\"form-control\" [(ngModel)]=\"issueComment\" placeholder=\"What was unsatisfying about this response?\"></textarea>\n <div class=\"d-flex flex-row-reverse mt-2\">\n <button class=\"btn btn-primary\" [disabled]=\"!issueType\" (click)=\"sendIssue()\">Send</button>\n <button class=\"btn btn-light\" (click)=\"ignoreIssue()\">Cancel</button>\n </div>\n </div>\n</ng-template>\n\n<ng-template #defaultTokenConsumptionTpl let-instanceId>\n <sq-token-progress-bar\n [instanceId]=\"instanceId\">\n </sq-token-progress-bar>\n</ng-template>\n\n<div class=\"debug-messages\" [class.displayed]=\"showDebugMessages\">\n <button *ngIf=\"showDebugMessages\" class=\"btn btn-light shadow back-btn\" (click)=\"showDebugMessages=false\">\n <i class=\"fas fa-chevron-right\"></i>\n </button>\n <ng-container *ngTemplateOutlet=\"debugMessagesTpl || defaultDebugMessagesTpl; context: { $implicit: debugMessages }\">\n </ng-container>\n</div>\n\n<ng-template #defaultDebugMessagesTpl let-debugMessages>\n <sq-debug-message [data]=\"debugMessages\"></sq-debug-message>\n</ng-template>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { Validators } from '@angular/forms';\nimport { Subscription, catchError, filter, switchMap, tap, throwError, BehaviorSubject } from \"rxjs\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { ConfirmType, ModalButton, ModalResult, ModalService, PromptOptions, ModalModule } from \"@sinequa/core/modal\";\nimport { NotificationsService } from \"@sinequa/core/notification\";\nimport { UtilsModule } from \"@sinequa/components/utils\";\nimport { format, parseISO, isToday, isYesterday, isThisWeek, isThisMonth, isThisQuarter, isThisYear, endOfYesterday, differenceInDays, differenceInMonths, differenceInYears, toDate } from 'date-fns';\nimport { ChatService } from \"../chat.service\";\nimport { SavedChat } from \"../types\";\nimport { InstanceManagerService } from \"../instance-manager.service\";\n\n@Component({\n selector: 'sq-saved-chats-v3',\n templateUrl: 'saved-chats.component.html',\n styleUrls: ['saved-chats.component.scss'],\n standalone: true,\n imports: [CommonModule, ModalModule, UtilsModule]\n})\nexport class SavedChatsComponent implements OnInit, OnDestroy {\n /** Define the key based on it, the appropriate chatService instance will be returned from instanceManagerService */\n @Input() instanceId: string;\n\n @Output() load = new EventEmitter<SavedChat>();\n @Output() delete = new EventEmitter<SavedChat>();\n\n chatService: ChatService;\n subscription = new Subscription();\n groupedSavedChats$ = new BehaviorSubject<{ key: string; value: SavedChat[]}[]>([]);\n\n public loginService = inject(LoginService);\n public instanceManagerService = inject(InstanceManagerService);\n public modalService = inject(ModalService);\n public notificationsService = inject(NotificationsService);\n\n ngOnInit(): void {\n this.subscription.add(\n this.loginService.events.pipe(\n filter(e => e.type === 'login-complete'),\n tap(_ => this.instantiateChatService()),\n switchMap(_ => this.chatService.initProcess$),\n filter(success => !!success),\n tap(_ => {\n this.onListSavedChat();\n this.chatService.listSavedChat();\n })\n ).subscribe()\n );\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n instantiateChatService(): void {\n this.chatService = this.instanceManagerService.getInstance(this.instanceId);\n }\n\n onListSavedChat() {\n this.subscription.add(\n this.chatService.savedChats$.subscribe(\n (savedChats: SavedChat[]) => {\n this.groupedSavedChats$.next(this._groupSavedChatsByDate(savedChats));\n }\n )\n );\n }\n\n onLoad(savedChat: SavedChat) {\n this.chatService.setSavedChatId(savedChat.id);\n this.chatService.generateChatId(savedChat.id);\n this.chatService.loadSavedChat$.next(savedChat);\n this.chatService.generateAuditEvent('saved-chat.load', {}, savedChat.id);\n this.chatService.listSavedChat();\n this.load.emit(savedChat);\n }\n\n onRename(savedChat: SavedChat) {\n const model: PromptOptions = {\n title: 'Rename saved discussion',\n message: `Please enter a new name for the discussion \"${savedChat.title}\".`,\n buttons: [\n new ModalButton({result: ModalResult.Cancel}),\n new ModalButton({result: ModalResult.OK, text: \"Rename\", primary: true})\n ],\n output: savedChat.title,\n validators: [Validators.required]\n };\n\n this.modalService.prompt(model).then(res => {\n if(res === ModalResult.OK) {\n this.subscription.add(\n this.chatService.updateSavedChat(savedChat.id, model.output)\n .pipe(\n tap(() => {\n this.notificationsService.success(`The saved discussion \"${savedChat.title}\" has been successfully renamed to \"${model.output}\".`);\n this.chatService.listSavedChat();\n }),\n catchError((error) => {\n console.error('Error occurred while updating the saved chat:', error);\n this.notificationsService.error(`Error occurred while updating the saved discussion \"${savedChat.title}\"`);\n return throwError(() => error);\n })\n ).subscribe()\n );\n this.chatService.generateAuditEvent('saved-chat.rename', {'text': model.output}, savedChat.id);\n }\n });\n }\n\n onDelete(savedChat: SavedChat) {\n this.modalService\n .confirm({\n title: \"Delete saved discussion\",\n message: `You are about to delete the discussion \"${savedChat.title}\". Do you want to continue?`,\n buttons: [\n new ModalButton({result: ModalResult.Cancel}),\n new ModalButton({result: ModalResult.OK, text: \"Confirm\", primary: true})\n ],\n confirmType: ConfirmType.Warning\n }).then(res => {\n if(res === ModalResult.OK) {\n this.subscription.add(\n this.chatService.deleteSavedChat([savedChat.id])\n .pipe(\n tap(() => {\n this.notificationsService.success(`The saved discussion \"${savedChat.title}\" has been successfully deleted.`);\n this.delete.emit(savedChat);\n this.chatService.listSavedChat();\n }),\n catchError((error) => {\n console.error('Error occurred while deleting the saved chat:', error);\n this.notificationsService.error(`Error occurred while deleting the saved discussion \"${savedChat.title}\"`);\n return throwError(() => error);\n })\n ).subscribe()\n );\n this.chatService.generateAuditEvent('saved-chat.delete', {}, savedChat.id);\n }\n });\n }\n\n private _groupSavedChatsByDate(savedChats: SavedChat[]): { key: string; value: SavedChat[] }[] {\n const groupedSavedChats = new Map<string, SavedChat[]>();\n\n savedChats\n .sort((a, b) => parseISO(b.modifiedUTC).getTime() - parseISO(a.modifiedUTC).getTime())\n .forEach(savedChat => {\n const groupKey = this._getTimeKey(toDate(parseISO(savedChat.modifiedUTC))); // Must convert the UTC date to local date before passing to _getTimeKey\n\n if (!groupedSavedChats.has(groupKey)) {\n groupedSavedChats.set(groupKey, []);\n }\n\n groupedSavedChats.get(groupKey)!.push(savedChat);\n });\n\n return Array.from(groupedSavedChats, ([key, value]) => ({ key, value }));;\n }\n\n private _getTimeKey(date: Date): string {\n if (isToday(date)) {\n return 'Today';\n } else if (isYesterday(date)) {\n return 'Yesterday';\n } else if (isThisWeek(date)) {\n return 'This week';\n } else if (differenceInDays(endOfYesterday(), date) <= 7) {\n return 'Last week';\n } else if (isThisMonth(date)) {\n return 'This month';\n } else if (differenceInMonths(endOfYesterday(), date) <= 1) {\n return 'Last month';\n } else if (isThisQuarter(date)) {\n return 'This quarter';\n } else if (differenceInMonths(endOfYesterday(), date) <= 3) {\n return 'Last quarter';\n } else if (isThisYear(date)) {\n return 'This year';\n } else if (differenceInYears(endOfYesterday(), date) === 1) {\n return 'Last year';\n } else {\n return format(date, 'yyyy');\n }\n }\n\n}\n","<ng-container *ngIf=\"(chatService.chatConfig$ | async)?.savedChatSettings.display\">\n <div *ngFor=\"let group of (groupedSavedChats$ | async)\" class=\"saved-chats\">\n <div class=\"saved-chat-date\">{{group.key}}</div>\n <div *ngFor=\"let savedChat of group.value\" class=\"saved-chat p-2\" [class.active]=\"chatService.savedChatId === savedChat.id\"\n (click)=\"onLoad(savedChat)\">\n <span class=\"title me-1\">{{savedChat.title}}</span>\n <i class=\"saved-chat-actions fas fa-pen mx-1\" [sqTooltip]=\"'Rename'\"\n (click)=\"$event.stopPropagation(); onRename(savedChat)\"></i>\n <i class=\"saved-chat-actions fas fa-trash ms-1\" [sqTooltip]=\"'Delete'\"\n (click)=\"$event.stopPropagation(); onDelete(savedChat)\"></i>\n </div>\n </div>\n</ng-container>\n","export default {\n \"assistant\": {}\n}\n","export default {\n \"assistant\": {}\n}\n","export default {\n \"assistant\": {}\n}\n","import { Utils } from '@sinequa/core/base';\nimport _enAssistant from './en';\nimport _frAssistant from './fr';\nimport _deAssistant from './de';\n\nconst enAssistant = Utils.merge({}, _enAssistant);\nconst frAssistant = Utils.merge({}, _frAssistant);\nconst deAssistant = Utils.merge({}, _deAssistant);\n\nexport { enAssistant, frAssistant, deAssistant };\n","import { Component, Inject, OnDestroy, OnInit } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { UntypedFormControl, UntypedFormBuilder, Validators, UntypedFormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { MODAL_MODEL, PromptOptions, ModalRef, ModalButton, ModalResult } from \"@sinequa/core/modal\";\nimport { Utils } from '@sinequa/core/base';\nimport { BsModalModule } from \"@sinequa/components/modal\";\nimport { ValidationModule } from \"@sinequa/core/validation\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { IntlModule } from \"@sinequa/core/intl\";\n\n@Component({\n selector: \"sq-chat-prompt\",\n template: `\n <form name=\"prompt\" novalidate [formGroup]=\"form\">\n <sq-modal [title]=\"title\" [buttons]=\"buttons\">\n <div class=\"mb-3 sq-form-group\">\n <label class=\"form-label\" for=\"input\">{{model.message | sqMessage:model.messageParams}}</label>\n <input [sqValidation]=\"form\" type=\"text\" class=\"form-control\" id=\"input\" formControlName=\"input\" spellcheck=\"off\" sqAutofocus *ngIf=\"!model.rowCount\">\n <textarea [sqValidation]=\"form\" type=\"text\" class=\"form-control\" id=\"input\" formControlName=\"input\" spellcheck=\"on\" rows=\"{{model.rowCount}}\" sqAutofocus *ngIf=\"!!model.rowCount\">\n </textarea>\n </div>\n </sq-modal>\n </form>\n `,\n standalone: true,\n imports: [CommonModule, BsModalModule, ValidationModule, ReactiveFormsModule, IntlModule],\n})\nexport class ChatPrompt implements OnInit, OnDestroy {\n inputControl: UntypedFormControl;\n form: UntypedFormGroup;\n formChanges: Subscription;\n defaultButtons: ModalButton[];\n\n constructor(\n @Inject(MODAL_MODEL) public model: PromptOptions,\n protected modalRef: ModalRef,\n protected formBuilder: UntypedFormBuilder) {\n this.defaultButtons = [\n new ModalButton({\n result: ModalResult.OK,\n primary: true,\n validation: this.form\n }),\n new ModalButton({\n result: ModalResult.Cancel\n })\n ];\n }\n\n ngOnInit() {\n this.inputControl = new UntypedFormControl(this.model.output, this.model.validators || Validators.required);\n this.form = this.formBuilder.group({\n input: this.inputControl\n });\n this.formChanges = Utils.subscribe(this.form.valueChanges,\n (value) => {\n this.model.output = this.inputControl.value;\n });\n }\n\n ngOnDestroy() {\n this.formChanges.unsubscribe();\n }\n\n get title(): string {\n return this.model.title ? this.model.title : \"msg#modal.prompt.title\";\n }\n\n get buttons(): ModalButton[] {\n return (this.model.buttons && this.model.buttons.length > 0) ? this.model.buttons : this.defaultButtons;\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","Prism","i5","i6"],"mappings":"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"}