@sftech/ng-orchestrator 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{sftech-ng-orchestrator-agent-rag-upload.component-COPkzHNN.mjs → sftech-ng-orchestrator-agent-rag-upload.component-D3c3yDEQ.mjs} +2 -2
- package/fesm2022/{sftech-ng-orchestrator-agent-rag-upload.component-COPkzHNN.mjs.map → sftech-ng-orchestrator-agent-rag-upload.component-D3c3yDEQ.mjs.map} +1 -1
- package/fesm2022/{sftech-ng-orchestrator-agents.routes-DH_0cd5T.mjs → sftech-ng-orchestrator-agents.routes-a-biG3wv.mjs} +4 -4
- package/fesm2022/sftech-ng-orchestrator-agents.routes-a-biG3wv.mjs.map +1 -0
- package/fesm2022/{sftech-ng-orchestrator-chats.routes-CqFuG3l5.mjs → sftech-ng-orchestrator-chats.routes-DSlx52sA.mjs} +7 -8
- package/fesm2022/sftech-ng-orchestrator-chats.routes-DSlx52sA.mjs.map +1 -0
- package/fesm2022/{sftech-ng-orchestrator-prompt-display.component-CXGtE_Ui.mjs → sftech-ng-orchestrator-prompt-display.component-DM5L2ykm.mjs} +2 -2
- package/fesm2022/sftech-ng-orchestrator-prompt-display.component-DM5L2ykm.mjs.map +1 -0
- package/fesm2022/sftech-ng-orchestrator-prompt.model-DhASegzq.mjs.map +1 -1
- package/fesm2022/{sftech-ng-orchestrator-prompts.routes-CvMtYkTK.mjs → sftech-ng-orchestrator-prompts.routes-DThT4R9P.mjs} +2 -2
- package/fesm2022/sftech-ng-orchestrator-prompts.routes-DThT4R9P.mjs.map +1 -0
- package/fesm2022/{sftech-ng-orchestrator-sftech-ng-orchestrator-C51KniGY.mjs → sftech-ng-orchestrator-sftech-ng-orchestrator-BquR89lx.mjs} +4 -4
- package/fesm2022/sftech-ng-orchestrator-sftech-ng-orchestrator-BquR89lx.mjs.map +1 -0
- package/fesm2022/sftech-ng-orchestrator.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/sftech-ng-orchestrator-agents.routes-DH_0cd5T.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-chats.routes-CqFuG3l5.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-prompt-display.component-CXGtE_Ui.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-prompts.routes-CvMtYkTK.mjs.map +0 -1
- package/fesm2022/sftech-ng-orchestrator-sftech-ng-orchestrator-C51KniGY.mjs.map +0 -1
|
@@ -6,7 +6,7 @@ import { Button } from 'primeng/button';
|
|
|
6
6
|
import * as i1$1 from 'primeng/fileupload';
|
|
7
7
|
import { FileUploadModule } from 'primeng/fileupload';
|
|
8
8
|
import * as i1 from '@angular/common/http';
|
|
9
|
-
import { O as ORCHESTRATOR_CONFIGURATION, a as OrchestratorService } from './sftech-ng-orchestrator-sftech-ng-orchestrator-
|
|
9
|
+
import { O as ORCHESTRATOR_CONFIGURATION, a as OrchestratorService } from './sftech-ng-orchestrator-sftech-ng-orchestrator-BquR89lx.mjs';
|
|
10
10
|
import { P as Prompt } from './sftech-ng-orchestrator-prompt.model-DhASegzq.mjs';
|
|
11
11
|
|
|
12
12
|
class Agent extends BaseDbModel {
|
|
@@ -185,4 +185,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
185
185
|
}], propDecorators: { agentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "agentId", required: false }] }], chatId: [{ type: i0.Input, args: [{ isSignal: true, alias: "chatId", required: false }] }] } });
|
|
186
186
|
|
|
187
187
|
export { AgentService as A, AgentRagUploadComponent as a, Agent as b };
|
|
188
|
-
//# sourceMappingURL=sftech-ng-orchestrator-agent-rag-upload.component-
|
|
188
|
+
//# sourceMappingURL=sftech-ng-orchestrator-agent-rag-upload.component-D3c3yDEQ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sftech-ng-orchestrator-agent-rag-upload.component-COPkzHNN.mjs","sources":["../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/core/models/agent.model.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/core/service/agent.service.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-rag-upload/agent-rag-upload.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-rag-upload/agent-rag-upload.component.html"],"sourcesContent":["import { BaseDbModel, EFilterTypes, IBaseDbResponseDto } from '@sftech/ng-shared';\r\nimport { IAgentResponseDto } from '../dtos/agent-response.dto';\r\nimport { IPromptHistoryResponseDto } from '../dtos/prompt-history-response.dto';\r\nimport { PromptHistory } from './prompt-history.model';\r\nimport { Prompt } from './prompt.model';\r\n\r\nexport class Agent extends BaseDbModel {\r\n public identifier!: string;\r\n\r\n public description!: string;\r\n\r\n public name!: string;\r\n\r\n public connectorUrl!: string;\r\n\r\n public isGeneric!: boolean;\r\n\r\n public answerSpecification!: string;\r\n\r\n public tools!: string[];\r\n\r\n public llmProvider!: string;\r\n\r\n public llmModel!: string;\r\n\r\n public llmTemperature!: number;\r\n\r\n public llmTimeout?: number;\r\n\r\n public llmRetries?: number;\r\n\r\n public llmUserPromptId!: number;\r\n\r\n public llmUserPrompt?: Prompt;\r\n\r\n public llmSystemPromptId!: number;\r\n\r\n public llmSystemPrompt?: Prompt;\r\n\r\n public llmUserPromptHistoryId?: number;\r\n\r\n public llmUserPromptHistory?: PromptHistory;\r\n\r\n public llmSystemPromptHistoryId?: number;\r\n\r\n public llmSystemPromptHistory?: PromptHistory;\r\n\r\n public ragModel?: string;\r\n\r\n public ragProvider?: string;\r\n\r\n public override propertiesToShow = ['name', 'identifier', 'description'];\r\n\r\n public override propertyUINames = new Map<string, string>([\r\n ['name', 'Name'],\r\n ['description', 'Beschreibung'],\r\n ['identifier', 'identifier'],\r\n ['llmUserPromptTemplateIdentifier', 'User Prompt Identifier'],\r\n ['connectorUrl', 'Connector-Url'],\r\n ['answerSpecification', 'Answer Specification'],\r\n ['isGeneric', 'Benutzerdefinierter Agent'],\r\n ['tools', 'LLM-Tools'],\r\n ['llmProvider', 'LLM-Provider'],\r\n ['llmModel', 'LLM-Model'],\r\n ['llmTemperature', 'LLM-Temperature'],\r\n ['llmTimeout', 'LLM-Timeout'],\r\n ['llmRetries', 'LLM-Retries'],\r\n ['llmUserPromptId', 'User Prompt ID'],\r\n ['llmUserPrompt', 'User Prompt Template'],\r\n ['llmSystemPromptId', 'System Prompt ID'],\r\n ['llmSystemPrompt', 'System Prompt Template'],\r\n ['ragProvider', 'RAG - Provider'],\r\n ['ragModel', 'RAG - Embedding Model'],\r\n ]);\r\n\r\n public override propertyFilterType = new Map<string, EFilterTypes>([\r\n ['name', EFilterTypes.STRING],\r\n ['template', EFilterTypes.STRING],\r\n ['identifier', EFilterTypes.STRING],\r\n ]);\r\n\r\n public override fromDto(dto: IAgentResponseDto): Agent {\r\n const model = new Agent();\r\n model.id = dto.id;\r\n model.createdAt = new Date(dto.createdAt);\r\n model.name = dto.name;\r\n model.identifier = dto.identifier;\r\n model.description = dto.description;\r\n model.connectorUrl = dto.connectorUrl;\r\n model.isGeneric = dto.isGeneric;\r\n model.answerSpecification = dto.answerSpecification;\r\n model.tools = dto.tools ? dto.tools : [];\r\n model.llmProvider = dto.llmProvider;\r\n model.llmModel = dto.llmModel;\r\n model.llmTemperature = dto.llmTemperature;\r\n model.llmTimeout = dto.llmTimeout;\r\n model.llmRetries = dto.llmRetries;\r\n model.llmUserPrompt = dto.llmUserPrompt ? (Prompt.fromDto(dto.llmUserPrompt) as Prompt) : undefined;\r\n model.llmUserPromptId = dto.llmUserPromptId;\r\n model.llmSystemPrompt = dto.llmSystemPrompt ? (Prompt.fromDto(dto.llmSystemPrompt) as Prompt) : undefined;\r\n model.llmSystemPromptId = dto.llmSystemPromptId;\r\n model.llmUserPromptHistory = dto.llmUserPromptHistory ? (Prompt.fromDto(dto.llmUserPromptHistory) as PromptHistory) : undefined;\r\n model.llmUserPromptHistoryId = dto.llmUserPromptHistoryId;\r\n model.llmSystemPromptHistory = dto.llmSystemPromptHistory ? (Prompt.fromDto(dto.llmSystemPromptHistory) as PromptHistory) : undefined;\r\n model.llmSystemPromptHistoryId = dto.llmSystemPromptHistoryId;\r\n model.ragModel = dto.ragModel;\r\n model.ragProvider = dto.ragProvider;\r\n return model;\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Inject, Injectable } from '@angular/core';\r\nimport { BaseDbApiService } from '@sftech/ng-shared';\r\nimport { IOrchestratorConfig } from '../configuration/orchestrator-config.interface';\r\nimport { ORCHESTRATOR_CONFIGURATION } from '../configuration/orchestrator-configuration.token';\r\nimport { IAgentCreateDto } from '../dtos/agent-create-request.dto';\r\nimport { IAgentResponseDto } from '../dtos/agent-response.dto';\r\nimport { IAgentUpdateDto } from '../dtos/agent-update-request.dto';\r\nimport { Agent } from '../models/agent.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AgentService extends BaseDbApiService<Agent, IAgentCreateDto, IAgentUpdateDto, IAgentResponseDto> {\r\n constructor(\r\n protected override readonly http: HttpClient,\r\n @Inject(ORCHESTRATOR_CONFIGURATION) protected override readonly config: IOrchestratorConfig,\r\n ) {\r\n super(http, config);\r\n this.url = `${this.config.orchestratorDbUrl}/agents`;\r\n }\r\n\r\n protected getNewModel(): Agent {\r\n return new Agent();\r\n }\r\n}\r\n","import { Component, OnInit, inject, input, signal } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { BaseDialogComponent, IconProvider, MappedApiError } from '@sftech/ng-shared';\r\nimport { Button } from 'primeng/button';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { FileRemoveEvent, FileSelectEvent, FileUploadModule } from 'primeng/fileupload';\r\nimport { IRagInfoDto } from '../../../../../core/dtos/rag-ingest-config.dto';\r\nimport { Agent } from '../../../../../core/models/agent.model';\r\nimport { AgentService } from '../../../../../core/service/agent.service';\r\nimport { OrchestratorService } from '../../../../../core/service/orchestrator.service';\r\n\r\n@Component({\r\n selector: 'sftech-agent-rag-upload',\r\n imports: [BaseDialogComponent, FileUploadModule, Button, FaIconComponent],\r\n templateUrl: './agent-rag-upload.component.html',\r\n styleUrl: './agent-rag-upload.component.css',\r\n})\r\nexport class AgentRagUploadComponent extends BaseDialogComponent implements OnInit {\r\n public agentId = input<number>();\r\n public chatId = input<number | undefined>();\r\n public uploadedFiles = signal<File[]>([]);\r\n public agent = signal<Agent | undefined>(undefined);\r\n public isUploading = signal<boolean>(false);\r\n public uploadError = signal<string | undefined>(undefined);\r\n\r\n private agentService = inject(AgentService);\r\n private orchestratorService = inject(OrchestratorService);\r\n\r\n public ngOnInit(): void {\r\n if (this.agentId()) {\r\n this.agentService.get(this.agentId()!).subscribe((result) => {\r\n if (result instanceof MappedApiError) {\r\n this.uploadError.set('Fehler beim Laden des Agents');\r\n return;\r\n }\r\n this.agent.set(result.data as Agent);\r\n });\r\n }\r\n }\r\n\r\n public onFileSelect(event: FileSelectEvent) {\r\n const files: File[] = event.currentFiles || [];\r\n this.uploadedFiles.set(files);\r\n }\r\n\r\n public onFileRemove(event: FileRemoveEvent) {\r\n const files = this.uploadedFiles();\r\n const index = files.findIndex((f) => f.name === event.file.name);\r\n if (index > -1) {\r\n files.splice(index, 1);\r\n this.uploadedFiles.set([...files]);\r\n }\r\n }\r\n\r\n public uploadFiles() {\r\n const agent = this.agent();\r\n if (!agent || !agent.identifier) {\r\n this.uploadError.set('Agent-Identifier nicht gefunden');\r\n return;\r\n }\r\n\r\n const files = this.uploadedFiles();\r\n if (files.length === 0) {\r\n return;\r\n }\r\n\r\n this.isUploading.set(true);\r\n this.uploadError.set(undefined);\r\n\r\n const ragInfo: IRagInfoDto = {\r\n agentIdentifier: agent.identifier,\r\n chatId: this.chatId(),\r\n };\r\n\r\n this.orchestratorService.storeRagDocuments(files, ragInfo).subscribe({\r\n next: (result) => {\r\n this.isUploading.set(false);\r\n if (result instanceof MappedApiError) {\r\n this.uploadError.set('Fehler beim Hochladen der Dateien');\r\n } else {\r\n this.close();\r\n }\r\n },\r\n error: () => {\r\n this.isUploading.set(false);\r\n this.uploadError.set('Fehler beim Hochladen der Dateien');\r\n },\r\n });\r\n }\r\n}\r\n","<sftech-base-dialog (closed)=\"close()\">\n <ng-template #body>\n <div class=\"h-full overflow-auto\">\n <p class=\"mb-4 text-gray-600\">\n Laden Sie Dokumente hoch, die für die RAG-Funktion (Retrieval-Augmented Generation) verwendet werden sollen.\n </p>\n\n @if (uploadError()) {\n <div class=\"p-4 mb-4 bg-red-50 border border-red-200 rounded text-red-800\">\n <strong>Fehler:</strong> {{ uploadError() }}\n </div>\n }\n\n @if (isUploading()) {\n <div class=\"flex items-center justify-center p-8\">\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary-500 mb-4\"></i>\n <p class=\"text-gray-600\">Dateien werden hochgeladen...</p>\n </div>\n </div>\n } @else {\n <div class=\"mt-4\">\n <p-fileupload\n mode=\"advanced\"\n [multiple]=\"true\"\n [showUploadButton]=\"false\"\n [showCancelButton]=\"false\"\n (onSelect)=\"onFileSelect($event)\"\n (onRemove)=\"onFileRemove($event)\"\n [auto]=\"false\"\n chooseLabel=\"Dateien auswählen\"\n chooseIcon=\"pi pi-upload\"\n [maxFileSize]=\"10000000\"\n accept=\".pdf,.txt,.doc,.docx\">\n <ng-template #content let-files>\n @if (uploadedFiles().length > 0) {\n <div class=\"p-4 bg-gray-50 rounded\">\n <h5 class=\"font-semibold mb-2\">Ausgewählte Dateien ({{ uploadedFiles().length }})</h5>\n <ul class=\"list-disc pl-4\">\n @for (file of uploadedFiles(); track file.name) {\n <li class=\"mb-1\">\n <span class=\"font-medium\">{{ file.name }}</span>\n <span class=\"text-gray-500 text-sm ml-2\">({{ (file.size / 1024).toFixed(2) }} KB)</span>\n </li>\n }\n </ul>\n </div>\n }\n </ng-template>\n </p-fileupload>\n <small class=\"block mt-2 text-gray-600\">\n Unterstützte Formate: PDF, TXT, DOC, DOCX (max. 10MB pro Datei)\n </small>\n </div>\n }\n </div>\n </ng-template>\n <ng-template #footer>\n <div class=\"flex justify-end gap-2 mt-2\">\n <p-button\n label=\"Abbrechen\"\n (onClick)=\"close()\"\n [outlined]=\"true\"\n severity=\"secondary\">\n </p-button>\n <p-button\n label=\"Hochladen\"\n (onClick)=\"uploadFiles()\"\n [disabled]=\"uploadedFiles().length === 0 || isUploading()\"\n [loading]=\"isUploading()\">\n <fa-icon [icon]=\"iconProvider.upload\" class=\"mr-2\"></fa-icon>\n </p-button>\n </div>\n </ng-template>\n</sftech-base-dialog>\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sftech-ng-orchestrator-agent-rag-upload.component-D3c3yDEQ.mjs","sources":["../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/core/models/agent.model.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/core/service/agent.service.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-rag-upload/agent-rag-upload.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-rag-upload/agent-rag-upload.component.html"],"sourcesContent":["import { BaseDbModel, EFilterTypes, IBaseDbResponseDto } from '@sftech/ng-shared';\nimport { IAgentResponseDto } from '../dtos/agent-response.dto';\nimport { IPromptHistoryResponseDto } from '../dtos/prompt-history-response.dto';\nimport { PromptHistory } from './prompt-history.model';\nimport { Prompt } from './prompt.model';\n\nexport class Agent extends BaseDbModel {\n public identifier!: string;\n\n public description!: string;\n\n public name!: string;\n\n public connectorUrl!: string;\n\n public isGeneric!: boolean;\n\n public answerSpecification!: string;\n\n public tools!: string[];\n\n public llmProvider!: string;\n\n public llmModel!: string;\n\n public llmTemperature!: number;\n\n public llmTimeout?: number;\n\n public llmRetries?: number;\n\n public llmUserPromptId!: number;\n\n public llmUserPrompt?: Prompt;\n\n public llmSystemPromptId!: number;\n\n public llmSystemPrompt?: Prompt;\n\n public llmUserPromptHistoryId?: number;\n\n public llmUserPromptHistory?: PromptHistory;\n\n public llmSystemPromptHistoryId?: number;\n\n public llmSystemPromptHistory?: PromptHistory;\n\n public ragModel?: string;\n\n public ragProvider?: string;\n\n public override propertiesToShow = ['name', 'identifier', 'description'];\n\n public override propertyUINames = new Map<string, string>([\n ['name', 'Name'],\n ['description', 'Beschreibung'],\n ['identifier', 'identifier'],\n ['llmUserPromptTemplateIdentifier', 'User Prompt Identifier'],\n ['connectorUrl', 'Connector-Url'],\n ['answerSpecification', 'Answer Specification'],\n ['isGeneric', 'Benutzerdefinierter Agent'],\n ['tools', 'LLM-Tools'],\n ['llmProvider', 'LLM-Provider'],\n ['llmModel', 'LLM-Model'],\n ['llmTemperature', 'LLM-Temperature'],\n ['llmTimeout', 'LLM-Timeout'],\n ['llmRetries', 'LLM-Retries'],\n ['llmUserPromptId', 'User Prompt ID'],\n ['llmUserPrompt', 'User Prompt Template'],\n ['llmSystemPromptId', 'System Prompt ID'],\n ['llmSystemPrompt', 'System Prompt Template'],\n ['ragProvider', 'RAG - Provider'],\n ['ragModel', 'RAG - Embedding Model'],\n ]);\n\n public override propertyFilterType = new Map<string, EFilterTypes>([\n ['name', EFilterTypes.STRING],\n ['template', EFilterTypes.STRING],\n ['identifier', EFilterTypes.STRING],\n ]);\n\n public override fromDto(dto: IAgentResponseDto): Agent {\n const model = new Agent();\n model.id = dto.id;\n model.createdAt = new Date(dto.createdAt);\n model.name = dto.name;\n model.identifier = dto.identifier;\n model.description = dto.description;\n model.connectorUrl = dto.connectorUrl;\n model.isGeneric = dto.isGeneric;\n model.answerSpecification = dto.answerSpecification;\n model.tools = dto.tools ? dto.tools : [];\n model.llmProvider = dto.llmProvider;\n model.llmModel = dto.llmModel;\n model.llmTemperature = dto.llmTemperature;\n model.llmTimeout = dto.llmTimeout;\n model.llmRetries = dto.llmRetries;\n model.llmUserPrompt = dto.llmUserPrompt ? (Prompt.fromDto(dto.llmUserPrompt) as Prompt) : undefined;\n model.llmUserPromptId = dto.llmUserPromptId;\n model.llmSystemPrompt = dto.llmSystemPrompt ? (Prompt.fromDto(dto.llmSystemPrompt) as Prompt) : undefined;\n model.llmSystemPromptId = dto.llmSystemPromptId;\n model.llmUserPromptHistory = dto.llmUserPromptHistory ? (Prompt.fromDto(dto.llmUserPromptHistory) as PromptHistory) : undefined;\n model.llmUserPromptHistoryId = dto.llmUserPromptHistoryId;\n model.llmSystemPromptHistory = dto.llmSystemPromptHistory ? (Prompt.fromDto(dto.llmSystemPromptHistory) as PromptHistory) : undefined;\n model.llmSystemPromptHistoryId = dto.llmSystemPromptHistoryId;\n model.ragModel = dto.ragModel;\n model.ragProvider = dto.ragProvider;\n return model;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { BaseDbApiService } from '@sftech/ng-shared';\nimport { IOrchestratorConfig } from '../configuration/orchestrator-config.interface';\nimport { ORCHESTRATOR_CONFIGURATION } from '../configuration/orchestrator-configuration.token';\nimport { IAgentCreateDto } from '../dtos/agent-create-request.dto';\nimport { IAgentResponseDto } from '../dtos/agent-response.dto';\nimport { IAgentUpdateDto } from '../dtos/agent-update-request.dto';\nimport { Agent } from '../models/agent.model';\n\n@Injectable({ providedIn: 'root' })\nexport class AgentService extends BaseDbApiService<Agent, IAgentCreateDto, IAgentUpdateDto, IAgentResponseDto> {\n constructor(\n protected override readonly http: HttpClient,\n @Inject(ORCHESTRATOR_CONFIGURATION) protected override readonly config: IOrchestratorConfig,\n ) {\n super(http, config);\n this.url = `${this.config.orchestratorDbUrl}/agents`;\n }\n\n protected getNewModel(): Agent {\n return new Agent();\n }\n}\n","import { Component, OnInit, inject, input, signal } from '@angular/core';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { BaseDialogComponent, IconProvider, MappedApiError } from '@sftech/ng-shared';\nimport { Button } from 'primeng/button';\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\nimport { FileRemoveEvent, FileSelectEvent, FileUploadModule } from 'primeng/fileupload';\nimport { IRagInfoDto } from '../../../../../core/dtos/rag-ingest-config.dto';\nimport { Agent } from '../../../../../core/models/agent.model';\nimport { AgentService } from '../../../../../core/service/agent.service';\nimport { OrchestratorService } from '../../../../../core/service/orchestrator.service';\n\n@Component({\n selector: 'sftech-agent-rag-upload',\n imports: [BaseDialogComponent, FileUploadModule, Button, FaIconComponent],\n templateUrl: './agent-rag-upload.component.html',\n styleUrl: './agent-rag-upload.component.css',\n})\nexport class AgentRagUploadComponent extends BaseDialogComponent implements OnInit {\n public agentId = input<number>();\n public chatId = input<number | undefined>();\n public uploadedFiles = signal<File[]>([]);\n public agent = signal<Agent | undefined>(undefined);\n public isUploading = signal<boolean>(false);\n public uploadError = signal<string | undefined>(undefined);\n\n private agentService = inject(AgentService);\n private orchestratorService = inject(OrchestratorService);\n\n public ngOnInit(): void {\n if (this.agentId()) {\n this.agentService.get(this.agentId()!).subscribe((result) => {\n if (result instanceof MappedApiError) {\n this.uploadError.set('Fehler beim Laden des Agents');\n return;\n }\n this.agent.set(result.data as Agent);\n });\n }\n }\n\n public onFileSelect(event: FileSelectEvent) {\n const files: File[] = event.currentFiles || [];\n this.uploadedFiles.set(files);\n }\n\n public onFileRemove(event: FileRemoveEvent) {\n const files = this.uploadedFiles();\n const index = files.findIndex((f) => f.name === event.file.name);\n if (index > -1) {\n files.splice(index, 1);\n this.uploadedFiles.set([...files]);\n }\n }\n\n public uploadFiles() {\n const agent = this.agent();\n if (!agent || !agent.identifier) {\n this.uploadError.set('Agent-Identifier nicht gefunden');\n return;\n }\n\n const files = this.uploadedFiles();\n if (files.length === 0) {\n return;\n }\n\n this.isUploading.set(true);\n this.uploadError.set(undefined);\n\n const ragInfo: IRagInfoDto = {\n agentIdentifier: agent.identifier,\n chatId: this.chatId(),\n };\n\n this.orchestratorService.storeRagDocuments(files, ragInfo).subscribe({\n next: (result) => {\n this.isUploading.set(false);\n if (result instanceof MappedApiError) {\n this.uploadError.set('Fehler beim Hochladen der Dateien');\n } else {\n this.close();\n }\n },\n error: () => {\n this.isUploading.set(false);\n this.uploadError.set('Fehler beim Hochladen der Dateien');\n },\n });\n }\n}\n","<sftech-base-dialog (closed)=\"close()\">\n <ng-template #body>\n <div class=\"h-full overflow-auto\">\n <p class=\"mb-4 text-gray-600\">\n Laden Sie Dokumente hoch, die für die RAG-Funktion (Retrieval-Augmented Generation) verwendet werden sollen.\n </p>\n\n @if (uploadError()) {\n <div class=\"p-4 mb-4 bg-red-50 border border-red-200 rounded text-red-800\">\n <strong>Fehler:</strong> {{ uploadError() }}\n </div>\n }\n\n @if (isUploading()) {\n <div class=\"flex items-center justify-center p-8\">\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner text-4xl text-primary-500 mb-4\"></i>\n <p class=\"text-gray-600\">Dateien werden hochgeladen...</p>\n </div>\n </div>\n } @else {\n <div class=\"mt-4\">\n <p-fileupload\n mode=\"advanced\"\n [multiple]=\"true\"\n [showUploadButton]=\"false\"\n [showCancelButton]=\"false\"\n (onSelect)=\"onFileSelect($event)\"\n (onRemove)=\"onFileRemove($event)\"\n [auto]=\"false\"\n chooseLabel=\"Dateien auswählen\"\n chooseIcon=\"pi pi-upload\"\n [maxFileSize]=\"10000000\"\n accept=\".pdf,.txt,.doc,.docx\">\n <ng-template #content let-files>\n @if (uploadedFiles().length > 0) {\n <div class=\"p-4 bg-gray-50 rounded\">\n <h5 class=\"font-semibold mb-2\">Ausgewählte Dateien ({{ uploadedFiles().length }})</h5>\n <ul class=\"list-disc pl-4\">\n @for (file of uploadedFiles(); track file.name) {\n <li class=\"mb-1\">\n <span class=\"font-medium\">{{ file.name }}</span>\n <span class=\"text-gray-500 text-sm ml-2\">({{ (file.size / 1024).toFixed(2) }} KB)</span>\n </li>\n }\n </ul>\n </div>\n }\n </ng-template>\n </p-fileupload>\n <small class=\"block mt-2 text-gray-600\">\n Unterstützte Formate: PDF, TXT, DOC, DOCX (max. 10MB pro Datei)\n </small>\n </div>\n }\n </div>\n </ng-template>\n <ng-template #footer>\n <div class=\"flex justify-end gap-2 mt-2\">\n <p-button\n label=\"Abbrechen\"\n (onClick)=\"close()\"\n [outlined]=\"true\"\n severity=\"secondary\">\n </p-button>\n <p-button\n label=\"Hochladen\"\n (onClick)=\"uploadFiles()\"\n [disabled]=\"uploadedFiles().length === 0 || isUploading()\"\n [loading]=\"isUploading()\">\n <fa-icon [icon]=\"iconProvider.upload\" class=\"mr-2\"></fa-icon>\n </p-button>\n </div>\n </ng-template>\n</sftech-base-dialog>\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { Panel } from 'primeng/panel';
|
|
|
9
9
|
import * as i1$1 from 'primeng/table';
|
|
10
10
|
import { TableModule } from 'primeng/table';
|
|
11
11
|
import { Tooltip } from 'primeng/tooltip';
|
|
12
|
-
import { A as AgentService, b as Agent, a as AgentRagUploadComponent } from './sftech-ng-orchestrator-agent-rag-upload.component-
|
|
12
|
+
import { A as AgentService, b as Agent, a as AgentRagUploadComponent } from './sftech-ng-orchestrator-agent-rag-upload.component-D3c3yDEQ.mjs';
|
|
13
13
|
import * as i1 from '@angular/forms';
|
|
14
14
|
import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
15
15
|
import { AutoFocus } from 'primeng/autofocus';
|
|
@@ -21,8 +21,8 @@ import { InputText } from 'primeng/inputtext';
|
|
|
21
21
|
import { MultiSelect } from 'primeng/multiselect';
|
|
22
22
|
import { Textarea } from 'primeng/textarea';
|
|
23
23
|
import { ToggleButtonModule } from 'primeng/togglebutton';
|
|
24
|
-
import { a as OrchestratorService, O as ORCHESTRATOR_CONFIGURATION } from './sftech-ng-orchestrator-sftech-ng-orchestrator-
|
|
25
|
-
import { a as PromptDisplayComponent } from './sftech-ng-orchestrator-prompt-display.component-
|
|
24
|
+
import { a as OrchestratorService, O as ORCHESTRATOR_CONFIGURATION } from './sftech-ng-orchestrator-sftech-ng-orchestrator-BquR89lx.mjs';
|
|
25
|
+
import { a as PromptDisplayComponent } from './sftech-ng-orchestrator-prompt-display.component-DM5L2ykm.mjs';
|
|
26
26
|
import { NgTemplateOutlet } from '@angular/common';
|
|
27
27
|
import { Popover } from 'primeng/popover';
|
|
28
28
|
import { map } from 'rxjs';
|
|
@@ -281,4 +281,4 @@ const agentsRoutes = [
|
|
|
281
281
|
];
|
|
282
282
|
|
|
283
283
|
export { agentsRoutes };
|
|
284
|
-
//# sourceMappingURL=sftech-ng-orchestrator-agents.routes-
|
|
284
|
+
//# sourceMappingURL=sftech-ng-orchestrator-agents.routes-a-biG3wv.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sftech-ng-orchestrator-agents.routes-a-biG3wv.mjs","sources":["../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/agents.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/agents.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/core/validators/rag.validator.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-display/prompt-helper-modal/prompt-helper-modal.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-display/prompt-helper-modal/prompt-helper-modal.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-display/agent-display.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agent-display/agent-display.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agents-list/agents-list.component.ts","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/components/agent/agents-list/agents-list.component.html","../../../../libs/ng-orchestrator/src/lib/ng-orchestrator/admin/agents/agents.routes.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'sftech-agents',\n imports: [RouterOutlet],\n templateUrl: './agents.component.html',\n styleUrl: './agents.component.css',\n})\nexport class AgentsComponent {}\n","<router-outlet></router-outlet>\n","// rag.validator.ts\nimport { AbstractControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport const ragPairValidator = (): ValidatorFn => {\n return (control: AbstractControl): ValidationErrors | null => {\n const group = control as FormGroup;\n\n const ragProvider = group.get('ragProvider')?.value;\n const ragModel = group.get('ragModel')?.value;\n\n // beide leer → ok\n if (!ragProvider && !ragModel) {\n return null;\n }\n\n // beide gesetzt → ok\n if (ragProvider && ragModel) {\n return null;\n }\n\n // nur eins gesetzt → Fehler auf dem FormGroup\n return { ragPairInvalid: true };\n };\n};\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { BaseDialogComponent } from '@sftech/ng-shared';\nimport { AutoFocus } from 'primeng/autofocus';\nimport { Button } from 'primeng/button';\nimport { Fieldset } from 'primeng/fieldset';\nimport { FloatLabel } from 'primeng/floatlabel';\nimport { Popover } from 'primeng/popover';\nimport { Textarea } from 'primeng/textarea';\nimport { Subscription, map } from 'rxjs';\n\n@Component({\n selector: 'sftech-prompt-helper-modal',\n imports: [BaseDialogComponent, ReactiveFormsModule, Fieldset, FloatLabel, Textarea, AutoFocus, Button, FaIconComponent, Popover, NgTemplateOutlet],\n templateUrl: './prompt-helper-modal.component.html',\n styleUrl: './prompt-helper-modal.component.css',\n})\nexport class PromptHelperModalComponent extends BaseDialogComponent implements OnInit, OnDestroy {\n private _subscriptions: Subscription[] = [];\n\n protected systemPromptForm: FormGroup = new FormGroup({\n systemPromptText: new FormControl({ value: '', disabled: true }),\n roleSpecification: new FormControl(''),\n targetGroupSpecification: new FormControl(''),\n inputSpecification: new FormControl(''),\n exampleSpecification: new FormControl(''),\n additionalRulesSpecification: new FormControl(''),\n });\n\n ngOnInit(): void {\n this._subscriptions.push(\n this.systemPromptForm.valueChanges\n .pipe(\n map((value) => {\n let systemPromptText = '';\n if (value.roleSpecification) {\n systemPromptText += `Role:\\n${value.roleSpecification}\\n\\n`;\n }\n if (value.targetGroupSpecification) {\n systemPromptText += `Target Group:\\n${value.targetGroupSpecification}\\n\\n`;\n }\n if (value.inputSpecification) {\n systemPromptText += `Input:\\n${value.inputSpecification}\\n\\n`;\n }\n if (value.exampleSpecification) {\n systemPromptText += `Example:\\n${value.exampleSpecification}\\n\\n`;\n }\n if (value.additionalRulesSpecification) {\n systemPromptText += `Additional Rules:\\n${value.additionalRulesSpecification}\\n\\n`;\n }\n this.systemPromptForm.get('systemPromptText')?.setValue(systemPromptText);\n }),\n )\n .subscribe(),\n );\n }\n\n ngOnDestroy(): void {\n this._subscriptions.forEach((subscription) => subscription.unsubscribe());\n }\n}\n","<sftech-base-dialog [hasHeader]=\"true\" (closed)=\"close()\">\n <ng-template #header>\n <div class=\"flex justify-between\">\n <h2 class=\"text-xl font-semibold\">\n Hilfe zur Prompt-Erstellung\n </h2>\n </div>\n </ng-template>\n <ng-template #body>\n <form [formGroup]=\"systemPromptForm\" [pAutoFocus]=\"true\">\n <p-fieldset legend=\"Prompt-Elemente\">\n <div class=\"grid grid-cols-2 gap-2\">\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\n <textarea id=\"systemPromptText\" formControlName=\"systemPromptText\" pTextarea\n class=\"w-full h-full\"\n [class.ng-invalid]=\"systemPromptForm.get('systemPromptText')?.dirty && systemPromptForm.get('systemPromptText')?.invalid\"></textarea>\n <label for=\"systemPromptText\">Mein Prompt</label>\n </p-floatlabel>\n <div>\n <ng-container [ngTemplateOutlet]=\"textField\"\n [ngTemplateOutletContext]=\"{ controlName: 'roleSpecification', popover: roleSpecificationPO, label: 'KI-Rolle' }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"textField\"\n [ngTemplateOutletContext]=\"{ controlName: 'targetGroupSpecification', popover: targetGroupSpecificationPO, label: 'Zielgruppe' }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"textField\"\n [ngTemplateOutletContext]=\"{ controlName: 'inputSpecification', popover: inputSpecificationPO, label: 'Eingabe' }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"textField\"\n [ngTemplateOutletContext]=\"{ controlName: 'exampleSpecification', popover: exampleSpecificationPO, label: 'Eingabe-Beispiel' }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"textField\"\n [ngTemplateOutletContext]=\"{ controlName: 'additionalRulesSpecification', popover: additionalRulesSpecificationPO, label: 'Zusätzliche Informationen' }\"></ng-container>\n </div>\n </div>\n\n </p-fieldset>\n <div class=\"flex justify-end mt-2 w-full\">\n <p-button label=\"übernehmen\" type=\"submit\" [disabled]=\"!systemPromptForm.valid\"\n (click)=\"ref.close(systemPromptForm.get('systemPromptText')?.value ?? '')\"></p-button>\n </div>\n\n\n <ng-template #textField let-controlName=\"controlName\" let-popover=\"popover\" let-label=\"label\">\n <label [for]=\"controlName\" class=\"font-bold me-2\">{{ label }}</label>\n <fa-icon [icon]=\"iconProvider.help\" class=\"rounded-[50%] bg-primary text-white\" [fixedWidth]=\"true\"\n (click)=\"popover.toggle($event)\"></fa-icon>\n <textarea rows=\"4\" [id]=\"controlName\" [formControlName]=\"controlName\"\n pTextarea class=\"w-full mt-1\"\n [class.ng-invalid]=\"systemPromptForm.get(controlName)?.dirty && systemPromptForm.get(controlName)?.invalid\"></textarea>\n </ng-template>\n\n <p-popover #roleSpecificationPO styleClass=\"bg-gray-500\">\n <ng-container\n *ngTemplateOutlet=\"popoverStyle; context: { po: roleSpecificationPO, controlName: 'roleSpecification', description: 'Die Rolle der KI beschreibt, wie sie sich verhalten soll. Die Rolle hilft der KI, den Kontext zu verstehen und angemessen zu antworten.', example: 'Du bist ein kompetenter, hilfreicher Assistent mit Fachwissen in Technik, Text, Organisation und Problemlösung. Du analysierst präzise, erklärst klar und gibst fundierte, praktische Antworten.' }\"></ng-container>\n </p-popover>\n\n <p-popover #targetGroupSpecificationPO styleClass=\"bg-gray-500\">\n <ng-container\n *ngTemplateOutlet=\"popoverStyle; context: { po: targetGroupSpecificationPO, controlName: 'targetGroupSpecification', description: 'Die Zielgruppe beschreibt, für wen die KI antworten soll. Sie hilft der KI, den Ton und die Komplexität der Antworten anzupassen.', example: 'Sprich mit einer Person, die in ihrem Fachgebiet erfahren oder zumindest mit den Grundbegriffen vertraut ist. Du darfst Fachsprache verwenden, aber kein unnötiges Theoriewissen voraussetzen.' }\"></ng-container>\n </p-popover>\n <p-popover #inputSpecificationPO styleClass=\"bg-gray-500\">\n <ng-container\n *ngTemplateOutlet=\"popoverStyle; context: { po: inputSpecificationPO, controlName: 'inputSpecification', description: 'Die Eingabe beschreibt, wie das vom Anwender eingegebene aussieht. Sie hilft der KI, das vom Anwender übergebene zu verstehen.', example: 'z.B. Du erhältst eine Frage oder ein Problem, das du lösen sollst. Analysiere es gründlich und gib eine klare, präzise Antwort. Mein Input ist ein JSON: {"frage": "Fragen, die du beantworten sollst"}' }\"></ng-container>\n </p-popover>\n\n <p-popover #exampleSpecificationPO styleClass=\"bg-gray-500\">\n <ng-container\n *ngTemplateOutlet=\"popoverStyle; context: { po: exampleSpecificationPO, controlName: 'exampleSpecification', description: 'Das Eingabe-Beispiel zeigt der KI ein konkretes Beispiel, wie die Anfragen aussehen können. Dies hilft der KI, das erwartete Format besser zu verstehen.', example: 'Beispiel {"frage": "Wie kann ich meine Produktivität steigern?"}' }\"></ng-container>\n </p-popover>\n\n <p-popover #additionalRulesSpecificationPO styleClass=\"bg-gray-500\">\n <ng-container\n *ngTemplateOutlet=\"popoverStyle; context: { po: additionalRulesSpecificationPO, controlName: 'additionalRulesSpecification', description: 'Zusätzliche Informationen oder Regeln, die die KI bei der Beantwortung beachten soll. Diese können Einschränkungen, spezielle Anforderungen oder wichtige Hinweise enthalten.', example: 'Du darfst keine persönlichen Daten sammeln oder speichern. Deine Antworten müssen respektvoll und professionell sein. Vermeide es, persönliche Meinungen zu äußern.' }\"></ng-container>\n </p-popover>\n\n <ng-template #popoverStyle let-po='po' let-formControlName='controlName' let-description=\"description\"\n let-example=\"example\">\n <div class=\"p-3 w-200\">\n <p><span class=\"font-bold\">Beschreibung:</span></p>\n <p>{{ description }}</p>\n <p class=\"mt-4\"><span class=\"font-bold\">Beispiel:</span></p>\n <p>{{ example }}</p>\n <p class=\"mt-2\">\n <p-button (onClick)=\"systemPromptForm.get(formControlName)?.setValue(example); po.toggle($event)\">\n übernehmen\n </p-button>\n </p>\n </div>\n </ng-template>\n\n </form>\n </ng-template>\n <ng-template #footer>\n\n </ng-template>\n</sftech-base-dialog>\n","import { Component, OnInit, inject, signal } from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { BaseDialogComponent, BaseDisplayComponent, MappedApiError } from '@sftech/ng-shared';\nimport { AutoFocus } from 'primeng/autofocus';\nimport { Button } from 'primeng/button';\nimport { Checkbox } from 'primeng/checkbox';\nimport { DatePicker } from 'primeng/datepicker';\nimport { DialogService } from 'primeng/dynamicdialog';\nimport { Fieldset } from 'primeng/fieldset';\nimport { FloatLabel } from 'primeng/floatlabel';\nimport { InputText } from 'primeng/inputtext';\nimport { MultiSelect } from 'primeng/multiselect';\nimport { Textarea } from 'primeng/textarea';\nimport { ToggleButtonModule } from 'primeng/togglebutton';\nimport { IOrchestratorConfig } from '../../../../../core/configuration/orchestrator-config.interface';\nimport { ORCHESTRATOR_CONFIGURATION } from '../../../../../core/configuration/orchestrator-configuration.token';\nimport { IAgentCreateDto } from '../../../../../core/dtos/agent-create-request.dto';\nimport { IAgentResponseDto } from '../../../../../core/dtos/agent-response.dto';\nimport { IAgentUpdateDto } from '../../../../../core/dtos/agent-update-request.dto';\nimport { Agent } from '../../../../../core/models/agent.model';\nimport { McpTool } from '../../../../../core/models/mcp-tool.model';\nimport { AgentService } from '../../../../../core/service/agent.service';\nimport { OrchestratorService } from '../../../../../core/service/orchestrator.service';\nimport { ragPairValidator } from '../../../../../core/validators/rag.validator';\nimport { PromptDisplayComponent } from '../../../../prompts/components/prompt/prompt-display/prompt-display.component';\nimport { PromptHelperModalComponent } from './prompt-helper-modal/prompt-helper-modal.component';\n\n@Component({\n selector: 'sftech-agent-display',\n imports: [ReactiveFormsModule, InputText, AutoFocus, FloatLabel, DatePicker, Textarea, Button, BaseDialogComponent, Fieldset, MultiSelect, ToggleButtonModule, FaIconComponent, Checkbox],\n providers: [DialogService],\n templateUrl: './agent-display.component.html',\n styleUrl: './agent-display.component.css',\n})\nexport class AgentDisplayComponent extends BaseDisplayComponent<Agent, IAgentUpdateDto, IAgentUpdateDto, IAgentResponseDto> implements OnInit {\n protected override _repo = inject(AgentService);\n protected override _route = 'agents';\n protected _orchestratorService: OrchestratorService = inject(OrchestratorService);\n\n public tools = signal<McpTool[] | undefined>(undefined);\n\n protected dialog = inject(DialogService);\n\n private _options: IOrchestratorConfig = inject(ORCHESTRATOR_CONFIGURATION);\n\n public override ngOnInit(): void {\n super.ngOnInit();\n this._orchestratorService.getTools().subscribe((res) => {\n if (res instanceof MappedApiError) {\n this.tools.set([]);\n return;\n }\n this.tools.set(res.data);\n });\n }\n\n protected override initializeForm(): FormGroup {\n const form = new FormGroup(\n {\n id: new FormControl({ value: this.model()!.id, disabled: true }),\n createdAt: new FormControl({ value: this.model()!.createdAt, disabled: true }),\n identifier: new FormControl({ value: this.model()!.identifier, disabled: true }),\n llmUserPrompt: new FormControl({ value: this.model()!.llmUserPrompt, disabled: true }),\n llmSystemPrompt: new FormControl({ value: this.model()!.llmSystemPrompt, disabled: true }),\n description: new FormControl({ value: this.model()!.description, disabled: !this.canEdit }),\n connectorUrl: new FormControl({ value: this.model()!.connectorUrl, disabled: !this.canEdit }),\n systemPromptText: new FormControl(''),\n answerSpecification: new FormControl({\n value: this.model()!.answerSpecification,\n disabled: !this.canEdit || !this.model()!.isGeneric,\n }),\n tools: new FormControl({ value: this.model()!.tools, disabled: !this.canEdit }),\n llmProvider: new FormControl({ value: this.model()!.llmProvider, disabled: !this.canEdit }),\n llmModel: new FormControl({ value: this.model()!.llmModel, disabled: !this.canEdit }),\n llmTemperature: new FormControl({ value: this.model()!.llmTemperature, disabled: !this.canEdit }),\n llmTimeout: new FormControl({ value: this.model()!.llmTimeout, disabled: !this.canEdit }),\n llmRetries: new FormControl({ value: this.model()!.llmRetries, disabled: !this.canEdit }),\n useRag: new FormControl({ value: this.model()!.ragProvider !== null && this.model()!.ragModel !== null, disabled: !this.canEdit }),\n ragProvider: new FormControl({ value: this.model()!.ragProvider, disabled: !this.canEdit }),\n ragModel: new FormControl({ value: this.model()!.ragModel, disabled: !this.canEdit }),\n name: new FormControl(this.model()?.name),\n },\n {\n validators: [ragPairValidator()],\n },\n );\n form.get('useRag')?.valueChanges.subscribe((useRag: boolean | null) => {\n if (useRag) {\n const ragProviderControl = this.form.get('ragProvider');\n const ragModelControl = this.form.get('ragModel');\n\n // Only set default values if fields are currently empty\n if (!ragProviderControl?.value) {\n ragProviderControl?.setValue(this._options.defaultRagProvider);\n }\n if (!ragModelControl?.value) {\n ragModelControl?.setValue(this._options.defaultRagModel);\n }\n }\n });\n return form;\n }\n\n protected override getNewModel(): Agent {\n const agent = new Agent();\n agent.connectorUrl = this._options.defaultConnectorUrl;\n agent.isGeneric = true;\n agent.answerSpecification = this._options.defaultAnswerSpecification;\n agent.llmProvider = this._options.defaultLlmProvider;\n agent.llmModel = this._options.defaultLlmModel;\n agent.llmTemperature = this._options.defaultLlmTemperature;\n agent.llmTimeout = this._options.defaultLlmTimeout;\n agent.llmRetries = this._options.defaultLlmRetries;\n return agent;\n }\n\n protected override mapFormToUpdateDto(): IAgentUpdateDto {\n return {\n description: this.form.get('description')?.value,\n connectorUrl: this.form.get('connectorUrl')?.value,\n tools: this.form.get('tools')?.value,\n answerSpecification: this.form.get('answerSpecification')?.value,\n llmProvider: this.form.get('llmProvider')?.value,\n llmModel: this.form.get('llmModel')?.value,\n llmTemperature: +this.form.get('llmTemperature')?.value,\n llmTimeout: this.form.get('llmTimeout')?.value,\n llmRetries: this.form.get('llmRetries')?.value,\n ragModel: this.form.get('ragModel')?.value,\n ragProvider: this.form.get('ragProvider')?.value,\n name: this.form.get('name')?.value,\n };\n }\n\n protected override mapFormToCreateDto(): IAgentCreateDto {\n return {\n description: this.form.get('description')?.value,\n connectorUrl: this.form.get('connectorUrl')?.value,\n systemPromptText: this.form.get('systemPromptText')?.value,\n answerSpecification: this.form.get('answerSpecification')?.value,\n tools: this.form.get('tools')?.value,\n llmProvider: this.form.get('llmProvider')?.value,\n llmModel: this.form.get('llmModel')?.value,\n llmTemperature: +this.form.get('llmTemperature')?.value,\n llmTimeout: this.form.get('llmTimeout')?.value,\n llmRetries: this.form.get('llmRetries')?.value,\n ragModel: this.form.get('ragModel')?.value,\n ragProvider: this.form.get('ragProvider')?.value,\n name: this.form.get('name')?.value,\n };\n }\n\n public openPromptModal(promptId: number | undefined): void {\n if (!promptId) {\n return;\n }\n this.dialog.open(PromptDisplayComponent, {\n inputValues: { id: promptId, canEdit: true, openedAsModal: true },\n focusOnShow: false,\n modal: true,\n dismissableMask: true,\n width: '40%',\n contentStyle: { overflow: 'auto' },\n });\n }\n\n public openPromptHelper() {\n const modalRef = this.dialog.open(PromptHelperModalComponent, {\n modal: true,\n dismissableMask: true,\n width: '60%',\n contentStyle: { overflow: 'auto' },\n });\n modalRef?.onClose.subscribe((result: string | undefined) => {\n if (!result) {\n return;\n }\n this.form.get('systemPromptText')?.setValue(result);\n });\n }\n}\n","<sftech-base-dialog (closed)=\"close()\">\n <ng-template #body>\n <div class=\"h-full overflow-auto\">\n @if (model()) {\n <form [formGroup]=\"form\" [pAutoFocus]=\"true\">\n <p-fieldset legend=\"Stammdaten\" class=\"bg-primary-50!\">\n @if (!isNew()) {\n\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2\">\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"id\" formControlName=\"id\" pInputText class=\"w-full\"/>\n <label for=\"id\">{{ this.model()!.getUiNameForProperty('id') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"identifier\" formControlName=\"identifier\" pInputText\n class=\"w-full\"\n [class.ng-invalid]=\"form.get('identifier')?.dirty && form.get('identifier')?.invalid\"/>\n <label for=\"identifier\">{{ this.model()!.getUiNameForProperty('identifier') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <p-datePicker id=\"createdAt\" formControlName=\"createdAt\" dateFormat=\"dd.mm.yy\"\n [showTime]=\"true\"\n [hourFormat]=\"'24'\" [style]=\"{'width': '100%'}\"\n [class.ng-invalid]=\"form.get('createdAt')?.dirty && form.get('createdAt')?.invalid\"></p-datePicker>\n <label for=\"createdAt\">{{ this.model()!.getUiNameForProperty('createdAt') }}</label>\n </p-floatlabel>\n </div>\n }\n\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\n <input type=\"text\" id=\"name\" formControlName=\"name\" pTextarea class=\"w-full\"\n [class.ng-invalid]=\"form.get('name')?.dirty && form.get('name')?.invalid\"/>\n <label for=\"name\">{{ this.model()!.getUiNameForProperty('name') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full mt-2\">\n <textarea rows=\"2\" id=\"description\" formControlName=\"description\" pTextarea class=\"w-full\"\n [class.ng-invalid]=\"form.get('description')?.dirty && form.get('description')?.invalid\"></textarea>\n <label for=\"description\">{{ this.model()!.getUiNameForProperty('description') }}</label>\n </p-floatlabel>\n </p-fieldset>\n <hr class=\"my-10 text-primary-50\"/>\n <p-fieldset legend=\"Prompts\">\n @if (!isNew()) {\n <div class=\"grid grid-cols-1 sm:grid-cols-2 mb-2 gap-2\">\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"llmUserPrompt\"\n (click)=\"openPromptModal(model()!.llmUserPromptId)\"\n [value]=\"model()!.llmUserPrompt?.identifier\" pInputText\n class=\"w-full cursor-pointer\"/>\n <label for=\"llmUserPrompt\">{{ this.model()!.getUiNameForProperty('llmUserPrompt') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"llmSystemPrompt\"\n (click)=\"openPromptModal(model()!.llmSystemPromptId)\"\n [value]=\"model()!.llmSystemPrompt?.identifier\" pInputText\n class=\"w-full cursor-pointer\"/>\n <label for=\"llmSystemPrompt\">{{ this.model()!.getUiNameForProperty('llmSystemPrompt') }}</label>\n </p-floatlabel>\n </div>\n } @else {\n <span class=\"me-2\">Ich möchte Unterstützung bei der Prompt-Erstellung</span>\n <p-button [rounded]=\"true\" (onClick)=\"openPromptHelper()\">\n <fa-icon [icon]=\"iconProvider.help\" [fixedWidth]=\"true\"></fa-icon>\n </p-button>\n <p-floatlabel variant=\"in\" class=\"w-full mb-2\">\n <textarea rows=\"10\" id=\"systemPromptText\" formControlName=\"systemPromptText\" pTextarea\n class=\"w-full\"\n [class.ng-invalid]=\"form.get('systemPromptText')?.dirty && form.get('systemPromptText')?.invalid\"></textarea>\n <label for=\"systemPromptText\">{{ this.model()!.getUiNameForProperty('systemPromptText') }}</label>\n </p-floatlabel>\n }\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <textarea rows=\"5\" id=\"answerSpecification\" formControlName=\"answerSpecification\" pTextarea\n class=\"w-full\"\n [class.ng-invalid]=\"form.get('answerSpecification')?.dirty && form.get('answerSpecification')?.invalid\"></textarea>\n <label for=\"answerSpecification\">{{ this.model()!.getUiNameForProperty('answerSpecification') }}</label>\n </p-floatlabel>\n </p-fieldset>\n <hr class=\"my-10 text-primary-50\"/>\n <p-fieldset legend=\"LLM-Tools\">\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 mb-2 gap-2\">\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <p-multiselect id=\"tools\" [options]=\"tools()\" [loading]=\"!tools()\"\n appendTo=\"body\"\n formControlName=\"tools\"\n optionLabel=\"name\"\n optionValue=\"identifier\" styleClass=\"w-full md:w-80\" display=\"chip\">\n <ng-template let-tool #item>\n <div class=\"flex items-center gap-2\">\n <div>{{ tool.name }}</div>\n </div>\n </ng-template>\n <ng-template #dropdownicon>\n <i class=\"pi pi-map\"></i>\n </ng-template>\n <ng-template #header>\n <div class=\"font-medium px-3 py-2\">Verfügbare Tools</div>\n </ng-template>\n </p-multiselect>\n <label for=\"tools\">Tools</label>\n </p-floatlabel>\n </div>\n </p-fieldset>\n <hr class=\"my-10 text-primary-50\"/>\n\n <p-fieldset legend=\"LLM-RAG\" [toggleable]=\"true\">\n <div class=\"mb-4\">\n <p-checkbox id=\"useRag\" formControlName=\"useRag\" [binary]=\"true\" class=\"me-2\" />\n <label for=\"useRag\">Soll das LLM mit eigenen Dokumenten angereichert werden (RAG)?</label>\n </div>\n @if (this.form.get('useRag')!.value) {\n <div class=\"grid grid-cols-1 sm:grid-cols-2 mb-2 gap-2\">\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"ragProvider\"\n formControlName=\"ragProvider\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('ragProvider')?.dirty && form.get('ragProvider')?.invalid\"/>\n <label for=\"ragProvider\">{{ this.model()!.getUiNameForProperty('ragProvider') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"ragModel\"\n formControlName=\"ragModel\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('ragModel')?.dirty && form.get('ragModel')?.invalid\"/>\n <label for=\"ragModel\">{{ this.model()!.getUiNameForProperty('ragModel') }}</label>\n </p-floatlabel>\n </div>\n }\n </p-fieldset>\n <hr class=\"my-10 text-primary-50\"/>\n\n <p-fieldset legend=\"LLM-Konfiguration\" [toggleable]=\"true\" [collapsed]=\"true\">\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 mb-2 gap-2\">\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"connectorUrl\"\n formControlName=\"connectorUrl\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('connectorUrl')?.dirty && form.get('connectorUrl')?.invalid\"/>\n <label for=\"connectorUrl\">{{ this.model()!.getUiNameForProperty('connectorUrl') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"llmProvider\"\n formControlName=\"llmProvider\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('llmProvider')?.dirty && form.get('llmProvider')?.invalid\"/>\n <label for=\"llmProvider\">{{ this.model()!.getUiNameForProperty('llmProvider') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"text\" id=\"llmModel\"\n formControlName=\"llmModel\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('llmModel')?.dirty && form.get('llmModel')?.invalid\"/>\n <label for=\"llmModel\">{{ this.model()!.getUiNameForProperty('llmModel') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"number\" id=\"llmTemperature\"\n formControlName=\"llmTemperature\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('llmTemperature')?.dirty && form.get('llmTemperature')?.invalid\"/>\n <label for=\"llmTemperature\">{{ this.model()!.getUiNameForProperty('llmTemperature') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"number\" id=\"llmTimeout\"\n formControlName=\"llmTimeout\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('llmTimeout')?.dirty && form.get('llmTimeout')?.invalid\"/>\n <label for=\"llmTimeout\">{{ this.model()!.getUiNameForProperty('llmTimeout') }}</label>\n </p-floatlabel>\n <p-floatlabel variant=\"in\" class=\"w-full\">\n <input type=\"number\" id=\"llmRetries\"\n formControlName=\"llmRetries\" pInputText class=\"w-full\"\n [class.ng-invalid]=\"form.get('llmRetries')?.dirty && form.get('llmRetries')?.invalid\"/>\n <label for=\"llmRetries\">{{ this.model()!.getUiNameForProperty('llmRetries') }}</label>\n </p-floatlabel>\n </div>\n </p-fieldset>\n\n\n </form>\n }\n </div>\n </ng-template>\n <ng-template #footer>\n <div class=\"flex justify-end mt-2\">\n <p-button label=\"Speichern\" (onClick)=\"submitForm()\" (keyup.enter)=\"submitForm()\"\n [disabled]=\"!form || !form.dirty\"></p-button>\n </div>\n </ng-template>\n\n\n</sftech-base-dialog>\n","import { Component, inject } from '@angular/core';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { BaseListComponent, IconProvider, PaginatorComponent } from '@sftech/ng-shared';\nimport { Button } from 'primeng/button';\nimport { DialogService } from 'primeng/dynamicdialog';\nimport { Panel } from 'primeng/panel';\nimport { TableModule } from 'primeng/table';\nimport { Tooltip } from 'primeng/tooltip';\nimport { IAgentResponseDto } from '../../../../../core/dtos/agent-response.dto';\nimport { IAgentUpdateDto } from '../../../../../core/dtos/agent-update-request.dto';\nimport { Agent } from '../../../../../core/models/agent.model';\nimport { AgentService } from '../../../../../core/service/agent.service';\nimport { AgentDisplayComponent } from '../agent-display/agent-display.component';\nimport { AgentRagUploadComponent } from '../agent-rag-upload/agent-rag-upload.component';\n\n@Component({\n selector: 'sftech-agents-list',\n imports: [PaginatorComponent, Panel, TableModule, Button, FaIconComponent, Tooltip],\n providers: [DialogService],\n templateUrl: './agents-list.component.html',\n styleUrl: './agents-list.component.css',\n})\nexport class AgentsListComponent extends BaseListComponent<Agent, IAgentUpdateDto, IAgentUpdateDto, IAgentResponseDto> {\n protected _repo = inject(AgentService);\n protected _route = 'agents';\n protected override _modalComponent = AgentDisplayComponent;\n protected override detailModalHeaderText = 'Agent-Details';\n\n private dialogService = inject(DialogService);\n\n public iconProvider = IconProvider;\n\n constructor() {\n super();\n }\n\n public openRagUploadModal(agentId: number, event: Event) {\n event.stopPropagation();\n this.dialogService.open(AgentRagUploadComponent, {\n inputValues: { agentId },\n focusOnShow: false,\n modal: true,\n dismissableMask: true,\n header: 'RAG-Dokumente hochladen',\n width: '50%',\n contentStyle: { overflow: 'auto' },\n });\n }\n}\n","<div class=\"h-full overflow-y-auto px-2 sm:px-4\">\n <h1 class=\"text-primary-900 font-bold text-lg sm:text-xl p-2 my-4\">Agent-Übersicht</h1>\n\n @if (!data()) {\n <p-panel [toggleable]=\"false\">\n <p class=\"m-0\">\n Daten werden geladen...\n </p>\n </p-panel>\n } @else if (data()!.length === 0) {\n <p-panel [toggleable]=\"false\">\n <p class=\"m-0\">\n Es sind keine Agenten vorhanden.\n </p>\n </p-panel>\n } @else if (data()!.length > 0) {\n <div class=\"overflow-x-auto -mx-2 sm:mx-0\">\n <p-table [value]=\"data()!\"\n stripedRows\n [tableStyle]=\"{ 'min-width': '50rem' }\"\n selectionMode=\"single\"\n [resizableColumns]=\"true\"\n dataKey=\"id\"\n >\n <ng-template #header>\n <tr>\n @for(column of data()![0].propertiesToShow; track column) {\n <th>{{ data()![0].getUiNameForProperty(column) }}</th>\n }\n <th style=\"width: 80px\">Aktionen</th>\n </tr>\n </ng-template>\n <ng-template #body let-agent>\n <tr (click)=\"openDisplay(agent.id)\" [pSelectableRow]=\"agent\" class=\"cursor-pointer\">\n @for(column of data()![0].propertiesToShow; track column) {\n <td style=\"white-space: pre-wrap\">\n {{ agent.getPropertyValue(column) }}\n </td>\n }\n <td>\n @if (agent.ragProvider && agent.ragModel) {\n <p-button\n (onClick)=\"openRagUploadModal(agent.id, $event)\"\n [pTooltip]=\"'RAG-Dokumente hochladen'\"\n tooltipPosition=\"left\">\n <fa-icon [icon]=\"iconProvider.documentAdd\"></fa-icon>\n </p-button>\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <sftech-paginator [pagination]=\"odata().pagination\" (odataChanged)=\"updatePagination($event)\"></sftech-paginator>\n <div class=\"flex justify-end p-2\">\n <p-button (onClick)=\"openDisplay(undefined)\">\n <fa-icon [icon]=\"iconProvider.add\" class=\"sm:mr-2\"></fa-icon>\n <span class=\"hidden sm:inline\">Neuer Agent</span>\n </p-button>\n </div>\n }\n</div>\n\n","import { AgentsComponent } from './agents.component';\nimport { AgentsListComponent } from './components/agent/agents-list/agents-list.component';\n\nexport const agentsRoutes = [\n {\n path: '',\n component: AgentsComponent,\n children: [\n {\n path: '',\n component: AgentsListComponent,\n },\n ],\n },\n];\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -10,14 +10,13 @@ import { ButtonDirective } from 'primeng/button';
|
|
|
10
10
|
import { DialogService } from 'primeng/dynamicdialog';
|
|
11
11
|
import { Tooltip } from 'primeng/tooltip';
|
|
12
12
|
import { map, catchError } from 'rxjs';
|
|
13
|
-
import { A as AgentService, a as AgentRagUploadComponent } from './sftech-ng-orchestrator-agent-rag-upload.component-
|
|
14
|
-
import { A as AgentRun, O as ORCHESTRATOR_CONFIGURATION, C as Chat, E as EAgentRunStatus, a as OrchestratorService, b as ChatMessage } from './sftech-ng-orchestrator-sftech-ng-orchestrator-
|
|
13
|
+
import { A as AgentService, a as AgentRagUploadComponent } from './sftech-ng-orchestrator-agent-rag-upload.component-D3c3yDEQ.mjs';
|
|
14
|
+
import { A as AgentRun, O as ORCHESTRATOR_CONFIGURATION, C as Chat, E as EAgentRunStatus, a as OrchestratorService, b as ChatMessage } from './sftech-ng-orchestrator-sftech-ng-orchestrator-BquR89lx.mjs';
|
|
15
15
|
import * as i1 from '@angular/common/http';
|
|
16
16
|
import { faNoteSticky, faCog, faCheck, faXmark, faSpinner, faClipboardCheck, faCircleQuestion, faBrain, faUser, faNetworkWired } from '@fortawesome/free-solid-svg-icons';
|
|
17
17
|
import * as i1$1 from '@angular/forms';
|
|
18
18
|
import { FormGroup, FormControl, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
19
19
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
20
|
-
import { AgentRunIconTextDataprovider as AgentRunIconTextDataprovider$1 } from 'libs/ng-orchestrator/src/lib/ng-orchestrator/chats/core/dataprovider/agent-run-icon-text.dataprovider';
|
|
21
20
|
import { FloatLabel } from 'primeng/floatlabel';
|
|
22
21
|
import { InputText } from 'primeng/inputtext';
|
|
23
22
|
import { MarkdownComponent } from 'ngx-markdown';
|
|
@@ -201,7 +200,7 @@ class AgentChatMessageHumanInputInitialComponent {
|
|
|
201
200
|
sanitizer = inject(DomSanitizer);
|
|
202
201
|
form = new FormGroup({});
|
|
203
202
|
isSubmitting = false;
|
|
204
|
-
iconTextMapper = AgentRunIconTextDataprovider
|
|
203
|
+
iconTextMapper = AgentRunIconTextDataprovider;
|
|
205
204
|
iconProvider = IconProvider;
|
|
206
205
|
_agentChanged$ = effect(() => {
|
|
207
206
|
this.agent()
|
|
@@ -285,7 +284,7 @@ class AgentChatMessageHumanInputComponent {
|
|
|
285
284
|
message: new FormControl('', [Validators.required]),
|
|
286
285
|
});
|
|
287
286
|
isSubmitting = false;
|
|
288
|
-
iconTextMapper = AgentRunIconTextDataprovider
|
|
287
|
+
iconTextMapper = AgentRunIconTextDataprovider;
|
|
289
288
|
iconProvider = IconProvider;
|
|
290
289
|
run() {
|
|
291
290
|
if (this.form.invalid || this.isSubmitting) {
|
|
@@ -620,11 +619,11 @@ class AgentChatComponent {
|
|
|
620
619
|
return agentRun.chat.messages.filter((msg) => msg.messageType === 'human' || msg.messageType === 'user' || msg.messageType === 'ai').length;
|
|
621
620
|
}
|
|
622
621
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AgentChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
623
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AgentChatComponent, isStandalone: true, selector: "sftech-agent-chat", providers: [DialogService], viewQueries: [{ propertyName: "chatContainer", first: true, predicate: ["chatContainer"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full shadow-lg\">\n <!-- Header \u00FCber gesamte Breite -->\n @if (selectedAgent()) {\n <div class=\"border-b border-gray-300 px-3 sm:px-4 py-3 flex items-center bg-white gap-2\">\n <!-- Mobile Sidebar Toggle -->\n <div class=\"relative lg:hidden flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"toggleSidebar()\"\n [pTooltip]=\"'Chat-Verlauf (' + (agentRuns()?.length ?? 0) + ')'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"lg\"></fa-icon>\n </button>\n @if (agentRuns()?.length) {\n <span class=\"absolute -top-1 -right-1 bg-primary-500 text-white text-xs font-bold rounded-full min-w-5 h-5 flex items-center justify-center px-1 pointer-events-none\">\n {{ agentRuns()!.length }}\n </span>\n }\n </div>\n\n <div class=\"flex items-center gap-2 sm:gap-3 flex-1 min-w-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded flex-shrink-0\"\n (click)=\"goBack()\"\n [pTooltip]=\"'Zur\u00FCck'\"\n tooltipPosition=\"bottom\"\n tabindex=\"2\">\n <fa-icon [icon]=\"iconProvider.back\" size=\"lg\"></fa-icon>\n </button>\n @if (selectedAgentRun()) {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n <span class=\"hidden md:inline text-gray-500 font-normal\">\n vom {{ (selectedAgentRun()?.createdAt ?? selectedAgentRun()?.startedAt | date:'dd.MM.yyyy - HH:mm') }}\n </span>\n </h2>\n } @else {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n </h2>\n }\n </div>\n <div class=\"flex items-center gap-2 sm:gap-3 flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-sm\"\n (click)=\"startNewRun()\"\n tabindex=\"3\">\n <fa-icon [icon]=\"iconProvider.add\" class=\"sm:mr-2\"></fa-icon>\n <span class=\"hidden sm:inline\">Neuer Chat</span>\n </button>\n\n @if (selectedAgentRun()) {\n @if (selectedAgent()?.ragProvider && selectedAgent()?.ragModel) {\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"openRagUploadModal()\"\n [pTooltip]=\"'RAG-Dokumente hochladen'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.documentAdd\" size=\"lg\"></fa-icon>\n </button>\n }\n <div [pTooltip]=\"'Status: ' + iconTextMapper.getTextForStatus(selectedAgentRun()?.status)\"\n tooltipPosition=\"bottom\"\n class=\"cursor-help\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(selectedAgentRun()?.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(selectedAgentRun()?.status)\"\n [animation]=\"selectedAgentRun()?.status === 'running' ? 'spin' : undefined\"\n size=\"lg\"></fa-icon>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sidebar + Chat nebeneinander -->\n <div class=\"flex flex-1 min-h-0 overflow-hidden relative\">\n <!-- Mobile Overlay -->\n @if (sidebarVisible()) {\n <div class=\"fixed inset-0 bg-black/50 z-40 lg:hidden\"\n (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Sidebar -->\n <div class=\"chats-panel border-r border-gray-200 bg-gradient-to-b from-gray-50 to-white p-3 h-full flex-shrink-0 overflow-y-auto\n fixed lg:relative inset-y-0 left-0 z-50 lg:z-auto\n w-[280px] sm:w-[300px] lg:w-[220px]\n transform transition-transform duration-300 ease-in-out\n lg:transform-none\"\n [class.-translate-x-full]=\"!sidebarVisible()\"\n [class.translate-x-0]=\"sidebarVisible()\"\n [class.lg:translate-x-0]=\"true\">\n\n <!-- Mobile Close Button -->\n <div class=\"flex items-center justify-between mb-3 lg:hidden\">\n <h3 class=\"text-sm font-semibold text-gray-700\">Chat-Verlauf</h3>\n <button class=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n (click)=\"closeSidebar()\">\n <fa-icon [icon]=\"iconProvider.close\" class=\"text-gray-500\"></fa-icon>\n </button>\n </div>\n\n <div class=\"mb-3 hidden lg:block\">\n <h3 class=\"text-xs font-semibold text-gray-500 uppercase tracking-wider px-2\">Chat Verlauf</h3>\n </div>\n @if (agentRuns() === undefined) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.loading\" [animation]=\"'spin'\" size=\"2x\" class=\"text-gray-400 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Chats werden geladen...</p>\n </div>\n </div>\n } @else if (!agentRuns()?.length) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"2x\" class=\"text-gray-300 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Noch keine Chats</p>\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (agentRun of agentRuns(); track agentRun) {\n <div class=\"chat-item group relative rounded-xl p-3 cursor-pointer transition-all duration-200 border active:scale-[0.98]\"\n (click)=\"selectAgentRun(agentRun); closeSidebar()\"\n [class.active]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.bg-white]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.shadow-sm]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.hover:shadow-md]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.border-gray-200]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.bg-primary-50]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-primary-300]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.shadow-md]=\"selectedAgentRun()?.id === agentRun.id\">\n <div class=\"flex items-start justify-between mb-2\">\n <div class=\"flex items-center gap-2 flex-1 min-w-0\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(agentRun.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(agentRun.status)\"\n [animation]=\"agentRun.status === 'running' ? 'spin' : undefined\"\n class=\"flex-shrink-0\"\n size=\"sm\"></fa-icon>\n <span class=\"text-xs font-medium truncate\"\n [class.text-primary-700]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-700]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'dd.MM.YY' }}\n </span>\n </div>\n <span class=\"text-xs font-medium flex-shrink-0 ml-2\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'HH:mm' }}\n </span>\n </div>\n @if (agentRun.chat && agentRun.chat.messages && agentRun.chat.messages.length > 0) {\n <div class=\"text-xs truncate leading-relaxed\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-600]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getFirstUserMessage(agentRun) }}\n </div>\n } @else {\n <div class=\"text-xs italic truncate\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\">\n Neuer Chat\n </div>\n }\n @if (agentRun.chat && agentRun.chat.messages) {\n <div class=\"flex items-center gap-2 mt-2 pt-2 border-t\"\n [class.border-primary-200]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-gray-100]=\"selectedAgentRun()?.id !== agentRun.id\">\n <fa-icon [icon]=\"iconProvider.message\" size=\"xs\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\"></fa-icon>\n <span class=\"text-xs\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getMessageCount(agentRun) }} Nachrichten\n </span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Chat Area -->\n <div class=\"chat bg-gray-50 flex-1 relative min-w-0\">\n @if (selectedAgentRun() === undefined) {\n <div class=\"flex items-center justify-center h-full p-4\">\n <p class=\"m-0 text-gray-500 text-center\">\n <span class=\"hidden lg:inline\">Bitte einen Chat aus der linken Liste ausw\u00E4hlen</span>\n <span class=\"lg:hidden\">Tippe auf das Men\u00FC-Icon um einen Chat auszuw\u00E4hlen</span>\n </p>\n </div>\n } @else if (selectedAgent() === undefined) {\n <div class=\"flex items-center justify-center h-full\">\n <p class=\"m-0 text-gray-500\">\n Die Chat-Daten werden geladen...\n </p>\n </div>\n } @else {\n <div class=\"absolute inset-0 overflow-y-auto p-2 sm:p-3\" #chatContainer>\n @if (selectedAgentRun()!.chat) {\n @for (message of selectedAgentRun()!.chat!.messages; track message.id) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"message.message\"\n [type]=\"message.messageType\"></sftech-agent-chat-message>\n </div>\n }\n }\n @if (selectedAgentRun()!.status === agentRunStatus.INIT) {\n <sftech-agent-chat-message-human-input-initial [agent]=\"selectedAgent()\"\n (agentRunIdReceived)=\"startObservingAgentRun($event)\"></sftech-agent-chat-message-human-input-initial>\n }\n @if (loading()) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"'Am \u00DCberlegen'\"\n [type]=\"'ai_loading'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()?.status === agentRunStatus.FAILED) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message\n [message]=\"'Es ist ein Fehler aufgetreten! Bitte versuche es zu einem sp\u00E4teren Zeitpunkt erneut.'\"\n [type]=\"'ai_failed'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()!.status === agentRunStatus.COMPLETED) {\n <sftech-agent-chat-message-human-input [agent]=\"selectedAgent()\"\n [agentRunId]=\"selectedAgentRun()!.id\"\n (agentRunIdReceived)=\"startObservingAgentRun(selectedAgentRun()!.id!)\"></sftech-agent-chat-message-human-input>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden}.chat-item{transform:translate(0);transition:all .2s ease-in-out}.chat-item:hover{transform:translate(2px)}.chat-item.active{border-left-width:3px}\n"], dependencies: [{ kind: "directive", type: ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "component", type: AgentChatMessageComponent, selector: "sftech-agent-chat-message", inputs: ["message", "type"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: AgentChatMessageHumanInputInitialComponent, selector: "sftech-agent-chat-message-human-input-initial", inputs: ["agent"], outputs: ["agentRunIdReceived"] }, { kind: "component", type: AgentChatMessageHumanInputComponent, selector: "sftech-agent-chat-message-human-input", inputs: ["agent", "agentRunId"], outputs: ["agentRunIdReceived"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
|
|
622
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AgentChatComponent, isStandalone: true, selector: "sftech-agent-chat", providers: [DialogService], viewQueries: [{ propertyName: "chatContainer", first: true, predicate: ["chatContainer"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-col h-full shadow-lg\">\n <!-- Header \u00FCber gesamte Breite -->\n @if (selectedAgent()) {\n <div class=\"border-b border-gray-300 px-3 sm:px-4 py-3 flex items-center bg-white gap-2\">\n <!-- Mobile Sidebar Toggle -->\n <div class=\"relative lg:hidden flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"toggleSidebar()\"\n [pTooltip]=\"'Chat-Verlauf (' + (agentRuns()?.length ?? 0) + ')'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"lg\"></fa-icon>\n </button>\n @if (agentRuns()?.length) {\n <span class=\"absolute -top-1 -right-1 bg-primary-500 text-white text-xs font-bold rounded-full min-w-5 h-5 flex items-center justify-center px-1 pointer-events-none\">\n {{ agentRuns()!.length }}\n </span>\n }\n </div>\n\n <div class=\"flex items-center gap-2 sm:gap-3 flex-1 min-w-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded flex-shrink-0\"\n (click)=\"goBack()\"\n [pTooltip]=\"'Zur\u00FCck'\"\n tooltipPosition=\"bottom\"\n tabindex=\"2\">\n <fa-icon [icon]=\"iconProvider.back\" size=\"lg\"></fa-icon>\n </button>\n @if (selectedAgentRun()) {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n <span class=\"hidden md:inline text-gray-500 font-normal\">\n vom {{ (selectedAgentRun()?.createdAt ?? selectedAgentRun()?.startedAt | date:'dd.MM.yyyy - HH:mm') }}\n </span>\n </h2>\n } @else {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n </h2>\n }\n </div>\n <div class=\"flex items-center gap-2 sm:gap-3 flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-sm\"\n (click)=\"startNewRun()\"\n tabindex=\"3\">\n <fa-icon [icon]=\"iconProvider.add\" class=\"sm:mr-2\"></fa-icon>\n <span class=\"hidden sm:inline\">Neuer Chat</span>\n </button>\n\n @if (selectedAgentRun()) {\n @if (selectedAgent()?.ragProvider && selectedAgent()?.ragModel) {\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"openRagUploadModal()\"\n [pTooltip]=\"'RAG-Dokumente hochladen'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.documentAdd\" size=\"lg\"></fa-icon>\n </button>\n }\n <div [pTooltip]=\"'Status: ' + iconTextMapper.getTextForStatus(selectedAgentRun()?.status)\"\n tooltipPosition=\"bottom\"\n class=\"cursor-help\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(selectedAgentRun()?.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(selectedAgentRun()?.status)\"\n [animation]=\"selectedAgentRun()?.status === 'running' ? 'spin' : undefined\"\n size=\"lg\"></fa-icon>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sidebar + Chat nebeneinander -->\n <div class=\"flex flex-1 min-h-0 overflow-hidden relative\">\n <!-- Mobile Overlay -->\n @if (sidebarVisible()) {\n <div class=\"fixed inset-0 bg-black/50 z-40 lg:hidden\"\n (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Sidebar -->\n <div class=\"chats-panel border-r border-gray-200 bg-gradient-to-b from-gray-50 to-white p-3 h-full flex-shrink-0 overflow-y-auto\n fixed lg:relative inset-y-0 left-0 z-50 lg:z-auto\n w-[280px] sm:w-[300px] lg:w-[220px]\n transform transition-transform duration-300 ease-in-out\n lg:transform-none\"\n [class.-translate-x-full]=\"!sidebarVisible()\"\n [class.translate-x-0]=\"sidebarVisible()\"\n [class.lg:translate-x-0]=\"true\">\n\n <!-- Mobile Close Button -->\n <div class=\"flex items-center justify-between mb-3 lg:hidden\">\n <h3 class=\"text-sm font-semibold text-gray-700\">Chat-Verlauf</h3>\n <button class=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n (click)=\"closeSidebar()\">\n <fa-icon [icon]=\"iconProvider.close\" class=\"text-gray-500\"></fa-icon>\n </button>\n </div>\n\n <div class=\"mb-3 hidden lg:block\">\n <h3 class=\"text-xs font-semibold text-gray-500 uppercase tracking-wider px-2\">Chat Verlauf</h3>\n </div>\n @if (agentRuns() === undefined) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.loading\" [animation]=\"'spin'\" size=\"2x\" class=\"text-gray-400 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Chats werden geladen...</p>\n </div>\n </div>\n } @else if (!agentRuns()?.length) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"2x\" class=\"text-gray-300 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Noch keine Chats</p>\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (agentRun of agentRuns(); track agentRun) {\n <div class=\"chat-item group relative rounded-xl p-3 cursor-pointer transition-all duration-200 border active:scale-[0.98]\"\n (click)=\"selectAgentRun(agentRun); closeSidebar()\"\n [class.active]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.bg-white]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.shadow-sm]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.hover:shadow-md]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.border-gray-200]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.bg-primary-50]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-primary-300]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.shadow-md]=\"selectedAgentRun()?.id === agentRun.id\">\n <div class=\"flex items-start justify-between mb-2\">\n <div class=\"flex items-center gap-2 flex-1 min-w-0\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(agentRun.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(agentRun.status)\"\n [animation]=\"agentRun.status === 'running' ? 'spin' : undefined\"\n class=\"flex-shrink-0\"\n size=\"sm\"></fa-icon>\n <span class=\"text-xs font-medium truncate\"\n [class.text-primary-700]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-700]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'dd.MM.yy' }}\n </span>\n </div>\n <span class=\"text-xs font-medium flex-shrink-0 ml-2\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'HH:mm' }}\n </span>\n </div>\n @if (agentRun.chat && agentRun.chat.messages && agentRun.chat.messages.length > 0) {\n <div class=\"text-xs truncate leading-relaxed\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-600]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getFirstUserMessage(agentRun) }}\n </div>\n } @else {\n <div class=\"text-xs italic truncate\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\">\n Neuer Chat\n </div>\n }\n @if (agentRun.chat && agentRun.chat.messages) {\n <div class=\"flex items-center gap-2 mt-2 pt-2 border-t\"\n [class.border-primary-200]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-gray-100]=\"selectedAgentRun()?.id !== agentRun.id\">\n <fa-icon [icon]=\"iconProvider.message\" size=\"xs\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\"></fa-icon>\n <span class=\"text-xs\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getMessageCount(agentRun) }} Nachrichten\n </span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Chat Area -->\n <div class=\"chat bg-gray-50 flex-1 relative min-w-0\">\n @if (selectedAgentRun() === undefined) {\n <div class=\"flex items-center justify-center h-full p-4\">\n <p class=\"m-0 text-gray-500 text-center\">\n <span class=\"hidden lg:inline\">Bitte einen Chat aus der linken Liste ausw\u00E4hlen</span>\n <span class=\"lg:hidden\">Tippe auf das Men\u00FC-Icon um einen Chat auszuw\u00E4hlen</span>\n </p>\n </div>\n } @else if (selectedAgent() === undefined) {\n <div class=\"flex items-center justify-center h-full\">\n <p class=\"m-0 text-gray-500\">\n Die Chat-Daten werden geladen...\n </p>\n </div>\n } @else {\n <div class=\"absolute inset-0 overflow-y-auto p-2 sm:p-3\" #chatContainer>\n @if (selectedAgentRun()!.chat) {\n @for (message of selectedAgentRun()!.chat!.messages; track message.id) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"message.message\"\n [type]=\"message.messageType\"></sftech-agent-chat-message>\n </div>\n }\n }\n @if (selectedAgentRun()!.status === agentRunStatus.INIT) {\n <sftech-agent-chat-message-human-input-initial [agent]=\"selectedAgent()\"\n (agentRunIdReceived)=\"startObservingAgentRun($event)\"></sftech-agent-chat-message-human-input-initial>\n }\n @if (loading()) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"'Am \u00DCberlegen'\"\n [type]=\"'ai_loading'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()?.status === agentRunStatus.FAILED) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message\n [message]=\"'Es ist ein Fehler aufgetreten! Bitte versuche es zu einem sp\u00E4teren Zeitpunkt erneut.'\"\n [type]=\"'ai_failed'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()!.status === agentRunStatus.COMPLETED) {\n <sftech-agent-chat-message-human-input [agent]=\"selectedAgent()\"\n [agentRunId]=\"selectedAgentRun()!.id\"\n (agentRunIdReceived)=\"startObservingAgentRun(selectedAgentRun()!.id!)\"></sftech-agent-chat-message-human-input>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden}.chat-item{transform:translate(0);transition:all .2s ease-in-out}.chat-item:hover{transform:translate(2px)}.chat-item.active{border-left-width:3px}\n"], dependencies: [{ kind: "directive", type: ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "component", type: AgentChatMessageComponent, selector: "sftech-agent-chat-message", inputs: ["message", "type"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: AgentChatMessageHumanInputInitialComponent, selector: "sftech-agent-chat-message-human-input-initial", inputs: ["agent"], outputs: ["agentRunIdReceived"] }, { kind: "component", type: AgentChatMessageHumanInputComponent, selector: "sftech-agent-chat-message-human-input", inputs: ["agent", "agentRunId"], outputs: ["agentRunIdReceived"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
|
|
624
623
|
}
|
|
625
624
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AgentChatComponent, decorators: [{
|
|
626
625
|
type: Component,
|
|
627
|
-
args: [{ selector: 'sftech-agent-chat', imports: [ButtonDirective, AgentChatMessageComponent, DatePipe, FaIconComponent, AgentChatMessageHumanInputInitialComponent, AgentChatMessageHumanInputComponent, Tooltip], providers: [DialogService], template: "<div class=\"flex flex-col h-full shadow-lg\">\n <!-- Header \u00FCber gesamte Breite -->\n @if (selectedAgent()) {\n <div class=\"border-b border-gray-300 px-3 sm:px-4 py-3 flex items-center bg-white gap-2\">\n <!-- Mobile Sidebar Toggle -->\n <div class=\"relative lg:hidden flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"toggleSidebar()\"\n [pTooltip]=\"'Chat-Verlauf (' + (agentRuns()?.length ?? 0) + ')'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"lg\"></fa-icon>\n </button>\n @if (agentRuns()?.length) {\n <span class=\"absolute -top-1 -right-1 bg-primary-500 text-white text-xs font-bold rounded-full min-w-5 h-5 flex items-center justify-center px-1 pointer-events-none\">\n {{ agentRuns()!.length }}\n </span>\n }\n </div>\n\n <div class=\"flex items-center gap-2 sm:gap-3 flex-1 min-w-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded flex-shrink-0\"\n (click)=\"goBack()\"\n [pTooltip]=\"'Zur\u00FCck'\"\n tooltipPosition=\"bottom\"\n tabindex=\"2\">\n <fa-icon [icon]=\"iconProvider.back\" size=\"lg\"></fa-icon>\n </button>\n @if (selectedAgentRun()) {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n <span class=\"hidden md:inline text-gray-500 font-normal\">\n vom {{ (selectedAgentRun()?.createdAt ?? selectedAgentRun()?.startedAt | date:'dd.MM.yyyy - HH:mm') }}\n </span>\n </h2>\n } @else {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n </h2>\n }\n </div>\n <div class=\"flex items-center gap-2 sm:gap-3 flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-sm\"\n (click)=\"startNewRun()\"\n tabindex=\"3\">\n <fa-icon [icon]=\"iconProvider.add\" class=\"sm:mr-2\"></fa-icon>\n <span class=\"hidden sm:inline\">Neuer Chat</span>\n </button>\n\n @if (selectedAgentRun()) {\n @if (selectedAgent()?.ragProvider && selectedAgent()?.ragModel) {\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"openRagUploadModal()\"\n [pTooltip]=\"'RAG-Dokumente hochladen'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.documentAdd\" size=\"lg\"></fa-icon>\n </button>\n }\n <div [pTooltip]=\"'Status: ' + iconTextMapper.getTextForStatus(selectedAgentRun()?.status)\"\n tooltipPosition=\"bottom\"\n class=\"cursor-help\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(selectedAgentRun()?.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(selectedAgentRun()?.status)\"\n [animation]=\"selectedAgentRun()?.status === 'running' ? 'spin' : undefined\"\n size=\"lg\"></fa-icon>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sidebar + Chat nebeneinander -->\n <div class=\"flex flex-1 min-h-0 overflow-hidden relative\">\n <!-- Mobile Overlay -->\n @if (sidebarVisible()) {\n <div class=\"fixed inset-0 bg-black/50 z-40 lg:hidden\"\n (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Sidebar -->\n <div class=\"chats-panel border-r border-gray-200 bg-gradient-to-b from-gray-50 to-white p-3 h-full flex-shrink-0 overflow-y-auto\n fixed lg:relative inset-y-0 left-0 z-50 lg:z-auto\n w-[280px] sm:w-[300px] lg:w-[220px]\n transform transition-transform duration-300 ease-in-out\n lg:transform-none\"\n [class.-translate-x-full]=\"!sidebarVisible()\"\n [class.translate-x-0]=\"sidebarVisible()\"\n [class.lg:translate-x-0]=\"true\">\n\n <!-- Mobile Close Button -->\n <div class=\"flex items-center justify-between mb-3 lg:hidden\">\n <h3 class=\"text-sm font-semibold text-gray-700\">Chat-Verlauf</h3>\n <button class=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n (click)=\"closeSidebar()\">\n <fa-icon [icon]=\"iconProvider.close\" class=\"text-gray-500\"></fa-icon>\n </button>\n </div>\n\n <div class=\"mb-3 hidden lg:block\">\n <h3 class=\"text-xs font-semibold text-gray-500 uppercase tracking-wider px-2\">Chat Verlauf</h3>\n </div>\n @if (agentRuns() === undefined) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.loading\" [animation]=\"'spin'\" size=\"2x\" class=\"text-gray-400 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Chats werden geladen...</p>\n </div>\n </div>\n } @else if (!agentRuns()?.length) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"2x\" class=\"text-gray-300 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Noch keine Chats</p>\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (agentRun of agentRuns(); track agentRun) {\n <div class=\"chat-item group relative rounded-xl p-3 cursor-pointer transition-all duration-200 border active:scale-[0.98]\"\n (click)=\"selectAgentRun(agentRun); closeSidebar()\"\n [class.active]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.bg-white]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.shadow-sm]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.hover:shadow-md]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.border-gray-200]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.bg-primary-50]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-primary-300]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.shadow-md]=\"selectedAgentRun()?.id === agentRun.id\">\n <div class=\"flex items-start justify-between mb-2\">\n <div class=\"flex items-center gap-2 flex-1 min-w-0\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(agentRun.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(agentRun.status)\"\n [animation]=\"agentRun.status === 'running' ? 'spin' : undefined\"\n class=\"flex-shrink-0\"\n size=\"sm\"></fa-icon>\n <span class=\"text-xs font-medium truncate\"\n [class.text-primary-700]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-700]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'dd.MM.YY' }}\n </span>\n </div>\n <span class=\"text-xs font-medium flex-shrink-0 ml-2\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'HH:mm' }}\n </span>\n </div>\n @if (agentRun.chat && agentRun.chat.messages && agentRun.chat.messages.length > 0) {\n <div class=\"text-xs truncate leading-relaxed\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-600]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getFirstUserMessage(agentRun) }}\n </div>\n } @else {\n <div class=\"text-xs italic truncate\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\">\n Neuer Chat\n </div>\n }\n @if (agentRun.chat && agentRun.chat.messages) {\n <div class=\"flex items-center gap-2 mt-2 pt-2 border-t\"\n [class.border-primary-200]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-gray-100]=\"selectedAgentRun()?.id !== agentRun.id\">\n <fa-icon [icon]=\"iconProvider.message\" size=\"xs\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\"></fa-icon>\n <span class=\"text-xs\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getMessageCount(agentRun) }} Nachrichten\n </span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Chat Area -->\n <div class=\"chat bg-gray-50 flex-1 relative min-w-0\">\n @if (selectedAgentRun() === undefined) {\n <div class=\"flex items-center justify-center h-full p-4\">\n <p class=\"m-0 text-gray-500 text-center\">\n <span class=\"hidden lg:inline\">Bitte einen Chat aus der linken Liste ausw\u00E4hlen</span>\n <span class=\"lg:hidden\">Tippe auf das Men\u00FC-Icon um einen Chat auszuw\u00E4hlen</span>\n </p>\n </div>\n } @else if (selectedAgent() === undefined) {\n <div class=\"flex items-center justify-center h-full\">\n <p class=\"m-0 text-gray-500\">\n Die Chat-Daten werden geladen...\n </p>\n </div>\n } @else {\n <div class=\"absolute inset-0 overflow-y-auto p-2 sm:p-3\" #chatContainer>\n @if (selectedAgentRun()!.chat) {\n @for (message of selectedAgentRun()!.chat!.messages; track message.id) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"message.message\"\n [type]=\"message.messageType\"></sftech-agent-chat-message>\n </div>\n }\n }\n @if (selectedAgentRun()!.status === agentRunStatus.INIT) {\n <sftech-agent-chat-message-human-input-initial [agent]=\"selectedAgent()\"\n (agentRunIdReceived)=\"startObservingAgentRun($event)\"></sftech-agent-chat-message-human-input-initial>\n }\n @if (loading()) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"'Am \u00DCberlegen'\"\n [type]=\"'ai_loading'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()?.status === agentRunStatus.FAILED) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message\n [message]=\"'Es ist ein Fehler aufgetreten! Bitte versuche es zu einem sp\u00E4teren Zeitpunkt erneut.'\"\n [type]=\"'ai_failed'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()!.status === agentRunStatus.COMPLETED) {\n <sftech-agent-chat-message-human-input [agent]=\"selectedAgent()\"\n [agentRunId]=\"selectedAgentRun()!.id\"\n (agentRunIdReceived)=\"startObservingAgentRun(selectedAgentRun()!.id!)\"></sftech-agent-chat-message-human-input>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden}.chat-item{transform:translate(0);transition:all .2s ease-in-out}.chat-item:hover{transform:translate(2px)}.chat-item.active{border-left-width:3px}\n"] }]
|
|
626
|
+
args: [{ selector: 'sftech-agent-chat', imports: [ButtonDirective, AgentChatMessageComponent, DatePipe, FaIconComponent, AgentChatMessageHumanInputInitialComponent, AgentChatMessageHumanInputComponent, Tooltip], providers: [DialogService], template: "<div class=\"flex flex-col h-full shadow-lg\">\n <!-- Header \u00FCber gesamte Breite -->\n @if (selectedAgent()) {\n <div class=\"border-b border-gray-300 px-3 sm:px-4 py-3 flex items-center bg-white gap-2\">\n <!-- Mobile Sidebar Toggle -->\n <div class=\"relative lg:hidden flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"toggleSidebar()\"\n [pTooltip]=\"'Chat-Verlauf (' + (agentRuns()?.length ?? 0) + ')'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"lg\"></fa-icon>\n </button>\n @if (agentRuns()?.length) {\n <span class=\"absolute -top-1 -right-1 bg-primary-500 text-white text-xs font-bold rounded-full min-w-5 h-5 flex items-center justify-center px-1 pointer-events-none\">\n {{ agentRuns()!.length }}\n </span>\n }\n </div>\n\n <div class=\"flex items-center gap-2 sm:gap-3 flex-1 min-w-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded flex-shrink-0\"\n (click)=\"goBack()\"\n [pTooltip]=\"'Zur\u00FCck'\"\n tooltipPosition=\"bottom\"\n tabindex=\"2\">\n <fa-icon [icon]=\"iconProvider.back\" size=\"lg\"></fa-icon>\n </button>\n @if (selectedAgentRun()) {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n <span class=\"hidden md:inline text-gray-500 font-normal\">\n vom {{ (selectedAgentRun()?.createdAt ?? selectedAgentRun()?.startedAt | date:'dd.MM.yyyy - HH:mm') }}\n </span>\n </h2>\n } @else {\n <h2 class=\"text-base sm:text-xl font-semibold truncate\">\n <span class=\"hidden sm:inline\">Agent: </span>{{ selectedAgent()?.name }}\n </h2>\n }\n </div>\n <div class=\"flex items-center gap-2 sm:gap-3 flex-shrink-0\">\n <button pButton\n type=\"button\"\n class=\"p-button-sm\"\n (click)=\"startNewRun()\"\n tabindex=\"3\">\n <fa-icon [icon]=\"iconProvider.add\" class=\"sm:mr-2\"></fa-icon>\n <span class=\"hidden sm:inline\">Neuer Chat</span>\n </button>\n\n @if (selectedAgentRun()) {\n @if (selectedAgent()?.ragProvider && selectedAgent()?.ragModel) {\n <button pButton\n type=\"button\"\n class=\"p-button-text p-button-rounded\"\n (click)=\"openRagUploadModal()\"\n [pTooltip]=\"'RAG-Dokumente hochladen'\"\n tooltipPosition=\"bottom\">\n <fa-icon [icon]=\"iconProvider.documentAdd\" size=\"lg\"></fa-icon>\n </button>\n }\n <div [pTooltip]=\"'Status: ' + iconTextMapper.getTextForStatus(selectedAgentRun()?.status)\"\n tooltipPosition=\"bottom\"\n class=\"cursor-help\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(selectedAgentRun()?.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(selectedAgentRun()?.status)\"\n [animation]=\"selectedAgentRun()?.status === 'running' ? 'spin' : undefined\"\n size=\"lg\"></fa-icon>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sidebar + Chat nebeneinander -->\n <div class=\"flex flex-1 min-h-0 overflow-hidden relative\">\n <!-- Mobile Overlay -->\n @if (sidebarVisible()) {\n <div class=\"fixed inset-0 bg-black/50 z-40 lg:hidden\"\n (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Sidebar -->\n <div class=\"chats-panel border-r border-gray-200 bg-gradient-to-b from-gray-50 to-white p-3 h-full flex-shrink-0 overflow-y-auto\n fixed lg:relative inset-y-0 left-0 z-50 lg:z-auto\n w-[280px] sm:w-[300px] lg:w-[220px]\n transform transition-transform duration-300 ease-in-out\n lg:transform-none\"\n [class.-translate-x-full]=\"!sidebarVisible()\"\n [class.translate-x-0]=\"sidebarVisible()\"\n [class.lg:translate-x-0]=\"true\">\n\n <!-- Mobile Close Button -->\n <div class=\"flex items-center justify-between mb-3 lg:hidden\">\n <h3 class=\"text-sm font-semibold text-gray-700\">Chat-Verlauf</h3>\n <button class=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n (click)=\"closeSidebar()\">\n <fa-icon [icon]=\"iconProvider.close\" class=\"text-gray-500\"></fa-icon>\n </button>\n </div>\n\n <div class=\"mb-3 hidden lg:block\">\n <h3 class=\"text-xs font-semibold text-gray-500 uppercase tracking-wider px-2\">Chat Verlauf</h3>\n </div>\n @if (agentRuns() === undefined) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.loading\" [animation]=\"'spin'\" size=\"2x\" class=\"text-gray-400 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Chats werden geladen...</p>\n </div>\n </div>\n } @else if (!agentRuns()?.length) {\n <div class=\"flex items-center justify-center py-8\">\n <div class=\"text-center\">\n <fa-icon [icon]=\"iconProvider.chat\" size=\"2x\" class=\"text-gray-300 mb-2\"></fa-icon>\n <p class=\"text-sm text-gray-500 m-0\">Noch keine Chats</p>\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (agentRun of agentRuns(); track agentRun) {\n <div class=\"chat-item group relative rounded-xl p-3 cursor-pointer transition-all duration-200 border active:scale-[0.98]\"\n (click)=\"selectAgentRun(agentRun); closeSidebar()\"\n [class.active]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.bg-white]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.shadow-sm]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.hover:shadow-md]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.border-gray-200]=\"selectedAgentRun()?.id !== agentRun.id\"\n [class.bg-primary-50]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-primary-300]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.shadow-md]=\"selectedAgentRun()?.id === agentRun.id\">\n <div class=\"flex items-start justify-between mb-2\">\n <div class=\"flex items-center gap-2 flex-1 min-w-0\">\n <fa-icon [icon]=\"iconTextMapper.getIconForStatus(agentRun.status)\"\n [classList]=\"iconTextMapper.getIconClassesForStatus(agentRun.status)\"\n [animation]=\"agentRun.status === 'running' ? 'spin' : undefined\"\n class=\"flex-shrink-0\"\n size=\"sm\"></fa-icon>\n <span class=\"text-xs font-medium truncate\"\n [class.text-primary-700]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-700]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'dd.MM.yy' }}\n </span>\n </div>\n <span class=\"text-xs font-medium flex-shrink-0 ml-2\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ agentRun.createdAt | date:'HH:mm' }}\n </span>\n </div>\n @if (agentRun.chat && agentRun.chat.messages && agentRun.chat.messages.length > 0) {\n <div class=\"text-xs truncate leading-relaxed\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-600]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getFirstUserMessage(agentRun) }}\n </div>\n } @else {\n <div class=\"text-xs italic truncate\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\">\n Neuer Chat\n </div>\n }\n @if (agentRun.chat && agentRun.chat.messages) {\n <div class=\"flex items-center gap-2 mt-2 pt-2 border-t\"\n [class.border-primary-200]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.border-gray-100]=\"selectedAgentRun()?.id !== agentRun.id\">\n <fa-icon [icon]=\"iconProvider.message\" size=\"xs\"\n [class.text-primary-500]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-400]=\"selectedAgentRun()?.id !== agentRun.id\"></fa-icon>\n <span class=\"text-xs\"\n [class.text-primary-600]=\"selectedAgentRun()?.id === agentRun.id\"\n [class.text-gray-500]=\"selectedAgentRun()?.id !== agentRun.id\">\n {{ getMessageCount(agentRun) }} Nachrichten\n </span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Chat Area -->\n <div class=\"chat bg-gray-50 flex-1 relative min-w-0\">\n @if (selectedAgentRun() === undefined) {\n <div class=\"flex items-center justify-center h-full p-4\">\n <p class=\"m-0 text-gray-500 text-center\">\n <span class=\"hidden lg:inline\">Bitte einen Chat aus der linken Liste ausw\u00E4hlen</span>\n <span class=\"lg:hidden\">Tippe auf das Men\u00FC-Icon um einen Chat auszuw\u00E4hlen</span>\n </p>\n </div>\n } @else if (selectedAgent() === undefined) {\n <div class=\"flex items-center justify-center h-full\">\n <p class=\"m-0 text-gray-500\">\n Die Chat-Daten werden geladen...\n </p>\n </div>\n } @else {\n <div class=\"absolute inset-0 overflow-y-auto p-2 sm:p-3\" #chatContainer>\n @if (selectedAgentRun()!.chat) {\n @for (message of selectedAgentRun()!.chat!.messages; track message.id) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"message.message\"\n [type]=\"message.messageType\"></sftech-agent-chat-message>\n </div>\n }\n }\n @if (selectedAgentRun()!.status === agentRunStatus.INIT) {\n <sftech-agent-chat-message-human-input-initial [agent]=\"selectedAgent()\"\n (agentRunIdReceived)=\"startObservingAgentRun($event)\"></sftech-agent-chat-message-human-input-initial>\n }\n @if (loading()) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message [message]=\"'Am \u00DCberlegen'\"\n [type]=\"'ai_loading'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()?.status === agentRunStatus.FAILED) {\n <div class=\"mb-2\">\n <sftech-agent-chat-message\n [message]=\"'Es ist ein Fehler aufgetreten! Bitte versuche es zu einem sp\u00E4teren Zeitpunkt erneut.'\"\n [type]=\"'ai_failed'\"></sftech-agent-chat-message>\n </div>\n }\n @if (selectedAgentRun()!.status === agentRunStatus.COMPLETED) {\n <sftech-agent-chat-message-human-input [agent]=\"selectedAgent()\"\n [agentRunId]=\"selectedAgentRun()!.id\"\n (agentRunIdReceived)=\"startObservingAgentRun(selectedAgentRun()!.id!)\"></sftech-agent-chat-message-human-input>\n }\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden}.chat-item{transform:translate(0);transition:all .2s ease-in-out}.chat-item:hover{transform:translate(2px)}.chat-item.active{border-left-width:3px}\n"] }]
|
|
628
627
|
}], propDecorators: { chatContainer: [{
|
|
629
628
|
type: ViewChild,
|
|
630
629
|
args: ['chatContainer']
|
|
@@ -740,4 +739,4 @@ const chatsRoutes = [
|
|
|
740
739
|
];
|
|
741
740
|
|
|
742
741
|
export { chatsRoutes };
|
|
743
|
-
//# sourceMappingURL=sftech-ng-orchestrator-chats.routes-
|
|
742
|
+
//# sourceMappingURL=sftech-ng-orchestrator-chats.routes-DSlx52sA.mjs.map
|